本帖最后由 ky123 于 2018-1-31 14:04 编辑
基于树莓派的迎宾机器人
首先感谢e络盟的基金支持。
原理介绍:
树莓派作为中心控制器
使用摄像头获取图像,借助openCV技术进行图像处理,包括人脸识别,人流计数,自动跟随等
使用HC-SR04 超声波测距模块进行距离探测实现人体跟随保持
首先展示下树莓派的引脚图,非常丰富。
1.整体原理图
通过麦克风阵列采集声音,摄像头采集图像信号,超声波定位模块提供距离数据,红外对管实现避障,使用L9110驱动马达实现移动及位置调整
2.人像识别及数据处理系统
图像采集部分使用摄像头模块实现,左右方向调整通过舵机旋转底部调整轮实现。 树莓派可以使用USB接口摄像头,也可以使用预留的CSI接口的摄像头。本方案选用CSI接口的摄像头,响应速度回更快。
硬件连线图:
摄像头排线的金属片一侧朝向HDMI接口方向 整体控制逻辑图: 视频效果演示:
3. 超声波距离保持系统
测距功能使用的是HC-SR04 超声波模块。
采购到的模块如下图所示
Vcc 电源供电接口,连接树莓派的5V输出引脚
GND 连接树莓派的 GND引脚
Trig 引脚用来接收树莓派的控制信号。接任意 GPIO 口
Echo 引脚用来向树莓派返回测距信息。接任意 GPIO 口
实物连线图如下:
测距原理图:
主要代码:- import RPi.GPIO as GPIO
- import time
- Trig=20
- Echo=21
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(Trig,GPIO.OUT,initial=GPIO.LOW)
- GPIO.setup(Echo,GPIO.IN)
- def checkdist():
-
- #发出触发信号
- GPIO.output(Trig,GPIO.HIGH)
- #保持10us以上(我选择15us)
- time.sleep(0.000015)
- GPIO.output(Trig,GPIO.LOW)
- while not GPIO.input(Echo):
- pass
- #发现高电平时开时计时
- t1 = time.time()
- t3=t1
- while GPIO.input(Echo):
- #超时判断,只需要探测大约3米范围,取100毫秒足够
- if time.time()-t3>100:
- return 100000
- pass
- #高电平结束停止计时
- t2 = time.time()
- #返回距离,单位为cm
- return (t2-t1)*340*100/2
-
- time.sleep(2)
- try:
- while True:
- #获取距离,设定保持距离为50cm,如果大于50,向前走;小于50向后走
- lenth=checkdist()
- tmpdiff=lenth
- if tmpdiff>100:
- tmpdiff=100
- #计算转动方向和角度 ,速度范围10%-90%,正数向前,负数向后。 移动速度与距离换算:V =L*1.5+10
- chengV=0
- if tmpdiff>60:
- chengV=(tmpdiff-50)*1.5+10
- if tmpdiff<40:
- chengV=(tmpdiff-50)*1.5-10
- print 'Dis: %0.2fcm, V:%d ' %(lenth,chengV)
- time.sleep(0.5)
复制代码 视频效果:
4. 移动系统部分
采用L911s驱动芯片驱动马达实现动力。
芯片参数
芯片原理图
电路连线示意图
主要代码:- #电机控制
- def setpwm(lef,rig,tim):
- #设置gpio口的模式
- GPIO.setmode(GPIO.BCM)
- #定义信号接口gpio口
- #左侧
- LFT1 = 21
- LFT2 = 20
- #右侧
- RIG1 = 13
- RIG2 = 15
- #设置gpio口为输出
- GPIO.setup(LFT1,GPIO.OUT)
- GPIO.setup(LFT2,GPIO.OUT)
- GPIO.setup(RIG1,GPIO.OUT)
- GPIO.setup(RIG2,GPIO.OUT)
- LFTPWM=GPIO.PWM(LFT2, 10)
- RIGPWM=GPIO.PWM(RIG2, 10)
- LFTPWM.start(0)
- RIGPWM.start(1)
-
- #正转
- GPIO.output(LFT1,GPIO.LOW)
- GPIO.output(RIG1,GPIO.LOW)
- LFTPWM.ChangeDutyCycle(lef)
- RIGPWM.ChangeDutyCycle(rig)
- #end 正转
- #根据控制时间控制延时,单位毫秒
- time.sleep(tim/1000)
- LFTPWM.stop()
- RIGPWM.stop()
- GPIO.cleanup()
复制代码 实物展示:
|