树莓派机器人教程:使用 Raspberry Pi 制作障碍避免机器人(一)

我对学习硬件,建立一些很酷的物联网项目,以及机器学习有着极大的兴趣。

步骤0:材料清单

我们所需要的材料有:

  • Raspberry Pi 3 B
  • 摄像头或摄像头模块(使用 OpenCV 进行实时图像检测,用于系列的第2部分)
  • L293D 电机驱动器(正反两方向步进电机)
  • 超声波距离传感器(主要用于避免障碍物碰撞)
  • 2个 WD 机壳(Chassis)或4个 WD 机壳(Chassis),带 2 个直流电机
  • 中型储物箱(我用来连接手机箱:P)
  • 跳线 公-母 公-公 母-母
  • 移动电源(任何输出 5V 和 2.2A 的移动电源来运行 Raspberry Pi 3)
  • 半个面包板。
  • 330 欧姆电阻(用于降低电压)
  • PIR 传感器(可选:主要用于运动检测)

材料清单

步骤1:驱动电路连接

L293D

电子电路帽中的 H桥,允许电压沿任一方向施加在电机两端。这些电路通常用于机器人和其他应用,以使直流电机正向或反向运行。大多数 "直流-交流" 转换器(功率逆变器),大多数 "交流/交流转" 换器,"直流-直流" 推转换器,大多数电机控制器以及许多其他类型的功率电子设备都使用 H 桥。特别是双极步进电机,几乎总是由一个包含两个 H 电桥的电机控制器来驱动。H 桥电路的大部分是用 4 个晶体管制成的

在这里微控制器 = Raspberry Pi

A1,A2 - 来自电机 1 的微控制器的输入 B1,B2 - 来自电机 2 的微控制器的输入 ENA - 启用电机 1 ENB - 启用电机 2 如果 ENA 和 ENB + 5V - 电机全速, 如果 ENA 和 ENB + 2.5v - 电机半速等。 如果 ENA 和 ENB 0v - 电机停止。 ENA,ENB - 来自微控制器的 PWM 输入

示例

A1 A2 ENA 功能
逆时针(反转)
顺时针旋转(向前)
停止
停止
X X 停止

2 MB 1 = 用于连接电机2 + v - = 电机功率“+”和“ - ” 1 MA 2 = 用于连接电机1

通过上面的解释,输入让我们匹配 L293D 电机与 Raspberry Pi GPIO 引脚:

VCC -> 5V 电压 GND -> 地 A1 -> 方向控制信号 A2 -> 方向控制信号 En-B -> PWM控制(用于速度控制或电机启用/禁用) B1 -> 从控制器 B2 -> 来自控制器

连接 GPIO 引脚号:

MotorA1 = 18 MotorA2 = 16 Motor1EA = 22

MotorB1 = 19 MotorB2 = 21 Motor2EB = 23

GND = 连线——在面包板上(负极/地线) VCC = 连接在面包板的正极与及电池正极

检查电机

检查正向和反向

B1 = 19
B2 = 21
BE = 23

GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(B1,GPIO.OUT)
GPIO.setup(B2,GPIO.OUT)
GPIO.setup(BE,GPIO.OUT)

print "Turning motor on"
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(B1,GPIO.HIGH)
GPIO.output(B2,GPIO.LOW)
GPIO.output(BE,GPIO.HIGH)
sleep(20)

print "Stopping motor"
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(BE,GPIO.LOW)
GPIO.cleanup()

步骤2:超声波传感器

我已经在 hackster.io 上使用超声波传感器编写了一个小型项目:

> https://www.hackster.io/arbazhussain/distance-calculation-with-ultrasonic-sensor-26d63e

在这里可以从上面的URL项目,使用相同的教程:

Sonic Fritzing

如果传感器检测到任何在 15 厘米以内的物体,则会反向前进,这将有助于车轮避免碰撞物体:

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO_TRIGGER = 11
GPIO_ECHO    = 13
Motor1A = 16
Motor1B = 18
Motor1E = 22
Motor2A = 19
Motor2B = 21
Motor2E = 23
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(Motor2B,GPIO.OUT)
GPIO.setup(Motor2E,GPIO.OUT)
print "Ultrasonic Measurement"
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo
GPIO.output(GPIO_TRIGGER, False)
def measure():
  time.sleep(0.333)
  GPIO.output(GPIO_TRIGGER, True)
  time.sleep(0.00001)
  GPIO.output(GPIO_TRIGGER, False)
  start = time.time()

  while GPIO.input(GPIO_ECHO)==0:
    start = time.time()
while GPIO.input(GPIO_ECHO)==1:
    stop = time.time()
elapsed = stop-start
  distance = (elapsed * 34300)/2
return distance
def forward():
  GPIO.output(Motor1A,GPIO.HIGH)
  GPIO.output(Motor1B,GPIO.LOW)
  GPIO.output(Motor1E,GPIO.HIGH)
  GPIO.output(Motor2A,GPIO.HIGH)
  GPIO.output(Motor2B,GPIO.LOW)
  GPIO.output(Motor2E,GPIO.HIGH)
def turn():
  GPIO.output(Motor1A,GPIO.LOW)
  GPIO.output(Motor1B,GPIO.HIGH)
  GPIO.output(Motor1E,GPIO.HIGH)
  GPIO.output(Motor2A,GPIO.LOW)
  GPIO.output(Motor2B,GPIO.HIGH)
  GPIO.output(Motor2E,GPIO.HIGH)
try:
while True:
distance = measure()
    print "Distance : %.1f" % distance
    time.sleep(0.5)
if distance >= 15:
     forward()
    else:
     turn()
except KeyboardInterrupt:
GPIO.cleanup()

步骤3:连接摄像头

现在可以将摄像头或摄像头模块添加到 Raspberry PI 3 中。

使用Python 3,下载并编译 OpenCV:

确保创建单独的虚拟环境,以避免混乱的环境问题。

> http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/

pip install numpy
pip install tensorflow-cpu
pip install PIL
pip install matplotlib.pyplot
pip install pandas

现在我们正在使用 haarcascade_frontalface_default.xml 来检测人脸。

haarcascade 示例

import cv2
import sys
import logging as log
import datetime as dt
from time import sleep
cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)
log.basicConfig(filename='webcam.log',level=log.INFO)
video_capture = cv2.VideoCapture(0)
anterior = 0
while True:
    if not video_capture.isOpened():
        print('Unable to load camera.')
        sleep(5)
        pass
# Capture frame-by-frame
    ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30)
    )
# Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if anterior != len(faces):
        anterior = len(faces)
        log.info("faces: "+str(len(faces))+" at "+str(dt.datetime.now()))
# Display the resulting frame
    cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# Display the resulting frame
    cv2.imshow('Video', frame)
# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

小结

下一部分将介绍关于网络摄像头模块,OpenCV 库,Numpy 的实时图像数据提取,以创建自动驾驶机器人。

如果你已经使用 opencv,numpy,tensorflow 那么

在 GitHub 上已经有训练好的数据,其使用流行的机器学习库Tensorflow。 感觉@hamuchiwa

> https://github.com/arbazkiraak/AutoRCCar

如果你想要你学习如何使用神经网络训练数据。

我会推荐 Sentdex Tut’s and practicing it in GTA 5

原文链接:https://medium.com/@arbazhussain/building-obstacle-avoiding-bot-using-raspberry-pi-part-1-4f930d1fa6f8

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.