Home> Note> Arduino>超音波感測器 HCSR04

超音波感測器 HCSR04

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

接腳說明

  • VCC:正極 (5V)
  • Trig: 發射腳位( Trigger )
  • Echo:接收腳位
  • GND:負極(接地)

電路圖

對應接腳:

  • 「超音波」 <->「Arduino」
  • Trig <-> Pin13
  • Echo <-> Pin12
  • VCC <-> 5V
  • GND <-> GND

會使用到指令說明

【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)

使用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)

library在Arduino 官方網站就有提供了,下面是我放在雲端硬碟的備用檔案。

下載網址:https://goo.gl/LgquzR

程式碼:

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);
   }

                    

----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------

Top