[TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi
一、实验器材
1、TPYboard V102板 一块
2、电机驱动模块L298N 一个
3、电机 两块
4、小车底盘
5、超声波模块
6、5110屏 一块
二、超声波模块
1、什么是超声波模块
超声波传感器是利用超声波的特性研制而成的传感器, 它是通过传送一个超声波(远高于人的听觉范围)和提供一个对应于爆裂回声返回到传感器所需时间的输出脉冲来工作的。超声波传感器在非接触性测量方面的应用非常广泛,如检测液体水位(特别是具有腐蚀性的液体,如硫酸、硝酸液体),汽车倒车防撞系统,金属/非金属探伤等,都可以用到超声波距离传感器。
2、超声波模块测距的原理
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回。
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
三、实验一:超声波模块测距,用5110来显示
1、连线方法
(1)超声波模块连接方法
VCC 供 5V电源, GND 为地线,TRIG 触发控制信号输入,接板子的X2,ECHO 回响信号输出,接板子的X1,四个接口端。
(2)5110连线及使用方法
具体见:http://www.cnblogs.com/xiaowuyi/p/6347336.html
2、原代码
导入font.py文件和upcd8544.py文件,编写main.py
main.py的代码如下:
import pyb from pyb import Pin from pyb import Timer import upcd8544 from machine import SPI,Pin Trig = Pin('X2',Pin.OUT_PP) Echo = Pin('X1',Pin.IN) num=0 flag=0 run=1 def start(t): global flag global num if(flag==0): num=0 else: num=num+1 def stop(t): global run if(run==0): run=1 start1=Timer(1,freq=10000,callback=start) stop1=Timer(4,freq=2,callback=stop) while True: if(run==1): SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in) #CLK =>SPI(1).SCK 'X6' SPI clock RST = pyb.Pin('Y10') CE = pyb.Pin('Y11') DC = pyb.Pin('Y9') LIGHT = pyb.Pin('Y12') lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT) Trig.value(1) pyb.udelay(100) Trig.value(0) while(Echo.value()==0): Trig.value(1) pyb.udelay(100) Trig.value(0) flag=0 if(Echo.value()==1): flag=1 while(Echo.value()==1): flag=1 if(num!=0): #print('num:',num) distance=num/10000*34299/2 print('Distance:') print(distance,'cm') lcd_5110.lcd_write_string('Distance',0,0) lcd_5110.lcd_write_string(str(distance),0,1) lcd_5110.lcd_write_string('cm',50,1) flag=0 run=0
3、效果
(1)靠近障碍物
(2)远离障碍物
四、实验二:避障小车
1、什么是电机驱动模块
电机驱动模块主要是可以控制电机的运行:调速、运行、停止、步进、匀速等操作
2、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的Y1,Y2,Y3,Y4,通过Y1,Y2与Y3,Y4的高低电平,来控制电机的转动,从而让小车前进,后退,向左,向右。
3、利用底盘+V102+超声波+L298N当小车往前开时,遇到障碍会自己拐弯,躲避
(1)原代码 main,py文件
# main.py -- put your code here! import pyb from pyb import Pin from pyb import Timer def start(t): global flag global num if(flag==0): num=0 else: num=num+1 def stop(t): global run if(run==0): run=1 def left(): x1.high() x2.low() y1.high() y2.low() def go(): x1.high() x2.low() y1.low() y2.high() def back(): x1.low() x2.high() y1.high() y2.low() def right(): x1.low() x2.high() y1.low() y2.high() def stop(): x1.low() x2.low() y1.low() y2.low() Trig = Pin('X9',Pin.OUT_PP) Echo = Pin('X10',Pin.IN) num=0 flag=0 run=1 start1=Timer(1,freq=10000,callback=start) stop1=Timer(4,freq=2,callback=stop) x1 = Pin('X1', Pin.OUT_PP) x2 = Pin('X2', Pin.OUT_PP) y1 = Pin('Y1', Pin.OUT_PP) y2 = Pin('Y2', Pin.OUT_PP) while True: if(run==1): Trig.value(1) pyb.udelay(100) Trig.value(0) while(Echo.value()==0): Trig.value(1) pyb.udelay(100) Trig.value(0) flag=0 if(Echo.value()==1): flag=1 while(Echo.value()==1): flag=1 if(num!=0): #print('num:',num) distance=num/10000*34299/2 print('Distance') print(distance,'cm') if distance>=20: go() if distance<=20: stop() back() flag=0 run=0
(2)实现效果
以上视频如果浏览不了,请访问http://admin.turnipsmart.com/IMG_3362.mp4