日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/14 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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绘制超声波雷达扫描的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。