一、介紹
??閱讀本篇文章前建議先參考前期文章:
??樹莓派基礎(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
★跳線若干
三款票、實驗原理
??本實驗原理和超聲波避障相似控硼,紅外傳感器就是一個紅外對射開關(guān),通電狀態(tài)下艾少,紅外發(fā)射頭發(fā)射紅外信號卡乾,經(jīng)過目標反射后接收頭接收此信號,并輸出一個低電平信號姆钉,樹莓派采集這個低電平信號后采取相應(yīng)措施避障说订。
??若沒有被任何一個探頭檢測到障礙物,小車直行潮瓶;左邊探頭檢測到障礙物時小車向右轉(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源代碼下載