树莓派小车Python控制小车

Posted 李汉祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派小车Python控制小车相关的知识,希望对你有一定的参考价值。

技术分享图片

正文之前

由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享。


正文

树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种:

  • PHYSICAL NUMBERING
  • GPIO NUMBERING

我采用的是第二种方式。

开始写

1. 导入库
import RPi.GPIO as GPIO
import time
2. 定义接口方式以及接口位置
GPIO.setmode(GPIO.BCM)
IN1 = 17
IN2 = 18
IN3 = 27
IN4 = 22
IN5 = 23
IN6 = 24 

IN1 - IN4为L298N接入,IN5和IN6为红外线模块接入。

车轮驱动方式:

IN1和IN2负责驱动车轮转动(前进)。
IN3和IN4负责驱动车轮转动(后退)。

3. 初始化
def init():
    GPIO.setup(IN1, GPIO.OUT)
    GPIO.setup(IN2, GPIO.OUT)
    GPIO.setup(IN3, GPIO.OUT)
    GPIO.setup(IN4, GPIO.OUT)
    GPIO.setup(IN5, GPIO.IN)
    GPIO.setup(IN6, GPIO.IN)

连接L298N的接口设为输出,因为需要输出的信号来驱动电机。
连接红外线模块的接口为输入,因为需要输入的信号来做出判断。

4. 基础方向行为
def up():
    GPIO.output(IN1, GPIO.HIGH)          //右侧车轮前进
    GPIO.output(IN2, GPIO.HIGH)          //左侧车轮前进
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)


def down():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.HIGH)          //右侧车轮后退
    GPIO.output(IN4, GPIO.HIGH)          //左侧车轮后退


def turn_left():
    GPIO.output(IN1, GPIO.HIGH)          //右侧车轮前进
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)


def turn_right():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.HIGH)          //左侧车轮前进
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)

需要说明的是:由于不含舵机,转弯的操作是单边车轮驱动,带动车身转动

5. 红外控制
init()

n = 5

while (n > 0):                                  //总共转弯五次
    in_left = GPIO.input(IN5)                   //左侧红外线接收器
    in_right = GPIO.input(IN6)                  //右侧红外线接收器
    up()                                        //未遇到障碍时直行
    if (in_left == GPIO.LOW):
        down()
        time.sleep(1)
        turn_right()
        time.sleep(1)
        n = n - 1
        continue
    
    if (in_right == GPIO.LOW):
        down()
        time.sleep(1)
        turn_left()
        time.sleep(1)
        n = n - 1
        continue
    
    if (in_right == GPIO.LOW & in_left == GPIO.LOW):
        down()
        time.sleep(1)
        turn_right()               //如果两侧都有障碍,就右转(个人喜好)
        time.sleep(1)
        n = n - 1
        continue

stop()                      
GPIO.cleanup()                    //清空GPIO接口配置信息

如果前方遇到障碍,就后退一秒,然后转弯,最后继续直行,直到遇到下一个障碍。

需要说明的是time.sleep()的用法:
time.sleep(time) 表示的是经过 time 秒后执行下一步操作,就是休眠一段时间的意思。
如果不使用time.sleep(),将会一直执行第一步操作。

关于运行:

  • 由于红外传感器的有效距离偏短(5cm左右),以及传感器的安装位置在车的底部,所以在车辆运动时,如果遇到凹凸不平的物体,有可能造成避障的延迟。

运行视频

树莓派小车

遇到凹凸不平的物体有些许碰撞(环境简陋)

关于树莓派信息的内容就先告一段落,等我做出遥控器再来介绍,谢谢大家的关注。





以上是关于树莓派小车Python控制小车的主要内容,如果未能解决你的问题,请参考以下文章

树莓派小车By 树莓派爱好者ITJoker(通过python socket通信实现树莓派视频小车)

树莓派视觉小车 -- 物体跟踪(OpenCV)

树莓派小车By 树莓派爱好者ITJoker(通过C socket通信实现树莓派视频小车)

树莓派小车树莓派小车和红外线模块连接(多图)

树莓派视觉小车 -- 人脸追踪(人脸识别PID控制舵机运动)

用树莓派的方式打开小米手机:摇晃手机控制小车,前进后退加转弯,成本不到350元 | 开源...