小車的耳朵(傳感器)
(一)超聲波傳感器
超聲波傳感器實物圖,
HC-SR04超聲波模塊具有性能穩定,測量距離精確,盲區小的特點,HC-SR04超聲波傳感器具有四個接口,分別爲VCC、TRIG(觸發)、ECHO(反饋)、GND。
超聲波測距原理
超聲波傳感器。主要是利用壓電晶片和共振板構成發生器,發生器接受脈衝信號,施加電壓於電極,通過壓電晶體的簡諧振動,共振板隨壓電晶體振動,從而實現超聲波的發射。超聲波接收器的原理過程與發生器相反,當沒有外加電壓施加在兩電極之間時,若有超聲波反射到共振板,壓電晶片作振動時爲超聲波接收器。
超聲波測距的原理公式:
可探測距離爲2cm-400cm,測量角度爲15°
具體從下圖可見測距原理
怎麼用代碼實現呢,瞭解一下原理。
超聲波進行測距時,樹莓派向TRIG發送高電平的脈衝信號,並且脈衝信號時長需要在10us以上,然後模塊會產生8個40Khz的方波,用於之後在超聲波ECHO端等待TRIG發送的高電平,判斷是否有高電平輸出,如果樹莓派檢測到ECHO端有高電平信號,則使用定時器進行計時,當檢測爲低電平時結束計時。定時器所得時間爲超聲波的迴響時間,通過計算即可得到探測距離。
超聲波模塊代碼
使用python編程,簡單方便,看的懂圖就可以了。引腳圖的話,可以看樹莓派+二自由度雲臺製作智能小車(總)——準備及說明
在終端輸入命令:
gpio readall
可得到引腳圖
下面是超聲波模塊的代碼,可直接運行,記得接對PIN口進行測試。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 使用超聲波傳感器測距
import time
import RPi.GPIO as GPIO
class Ultrasonic():
def __init__(self,trigger,echo): #創建對象同時運行的初始化函數
self.trigger = trigger
self.echo = echo
GPIO.setmode(GPIO.BCM) #不用BOARD編碼,因爲後面用的引腳多了,會報錯。
GPIO.setwarnings(False) #關閉GPIO的警告
GPIO.setup(self.trigger,GPIO.OUT)
GPIO.setup(self.echo,GPIO.IN)
def send_trigger_pulse(self): #扣動扳機
GPIO.output(self.trigger,True)
time.sleep(0.00015) #delay 15us
GPIO.output(self.trigger,False)
def wait_for_echo(self,value,timeout): #等待聲波返回
count = timeout
while GPIO.input(self.echo) != value and count>0:
count = count-1
def get_distance(self):
self.send_trigger_pulse()
self.wait_for_echo(True,10000) #delay 25us-100`ms
start = time.time()
self.wait_for_echo(False,10000)
finish = time.time()
pulse_len = finish-start
distance_cm = pulse_len/0.000058 # =*340*100(cm)/2
return distance_cm
if __name__ == "__main__":
while True:
sonic_l = Ultrasonic(25,12)
print("距離 = %.2f cm"%sonic_l.get_distance())
time.sleep(1)
GPIO.cleanup()
(二)紅外傳感器
紅外測距原理
該模塊有3個引腳,分別對應黃色Signal信號腳、黑色GND工作地、紅色VCC+5V電源輸入。Single信號腳接樹莓派物理接口pin38(BCM編碼20),當探測到前方有障礙物時,產生不同的電壓信號,在使用時通常配合ADC數模轉換器進行精確測距,測距原理圖如圖3-19所示,理論測距範圍爲0至80cm。由於環境及設備實際使用情況,測得實際探測距離爲0至25cm,由於探測距離原因,本系統未使用ADC數模轉換,當紅外傳感器探測前方有障礙物時,樹莓派獲取信號,即判定前方25cm處有障礙物。
探測距離公式
D爲紅外傳感器到目標物體的距離,f爲濾鏡的焦距,L爲偏移值,X爲中心距,a表示發射角,c 表示紅外線在空氣中的傳播速度紅外傳感器根據距離D產生相應的電壓信號,由single引腳發送。當D大於測距範圍上限時,無信號產生。
由於,選配的是夏普SP2Y0A21紅外傳感器。比較低端,白天有效探測距離一般爲25cm左右,考慮到後期小車的車速問題,本文不用ADC模塊,直接簡單粗暴的使用。有意向的道友可研究尋跡、測距等功能。
紅外傳感器測試代碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 使用紅外傳感器探測障礙
import RPi.GPIO as GPIO
import time
import configparser
class Infrared():
def __init__(self,pin):
self.single = pin
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(self.single,GPIO.IN)
def check_distance(self):
if GPIO.input(self.single)==0:
#warn()
return 'OK'
#20CM
else:
return 'Warning'
if __name__ =="__main__":
a = Infrared(20)
while True:
print(a.check_distance())
time.sleep(1)
GPIO.cleanup()
使用首先測試傳感器是爲了後續小車自動避障策略的一個設計,方便測試。也可選用3個超聲波傳感器來進行測距從而選擇避障策略。