[TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车

转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 

欢迎加入讨论群 64770604
 

一、实验器材

1、TPYboard V102板  一块

2、电机驱动模块L298N   一个 

3、电机 两块

4、小车底盘

5、超声波模块

65110屏  一块

 

二、超声波模块

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接口的OUT1OUT2与小车的一个电机的正负极连接起来,将电机2接口的OUT3OUT2与小车的另一个电机的正负极连接起来。然后将两边的接线端子,即供电正极(中间的接线端子为接地)连接TPYboardVIN,中间的接线端子即接地,连接TPYBoardGNDIn1-In4连接TPYBoardY1Y2Y3Y4,通过Y1,Y2Y3,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

posted @ 2017-03-18 22:21  小五义  阅读(4748)  评论(0编辑  收藏  举报