测试传感器
- 汽车耳朵(传感器)
-
- (一)超声传感器
-
- 超声波测距原理
- 超声模块代码
- (二)红外传感器
-
- 红外测距原理
- 红外传感器测试代码
汽车耳朵(传感器)
(一)超声传感器
超声传感器实物图, HC-SR04超声波模块具有性能稳定、测量距离准确、盲区小等特点,HC-SR04超声传感器有四个接口VCC、TRIG(触发)、ECHO(反馈)、GND。
超声波测距原理
超声波传感器。发生器主要由压电晶片和共振板组成。发生器接收脉冲信号,在电极上施加电压。通过压电晶体的简谐振动,共振板随压电晶体振动,从而实现超声波的发射。超声波接收器的原理过程与发生器相反。当两个电极之间没有额外的电压时,如果超声波反射到共振板上,当压电晶片振动时,它是超声波接收器。 超声测距原理公式: D = 回 响 时 间 ? 340 ? 100 2 D=\cfrac{回响时间*340*100}{2} D=2回响时间?340?100 可探测距离为2cm-400cm,测量角度为15° 从下图可以看到测距原理 如何用代码实现,了解原理。 超声波测距时,树莓派向TRIG发送高电平脉冲信号,脉冲信号持续时间为10us以上,然后模块会产生8个40Khz方波用于超声波ECHO端等待TRIG如果树莓派检测到发送的高电平,则判断是否有高电平输出。ECHO当检测到低电平时,端有高电平信号时,使用定时器计时。定时器获得的时间是超声波的回响时间,可以通过计算得到探测距离。
超声模块代码
使用python编程简单方便,可以看懂图片。如果引脚图,可以看树莓派 二自由度云台制作智能车(总)-准备和说明 输入终端命令: gpio readall
可获得引脚图 以下是超声波模块的代码,可以直接运行。记得接对PIN测试口。 建议设置名称ultrasonic.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # 超声传感器测距 import time import RPi.GPIO as GPIO class Ultrasonic(): def __init__(self,trigger,echo): #创建对象同时运行的初始函数 self.trigge = 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 + f c t g ( 90 ° − α ) D=\cfrac{f(L+X)}{L+fctg(90°-α)} D=L+fctg(90°−α)f(L+X) D为红外传感器到目标物体的距离,f为滤镜的焦距,L为偏移值,X为中心距,a表示发射角,c 表示红外线在空气中的传播速度 c = 3 ∗ 1 0 8 m / s c= 3*10^8m/s c=3∗108m/s红外传感器根据距离D产生相应的电压信号,由single引脚发送。当D大于测距范围上限时,无信号产生。
由于,选配的是夏普SP2Y0A21红外传感器。比较低端,白天有效探测距离一般为25cm左右,考虑到后期小车的车速问题,本文不用ADC模块,直接简单粗暴的使用。有意向的道友可研究寻迹、测距等功能。
红外传感器测试代码
建议设置名称infrared.py
#!/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个超声波传感器来进行测距从而选择避障策略。