做個超聲波測距雷達,預算20
ARDUINO從入門到創(chuàng)客帶師第二彈:超聲波雷達
這期咱簡單的做個超聲波雷達,預算20
本期我們需要的材料有
ARDUINO UNO開發(fā)板,14包郵吧
HC SR04開發(fā)板超聲波測距模塊,不到5塊錢,這個分新款和舊款,舊款只支持5V供電新款支持3.3
四根杜邦線用于傳感器供電和連接

UNO我們之前說過,無論是改進版還是原版都是一樣的,改進版因為加了排針所以對杜邦線的要求反倒更靈活,而ATMEGA328P這種單片機基本不會炸,如果炸了,再買塊板子也就14包郵,沒必要花20塊錢買“標準版”

不過咱還真有標準版,咱當年用它玩起了播放生日歌在那天上傳到了ACFUN之后就被封號了
現在這個開發(fā)板里面的程序都是自動放生日歌,我打算過兩天拜壽的時候帶上

所謂的意大利制造也就那么回事吧,這種東西我都會做,畫板子的時候用人家開源的項目的設計圖可以直接在生產出來的電路板上打上原版MADE IN ITALY的絲印,所以現在網上不少打著“意大利生產”的旗號賣高價的開發(fā)板可能和咱的20包郵的一樣產自深圳華強北
隨著國人版權意識增強,不少人見有利可圖就打著“正版”旗號開始碰瓷釣魚或者收智商稅,所以作為消費者,我們應該加強健全法律意識,了解開源開放版權和改進設計的概念 開源的東西怎么存在正版呢?顯然又是另一波割韭菜的幌子 20塊錢就能買的東西,標個“正版”就能賣150甚至299了?賣家在想PEACH

如果你有像這樣的ESP8266模塊,也可以做本期教程。但是遺憾的是這種NODEMCU型的模塊沒有5V定義,需要在面包板上借助其他模塊的5V供電才能驅動5V的模塊,這里在采購超聲波模塊的時候可以買新版支持3.3V的
此外如果有12864顯示屏,本篇教程還可以進階直接利用模塊將傳感器的數據實時投射到屏幕上,這里因為預算原因不介紹 畢竟20塊錢買了屏幕的話剩下的錢你只能買兩個超聲波模塊了
其實咱日常生活中雷達這種東西是非常常見的,一般咱常用的這種東西也就是感應門感應開關之類的紅外感應的設備,至于超聲波,其實咱也不是見不到?,F代汽車的倒車雷達,基本就都是超聲波雷達,十多年前的汽車就可以用車載的液晶顯示屏把倒車雷達測量出的距離顯示在屏幕上了,而不是只會簡單的滴滴滴響,而現代的汽車更是前后左右都放置了超聲波雷達,甚至還搭配了自動泊車輔助系統(tǒng)
超聲波雷達的原理
超聲波雷達的工作原理是通過超聲波發(fā)射裝置向外發(fā)出超聲波,遇到障礙物反射到接收器,通過接收器接收到發(fā)送過來超聲波時的時間差來測算距離。目前,常用探頭的工作頻率有 40kHz, 48kHz 和 58kHz 三種。一般來說,頻率越高,靈敏度越高,但水平與垂直方向的探測角度就越小,故一般采用 40kHz 的探頭。超聲波雷達防水、防塵,即使有少量的泥沙遮擋也不影響。探測范圍在 0.1-3 米之間,因此非常適合應用于泊車。相比紅外雷達,超聲波也有它的缺點。在不同的天氣情況下,超聲波的傳輸速度不同,而且傳播速度較慢,精度就不如紅外了。畢竟聲音是機械波,紅外線是電磁波。超聲波散射角大,方向性較差,在測量較遠距離的目標時,其回波信號會比較弱,影響測量精度。但是,在短距離測量中,超聲波測距傳感器具有非常大的優(yōu)勢。
關于駐波
兩列沿相反方向傳播的振幅相同、頻率相同的波疊加時形成的波叫做駐波。頻率相同、傳輸方向相反的兩種波(不一定是電磁波),其中的一個波一般是另一個波的反射波。在兩者電壓(或電流)相加的點出現波腹,在兩者電壓(或電流)相減的點形成波節(jié)。在波形上,波節(jié)和波腹的位置始終是不變的,給人“駐立不動”的印象,但它的瞬時值是隨時間而改變的。如果這兩種波的幅值相等,則波節(jié)的幅值為零。
HC-SR04模塊工作原理
(1)采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;
(2)模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;

(3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2;
(4)本模塊使用方法簡單,一個控制口發(fā)一個10US以上的高電平,就可以在接收口等待高電平輸出。一有輸出就可以開定時器計時,當此口變?yōu)榈碗娖綍r就可以讀定時器的值,此時就為此次測距的時間,方可算出距離。如此不斷的周期測,即可以達到你移動測量的值

可以看到,模塊本身是有一發(fā)一收兩個壓電模塊的,其中一個發(fā)射超聲波另一個接收超聲波。因為壓電效應可逆,所以理論上用一個探頭也可以。
壓電效應:某些電介質在沿一定方向上受到外力的作用而變形時,其內部會產生極化現象,同時在它的兩個相對表面上出現正負相反的電荷。當外力去掉后,它又會恢復到不帶電的狀態(tài),這種現象稱為正壓電效應。事實上,大部分超聲波元件都是依靠壓電效應而非常見揚聲器的電磁感應原理。
硬件配置

我們要做的是把超聲波模塊通過杜邦線正確的接到開發(fā)板上,接線圖如上 VCC接+5V GND要和開發(fā)板共地,ECHO接單片機2號數字端口TRIG接3號(這個其實后期可以通過更改代碼定義修改)但是總體來說是這么回事,要按照正確的方法接線,一般來說供電不能反接,模塊一般沒有保護會爆炸,數據如果接錯了也有可能GG,不過一般傳感器模塊的問題不大。USB數據接反是有點問題 不要接反

總之ARDUINO環(huán)境的配置和驅動的安裝都老生常談了我就不想說了,直接接在筆記本或者臺式機的USB接口接開發(fā)板就行了,開發(fā)板用USB的供電夠

驅動的安裝
ARDUINO有JAVA環(huán)境,安裝板經常容易出現丟環(huán)境的情況,這時候留著安裝包把ARDUINO卸載重裝就行了
代碼方面,還是復讀一遍吧,Arduino的程序結構與傳統(tǒng)的c程序結構有所不同——Arduino程序中沒有main函數。其實并不是Arduino程序中沒有main函數,而是main函數的定義隱藏在了Arduino的核心庫文件中。在進行Arduino開發(fā)中不直接操作main函數,而是使用setup和loop這兩個函數。
setup() Arduino控制器通電或者復位后,就會開始執(zhí)行Arduino的初始化配置(IO口 串口等);
loop() setup函數執(zhí)行完畢后,Arduino會接著執(zhí)行l(wèi)oop()函數中的程序。而loop函數是一個死循環(huán),其中的程序會不斷地重復運行。通常在loop函數中完成程序的主要功能,如驅動各種模塊和采集數據等
以下是本期所需要的全代碼:
const int TrigPin = 2; //發(fā)出超聲波
const int EchoPin = 3; //收到反射回來的超聲波 定義用哪個端口來驅動超聲波模塊
float cm; //因為測得的距離是浮點型的
void setup() {Serial.begin(9600); //設置波特率
?pinMode(TrigPin, OUTPUT);
?pinMode(EchoPin, INPUT);
?// put your setup code here, to run once:這個括號里的代碼只會執(zhí)行一次
}
void loop() {
digitalWrite(TrigPin, LOW); //低高低電平發(fā)一個短時間脈沖去TrigPin
?delayMicroseconds(2); ? ? ? // delayMicroseconds在更小的時間內延時準確
?digitalWrite(TrigPin, HIGH);
?delayMicroseconds(10);
?digitalWrite(TrigPin, LOW); //通過這里控制超聲波的發(fā)射
?cm = pulseIn(EchoPin, HIGH) / 58.0; //將回波時間換算成cm
?cm = (int(cm * 100.0)) / 100.0; //保留兩位小數
?Serial.print("Distance:");
?Serial.print(cm);
?Serial.print("cm");
?Serial.println();
?delay(1000);
?// put your main code here, to run repeatedly:這個括號里的代碼會執(zhí)行無限次
}
關于波特率
波特率(Baud Rate) 單位 bps -- 每秒傳送的字節(jié)數 Byte Per Second.。
為何要設置波特率
模擬線路信號的速率,也稱調制速率,以波形每秒的振蕩數來衡量。如果數據不壓縮,波特率等于每秒鐘傳輸的數據位數,如果數據進行了壓縮,那么每秒鐘傳輸的數據位數通常大于調制速率,使得交換使用波特和比特/秒偶爾會產生錯誤。為了保證有效通訊,需要設置波特率。

編譯 因為這個項目的代碼都是很成熟的也不需要什么庫的調用,所以很快就編譯成功了 也不容易報錯

上傳成功后,我們需要在工具中打開串口監(jiān)視器

如果一切正常,這會兒你就可以讀取這個超聲波看看你周圍的東西離你距離有多遠,或者拿個尺校一下看看超聲波模塊的測量精度怎么樣,一般來說,這個模塊在3CM-3M的距離下測量的結果都是準確的,而且因為是超聲波模塊,它不需要用傳統(tǒng)方式測量,相對來說使用非常便利。


精度方面,模塊的精度基本是沒問題的。當然你也可以根據實際當前溫度修改聲速,獲得更高精度的代碼,或者加個溫度傳感器自動進行溫度補償?,F在市面上有帶溫度補償的超聲波模塊,能夠自動修正溫度帶來的聲速變化,還是非常先進的。
關于上期的leonardo在模擬USB設備后,無法下載的問題 官方對此問題的建議是,在使用USB鍵盤鼠標庫時,給你的arduino安裝一個物理開關,當此開關打開或關閉時,才運行USB鍵盤鼠標模擬程序。 在模擬USB后,無法下載的解決方法:按住arduino leonardo上的復位按鍵不放,點擊upload,等待IDE編譯,待arduino提示uploading時放開復位按鈕,等待完成下載?;蛘咴赼rduino IDE快要上傳前,按下復位鍵,然后你會發(fā)現,一切正常了。

修改代碼過程中,鼠標和空格老連點確實給咱造成了不小的麻煩,但是咱通過技巧解決了:在插開發(fā)板之前,把光標放在末尾,鼠標放在上傳按鈕上,當開發(fā)板開始鬼畜的時候,直接就可以通過移動鼠標讓鼠標點擊操作沒有效果,這樣就可以從容的等上傳然后一鍵CTRL+Z撤銷剛才鬼畜出來的空格了
最終經過反復修改,我們找到了實現GTASA舉啞鈴的最佳方案

#include <Keyboard.h>
#include <Mouse.h>
void setup() {
?// put your setup code here, to run once:
}
void loop() {Keyboard.press(32);
Keyboard.release(32);
delay(10);
Mouse.click(MOUSE_LEFT);
delay(20);
?// put your main code here, to ?run repeatedly:
;} ? ? ?
我們在鼠標和鍵盤空格之間加了兩個DELAY函數,這個函數能讓、通過延時控制鼠標鍵盤連點的頻率,獲得最佳效率。(事實證明,空格可以無限連點,但是一旦和鼠標一起無限連,就會被系統(tǒng)判定為粘滯,操作無效,所以需要控制頻率來獲取最佳效率 總之最后我們是通過這個東西把肌肉和耐力很快練滿了,而且咱可以不用動一根手指頭)
ARDUINO玩得好確實可以做很多事,而且成本來說非常便宜 過去我們一直被教導說要從51單片機開始學起,要從底層開始,然而實際上取得成就并不一定要精通底層,將底層簡化也是有利于更多人能從中解放走向應用的,在應用層方面只要應用得當就能取得成就。所以要么怎么說ARDUINO叫創(chuàng)客神器呢
參考資料:arduino UNO 與 超聲波測距模塊
以上