小车的耳朵(传感器)

(一)超声波传感器

超声波传感器实物图,
HC-SR04超声波传感器
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
#!/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= 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
#!/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个超声波传感器来进行测距从而选择避障策略。