超声波传感器能检测与前方障碍物间的距离,如果将它固定于360度旋转的舵机上持续采样,就能将采样获取的数据绘制成雷达图进行动态展示。
01
实验器材及连接
树莓派3B+和古德微扩展板各一块,HC-SR04超声波传感器一个,4路8线电滑环一个,360度舵机一个,红色、绿色LED灯各一支;还需要电烙铁和热熔枪各一把。
用热熔枪将滑环中央的转子底端与舵机输出转子进行固定,注意二者的中心点要尽量吻合,防止旋转时偏心。再将滑环中央转子的顶端与超声波传感器顶端固定好,也要中心对齐。接着,将滑环外围的定子圈的四根线与古德微扩展板的20和21号(共四个引脚)进行连接,红线接电源正极VCC,黑线接地GND,橙红色线接Trig信号发射端,棕色线接Echo信号回声端。滑环中央转子4根引线分别与超声波传感器的四个引脚进行对应连接(电烙铁点锡);将舵机固定好之后,连接线插入扩展板的18号引脚,注意黑色、红色和棕黄色三根线分别与GND、VCC和信号控制D端连接;然后,将红色和绿色LED灯按照“长腿正、短腿负”的规则分别插入扩展板的5号和6号引脚;最后,给树莓派插入数据线,通电启动操作系统(如图1)。
02
Python代码编程
(1)库模块的导入与变量初始化
首先,导入GPIOZero、MatplotLib等库模块:“from gpiozero import LED,Servo,DistanceSensor”“import numpy as np”“import matplotlib”“import matplotlib.pyplot as plt”和“import time”;然后进行LED灯、舵机和超声波传感器实例的初始化操作:“Red_LED=LED(5)”“Green_LED=LED(6)”“servo=Servo(18)”
和“sensor=DistanceSensor(echo=21,trigger=20,max_distance=4)”,并且通过语句“servo.mid()”控制360度舵机以中速带动超声波传感器向一个方向开始旋转;再设置雷达图绘制画布的宽度和高度,大小分别为8和6(单位为英寸):“plt.figure(figsize=(8,6))”;建立变量ax,赋值为“plt.subplot(111, projection='polar')”,作用是设置画图样式为“极坐标”模式(Polar);建立变量theta,赋值为“np.arange(0,2*np.pi,2*np.pi/30)”,通过调用Numpy库中的arange()函数返回一个起点为0、终点为2Pi(360度圆周)的等差数列,固定步长为2Pi/30;语句“plt.ion()”的作用是将figure绘图设置为交互模式;建立变量data,赋值为空列表“[]”,作用是存放超声波传感器每旋转360度一周扫描后检测生成的若干个与前方障碍物的间距值(如图2)。
(2)“while True:”循环体
如果超声波传感器检测的障碍间距值在安全范围内(比如20cm),则控制绿色LED灯常亮:“Green_LED.on()”;在每次旋转360度的过程中,需要获取30个值与之前产生的等差数列30个刻度值对应:“for i in range(30):”;建立变量distance,赋值为“round(sensor.distance,4)”,获取检测到的障碍间距数据(保留4位小数),并且通过语句“print(i,distance)”进行输出监测;在“if distance
进入下一次循环(range),30次循环结束之后,开始绘制雷达图:语句“ax.plot(theta,data,'o--',color='g',label='data',linewidth=1)”对极坐标进行数据设置,包括30个0至360度的等差刻度值、30个超声波检测障碍间距值(data列表)、线的模式(虚线)、颜色(Green绿色)和线宽(linewidth)等;语句“ax.fill(theta,data,facecolor='g',alpha=0.15)”是对30个障碍间距值与极坐标中心点围成的封闭区域进行设置,包括填充颜色和透明度等;语句“plt.pause(0.1)”的作用是控制交互式绘图过程中数据更新的预留时间缓冲,预防出现图形不能及时刷新显示的问题;语句“plt.cla()”的作用是清除当前活动轴的数据内容(相当于清空操作),语句“plt.show()”的作用是绘制显示图像,语句“data.clear()”的作用是清除data列表中的当前数据,为下一次循环保存新数据“留空”(如图3)。
3.测试超声波动态雷达
将程序保存为Radar.py,点击“运行”按钮进行超声波动态雷达的测试。超声波传感器在舵机的带动下开始匀速旋转,程序界面中也不断有“0 0.2698”“23 0.3555”等信息出现,表示每次旋转一周所监测到的30个障碍间距值;同时,绿色LED灯亮起,如果出现有近距离的障碍物(在20cm范围内),则会亮起红色LED灯。超声波传感器每旋转一周,就会出现一个雷达极坐标图,绘制有每个点所处的二维空间位置(角度值)和距离中心的半径大小(障碍物间距值),同时在这些坐标点所包围生成的封闭区域内,雷达图是以一定透明度的绿色来展示的。随着超声波传感器的不停旋转,同时在其周围变换出现各种障碍物,整个雷达图也在不断发生变化(如图4)。
编辑|张毅
审核|吴新
领取专属 10元无门槛券
私享最新 技术干货