资讯详情

树莓派+二自由度云台制作智能小车(二)——测试传感器

测试传感器

  • 汽车耳朵(传感器)
    • (一)超声传感器
      • 超声波测距原理
      • 超声模块代码
    • (二)红外传感器
      • 红外测距原理
      • 红外传感器测试代码

汽车耳朵(传感器)

(一)超声传感器

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

标签: sharp红外线传感器a21传感器微型对射传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台