[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM