樹莓派+二自由度雲臺製作智能小車(二)——測試傳感器

小車的耳朵(傳感器)

(一)超聲波傳感器

超聲波傳感器實物圖,
HC-SR04超聲波傳感器
HC-SR04超聲波模塊具有性能穩定,測量距離精確,盲區小的特點,HC-SR04超聲波傳感器具有四個接口,分別爲VCC、TRIG(觸發)、ECHO(反饋)、GND。

超聲波測距原理

超聲波傳感器。主要是利用壓電晶片和共振板構成發生器,發生器接受脈衝信號,施加電壓於電極,通過壓電晶體的簡諧振動,共振板隨壓電晶體振動,從而實現超聲波的發射。超聲波接收器的原理過程與發生器相反,當沒有外加電壓施加在兩電極之間時,若有超聲波反射到共振板,壓電晶片作振動時爲超聲波接收器。
超聲波發生器結構
超聲波測距的原理公式:D=3401002D=\cfrac{迴響時間*340*100}{2}
可探測距離爲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)L+fctg(90°α) D=\cfrac{f(L+X)}{L+fctg(90°-α)}
D爲紅外傳感器到目標物體的距離,f爲濾鏡的焦距,L爲偏移值,X爲中心距,a表示發射角,c 表示紅外線在空氣中的傳播速度c=3108m/sc= 3*10^8m/s紅外傳感器根據距離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個超聲波傳感器來進行測距從而選擇避障策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章