树莓派小车————循迹篇

python 同时被 3 个专栏收录
7 篇文章 1 订阅
6 篇文章 10 订阅
1 篇文章 0 订阅

所谓的循迹就是让小车识别导引线,跟着导引线运行,在导引线组成的赛道上运行。循迹可以用红外传感器或者摄像头完成。我选择的是用红外传感器进行黑线循迹。

  • 该部分主要涉及到的硬件:两个红外循迹传感器(型号见准备篇)、树莓派。
  • 额外材料:准备点黑色电工胶布,制作一个跑道。
  • 两个红外传感器循迹缺点:无法完成对十字路线的正确识别。(如果你想让它可以识别十字路线,需要三个传感器,具体实现可以搜索)。下面我讲解两路循迹如何实现。
  • 电路连接:
    如果你用的循迹传感器和准备篇的中的一样,它共有四个引脚,分别是VCC、GND、A0、D0。其中A0和D0分别代码模拟信号和数字信号,这里我们选择连接D0引脚,因为我们给的是数字信号,0或1也就是False和True。传感器不需要特别的供电电源,和树莓派连接即可。电路连接图如下:
    在这里插入图片
    从上图中可以看到,两个传感器的VCC分别接了树莓派的2号和4号引脚,这两个都是+5V引脚。两个传感器的GND都接了树莓派的30号引脚(GND引脚),D0分别接了29和31号引脚(GPIO口)。当然还是一样,所有的引脚接线都不是固定的,你可以自己设计。
  • 循迹原理:
    红外循迹传感器有两个指示灯,当检测到黑色时,只有一个灯亮,此时为True。反之为False。所以我们可通过两个传感器的信号来处理小车如何转向,进而调整车身位置,保持跟着导引线行驶。循迹原理图:
    在这里插入图片描述
  • 设计重点
    在起初的设计中我有些“耿直”,看了资料后,直接开始设计赛道,两个传感器也是直接安在了小车前方,间距差不多和黑色电工胶布一样宽。当我一切都准备好了,代码跑起来后人傻了,一到弯道怎么就冲出赛道了,肯定小车太快,我将速度设计到最低,还是一样。就这样两天都没想明白该怎么解决。最后我就开始慢慢在赛道上试,我开始加宽弯道处的赛道,结果还是一样。
    最后我在不断尝试的过程中突然醒悟过来,小车在赛道直线部分冲的太快了,根本就不能让它做太久的前进动作,直接让它一开始就左转或者右转来调整自身,不就可以慢下来了,之后我便将两个传感器之间的距离调整到比黑色赛道略宽一点,也就是保证两个传感器一个可以检测到黑线,另一个检测不到黑线。调整到合适的距离之后,小车便可以完成循迹功能了。(可能你光看是体会不到的,所以要动手自己测试,你就明白其中的“奥妙”了)
  • 代码(程序中将之前基本运动的代码省略了,你在运行代码时。需要将其补上,这里只展示循迹相关的代码):
#coding=utf-8
import RPi.GPIO as GPIO
import time
#定义红外循迹传感器GPIO口
LSenso=29
RSenso=31
def init():
    #设置接触警告
    GPIO.setwarnings(False)
    #设置引脚模式为物理模式
    GPIO.setmode(GPIO.BOARD)
    #红外循迹传感器引脚初始化,设置为输入,接受红外信号
    GPIO.setup(LSenso,GPIO.IN)
    GPIO.setup(RSenso,GPIO.IN)

#红外循迹函数
def track():
    while True:
    	#接收两个红外传感器的信号
        LS=GPIO.input(LSenso)
        RS=GPIO.input(RSenso)
        #左右两个传感器都检测到黑色,小车在赛道上,前进
        if LS==True and RS==True:
            print "前进"
            turn_up(16,0.1)
        #左边的传感器没检测到黑色,说明小车车身偏离赛道靠左,右转将小车车身向右调整
        elif LS==False and RS==True:
            print "右转"
            turn_right(18,0.1)
        #右边的传感器没检测到黑色,说明小车车身偏离赛道靠右,左转将小车车身向左调整
        elif LS==True and RS==False:
            print "左转"
            turn_left(18,0.1)
        #两个传感器都没有检测到黑色,说明小车完全偏离赛道,停止
        else:
            print "停止"
            car_stop()
#主函数
if __name__=="__main__":
    init()
    L_Motor=GPIO.PWM(PWMA,100)
    L_Motor.start(0)
    R_Motor=GPIO.PWM(PWMB,100)
    R_Motor.start(0)
    try:
        track() #调用循迹函数
    except KeyboardInterrupt:   #Ctrl+C 程序停止
        GPIO.cleanup()      #清除GPIO占用
  • 9
    点赞
  • 2
    评论
  • 69
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

码义小小

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值