树莓派+二自由度云台小车(二)--测试传感器
|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
| 12
 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
| 12
 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个超声波传感器来进行测距从而选择避障策略。