首页资讯科技 树莓派超声波测距代码

树莓派超声波测距代码

牟晓东在开源硬件编程中,我们都会实时获取测量生成的实验数据,比如温湿度传感器对环境温度和湿度进行监测而产生的数据。通常情况下,我们会先将这些实验数据写入文件(比如CSV格式文件),然后进行数据整理,再绘制拟合图像,最终总结得出实验结论。其实…

树莓派超声波测距代码

牟东

在开源的硬件编程中,我们都是实时获取测量产生的实验数据,比如温湿度传感器监测环境温湿度产生的数据。通常我们会先把这些实验数据写入一个文件(比如CSV格式的文件),然后整理数据,再绘制拟合图像,最后得出实验结论。其实对于一些非常直观的测量数据,我们可以“跳过”数据整理,直接“画”出来,以动态曲线的形式显示出来。以超声波传感器的“测距值”为例,我们在Raspberry Pi中利用Python代码编程和Goodmicro“积木”图形化编程,实现了超声波测距轨迹曲线的动态绘制。

实验器材包括树莓派3B+和古德微扩展板各一块,HC-SR04超声波传感器一个,移动电源一个。首先,将超声波传感器的四个引脚(VCC、Trig、Echo和GND)对应插入扩展板的20和21号引脚,方向朝外;然后,通过数据线将树莓派与移动电源连接,通电,启动操作系统(如图1)。

实验设备包括树莓皮3B+和古德微扩展板、HC-SR04超声波传感器和移动电源。首先将超声波传感器的四个引脚(VCC、三角、回声、GND)插入扩展板的20号和21号引脚,朝外;然后,通过数据线将树莓Pi与移动电源连接,开机,启动操作系统(如图1)。

1.编写Python代码绘制超声波测距轨迹曲线

1.远程登录Raspberry Pi,导入要使用的库模块。

运行Windows的“远程桌面连接”,输入树莓派的IP地址(比如192.168.1.116),登录成功后点击“编程”-“Thonny Python IDE”菜单,启动Python编辑器,导入库模块:“import numpy as np”、“import matplotlib.pyplot as plt”、“from matplotlib import animation”、“from gpiozero import DistanceSensor”和“import time”(如图2),其中的numpy、matplotlib.pyplot和animation是负责数据生成和绘制曲线图像的,gpiozero库中DistanceSensor类是用来控制超声波传感器的。

运行Windows的“远程桌面连接”,输入Raspberry Pi的IP地址(如192.168.1.116),成功登录后点击“编程”-“T honny Python IDE”菜单,启动Python编辑器。导入库模块:导入numpy为np,导入matplotlib.pyplot为plt,从matplotlib导入动画,“从gpiozero导入DistanceSensor”和“导入时间”(如图2),其中numpy、matplotlib.pyplot和animation负责数据生成和曲线图像绘制,gpio zero库中的距离传感器类用于控制超声波传感器。

2.初始化和数据采集

首先建立变量sensor实例化超声波传感器的类:“sensor = DistanceSensor(echo=21,trigger=20,max_distance=4)”。注意“echo=21”和“trigger=20”分别对应超声波传感器的信号恢复和传输引脚号21和20。“max_distance=4”的作用是将超声波传感器的最大探测距离设置为4(单位为“米”)。如果没有设置,最多只能测量1米的极限值(HC-SR04超声波传感器可以提供2cm-400cm的非接触式距离感应功能)。

接着,进行图像绘制前的数据准备,横坐标x是通过numpy库中的linspace()来生成,范围为从0至100:“x = np.linspace(0,100,100)”;纵坐标y先设置为一个“空列表”:“y = []”,建立变量dis,作用是保存超声波传感器的“测距”值,初值为0:“dis = 0”;然后建立一个for循环结构(for i in range(100):),其中的第一行语句“dis = round(sensor.distance,2)”作用是为变量dis赋值,通过round()函数来保留两位小数;第二行语句“print(dis)”是将dis保存的测距值在屏幕上同步输出显示;第三行语句“y.append(dis)”作用是将测距值追加至列表y中;第四行语句“time.sleep(0.1)”是控制程序暂停0.1秒钟,然后进入下一次循环,获取下一个测距值(如图3)。

然后,在绘制图像之前准备数据。横坐标X由numpy库中的linspace()生成,范围从0到100:“X = NP。Linspace (0,100,100)”;y坐标先设置为“空list”:“y =[]”,建立一个变量dis,用来保存超声波传感器的“测距”值,初始值为0:“DIS = 0”;然后建立一个for循环结构(对于range(100)中的I):,其中第一行语句“dis = round(sensor.distance,2)”用来给变量dis赋值,round()函数用来保留两位小数;第二行语句“print(dis)”是将dis保存的测距值同步输出并显示在屏幕上;语句“y.append(dis)”的第三行用于将测距值附加到列表Y;第四行语句“time.sleep(0.1)”是指控制程序暂停0.1秒,然后进入下一个循环,获取下一个测距值(如图3)。

3.画出“测距值”轨迹的动态曲线。

绘制动态(包括静态)曲线需要创建画布和子图:“fig,ax = plt.subplots(dpi=200)”,其中“dpi=200”用于设置显示分辨率,可以根据情况设置;然后,画出曲线:“line,= ax.plot(x,y,ls='-',lw=1,color =' color='cornflowerblue ')”,其中参数表示横坐标值x,纵坐标值y,所画线条的类型和宽度,线条的颜色;然后定义一个帧画布的更新函数update(),其中第一条语句是“line.set _ data (x [:i],y [:i])”,用来切片动态检测生成的每组数据(横坐标的x值和纵坐标的y值),然后提供给下面的动画。FuncAnimation作为数据源。第二个语句“返回行”,是返回行值。

然后,生成曲线动画,建立变量ani,动画。调用FuncAnimation(),设置相关参数,包括:语句“fig=fig”用于设置绘制动态图形的画布名称;语句“func=update”,用来调用自定义动画函数update()。注意不要带括号;语句“fargs=(line,)”,作为需要传递给func的参数,frames除外;语句“frames=len(x)”用于控制生成的动画长度(一个周期包含的帧数);语句“interval=50”,用于设置更新的频率。单位为ms(毫秒);语句“blit=True”用于选择是更新所有点还是只更新已经改变的点;最后,通过语句“plt.show()”显示图像(如图4所示)。

4.程序的运行测试

将程序保存为“超声波测距轨迹曲线”后点击“运行”按钮,然后控制树莓派带动超声波传感器转动,或朝向墙面等障碍物靠近与远离,大约持续10秒钟后(程序的循环结构:100×0.1=10),此时,就会在屏幕上看到有超声波传感器“测距值”数据不断出现:0.46、0.49……接着,就会弹出一个名为“Figure 1”的图片窗口,绘制的正是动态的超声波测距轨迹曲线,而且会不断循环播放之前程序所监测获取的100个数据(如图5)。

将程序保存为“超声波测距轨迹曲线”并点击“运行”按钮,然后控制树莓Pi驱动超声波传感器旋转,或者朝向和远离墙壁等障碍物移动。大约10秒钟后(程序的循环结构:100×0.1=10),此时你会看到屏幕上不断出现超声波传感器的“测距值”数据:0.46,0.49 …会弹出一个名为“图1”的画面窗口,绘制动态超声波测距轨迹曲线,连续循环播放前一个程序监测采集的100个数据(如图5)。

该程序可以重复运行,以获得对应于不同动态轨迹曲线的不同超声波测距值。而且我们还可以修改程序中的循环次数(比如300),或者修改曲线绘制的速度(在变量ani调用动画中设置为“interval=50”)。FuncAnimation())。当然也可以试试曲线的颜色和宽度。其次,利用图形编程绘制超声波测距轨迹曲线。

1.登录古德微机器人平台,完成“积木”图形化编程

访问Goodmicro Robot网站(http://www.gdwrobot.cn),登录账号,点击“设备控制”进入“积木”界面。

首先,进行物联网服务器的设置,从左侧“物联网”-“常用”中将“设置物联网服务器”功能模块拖动至主界面,保持其默认的服务器“www.gdwrobot.top”和端口“1883”不变,下方的用户名和密码均保持为空;接着,建立一个重复执行100次的循环结构,建立名为“超声波测距”的变量,为其赋值为“智能硬件”-“常用”中的“超声波测距”项,并进行保留两位小数的四舍五入处理;然后通过“输出调试信息‘超声波测距”,在LOG调试信息区将超声波传感器每次获取的“测距”值进行显示输出;接着,从“物联网”-“常用”中拖动出“发送主题”功能模块,并且设置好对应的信息:“向‘luke007发送主题‘distance的数据‘超声波测距”,其中的“luke007”对应自己的登录账号,主题名为“distance”;最后,添加一条“等待0.3秒”的循环间隔时间,点击“保存”按钮将程序保存为“绘制超声波测距轨迹曲线”(如图6)。

首先设置物联网服务器,将“设置物联网服务器”功能模块从左侧的“物联网”-“常用”中拖动到主界面,保持其默认服务器“www.gdwrobot.top”和端口“1883”不变,底部用户名和密码保持为空;然后建立一个重复100次的循环结构,建立一个名为“超声波测距”的变量,赋为“智能硬件”中的“超声波测距”项——“常用”,四舍五入到小数点后两位。然后通过“输出调试信息‘超声波测距’”,在日志调试信息区显示输出超声波传感器每次获得的“测距”值;然后,从物联网-常用中拖动“发送主题”功能模块,设置相应信息:“发送主题“距离”的数据到“luke007”,其中“Luke 007”对应他的登录账号,主题名称为“距离”;最后,添加一个“等待0.3秒”的循环间隔,点击“保存”按钮,将程序保存为“绘制超声波测距轨迹曲线”(如图6)。

2.设置动态曲线绘制参数。

点击“更多功能”按钮后再点击“采集数据”按钮,进行动态曲线绘制的相关设置:將“采集标题”设置为“绘制超声波测距轨迹曲线”;第二行的服务器地址和端口号同样均保持默认不变(与“积木”图形化编程一致),可尝试点击后面的“测试连接”按钮进行测试,正常的话会出现“连接成功”的提示;第三行的“功能描述”设置为“使用超声波传感器进行绘图”(可自定义),“树莓派编号”处填写为“luke007”、“主题”填写为“distance”,同样是与图形化编程一一对应,后面的数值单位设置为“厘米”;最后,点击“保存”按钮,将本次的数据采集参数设置项目保存(如图7)。

点击“更多功能”按钮,然后点击“采集数据”按钮,设置动态曲线绘制的相关设置:将“采集标题”设置为“绘制超声波测距轨迹曲线”;第二行中的服务器地址和端口号也默认保持不变(与“构建块”的图形化编程一致)。可以尝试点击后面的“测试连接”按钮进行测试。如果正常,会出现“连接成功”提示;第三行,功能描述设置为“用超声波传感器画图”(可定制),树莓派数量填写为“luke007”,主题填写为“距离”,同样对应图形化编程,后面的数值单位设置为“cm”;最后,点击“保存”按钮保存当前的数据采集参数设置(如图7)。

3.程序的运行测试

点击“开始采集”按钮后再次返回到“积木”区,点击“连接设备”按钮再点击“运行”按钮,同时再移动树莓派带动超声波传感器做各种转向和移动操作;LOG调试显示区每隔0.3秒钟就会出现一个“测距值”,同时在“图表展示”窗口就会出现一个名为“绘制超声波测距轨迹曲线”在动态变化,描绘的正是超声波传感器所测量的与障碍物间的距离值(如图8)。

点击“开始采集”按钮,再次返回“构建模块”区域。单击“连接设备”按钮,然后单击“运行”按钮。同时移动树莓Pi带动超声波传感器做各种转向和移动操作。调试显示区每隔0.3秒就会出现一个“测距值”,在“图表显示”窗口会动态变化一个“绘制超声波测距轨迹曲线”,该曲线描绘了超声波传感器与障碍物之间的距离(如图8所示)。

升级和改进计划的建议:

如果舵机接树莓派,同时超声波传感器的连接线借助滑环与扩展板“切换”;然后在程序中添加控制舵机进行360度旋转,或者以圆形“摆头”的方式来回旋转,带动超声波传感器半自动扫描周围障碍物,这样就可以相应生成更有趣的超声波测距轨迹曲线动态图。如果在Python代码中使用matplotlib.pyplot,则不是折线图绘制,而是极坐标图像,这样就可以得到类似影视剧中雷达扫描的实时监控画面。你不妨试一试。

本文来自网络,不代表管理窝立场。转载请注明出处: https://www.guanliwo.com/a/zx/62399.html
上一篇狙击手小游戏大全
下一篇 微信用户体验亮点
管理窝

作者: 管理窝

这里可以再内容模板定义一些文字和说明,也可以调用对应作者的简介!或者做一些网站的描述之类的文字或者HTML!

为您推荐

评论列表()

    联系我们

    联系我们

    0898-88888888

    在线咨询: QQ交谈

    邮箱: email@wangzhan.com

    工作时间:周一至周五,9:00-17:30,节假日休息

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部