2016.12.21
這篇要介紹的是 超音波感測器 HCSR04 ,如下圖:
範圍:2cm至300cm
電源消耗:20 mA
供電電壓:5V(最小4.5V,最大6V)
輸入觸發:積極TTL脈衝,2 us -5 us。
回波脈衝:積極TTL脈衝,115 us -18.5 ms
說明:超音波是指任何聲波或震動,其頻率超過人類耳朵可以聽到的最高閾值20kHz。
PING 超音波適合使用在機器人上, 可以檢測移動中或靜止的物體, 只佔用微處理器的2個I/O port
對應接腳:
【pulseIn(pin, value, timeout)】
變數說明:
pin=腳位
value= HIGH or LOW (讀取脈衝高低電位)
timeout (選擇使用) = 發射中斷時間;等待脈衝完成,如果沒有完整的脈衝在限定時間內接紹到,該次計算為0,默認秒數為 1秒。
範例:
duration = pulseIn(6,HIGH); //腳位6,讀取脈衝高電位
duration = pulseIn(6,HIGH,1200); //腳位6,讀取脈衝高電位,中斷1.2秒。
【delayMicroseconds(us)】
變數說明:
us=微秒
範例:
delayMicroseconds(500); //暫停0.5毫秒
使用library會非常簡單,但是完全不懂原理也是不太好,所以有下面這段實作紀錄。
程式碼:
int motorIn3 = 5; iint trig = 13; int echo = 12; int inter_time = 1000; int time = 0; float duration, distance; Void setup{ Serial.begin(9600); pinMode (trig, OUTPUT); pinMode (echo, INPUT); } void loop() { digitalWrite(trig, HIGH); delayMicroseconds(1000); digitalWrite(trig, LOW); duration = pulseIn (echo, HIGH); distance = (duration/2)/29; Serial.print("Data:"); Serial.print (time/1000); Serial.print(", d = "); Serial.print(distance); Serial.println(" cm"); time = time + inter_time; delay(inter_time); }
library在Arduino 官方網站就有提供了,下面是我放在雲端硬碟的備用檔案。
程式碼:
int motorIn3 = 5; #include <Ultrasonic.h> #define TRIGGER_PIN 13 #define ECHO_PIN 12 Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); float cmMsec; void setup{ Serial.begin(9600); } void loop(){ long microsec = ultrasonic.timing(); cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); // 計算距離,單位: 公分 Serial.println(cmMsec); //列印超音波讀取數值 delay(500); }
以上就是使用這顆超音波的方法,如果一口氣要用很多超音波,有一個技巧,就是將所有的功能都寫進去副程式當中,超音波1、超音波2,等等..
程式碼:
#include <Ultrasonic.h> #define TRIGGER_PIN1 11 #define ECHO_PIN1 10 #define TRIGGER_PIN2 13 #define ECHO_PIN2 12 Ultrasonic ultrasonic1(TRIGGER_PIN1, ECHO_PIN1); float cmMsec1; Ultrasonic ultrasonic2(TRIGGER_PIN2, ECHO_PIN2); float cmMsec2; void setup{ Serial.begin(9600); } void loop(){ HCSR04(); Serial.print(cmMsec1); Serial.print(","); Serial.println(cmMsec2); } void HCSR04(){ //超音波1 long microsec1 = ultrasonic1.timing(); cmMsec1 = ultrasonic1.convert(microsec1, Ultrasonic::CM); } //超音波1 long microsec2 = ultrasonic2.timing(); cmMsec2 = ultrasonic2.convert(microsec2, Ultrasonic::CM); }
----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------