zoukankan      html  css  js  c++  java
  • 【树莓派】树莓派小车(三)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左右),以及传感器的安装位置在车的底部,所以在车辆运动时,如果遇到凹凸不平的物体,有可能造成避障的延迟。

    运行视频

    树莓派小车

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

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

  • 相关阅读:
    解决Web部署 svg/woff/woff2字体 404错误
    C# 汉字转拼音
    jquery ajax返回Internal server error 500错误解决方案
    bootstrap datepicker只能选择小于今天的日期
    向txt文件追加异常日志
    C# DataTable 和List之间相互转换的方法
    js点击行选中checkbox
    bootstrap-datepicker 插件修改为中文显示
    C# 压缩/解压字符串
    c# MD5加密
  • 原文地址:https://www.cnblogs.com/lihanxiang/p/8451818.html
Copyright © 2011-2022 走看看