查看: 1811|回复: 0

Micropython Turniobit 会思考的避障车

[复制链接]
  • TA的每日心情
    慵懒
    2018-1-6 09:01
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-3-14 10:42:40 | 显示全部楼层 |阅读模式
    分享到:
    什么是会思考的避障车?                                                      
    在日常生活中,大家会经常见到各种各样的遥控车,它需要我们人为的操作,控制它的前进、后退和转弯。今天就带大家认识一个不一样的新朋友——会思考的避障车。
    会思考的避障车和我们平时的遥控车最主要的区别就是智能化,它可以不需要我们去操控,自己就能行走。同时它还会实时检测前方是否有障碍物,思考自己是否要前进或者转弯。
    听到这里,是不是已经跃跃欲试了呢。话不多说,动起手来吧!
    所需器材:
    Ø  TurnipBit开发板 1块
    Ø  下载数据线 1条
    Ø  智能小车套件 1套(底盘、车轮、电机等)
    Ø  超声波模块(HC-SR04)1个(用作小车的“眼睛”)
    Ø  L298N电机驱动模块 1个
    Ø  接入互联网的电脑 1台(推荐使用Google Chome或者Firefox浏览器
    电机驱动和超声波的安装
    超声波模块共4个引脚,分别是VCC、GND、Trig和Echo。VCC接TurnipBit扩展板的+5V引脚,GND接TurnipBit扩展板的GND引脚,Trig触发引脚接P5,Echo回传引脚接P8。
    L298N电机驱动模块左侧OUT3、OUT4接线端子对应接入左轮电机的下侧、上侧侧铜片,右侧也是。L298N的输入端IN1、IN2、IN3、IN4分别接入扩展板的P19、P13、P12、P11。
    详细见下表:
      
    TurnipBit扩展板
      
    超声波模块
    L298N
    +5V
    VCC
    +12V、+5V
    GND
    GND
    GND
    P5
    Trig
    P8
    Echo
    P11
    IN4
    P12
    IN3
    P13
    IN2
    P19
    IN1
    cd5c3fd62780e00a11b1c5c744e0899.png

    cd891c08546c246e577809cc2a55a08.png
    程序设计伪代码分析
    让我们先用伪代码来分析一下避障车的程序逻辑。首先,我们通过小车的超声波模块来检测前方是否存在障碍物,计算出与障碍物之间的距离。当与障碍物的距离小于或等于我们预设的安全距离时,控制小车进行转向避开障碍物;当与障碍物的距离大于我们预设的安全距离时,控制小车进行继续前进;逻辑顺序如下:
    第一步,触犯超声波模块开始检测;
    第二步:计算出与前方障碍物的距离;
    第三步:判断与障碍物的距离是否小于设定的安全距离;
    第四步:若小于或等于则进行转向,避开障碍物;
    第五步:若大于则继续保持前进。
    根据伪代码,画成流程图如下: 009cfbf85082abd562119ebb63cd43c.png
    拼插编程
    整体的拼插代码如下图:具体怎么一步一步拼插就不写了。
    733d971a9714aed67210831ae752442.png a63f70a8a25dd63c6941cf094ca2879.png
          
    将程序名修改成turnipbit-car,点击【下载hex】按钮将程序保存到电脑里。
    把保存的turnipbit- car.hex文件拖入TurnipBit磁盘中,我们会看到TurnipBit板子上的灯在闪烁,说明正在下载到控制板中。
    下载成功后,将TurnipBit正确插入TurnipBit扩展板的金手指卡槽内,开始启动避障车吧。
    代码分析
    会思考的避障车整体代码,可参考右侧代码显示区,如下。
    1. from microbit import *


    2. display.show(Image.ARROW_N)
    3. pin11.write_digital(0)
    4. pin12.write_digital(1)
    5. pin13.write_digital(0)
    6. pin19.write_digital(1)
    7. while True:
    8.   num = 0
    9.   pin5.write_digital(0)
    10.   pin5.write_digital(1)
    11.   sleep(0.01)
    12.   if pin8.read_digital() != True:
    13.     pin5.write_digital(0)
    14.     pin5.write_digital(1)
    15.     sleep(0.01)
    16.   while pin8.read_digital():
    17.     num = num + 1
    18.   if num <= 8:
    19.     display.show(Image.ARROW_W)
    20.     pin11.write_digital(1)
    21.     pin12.write_digital(0)
    22.     pin13.write_digital(0)
    23.     pin19.write_digital(1)
    24.     sleep(1000)
    25.     display.show(Image.ARROW_N)
    26.     pin11.write_digital(0)
    27.     pin12.write_digital(1)
    28.     pin13.write_digital(0)
    29.     pin19.write_digital(1)
    复制代码
           接下来,我们一起来分析一下代码。
           通过上面的代码,不难发现,控制避障车前进的代码部分我们重复编写了两遍,在实际项目中这种写法是不合理的。为了让代码更加简洁,优雅,我们将控制前进的代码部分提取出来建立名称为Go()的函数,在需要执行前进的地方直接调用Go()函数即可。
    1. from microbit import *

    2. def Go():
    3.     display.show(Image.ARROW_N)
    4.     pin11.write_digital(0)
    5.     pin12.write_digital(1)
    6.     pin13.write_digital(0)
    7.     pin19.write_digital(1)

    8. Go()
    9. while True:
    10.     num = 0
    11.     pin5.write_digital(0)
    12.     pin5.write_digital(1)
    13.     sleep(0.01)
    14.     if pin8.read_digital() != True:
    15.         pin5.write_digital(0)
    16.         pin5.write_digital(1)
    17.         sleep(0.01)
    18.     while pin8.read_digital():
    19.         num = num + 1
    20.     if num <= 8:
    21.         display.show(Image.ARROW_W)
    22.         pin11.write_digital(1)
    23.         pin12.write_digital(0)
    24.         pin13.write_digital(0)
    25.         pin19.write_digital(1)
    26.         sleep(1000)
    27.         Go()
    复制代码
    按照同样的方式,我们将控制转向和检测障碍物的代码分别建立Turn()和Detection()函数。
    1. from microbit import *

    2. def Go():
    3.     display.show(Image.ARROW_N)
    4.     pin11.write_digital(0)
    5.     pin12.write_digital(1)
    6.     pin13.write_digital(0)
    7.     pin19.write_digital(1)

    8. def Turn():
    9.     display.show(Image.ARROW_W)
    10.     pin11.write_digital(1)
    11.     pin12.write_digital(0)
    12.     pin13.write_digital(0)
    13.     pin19.write_digital(1)

    14. def Detection():
    15.     num=0
    16.     pin5.write_digital(0)
    17.     pin5.write_digital(1)
    18.     sleep(0.01)
    19.     if pin8.read_digital() != True:
    20.         pin5.write_digital(0)
    21.         pin5.write_digital(1)
    22.         sleep(0.01)
    23.     while pin8.read_digital():
    24.         num = num + 1
    25.     return num
    26.    
    27. Go()
    28. while True:
    29.     num = Detection()
    30.     if num <= 8:
    31.         Turn()
    32.         sleep(1000)
    33.         Go()
    复制代码

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 19:19 , Processed in 0.118143 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.