欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Python与Arduino绘制超声波雷达扫描

发布时间:2023/12/14 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python与Arduino绘制超声波雷达扫描 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

视频连接:https://m.bilibili.com/video/BV1xf4y1X79p

前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!

在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?

这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!

我先写了一个测试程序试了一下,OK!搞定,想知道咋搞定的?继续看下去,一会就告诉你

Arduino端的程序设计

实际上,Arduino端的程序比较简单,就是通过超声波传感器采集距离,然后将采集到的数据发送给COM口就可以了,至于触发超声波传感器并且读取数据的程序么,就不多解释了,网络那么发达,搜一搜总会有哒

#include<Servo.h> #define Trig 10//引脚Tring 连接 IO D2 #define Echo 11 //引脚Echo 连接 IO D3 Servo myServo; //实例化舵机对象 float distance; void setup() {pinMode(Trig, OUTPUT);pinMode(Echo, INPUT);myServo.attach(12); //初始化舵机控制引脚Serial.begin(9600);myServo.write(15);//设定舵机的初始角度delay(100); } void loop() {for (int i = 15; i <= 165; i++) {myServo.write(i);distance = getDistance(Trig, Echo);if (distance > 450) //当超声波测到的距离超出范围时,设定为可检测到的最远距离distance = 450;//将数据按照一定格式发送给串口Serial.print('#');Serial.print(i);Serial.print('#');Serial.print(distance);Serial.println('#');delay(30);}for (int i = 165; i >= 15; i--) {myServo.write(i);distance = getDistance(Trig, Echo);if (distance > 450)distance = 450;Serial.print('#');Serial.print(i);Serial.print('#');Serial.print(distance);Serial.println('#');delay(30);} } float getDistance(int trig, int echo) {float temp = 0, cm = 0;digitalWrite(trig, LOW); //给Trig发送一个低电平delayMicroseconds(2); //等待 2微妙digitalWrite(trig, HIGH); //给Trig发送一个高电平delayMicroseconds(10); //等待 10微妙digitalWrite(trig, LOW); //给Trig发送一个低电平temp = (float)(pulseIn(echo, HIGH,750000));//存储回波等待时间//声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000//因为发送到接收,实际是相同距离走了2回,所以要除以2//距离(厘米) = (回波时间 * (34 / 1000)) / 2//简化后的计算公式为 (回波时间 * 17)/ 1000cm = temp * 17 / 1000; //把回波时间换算成cmreturn cm; }

Python程序设计

最开始想用tkinter做为雷达扫描的界面(刚学的tkinter,想显摆显摆),但是做到测试界面的时候才发现,tkinter的刷新频率好低啊,只要雷达扫描三次以后,整个界面就直接卡死了,窗口都拖不动了!!!

没办法,换一个吧,又把期待的目光投向了pygame(以前上过课,又可以显摆显摆了),这次没有铩羽而归,Pygame成功了!接下来,咱就简要说说这个程序是怎么做的,都需要哪些python库和模块吧。

pygame库

第一个当然是pygame的库了,还有pygame中的绘图库、字体库,这几个库主要用来设计雷达扫描界面的,比如设定窗口大小和扫描帧率、画半圆弧、绘制文字等,具体细节大家就看程序吧,我可没办法一句一句解释了。

math库

这个math就是数学的意思,它里面有很多与数学计算相关的方法,比如 sqrt(开根号)、log(求对数)、pow(求指数)等等,小编只用了math中的三个方法:sin(求正弦)、cos(求余弦)和pi(Π),主要是用它们来计算扫描线的角度、长度和位置。

serial库

这是串口库,用来设定串行通信接口、波特率以及接收数据,具体方法看下面:
serial.Serial(Port,Baud,timeout) #打开串口
Port:串口号,也就是COM口,字符串形式
Baud:波特率,也就是传输速率,Arduino端和Python端要一致,小编在程序中使用的是9600
timeout:设定超时时间
serial.readline() #接收串口发送来的数据

我在设计发送的数据格式的时候,故意将数据中插入了“#”,这样当python端接收到数据后可以直接转为字符串,然后利用字符串切片可以获取其中的数据,然后再转换成可用于计算的数据。

话不多说,直接上代码。。。。。额,代码有点多,文章中先放张图吧


我已将程序上传到后台了,想要程序的童鞋,请先关注公众号哦,然后在窗口中回复“超声波雷达扫描神器”,即可获得下载链接。先到先得!你值得拥有~

能力有限,程序中还有很多待优化的地方,感兴趣的小伙伴可以尽情优化啊,比如加个COM口的选项框等等,也希望各位增加了新功能后还可以一起分享经验哦~~

总结

以上是生活随笔为你收集整理的Python与Arduino绘制超声波雷达扫描的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。