超音波感測器是一種利用發射出的超聲波遇到物體會反射回波來測定距離的原理運作,和 Arduino 微控器結合為一個實驗
Jason Chin 2019/9/24
這個範例是超音波模組 HC-SR04 測試和實作的範例
HC-SR04 是超音波感測器模組,由超音波發射器、接收器和控制電路所組成。當它被觸發的時候,發射器會發射連續的40kHz的聲波,當近接快要碰觸到超音波前方的物體時,音波會反射回接收器。超音波是很高頻的聲音,人類耳朵無法聽見的聲音,所以稱為超音波。
這次利用HC-SR04的超音波模組來測試
本次使用的超音波感測器模組型號為HC-SR04
HC-SR04有五個pin腳,說明如下:
Vcc:接電源
Trig:GPIO模式時,為訊號發送端 Trigger
Echo:GPIO模式時,為訊號接收端 Echo
GND:接地
HC-SR04 規格:
Ultrasonic Ranging Module HC – SR04
Working Voltage: DC 5 V
Working Current: 15mA
Working Frequency: 40Hz
Max Range: 4m
Min Range: 2cm
MeasuringAngle: 15 degree
Trigger Input Signal: 10uS TTL pulse
Echo Output Signal: Input TTL lever signal and the range in proportion
Dimension: 45*20*15mm
HC-SR04超音波測距的原理是發射一個電波,當電波遇到物體反射回來,再被測距儀偵測到反射電波,利用來回時間與音波的速度算出距離,計算公式如下:
距離 = (音波發射與接收時間差 * 聲音速度 (340M/S) ) / 2
所以超音波模組是 Arduino 給Trig pin一個10 us TTL pluse,模組就會發射8個40k Hz的聲波,如果有收到TTL的高電位訊號,那Echo會送出超音波來回的時間,使用者再計算音速換算成距離。
換算公式 =>「距離(cm) = 時間(us) / 2(來回) /29(cm/us)」。其它要注意的是量測物體最好大於0.5公尺平方,而trigger時間最好大於60ms,以免trig與echo干擾。
HC-SR04 的接線方式很簡單,只有 4 支接腳。
程式範例: 將距離測定值,傳送到監控畫面上
int Trig = 13;
int Echo = 12;
int Duration;
float Distance;
void setup() {
Serial.begin(9600);
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
void loop() {
digitalWrite(Trig,LOW);
delayMicroseconds(1);
digitalWrite(Trig,HIGH);
delayMicroseconds(11);
digitalWrite(Trig,LOW);
Duration = pulseIn(Echo,HIGH);
if (Duration>0) {
Distance = Duration/2;
Distance = Distance*340*100/1000000; // ultrasonic speed is 340m/s = 34000cm/s = 0.034cm/us
Serial.print(Duration);
Serial.print(” us “);
Serial.print(Distance);
Serial.println(” cm”);
}
delay(500);
}
接著介紹一個 Library : HC-SR04 Ultrasonic Sensor Library 它已經把測距的公式都包成了函式庫。
請到網路上找 HC-SR04 Ultrasonic,會找到 Ultrasonic-HC-SR04-master 把它 download 下來
範例之一
// Ultrasonic – Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jrodrigo.net )
// more info at www.ardublog.com
#include <Ultrasonic.h>
Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)
void setup() {
Serial.begin(9600);
}
void loop()
{
Serial.print(ultrasonic.Ranging(CM)); // CM or INC
Serial.println(” cm” );
delay(100);
}
範例之二
#include <Ultrasonic.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 13
#define Alarm_PIN 8
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
void setup()
{
Serial.begin(9600);
pinMode(Alarm_PIN,8);
}
void loop()
{
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
Serial.print(“MS: “);
Serial.print(microsec);
Serial.print(“, CM: “);
Serial.print(cmMsec);
Serial.print(“, IN: “);
Serial.println(inMsec);
if(cmMsec <=10)
{
Serial.println(“too close”);
digitalWrite(Alarm_PIN,HGHI);
}
delay(1000);
}