回答

收藏

[大赛作品提交] 基于树莓派的迎宾机器人

Raspberry Pi Raspberry Pi 5326 人阅读 | 0 人回复 | 2018-01-10

本帖最后由 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 口

实物连线图如下:

测距原理图:

主要代码:
  1. import RPi.GPIO as GPIO
  2. import time

  3. Trig=20
  4. Echo=21
  5. GPIO.setmode(GPIO.BCM)
  6. GPIO.setup(Trig,GPIO.OUT,initial=GPIO.LOW)
  7. GPIO.setup(Echo,GPIO.IN)

  8. def checkdist():
  9.         
  10.         #发出触发信号
  11.         GPIO.output(Trig,GPIO.HIGH)
  12.         #保持10us以上(我选择15us)
  13.         time.sleep(0.000015)
  14.         GPIO.output(Trig,GPIO.LOW)
  15.         while not GPIO.input(Echo):
  16.                 pass
  17.         #发现高电平时开时计时
  18.         t1 = time.time()

  19.         t3=t1
  20.         while GPIO.input(Echo):
  21.                 #超时判断,只需要探测大约3米范围,取100毫秒足够
  22.                 if  time.time()-t3>100:
  23.                         return 100000
  24.                 pass
  25.         #高电平结束停止计时
  26.         t2 = time.time()
  27.         #返回距离,单位为cm
  28.         return (t2-t1)*340*100/2


  29. time.sleep(2)
  30. try:
  31.         while True:
  32.                 #获取距离,设定保持距离为50cm,如果大于50,向前走;小于50向后走
  33.                 lenth=checkdist()
  34.                 tmpdiff=lenth
  35.                 if tmpdiff>100:
  36.                         tmpdiff=100
  37.                 #计算转动方向和角度 ,速度范围10%-90%,正数向前,负数向后。 移动速度与距离换算:V =L*1.5+10     
  38.                 chengV=0
  39.                 if tmpdiff>60:
  40.                         chengV=(tmpdiff-50)*1.5+10
  41.                 if tmpdiff<40:
  42.                         chengV=(tmpdiff-50)*1.5-10               

  43.                 print 'Dis: %0.2fcm, V:%d ' %(lenth,chengV)
  44.                 time.sleep(0.5)
复制代码
视频效果:


4. 移动系统部分
采用L911s驱动芯片驱动马达实现动力。
芯片参数

芯片原理图

电路连线示意图

主要代码:
  1. #电机控制
  2. def setpwm(lef,rig,tim):
  3.                 #设置gpio口的模式               
  4.                 GPIO.setmode(GPIO.BCM)
  5.                 #定义信号接口gpio口
  6.                 #左侧
  7.                 LFT1 = 21
  8.                 LFT2 = 20
  9.                 #右侧
  10.                 RIG1 = 13
  11.                 RIG2 = 15

  12.                 #设置gpio口为输出
  13.                 GPIO.setup(LFT1,GPIO.OUT)
  14.                 GPIO.setup(LFT2,GPIO.OUT)
  15.                 GPIO.setup(RIG1,GPIO.OUT)
  16.                 GPIO.setup(RIG2,GPIO.OUT)

  17.                 LFTPWM=GPIO.PWM(LFT2, 10)
  18.                 RIGPWM=GPIO.PWM(RIG2, 10)

  19.                 LFTPWM.start(0)
  20. RIGPWM.start(1)

  21. #正转
  22.                 GPIO.output(LFT1,GPIO.LOW)
  23. GPIO.output(RIG1,GPIO.LOW)

  24. LFTPWM.ChangeDutyCycle(lef)
  25. RIGPWM.ChangeDutyCycle(rig)
  26. #end 正转

  27.                 #根据控制时间控制延时,单位毫秒
  28.                 time.sleep(tim/1000)
  29.                 LFTPWM.stop()
  30.                 RIGPWM.stop()
  31.                 GPIO.cleanup()
复制代码
实物展示:


微信图片_20180121205213.jpg (163.42 KB, 下载次数: 76)

微信图片_20180121205213.jpg
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条