0.jpg (40.93 KB, 下載次數(shù): 95)
下載附件
2018-5-20 02:43 上傳
全部資料51hei下載地址:
超聲波測(cè)距.zip
(2.58 MB, 下載次數(shù): 133)
2018-5-19 11:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
Arduino示例教程模塊版——超聲波測(cè)距實(shí)驗(yàn)超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就立即停止計(jì)時(shí)。聲波在空氣中的傳播速度為340m/s,根據(jù)計(jì)時(shí)器記錄的時(shí)間t,就可以計(jì)算出發(fā)射點(diǎn)距障礙物的距離s,即:s=340m/s× t / 2 。這就是所謂的時(shí)間差測(cè)距法。本實(shí)驗(yàn)利用超聲波測(cè)得的距離從串口中顯示。 元器件清單: Zduino UNO × 1;
OJ傳感器擴(kuò)展板× 1; USB數(shù)據(jù)線 × 1 ; 1p杜邦線 × 4 ; 超聲波傳感器 × 1;
知識(shí)要點(diǎn):
pulseIn():用于檢測(cè)引腳輸出的高低電平的脈沖寬度。 pulseIn(pin, value) pulseIn(pin, value, timeout) Pin---需要讀取脈沖的引腳 Value---需要讀取的脈沖類(lèi)型,HIGH或LOW Timeout---超時(shí)時(shí)間,單位微秒,數(shù)據(jù)類(lèi)型為無(wú)符號(hào)長(zhǎng)整型。 1、使用Arduino采用數(shù)字引腳給SR04的Trig引腳至少10μs的高電平信號(hào),觸發(fā)SR04模塊測(cè)距功能; 2、觸發(fā)后,模塊會(huì)自動(dòng)發(fā)送8個(gè)40KHz的超聲波脈沖,并自動(dòng)檢測(cè)是否有信號(hào)返回。這步會(huì)由模塊內(nèi)部自動(dòng)完成。 3、如有信號(hào)返回,Echo引腳會(huì)輸出高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。此時(shí),我們能使用pulseIn()函數(shù)獲取到測(cè)距的結(jié)果,并計(jì)算出距被測(cè)物的實(shí)際距離。 SR04與Arduino接線示意圖: Arduino示例程序:
- /*
- IDE 版本:1.0.1
- 功能:利用SR04超聲波傳感器進(jìn)行測(cè)距,并用串口顯示測(cè)出的距離值
- */
- // 設(shè)定SR04連接的Arduino引腳
- const int TrigPin = 2;
- const int EchoPin = 3;
- float distance;
- void setup()
- { // 初始化串口通信及連接SR04的引腳
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- // 要檢測(cè)引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài)
- pinMode(EchoPin, INPUT);
- Serial.println("Ultrasonic sensor:");
- }
- void loop()
- {
- // 產(chǎn)生一個(gè)10us的高脈沖去觸發(fā)TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- // 檢測(cè)脈沖寬度,并計(jì)算出距離
- distance = pulseIn(EchoPin, HIGH) / 58.00;
- Serial.print(distance);
- Serial.print("cm");
- Serial.println();
- delay(1000);
- }
復(fù)制代碼
連線實(shí)物圖:
下載完程序后,打開(kāi)串口監(jiān)視器,并將超聲波傳感器對(duì)向需要測(cè)量的物體,即可看到當(dāng)前超聲波傳感器距物體的距離,如下圖:
第56講Arduino入門(mén)教程實(shí)驗(yàn)16超聲波實(shí)驗(yàn)
1實(shí)驗(yàn)原理 科學(xué)家們將每秒鐘振動(dòng)的次數(shù)稱(chēng)為聲音的頻率,它的單位是赫茲(Hz)。我們?nèi)祟?lèi)耳朵能聽(tīng)到的聲波頻率為20Hz~20000Hz。當(dāng)聲波的振動(dòng)頻率小于20Hz或大于 20000Hz時(shí),我們便聽(tīng)不見(jiàn)了。因此,我們把頻率高于20000赫茲的聲波稱(chēng)為“超聲波”。由于超聲波指向性強(qiáng),能量消耗緩慢,在介質(zhì)中傳播的距離較遠(yuǎn),因而超聲波經(jīng)常用于距離的測(cè)量。
超聲波測(cè)距原理:超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就立即停止計(jì)時(shí)。超聲波在空氣中的傳播速度為340m/s,根據(jù)計(jì)時(shí)器記錄的時(shí)間t,就可以計(jì)算出發(fā)射點(diǎn)距障礙物的距離(s),即:s=340t/2 。這就是所謂的時(shí)間差測(cè)距法。
超聲波測(cè)距的原理是利用超聲波在空氣中的傳播速度為已知,測(cè)量聲波在發(fā)射后遇到障礙物反射回來(lái)的時(shí)間,根據(jù)發(fā)射和接收的時(shí)間差計(jì)算出發(fā)射點(diǎn)到障礙物的實(shí)際距離。由此可見(jiàn),超聲波測(cè)距原理與雷達(dá)原理是一樣的。
測(cè)距的公式表示為: L=C×T
式中L為測(cè)量的距離長(zhǎng)度;C為超聲波在空氣中的傳播速度;T為測(cè)量距離傳播的時(shí)間差(T為發(fā)射到接收時(shí)間數(shù)值的一半)。
這節(jié)課我們就介紹一下怎樣使用SR04超聲波模塊來(lái)進(jìn)行距離測(cè)量。會(huì)用到上節(jié)課脈沖計(jì)時(shí)所學(xué)到的知識(shí),通過(guò)計(jì)算脈沖時(shí)常來(lái)算出來(lái)超聲波傳感器所感知到的距離.
圖4-16-1SR04超聲波模塊參數(shù) 2硬件電路 超聲波測(cè)距實(shí)驗(yàn)參考表4-16-2。
實(shí)驗(yàn)器件
| 數(shù)量 | landzoduino開(kāi)發(fā)板 | 1 | 編程線 | 1 | 杜邦線 | 若干 | 面包板 | 1 | 超聲波模塊 | 1 |
圖4-16-2超聲波測(cè)距實(shí)驗(yàn)器件表 圖4-16-3超聲波測(cè)距實(shí)驗(yàn)電路圖 3程序設(shè)計(jì) 測(cè)試程序如下: - /****************************************************
- 超聲波測(cè)距實(shí)驗(yàn)程序
- 使用超聲波傳感器測(cè)距并串口顯示距離值
- This example code is in the public domain.
- ****************************************************/
- const int TrigPin = 8;
- const int EchoPin = 9;
- float cm;
- /****************************************************
- 初始化部分_setup()函數(shù)
- ****************************************************/
- void setup()
- {
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- /****************************************************
- 執(zhí)行部分_loop()函數(shù)
- ****************************************************/
- void loop()
- {
- //低高低電平發(fā)一個(gè)短時(shí)間脈沖去TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- //將回波時(shí)間換算成cm
- cm= pulseIn(EchoPin, HIGH) / 58.0;
- Serial.print(cm);
- Serial.print("cm");
- Serial.println();
- delay(1000);
- }
復(fù)制代碼 4實(shí)驗(yàn)操作 1) 按照?qǐng)D4-16-3將電路連接到landzoduino開(kāi)發(fā)板上。 2) 插上編程線,把程序下載到Landzoduino控制板。 3) 觀察運(yùn)行情況。 5實(shí)驗(yàn)結(jié)果
通過(guò)超聲波模塊的收發(fā),可以準(zhǔn)確的檢測(cè)3米之內(nèi)事物到超聲波模塊的距離。
6實(shí)驗(yàn)視頻
Arduino連接超聲波傳感器測(cè)距
注:方法已經(jīng)過(guò)時(shí),新方法使用timer去計(jì)時(shí),請(qǐng)看https://code.google.com/p/arduino-new-ping/
超聲波傳感器適用于對(duì)大幅的平面進(jìn)行靜止測(cè)距。普通的超聲波傳感器測(cè)距范圍大概是2cm~450cm,分辨率3mm(淘寶賣(mài)家說(shuō)的,筆者測(cè)試環(huán)境沒(méi)那么好,個(gè)人實(shí)測(cè)比較穩(wěn)定的距離10cm~2m左右,超過(guò)此距離就經(jīng)常有偶然不準(zhǔn)確的情況發(fā)生了,當(dāng)然不排除筆者技術(shù)問(wèn)題。)
測(cè)試對(duì)象是淘寶上面最便宜的SRF-04超聲波傳感器,有四個(gè)腳:5v電源腳(Vcc),觸發(fā)控制端(Trig),接收端(Echo),地端(GND)
模塊工作原理:
- 采用IO觸發(fā)測(cè)距,給至少10us的高電平信號(hào);
- 模塊自動(dòng)發(fā)送8個(gè)40KHz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
- 有信號(hào)返回,通過(guò)IO輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間.測(cè)試距離=(高電平時(shí)間*聲速(340m/s))/2;
電路連接方法:
Arduino程序例子:
- const int TrigPin = 2;
- const int EchoPin = 3;
- float cm;
- void setup()
- {
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- void loop()
- {
- digitalWrite(TrigPin, LOW); //低高低電平發(fā)一個(gè)短時(shí)間脈沖去TrigPin
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //將回波時(shí)間換算成cm
- cm = (int(cm * 100.0)) / 100.0; //保留兩位小數(shù)
- Serial.print(cm);
- Serial.print("cm");
- Serial.println();
- delay(1000);
- }
復(fù)制代碼
Arduino教程(提高篇)——SR04超聲波類(lèi)庫(kù)的使用SR04是最常見(jiàn)的超聲波傳感器之一,價(jià)格便宜,好用,是arduino開(kāi)發(fā)的必備良品~
其工作原理如下
- 采用IO觸發(fā)測(cè)距,給至少10us的高電平信號(hào);
- 模塊自動(dòng)發(fā)送8個(gè)40KHz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
- 有信號(hào)返回,通過(guò)IO輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間.距離=(高電平時(shí)間*聲速(340m/s))/2;
下面使用的是arduino官方推薦的SR04超聲波傳感器類(lèi)庫(kù)
- 將附件下載后解壓到arduinoIDE下的libraries文件夾即可,如下圖

- 打開(kāi)ArduinoIDE,選擇SR04例程
- #include "SR04.h"
- #define TRIG_PIN 2
- #define ECHO_PIN 3
- SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
- long a;
- void setup() {
- Serial.begin(9600);
- Serial.println("Example written by Coloz From Arduino.CN");
- delay(1000);}
- void loop() {
- a=sr04.Distance();
- Serial.print(a);
- Serial.println("cm");
- delay(1000);}
復(fù)制代碼#define TRIG_PIN 2 #define ECHO_PIN 3 |
TRIG接到arduino的第二腳
ECHO接到arduino的第三腳
VCC、GND接上
- 打開(kāi)串口調(diào)試,即可看到效果了
最后提供一個(gè)不用庫(kù)直接驅(qū)動(dòng)SR04的程序(上面庫(kù),就是把這個(gè)程序封裝了一次)- const int TrigPin = 2;
- const int EchoPin = 3;
- float cm;
- void setup()
- {
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- void loop()
- {
- //發(fā)一個(gè)10ms的高脈沖去觸發(fā)TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
- cm = (int(cm * 100.0)) / 100.0; //保留兩位小數(shù)
- Serial.print(cm);
- Serial.print("cm");
- Serial.println();
- delay(1000);
- }
復(fù)制代碼
|