极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4333|回复: 0

Micropython Turniobit 会思考的避障车

[复制链接]
发表于 2018-3-14 10:13:36 | 显示全部楼层 |阅读模式
什么是会思考的避障车?                                                      
在日常生活中,大家会经常见到各种各样的遥控车,它需要我们人为的操作,控制它的前进、后退和转弯。今天就带大家认识一个不一样的新朋友——会思考的避障车。
会思考的避障车和我们平时的遥控车最主要的区别就是智能化,它可以不需要我们去操控,自己就能行走。同时它还会实时检测前方是否有障碍物,思考自己是否要前进或者转弯。
听到这里,是不是已经跃跃欲试了呢。话不多说,动起手来吧!

所需器材:
Ø  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. Go()
  27. while True:
  28. num = Detection()
  29. if num <= 8:
  30. Turn()
  31. sleep(1000)
  32. Go()
复制代码


回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-7-7 15:20 , Processed in 0.051923 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表