序
好久沒有更新關于Arduino方面的文章了,其實前幾天一直在做,不過實作的功能都比較單一,也沒有什麼新奇的想法。也由于沒錢的原因,來來去去也就隻能圍着一個小燈棒轉,紅外遙控、藍牙遠端控制、人體紅外感應、紅外避障傳感,各種各樣的去驅動點亮小燈棒。不過比較之後,除了藍牙和紅外,超音波測距子產品是最為理想的傳感方式了。
人體紅外感應子產品雖然最符合人來即亮,人走即滅的理念,但是靈敏度真的是太低,聽說有算法解決的算法,但是最後也沒有琢磨出來。最後幾天将紅外避障子產品用做感應器,效果還是相當不錯的,特别是靈敏度,紅外以光的速度傳播,絲毫沒有延遲。美中不足的是,紅外避障子產品的最大感應距離上限40cm不到,而且線性的紅外光在經過一些小空隙,比如說手指間的時候,也會觸發低電平資訊,導緻燈熄滅。
而超音波測距子產品就克服了兩者的不足,此子產品最大感應距離可以達到3m左右,并且超音波發出也有一個音波的廣角,實驗效果還是比較理想的。
下面是制作一個超音波測距子產品為感應器,繼電器為動作執行器的感應LED燈棒。實作的功能為:當30cm内有物體時,給繼電器發送一個高電平,并持續3秒,3秒後如果物體依然存在在30cm範圍内,繼續輸出高電平,反之則輸出一個低電平,由此來控制繼電器的通斷。
子產品原理

通過子產品說明文檔可知,給Arduino闆的數字接口接上超音波測距傳感器後,程式開始Trig口會想子產品發送一個10μs長的高電平信号,此時子產品開始工作,發射器發出8個40KHz的超音波脈沖,同時内部計時器開始運作。當超音波脈沖遇到障礙物後立即傳回,接收器接收到傳回脈沖的同時會從Echo口向Arduino發送一個持續高電平,高電平持續的時間即為超音波從發射到被接收的時間。然後再通過聲速與時間的關系,進而測出被測物體與子產品的距離。
我給程式添加了一個輸出的序列槽,這個序列槽能實時輸出障礙物距離,通過距離的測定,規定如果障礙物與子產品距離小于30cm,則觸發數字引腳4輸出一個高電平,并持續3s。而引腳4我連接配接了一個繼電器,使用繼電器的通斷來實作LED燈管的點亮與熄滅。
材料準備
- Arduino UNO 開發闆。
- Arduino IDE 1.81。
- 超音波測距子產品。
- 面包線、面包闆。
- LED燈管。
線路連接配接
繼電器我使用了外接電源供電,隻将信号端口插在Arduino上:
繼電器針腳:
DC+ -> 5V
DC- -> GND
IN -> 4
使用高電平觸發。
超音波測距子產品:
VCC -> 5V
GND -> GND
Trig -> 2
Echo -> 3
效果示範
http://player.youku.com/player.php/sid/XMjY1ODczNzk3Mg==
源代碼
const int TrigPin = 2;
const int EchoPin = 3;
const int jdqPin = 4;
float distance;
void setup()
{ // 初始化序列槽通信
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(jdqPin, OUTPUT);
pinMode(EchoPin, INPUT);
Serial.println("Load Distance:");
}
void loop()
{
// 高脈沖去觸發TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
//計算出距離
distance = pulseIn(EchoPin, HIGH) / 58.00;
Serial.print(distance);
Serial.print(" cm");
Serial.println();
delay(100); //序列槽輸出距離結果的頻率
if(distance<30){
digitalWrite(jdqPin,HIGH);
}
else
digitalWrite(jdqPin,LOW);
delay(3000);
}