树莓派+二自由度云台小车(二)--测试传感器
|Word count:1.3k|Reading time:4min|Post View:
小车的耳朵(传感器)
(一)超声波传感器
超声波传感器实物图,
HC-SR04超声波模块具有性能稳定,测量距离精确,盲区小的特点,HC-SR04超声波传感器具有四个接口,分别为VCC、TRIG(触发)、ECHO(反馈)、GND。
超声波测距原理
超声波传感器。主要是利用压电晶片和共振板构成发生器,发生器接受脉冲信号,施加电压于电极,通过压电晶体的简谐振动,共振板随压电晶体振动,从而实现超声波的发射。超声波接收器的原理过程与发生器相反,当没有外加电压施加在两电极之间时,若有超声波反射到共振板,压电晶片作振动时为超声波接收器。
超声波测距的原理公式:$$D=\cfrac{回响时间340100}{2}$$
可探测距离为2cm-400cm,测量角度为15°
具体从下图可见测距原理
怎么用代码实现呢,了解一下原理。
超声波进行测距时,树莓派向TRIG发送高电平的脉冲信号,并且脉冲信号时长需要在10us以上,然后模块会产生8个40Khz的方波,用于之后在超声波ECHO端等待TRIG发送的高电平,判断是否有高电平输出,如果树莓派检测到ECHO端有高电平信号,则使用定时器进行计时,当检测为低电平时结束计时。定时器所得时间为超声波的回响时间,通过计算即可得到探测距离。
超声波模块代码
使用python编程,简单方便,看的懂图就可以了。引脚图的话,可以看树莓派+二自由度云台制作智能小车(总)——准备及说明
在终端输入命令:
gpio readall
可得到引脚图
下面是超声波模块的代码,可直接运行,记得接对PIN口进行测试。
建议设置名称ultrasonic.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
import time import RPi.GPIO as GPIO
class Ultrasonic(): def __init__(self,trigger,echo): self.trigger = trigger self.echo = echo GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) 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) 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) start = time.time() self.wait_for_echo(False,10000) finish = time.time() pulse_len = finish-start distance_cm = pulse_len/0.000058 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=L+fctg(90°−α)f(L+X)
D为红外传感器到目标物体的距离,f为滤镜的焦距,L为偏移值,X为中心距,a表示发射角,c 表示红外线在空气中的传播速度$$c= 3*10^8m/s$$红外传感器根据距离D产生相应的电压信号,由single引脚发送。当D大于测距范围上限时,无信号产生。
由于,选配的是夏普SP2Y0A21红外传感器。比较低端,白天有效探测距离一般为25cm左右,考虑到后期小车的车速问题,本文不用ADC模块,直接简单粗暴的使用。有意向的道友可研究寻迹、测距等功能。
红外传感器测试代码
建议设置名称infrared.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
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: return 'OK' else: return 'Warning' if __name__ =="__main__": a = Infrared(20) while True: print(a.check_distance()) time.sleep(1) GPIO.cleanup()
|
使用首先测试传感器是为了后续小车自动避障策略的一个设计,方便测试。也可选用3个超声波传感器来进行测距从而选择避障策略。