在Arduino上使用感測器:創建一個可以檢測運動並作出回應的簡單設備

超聲波感測器是一種簡潔的多功能感測器,可以應用到您的Arduino專案中。顧名思義,它利用超聲波來檢測出現的物體以及物體的距離。這種設備可用於動作識別,或者在檢測範圍內出現目標物件時作出回應。

當然,您也許會想知道的是Arduino超聲波感測器究竟是如何工作的?

為了描述它的工作原理,本指南將向您展示如何使用超聲波感測器來組裝一個簡單的樂器。

超聲波感測器的工作原理

我們今天要瞭解的超聲波感測器是HC-SR05,它是舊版HC-SR04的5引腳升級版本。該設備具有兩個圓柱形模組。一個是發出超聲波信號的發射器,另一個是接收器,會捕獲到達物體後反彈回來的信號。通過測量信號返回的時間,感測器可以計算出物體的距離。

雖然其他感測器(如被動紅外線運動感測器)也具有類似的功能,但是超聲波感測器的功用更強,因為它使您的專案不僅可以檢測到面前經過的物體,還可以區分出不同物體的距離遠近。

我們使用這種技術來創建一個浮動的樂器。該專案不是通過按下鋼琴鍵來彈奏音符,而是讓您把一個物體—比如一根棍子或者您的手指—放在感測器前面,根據物體與感測器之間的距離來播放不同的音符。這並不能打造出鋼琴的效果,但是通過創建該專案,您可以瞭解能用這款便利的Arduino聲音感測器來做什麼。

所需組件

為了創建該專案,您需要具備以下元件:

Arduino Uno
HC-SR05 超聲波感測器

(可以使用HC-SR04或其他超聲波感測器,但需要修改引腳配置)

Arduino IDE

您還需要使用以下硬體,都是比較通用的設備:

揚聲器:大多數簡單的揚聲器模組都可以,本專案使用的是該款簡單的單聲道揚聲器
USB 電纜

如果您還沒有設置Arduino IDE,可以先查閱我們之前發佈的指南

代碼

首先,我們先來看一下要上傳到Arduino Uno的代碼,瞭解將要執行的操作。

void setup() {
pinMode (6,OUTPUT); //Insert HC-SR-05 with VCC in pin 6
pinMode (5, INPUT); // Assign pin 5 to Echo
pinMode (4, OUTPUT);// Assign pin 4 to Trig
pinMode (2,OUTPUT); // Assign pin 2 to GND.
Serial.begin(9600); // This will allow you to read how far away your sensor is later
}

void loop()
{
long duration, cm; // Initialize variables for duration and cm

digitalWrite(6, HIGH); // Power the sensor
digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping,
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);

duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds
cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable

Serial.print(cm); // Print distance in cm to serial monitor
Serial.print(“cm”);
Serial.println();

delay(100); // Delay

int note = 0; // Assign note based on distance, spacing notes per 6cm

if(cm<=48&&cm>42) {
note = 523;
} else if(cm<=42&&cm>36) {
note = 493;
} else if(cm<=36&&cm>30) {
note = 440;
} else if(cm<=30&&cm>24) {
note = 392;
} else if(cm<=24&&cm>18) {
note = 349;
} else if(cm<=18&&cm>12) {
note = 329;
} else if(cm<=12&&cm>6) {
note = 294;
} else if(cm<=6) {
note = 261;
}

if (note == 0) { // If distance isn’t within 48cm, play nothing
noTone(9);
} else {
tone(9, note, 200); // Play assigned note for 200 milliseconds
}

delay(10); // Brief pause
}

您可以將上述代碼複製到您的IDE中,將其上傳到Uno,如果您想運行該代碼,可以繼續進行下一部分,但是這部分的代碼很重要,有必要對其進行分析和理解。首先:

digitalWrite(6, HIGH); // Power the sensor
digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping,
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);

duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds
cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable

這部分的操作是在Trig引腳上發出40KHz脈衝。這種超聲波信號會在它接觸的所有物體上發生反射,然後返回到接收器。接下來,pulseIn()函數測量從脈衝離開感測器到接收器檢測到返回信號所用的時間,單位為微秒。

然後將該時間除以2,因為這是信號往返花費的總時間。這為我們提供了40KHz聲音傳播到物體所需的微秒數。由於聲音傳播1釐米大約需要29.155微秒,所以我們可以將計算出的時間除以29.155。以此我們就可以計算出目標物件的距離,單位為釐米,然後將該距離值分配給cm變數。

接下來的幾行代碼會將距離(以釐米為單位)列印到串列監視器,這有助於確認代碼運行正常,並便於我們在運行程式時查看物體的距離。

代碼的最後主要相關部分是這樣的:

int note = 0; // Assign note based on distance, spacing notes per 6cm

if(cm<=48&&cm>42) {
note = 523;
} else if(cm<=42&&cm>36) {
note = 493;
} else if(cm<=36&&cm>30) {
note = 440;
} else if(cm<=30&&cm>24) {
note = 392;
} else if(cm<=24&&cm>18) {
note = 349;
} else if(cm<=18&&cm>12) {
note = 329;
} else if(cm<=12&&cm>6) {
note = 294;
} else if(cm<=6) {
note = 261;
}

if (note == 0) { // If distance isn’t within 48cm, play nothing
noTone(9);
} else {
tone(9, note, 200); // Play assigned note for 200 milliseconds
}

該代碼塊將根據物體的距離為揚聲器分配一個頻率。此Arduino參考文檔列出了一系列音符的頻率,我們將以此作為參考。使用 if else 語句 來根據目標物件的距離(以6cm為增量)為音符變數分配一個頻率,可在整個八度音階範圍內提供八個音符。如果沒有檢測到任何物體,音符變數值為0。

在最後一部分中,tone() 函數用來播放音符,如果48cm內沒有檢測到物體,noTone() 函數將會停止前一個聲音的播放。在開始迴圈之前的最後一個指令是delay()。這些延遲有助於避免程式更改音符過快,因為感測器的精確度沒有那麼高。

接線

瞭解了代碼如何運行之後,您就可以將其上傳到Arduino Uno上了,然後拔掉設備。現在,是時候將它們連接起來了。我們已經完成了代碼的編寫以盡可能簡化該過程。您所要做的就是按照以下步驟進行操作:

● 將HC-SR05感測器插入數字引腳2到6,GND插入引腳2,VCC插入引腳6。這樣連接可以使感測器朝向外側,遠離Arduino。
● 將揚聲器上的正極線(通常為紅色)插入引腳9。
● 將另一根揚聲器線(通常為黑色)插入其中一個GND引腳。

連接好所有電線好,插入Arduino,並在感測器前留出大約50釐米的空間。接下來是最有趣的部分。將您的手或者一根小棍子放在感測器前面,您會聽到揚聲器發出的聲音。物體放置的越遠,音調越高。

您可以嘗試使用delay()tone() 所帶來的持續時間使聲音聽起來更平滑,或調整頻率值以獲得不同的音符。該感測器還可以用作報警器,以在物體進入一定範圍內的區域時發出警報,或者當您的手處於某一距離範圍內時向您的電腦發送指令。