极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15383|回复: 0

Micropython实例之DIY超声波避障小车

[复制链接]
发表于 2018-6-5 10:36:20 | 显示全部楼层 |阅读模式
    当今发达的交通在给人们带来便捷的同时也带来了许多的交通事故。人们遇到紧急事情处理超时是造成因素的主要原因之一。如果我们的汽车更加智能,事先能预测并显示前面障碍物距离车的距离,当障碍物距离车很近的时候自动采取一些措施来避开障碍物,这样就能在很大程度上避免事故的发生,下面我来带大家做一个智能的避障小车。
下方可查看演示视频!

    一、实验器材

    1、TPYboard V102板  1块
    2、电机驱动模块L298N   1个
    3、电机 2块
    4、小车底盘 1个
    5、超声波模块 1个
    6、舵机 1个
    7、SG90舵机支架 1个
    8、超声波云台支架 1个



    二、超声波模块

    什么是超声波模块

    超声波传感器是利用超声波的特性研制而成的传感器, 它是通过传送一个超声波(远高于人的听觉范围)和提供一个对应于爆裂回声返回到传感器所需时间的输出脉冲来工作的。超声波传感器在非接触性测量方面的应用非常广泛,如检测液体水位(特别是具有腐蚀性的液体,如硫酸、硝酸液体),汽车倒车防撞系统,金属/非金属探伤等,都可以用到超声波距离传感器。

    超声波模块测距的原理

    采用IO口TRIG触发测距,给最少10us的高电平信呈。
    模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回。

    (3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
    如下图接线,VCC 供 5V电源, GND 为地线,TRIG 触发控制信号输入,接板子的X9,ECHO 回响信号输出,接板子的X10,四个接口端。




    三、电机驱动模块

    什么是电机驱动模块

    电机驱动模块主要是可以控制电机的运行:调速、运行、停止、步进、匀速等操作。

    L298N的使用方法

    L298N模块是2路的H桥驱动,所以可以同时驱动两个电机,接法如图所示使能ENA ENB之后,可以分别从IN1 IN2输入PWM信号驱动电机1的转速和方向,可以分别从IN3 IN4输入PWM信号驱动电机2的转速和方向。我们将电机1接口的OUT1与OUT2与小车的一个电机的正负极连接起来,将电机2接口的OUT3与OUT2与小车的另一个电机的正负极连接起来。然后将两边的接线端子,即供电正极(中间的接线端子为接地)连接TPYboard的VIN,中间的接线端子即接地,连接TPYBoard的GND,In1-In4连接TPYBoard的X1,X2,Y1,Y2,通过X1,X2与Y1,Y2的高低电平,来控制电机的转动,从而让小车前进,后退,向左,向右。




    四、舵机

    概述

    舵机也叫伺服电机,最早用于船舶上实现其转向功能,由于可以通过程序连续控制其转角,因而被广泛应用智能小车以实现转向以及机器人各类关节运动中,如下图所示。




    2、舵机的组成

    一般来讲,舵机主要由以下几个部分组成,舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等,如下图所示。



    舵机的输入线共有三条,红色中间,是电源线,一边灰色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V对应的要大一些,具体看应用条件;另外一根线是控制信号线,Futaba的一般为白色,JR的一般为桔黄色。另外要注意一点,SANWA的某些型号的舵机引线电源线在边上而不是中间,需要辨认。但记住红色为电源,灰色为地线,剩下的一根为信号线,一般不会搞错。本实验中,舵机红色接TPYBoard v102+的VIN引脚,灰色接TPYBoard v102+的GND引脚,剩下的橙色是信号线,接TPYBoard V102+的X3针脚。TPYBoard v102+ 的X1、X2、X3、X4为信号引脚。




    3、舵机工作原理

    控制电路板接受来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机转动的方向和速度,从而达到目标停止。其工作流程为:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。

    五、伺服电机的构造函数与方法

    1.构造函数
    pyb.Servo(id)
    在这id为1-4,对应TPYBoard v102+的X1-X4。

    2.方法
    Servo.angle([angle,time = 0 ])
    如果没有给出参数,则该函数返回当前角度。
    如果给出参数,则该函数设置伺服角度:

    angle 是以度数移动的角度。
    time是达到指定角度所需的毫秒数。如果省略,则伺服器尽可能快地移动到其新位置。
    Servo.speed([speed, time=0])
    如果没有给出参数,则该函数返回当前速度。
    如果给出参数,则该功能设置伺服的速度:
    speed 是在-100到100之间变化的速度。
    time是达到指定速度所需的毫秒数。如果省略,则伺服器尽可能快地加速。
    Servo.pulse_width([value ]) <http://docs.micropython.org/en/l ... rary/pyb.Servo.html>
    如果没有给出参数,该函数返回当前的原始脉冲宽度值。
    如果给出参数,则该函数设置原始脉冲宽度值。
    Servo.calibration([pulse_min,pulse_max,pulse_centre [,pulse_angle_90,pulse_speed_100 ]])
    如果没有给出参数,则该函数返回当前的校准数据,作为5元组。
    如果给出参数,该功能设置时序校准:
    pulse_min 是允许的最小脉冲宽度。
    pulse_max 是允许的最大脉冲宽度。
    pulse_centre 是对应于中心/零位置的脉冲宽度。
    pulse_angle_90 是对应于90度的脉冲宽度。
    pulse_speed_100 是对应于速度100的脉冲宽度。

    六、硬件接线图

TPYBoard v102        超声波模块        舵机        L298N驱动模块
VIN        VCC               
GND        GND               
X9        Trig               
X10        Echo               
VIN                红       
GND                灰       
X3                橙       
X1                        In1
X2                        In2
Y1                        In3
Y2                        In4
VIN                        +12V
GND                        GND
VIN                        +5V



    七、实验效果

   [media=swf,500,375] [/media]

    八、源代码
  1. # main.py -- put your code here!
  2. import pyb
  3. from pyb import Pin
  4. from pyb import Timer
  5. from pyb import servo

  6. x1 = Pin('X1', Pin.OUT_PP)
  7. x2 = Pin('X2', Pin.OUT_PP)
  8. y1 = Pin('Y1', Pin.OUT_PP)
  9. y2 = Pin('Y2', Pin.OUT_PP)
  10. Trig = Pin('X9',Pin.OUT_PP)
  11. Echo = Pin('X10',Pin.IN)

  12. num=0
  13. flag=0
  14. run=1
  15. zuo=0
  16. qian=0
  17. you=0
  18. distance=0
  19. def start(t):
  20.     global flag
  21.     global num
  22.     if(flag==0):
  23.         num=0
  24.     else:
  25.         num=num+1
  26. def stop(t):
  27.     global run
  28.     if(run==0):
  29.         run=1
  30. start1=Timer(1,freq=10000,callback=start)
  31. stop1=Timer(4,freq=2,callback=stop)

  32. #小车左转
  33. def left():
  34.     x1.high()
  35.     x2.low()
  36.     y1.high()
  37.     y2.low()
  38. #小车前进
  39. def go():
  40.     x1.high()
  41.     x2.low()
  42.     y1.low()
  43.     y2.high()
  44. #小车后退
  45. def back():
  46.     x1.low()
  47.     x2.high()
  48.     y1.high()
  49.     y2.low()
  50. #小车右转
  51. def right():
  52.     x1.low()
  53.     x2.high()
  54.     y1.low()
  55.     y2.high()
  56. #小车停止
  57. def stop():
  58.     x1.low()
  59.     x2.low()
  60.     y1.low()
  61.     y2.low()
  62. #控制舵机向右、向左、向前
  63. def servo():
  64.     global distance
  65.     global zuo
  66.     global you
  67.     global qian
  68.     servo3=pyb.Servo(3)
  69.     #向右75旋转
  70.     servo3.angle(-75,500)
  71.     pyb.delay(1000)
  72.     ceju()
  73.     you=distance
  74.     print('you',you)
  75.     #向左转75度
  76.     servo3.angle(75,500)
  77.     pyb.delay(1000)
  78.     ceju()
  79.     zuo=distance
  80.     print('zuo',distance)
  81.     #转到0度
  82.     servo3.angle(0,500)
  83.     pyb.delay(1000)
  84.     ceju()
  85.     qian=distance
  86.     print('qian',distance)
  87.     #返回正前方、左前方、右前方的距离
  88.     return qian,zuo,you
  89. #测距方法
  90. def  ceju():
  91.     global flag
  92.     global num
  93.     global run
  94.     global distance
  95.     if(run==1):
  96.         Trig.value(1)
  97.         pyb.udelay(100)
  98.         Trig.value(0)
  99.         while(Echo.value()==0):
  100.             Trig.value(1)
  101.             pyb.udelay(100)
  102.             Trig.value(0)
  103.             flag=0
  104.         if(Echo.value()==1):
  105.             flag=1
  106.             while(Echo.value()==1):           
  107.                 flag=1
  108.         if(num!=0):
  109.             #测距
  110.             distance=num/10000*34299/2
  111.             #print('Distance:')
  112.             #print(distance,'cm')
  113.             pyb.delay(500)
  114.         flag=0
  115.         run=0
  116.     return distance
  117. def main():
  118.     global distance
  119.     global zuo
  120.     global you
  121.     global qian
  122.     servo3=pyb.Servo(3)
  123.     servo3.angle(0,500)
  124.     pyb.delay(1000)
  125.     ceju()
  126.     while 1==1:
  127.         ceju()、
  128.         #前方距离大于40cm前进
  129.         if distance > 40:
  130.             go()
  131.             ceju()
  132.             print('juli',distance)
  133.         #前方距离小于40cm
  134.         if distance <= 40:
  135.             stop()
  136.             back()
  137.             pyb.delay(500)
  138.             stop()
  139.             servo()
  140.             #如果右前方距离大于左前方
  141.             if you>zuo:
  142.                 right()
  143.                 pyb.delay(400)
  144.                 ceju()
  145.             #如果左前方距离大于右前方
  146.             if zuo>you:
  147.                 left()
  148.                 pyb.delay(400)
  149.                 ceju()
  150.             #如果所有方向距离全部小于15cm
  151.             if zuo<15 and you< 15 and qian<15 :
  152.                 stop()
  153.                 back()
  154.                 pyb.delay(800)
  155.                 stop()
  156.                 ceju()
  157.             #有一个方向距离小于5CM
  158.             if zuo<5 or you <5 or qian<5:
  159.                 stop()
  160.                 back()
  161.                 pyb.delay(800)
  162.                 stop()
  163.                 ceju()
  164. main()
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 16:36 , Processed in 0.043918 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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