樹莓派綜合項目2:智能小車(五)紅外避障

一、介紹

??閱讀本篇文章前建議先參考前期文章:
??樹莓派基礎(chǔ)實驗34:L298N模塊驅(qū)動直流電機實驗,學(xué)習(xí)了單個電機的簡單驅(qū)動秸应。
??樹莓派綜合項目2:智能小車(一)四輪驅(qū)動,實現(xiàn)了代碼輸入對四個電機的簡單控制腌且。
??樹莓派綜合項目2:智能小車(二)tkinter圖形界面控制,實現(xiàn)了本地圖形界面控制小車的前進后退榛瓮、轉(zhuǎn)向和原地轉(zhuǎn)圈铺董。
??樹莓派綜合項目2:智能小車(三)無線電遙控,實現(xiàn)了無線電遙控設(shè)備控制小車的前進后退禀晓、轉(zhuǎn)向和原地轉(zhuǎn)圈精续。
??樹莓派綜合項目2:智能小車(四)超聲波避障,實現(xiàn)了超聲波傳感器實時感知小車前方障礙物的距離粹懒,當(dāng)距離近于某個閾值時重付,小車自動減速,再低于某個閾值時自動剎車凫乖,然后倒車至安全距離确垫。

??本實驗中將使用HJ-IR2紅外光電傳感器弓颈,探測到物體即輸出脈沖,輸入到樹莓派中處理删掀,再對電機驅(qū)動模塊進行控制翔冀,實現(xiàn)壁障的功能,這樣的避障小車又稱為簡單的避障機器人披泪。

??其它基礎(chǔ)內(nèi)容可以參考文集:樹莓派基礎(chǔ)實驗纤子。

二、組件

★Raspberry Pi 3 B+全套*1

★睿思凱Frsky XM+ 迷你接收機*1

★電平反向器模塊*1

★睿思凱Frsky Taranis X9D PLUS SE2019遙控器*1

★L(fēng)298N擴展板模塊*1

★智能小車底板模塊*1

★減速電機和車輪*4

★HC-SR04超聲波模塊*1

★HJ-IR2紅外光電傳感器*2

★跳線若干

三款票、實驗原理

HJ-IR2紅外光電傳感器

??本實驗原理和超聲波避障相似控硼,紅外傳感器就是一個紅外對射開關(guān),通電狀態(tài)下艾少,紅外發(fā)射頭發(fā)射紅外信號卡乾,經(jīng)過目標反射后接收頭接收此信號,并輸出一個低電平信號姆钉,樹莓派采集這個低電平信號后采取相應(yīng)措施避障说订。

傳感器參數(shù)

探測距離調(diào)節(jié)

??若沒有被任何一個探頭檢測到障礙物,小車直行潮瓶;左邊探頭檢測到障礙物時小車向右轉(zhuǎn),右邊探頭檢測到障礙物時小車向左轉(zhuǎn)钙姊。

??關(guān)于紅外傳感器的基礎(chǔ)知識請參見樹莓派基礎(chǔ)實驗28:紅外避障傳感器實驗毯辅。

四、實驗步驟

??第1步: 連接電路煞额。這里對紅外避障外的連線方法不在累述思恐,請參考樹莓派綜合項目2:智能小車(四)超聲波避障

樹莓派(name) 樹莓派(BOARD) 紅外探測模塊
GPIO.21 29 左側(cè)紅外輸出
GPIO.22 31 右側(cè)紅外輸出
5V 5V 兩個模塊的VCC
GND GND 兩個模塊的GND
加裝紅外避障模塊的小車

??第2步: motor_4w.py膊毁,moving_control.py胀莹,sbus_receiver_pi.py,ultrasonic.py文件的編碼這里不再累述婚温,參考樹莓派綜合項目2:智能小車(四)超聲波避障描焰。

??第3步:編寫紅外探測模塊,文件名為infrared.py栅螟,與樹莓派基礎(chǔ)實驗28:紅外避障傳感器實驗中的Python程序基本相同荆秦,只是設(shè)置了類,重構(gòu)了程序力图。
infrared.py:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#本模塊只含Infrared()一個類步绸,用于紅外避障模塊測出是否有障礙物
#有障礙物時返回值0,無障礙物時返回值1

import RPi.GPIO as GPIO
import time
class Infrared():
    
    InfraredPinLeft = 29  #左側(cè)模塊的輸出連接樹莓派29號針腳
    InfraredPinRight = 31

    def setup(self):
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(Infrared.InfraredPinLeft, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(Infrared.InfraredPinRight, GPIO.IN, pull_up_down=GPIO.PUD_UP)

    def infra_detect(self):
        infra_left_value = 1
        infra_right_value = 1
        if (0 == GPIO.input(Infrared.InfraredPinLeft)):  #當(dāng)檢測到障礙物時吃媒,輸出低電平信號
            infra_left_value = 0
        if (0 == GPIO.input(Infrared.InfraredPinRight)):  #當(dāng)檢測到障礙物時瓤介,輸出低電平信號
            infra_right_value = 0
        return infra_left_value,infra_right_value
 
    def destroy(self):
        GPIO.cleanup()

if __name__ == "__main__":
    
    try:
        infrared = Infrared()
        infrared.setup()
        while True:
            infra_left_value,infra_right_value = infrared.infra_detect()
            print('infra_left_value=%d infra_right_value=%d'%(infra_left_value,infra_right_value) )
            time.sleep(0.1)
    except KeyboardInterrupt:
        infrared.destroy()

??第4步: 編寫樹莓派智能小車的主程序吕喘,文件名為smartcar.py,將這5個Python文件放入一個文件夾后刑桑,只運行本文件就可以了氯质。
??主程序中加入了infra_control()紅外避障函數(shù),實現(xiàn)了沒有障礙物時小車直行漾月;左邊探頭檢測到障礙物時小車向右轉(zhuǎn)病梢,右邊探頭檢測到障礙物時小車向左轉(zhuǎn)。
smartcar.py:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#本模塊為樹莓派小車的主程序梁肿,
from motor_4w import Motor_4w
from sbus_receiver_pi import SBUSReceiver
from moving_control import MovingControl
from ultrasonic import Ultrasonic
from infrared import Infrared
import time

acc_value_sbus_enable = 1 #使能是否執(zhí)行SBUS油門信號蜓陌,為0時使遙控器油門信號無效

sbus_receiver = SBUSReceiver('/dev/ttyAMA0') #初始化SBUS信號接收實例
smp_car = Motor_4w() #初始化電機控制實例
smp_car.setGPIO()  #初始化引腳

ENA_pwm = smp_car.pwm(smp_car.ENA) #初始化使能信號PWM,A為左邊車輪
ENB_pwm = smp_car.pwm(smp_car.ENB) #初始化使能信號PWM吩蔑,B為右邊車輪
    
smartcar = MovingControl(smp_car,ENA_pwm,ENB_pwm)  #初始化車輛運動控制實例

ultr = Ultrasonic() #初始化超聲波實例
ultr.setup()        #初始化超聲波引腳

infrared = Infrared()  #初始化紅外避障實例
infrared.setup()       #初始化紅外避障引腳

def ultra_control():
    '''超聲波傳感器控制'''
    global acc_value_sbus_enable
    dis = ultr.distance()
    print('distance= %.1f cm\n' %dis)
    if dis < 50:
    #當(dāng)障礙距離小于50cm時钮热,不執(zhí)行SBUS油門信號
        if smartcar.acc_value > 40:
        #當(dāng)障礙距離小于50cm,且油門大于40時烛芬,油門設(shè)定為40隧期,為防沖撞減速
            smartcar.acc_value = 40 
            smartcar.accelerator() #調(diào)節(jié)油門
    if dis < 10:
    #如果測距小于10cm時,先停車再倒車0.3秒
        smartcar.brake()
        smartcar.reverse()
        time.sleep(0.3)
        
def infra_control():
    '''紅外避障傳感器控制'''
    infra_left_value = 1       #值默認為1時赘娄,表示無障礙物
    infra_right_value = 1
    infra_left_value,infra_right_value = infrared.infra_detect()
    if infra_left_value == 0:  #值為0時仆潮,表示左側(cè)檢測到障礙物
        #smartcar.acc_value=80
        smartcar.accelerator(1,0)  #控制小車向右偏轉(zhuǎn)
        time.sleep(0.5)            #向右偏轉(zhuǎn)行進0.5秒
    if infra_right_value == 0:
        #smartcar.acc_value=80
        smartcar.accelerator(0,1)
        time.sleep(0.5)
    print('infra_left_value=%d infra_right_value=%d'%(infra_left_value,infra_right_value) )

def sbus_control():
    '''無線電控制'''
    sbus_receiver.update() #獲取一個完整的幀數(shù)據(jù)
    global acc_value_sbus_enable
            
    aileron_value = sbus_receiver.get_rx_channel(0) #1通道為副翼通道,這里控制車原地轉(zhuǎn)向
    elevator_value = sbus_receiver.get_rx_channel(1)#2通道為升降舵通道遣臼,這里控制車前進后退
    rudder_value = sbus_receiver.get_rx_channel(3)#4通道為方向舵通道性置,這里控制車左右偏移行進
    
    if acc_value_sbus_enable == 1:
    #使能SBUS信號的油門控制    
        acc_value_sbus = 172  #3通道,即油門的值揍堰,最低時為172        
        if sbus_receiver.get_rx_channel(2):
            acc_value_sbus = sbus_receiver.get_rx_channel(2) #3通道為油門通道鹏浅,這里控制車速度
        #將172~1811的油門通道值轉(zhuǎn)換為0~100的占空比信號,
        smartcar.acc_value = int(100*(acc_value_sbus-172)/(1811-172))
        print('original.acc_value=',smartcar.acc_value) #檢測SBUS信號的油門值
        
    ultra_control()  #超聲波避障
    infra_control()  #紅外避障
       
    print('disposed.acc_value=',smartcar.acc_value)  #檢測超聲波函數(shù)處理后的油門值
      
    if 970 < rudder_value < 1100: #沒有左右偏移時屏歹,中間值為992隐砸,但遙控器微調(diào)時會有上下浮動
        pass                    #沒有左右偏移時
    elif rudder_value >=1100:      #向右偏移行進時
        rate_right = (1811.0 - rudder_value)/(1811-1100) 
        #最大值一般為1811,這里使用浮點類型蝙眶,所以一定要使用1811.0
        smartcar.accelerator(1,rate_right)
    elif rudder_value <=970:       #向左偏移行進時
        rate_left = (rudder_value - 172.0)/(970-172)  
        #最小值為172季希,這里使用浮點類型,所以一定要使用172.0
        smartcar.accelerator(rate_left,1)
    print('elevator_value=%d,aileron_value=%d,rudder_value=%d'%(elevator_value,aileron_value,rudder_value))#測試數(shù)據(jù)用
            
    if aileron_value >= 1100:  #原地左轉(zhuǎn)彎
        smartcar.leftTurn()
        smartcar.accelerator()
    elif aileron_value <= 970: #原地右轉(zhuǎn)彎
        smartcar.rightTurn()
        smartcar.accelerator()
    else : 
        smartcar.brake()       #停車
                
    if elevator_value >=1100:  #前進
        smartcar.forward()
        
    elif elevator_value <=970: #后退
        smartcar.reverse()
        #循環(huán)最后械馆,這里不能再用停車了    

try:    
    
    while True:
        time.sleep(0.01)
        sbus_control()

except KeyboardInterrupt:  
    smp_car.destroy(ENA_pwm,ENB_pwm)
finally:
    smp_car.destroy(ENA_pwm,ENB_pwm)

這個項目的代碼90%是我原創(chuàng)瞎寫的胖眷,有需要參考的同學(xué)可以下載:
樹莓派智能小車項目python源代碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霹崎,隨后出現(xiàn)的幾起案子珊搀,更是在濱河造成了極大的恐慌,老刑警劉巖尾菇,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件境析,死亡現(xiàn)場離奇詭異囚枪,居然都是意外死亡,警方通過查閱死者的電腦和手機劳淆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門链沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沛鸵,你說我怎么就攤上這事括勺。” “怎么了曲掰?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵疾捍,是天一觀的道長。 經(jīng)常有香客問我栏妖,道長乱豆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任吊趾,我火速辦了婚禮宛裕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘论泛。我一直安慰自己揩尸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布屁奏。 她就那樣靜靜地躺著疲酌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪了袁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天湿颅,我揣著相機與錄音载绿,去河邊找鬼。 笑死油航,一個胖子當(dāng)著我的面吹牛崭庸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谊囚,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怕享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镰踏?” 一聲冷哼從身側(cè)響起函筋,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奠伪,沒想到半個月后跌帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體首懈,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年谨敛,在試婚紗的時候發(fā)現(xiàn)自己被綠了究履。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脸狸,死狀恐怖最仑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炊甲,我是刑警寧澤泥彤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蜜葱,受9級特大地震影響全景,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牵囤,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一爸黄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揭鳞,春花似錦炕贵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乓梨,卻和暖如春鳖轰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扶镀。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工蕴侣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臭觉。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓昆雀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝠筑。 傳聞我的和親對象是個殘疾皇子狞膘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354