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

6 篇文章 30 订阅
1 篇文章 1 订阅

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

  • 该部分主要涉及到的硬件:两个红外循迹传感器(型号见准备篇)、树莓派。
  • 额外材料:准备点黑色电工胶布,制作一个跑道。
  • 两个红外传感器循迹缺点:无法完成对十字路线的正确识别。(如果你想让它可以识别十字路线,需要三个传感器,具体实现可以搜索)。下面我讲解两路循迹如何实现。
  • 电路连接:
    如果你用的循迹传感器和准备篇的中的一样,它共有四个引脚,分别是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占用
循迹控制是机器人控制中的一个重要应用场景,其中 PID 控制器是一种常用的控制算法。在树莓派上实现循迹控制需要相应的硬件和软件支持。 硬件方面,你需要一辆小车,同时安装循迹传感器并将其连接到树莓派上。循迹传感器可以检测小车所在的轨道,并输出相应的信号,以便树莓派进行控制。此外,你还需要购买电机和电调板,以便树莓派控制小车的运动。 软件方面,你需要在树莓派上安装 Python 和相关的库,如 GPIO、RPi.GPIO 和 numpy。然后,你可以使用 PID 算法来控制小车的运动。PID 算法可以根据当前偏差、偏差变化率和偏差积分值来计算输出信号,以便调整小车的方向和速度。 以下是一个基本的循迹 PID 控制程序的示例代码: ```python import RPi.GPIO as GPIO import time import numpy as np # 设置 GPIO 引脚模式 GPIO.setmode(GPIO.BOARD) # 定义引脚号 left_pin = 11 mid_pin = 13 right_pin = 15 motor1_pin1 = 16 motor1_pin2 = 18 motor2_pin1 = 22 motor2_pin2 = 24 # 设置引脚为输入模式 GPIO.setup(left_pin, GPIO.IN) GPIO.setup(mid_pin, GPIO.IN) GPIO.setup(right_pin, GPIO.IN) # 设置引脚为输出模式 GPIO.setup(motor1_pin1, GPIO.OUT) GPIO.setup(motor1_pin2, GPIO.OUT) GPIO.setup(motor2_pin1, GPIO.OUT) GPIO.setup(motor2_pin2, GPIO.OUT) # 定义 PID 参数 Kp = 0.5 Ki = 0.1 Kd = 0.2 # 定义 PID 变量 last_error = 0 integral = 0 # 定义循迹 PID 控制函数 def track_pid(): # 读取传感器信号 left = GPIO.input(left_pin) mid = GPIO.input(mid_pin) right = GPIO.input(right_pin) # 计算偏差 error = left - right # 计算偏差变化率 delta_error = error - last_error # 计算偏差积分值 integral += error # 计算输出信号 output = Kp * error + Ki * integral + Kd * delta_error # 更新 PID 变量 last_error = error # 控制小车运动 if output > 0: GPIO.output(motor1_pin1, GPIO.HIGH) GPIO.output(motor1_pin2, GPIO.LOW) GPIO.output(motor2_pin1, GPIO.HIGH) GPIO.output(motor2_pin2, GPIO.LOW) else: GPIO.output(motor1_pin1, GPIO.LOW) GPIO.output(motor1_pin2, GPIO.HIGH) GPIO.output(motor2_pin1, GPIO.LOW) GPIO.output(motor2_pin2, GPIO.HIGH) # 延时一段时间 time.sleep(0.1) # 循环执行循迹 PID 控制函数 while True: track_pid() ``` 在这个示例代码中,我们使用 GPIO 库来控制树莓派的引脚,使用 numpy 库来进行数学计算。我们定义了三个循迹传感器,分别对应左、中、右三个位置。在每次循迹 PID 控制函数中,我们读取传感器信号,并根据 PID 算法计算输出信号,以控制小车的运动。最后,我们使用一个无限循环来不断执行循迹 PID 控制函数。 你可以根据自己的需要调整 PID 参数,以获得更好的控制效果。同时,你还可以添加其他功能,如超声波避障、图像识别等,以进一步提高小车的智能化水平。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值