2015年3月23日 星期一

Arduino 測距系列 (五) Sharp GP2D12

之前既都係用超聲波, 今次講隻貴野, 用紅外線測距既 GP2D12



基本資料:

電壓:4-5.5V
電流消耗:33-50mA
感應角度:不大於 15度
探測距離:10 - 80 cm
探測精度:0.1cm+1%
分辨率:高於 1mm (可達 0.5mm)


相關資料下載:
GP2D12
GP2D12 使用說明書
GP2D12 Data Sheet

接線方法:

呢度要小心, 因為佢D針腳無名, 用番上圖咁放, 由左至右分別係 Vo, GND, Vcc



UNOGP2D12
A0Vo
5VVcc
GNDGND


測試程式:

呢舊野真係玩死人, 由於佢條曲線無一個好既轉換公式, 基本上只係用比較接近既方法去轉換成真實距離.



比較多見既兩條公式:
(1) http://www.geek-workshop.com/forum.php?mod=viewthread&tid=734&highlight=gp2d12 :

distance = 2547.8 / (0.49 * val - 10.41) - 0.42;

(2) http://playground.arduino.cc/Main/ReadGp2d12Range :
(Manning 本 Arduino in action 既例子都係用呢個計)

distance = (6787.0 / (val - 3.0)) - 4.0;

兩條公式都幾唔同下, 當中差距都幾大下, 只係有部份會比較接近.
如果要兩條公式既差距在 5% 內的話, 只可以接受 val 大約為在 80 - 450 之間.
即距離大約在 10 - 80 cm 之間, 亦配合 GP2D12 的探測距離.
所以, 用以上兩條公式去計算, 差距在 5% 以內.  用邊條都可以.


Arduino 測距系列 (三) US-015

今次要講既係同之前 HC-SR04, HY-SRF05 有 D 唔同既 US-015



基本資料:

電壓:5V
靜態電流:2.2mA
感應角度:不大於 15度
探測距離:2 - 400 cm
探測精度:0.1cm+1%
分辨率:高於 1mm (可達 0.5mm)


相關資料下載:
US-015
US-015-V2.0


接線方法:


UNOUS-015
D2Echo
D3Trig
5VVCC
GNDGND


測試程式:

unsigned int EchoPin = 2;           // connect Pin 2(Arduino digital io) to Echo at US-015
unsigned int TrigPin = 3;           // connect Pin 3(Arduino digital io) to Trig at US-015
unsigned long Time_Echo_us = 0;
unsigned long Len_mm  = 0;
void setup()
{  //Initialize
    Serial.begin(9600);                        //Serial: output result to Serial monitor
    pinMode(EchoPin, INPUT);                    //Set EchoPin as input, to receive measure result from US-015
    pinMode(TrigPin, OUTPUT);                   //Set TrigPin as output, used to send high pusle to trig measurement (>10us)
}

void loop()
{
    digitalWrite(TrigPin, HIGH);              //begin to send a high pulse, then US-015 begin to measure the distance
    delayMicroseconds(20);                    //set this high pulse width as 20us (>10us)
    digitalWrite(TrigPin, LOW);               //end this high pulse
    
    Time_Echo_us = pulseIn(EchoPin, HIGH);               //calculate the pulse width at EchoPin, 
    if((Time_Echo_us < 60000) && (Time_Echo_us > 1))     //a valid pulse width should be between (1, 60000).
    {
      Len_mm = (Time_Echo_us*34/100)/2;      //calculate the distance by pulse width, Len_mm = (Time_Echo_us * 0.34mm/us) / 2 (mm)
      Serial.print("Present Distance is: ");  //output result to Serial monitor
      Serial.print(Len_mm, DEC);            //output result to Serial monitor
      Serial.println("mm");                 //output result to Serial monitor
    }
    delay(1000);                            //take a measurement every second (1000ms)
}

Arduino 測距系列 (四) US-016

今次要講既係 US-015 既兄弟 US-016



基本資料:

電壓:5V
靜態電流:2.2mA
感應角度:不大於 15度
探測距離:2 - 400 cm
探測精度:0.1cm+1%
分辨率:高於 1mm (可達 0.5mm)

US-016 既強項係唔駛再計算, analogRead 既數值就係距離既比.
而且, 佢自己不斷量度, 唔駛係叫佢 send 再等 receive.
對於某 D 要後應快既程式, 咁樣一野讀 analog reading 係最正既.
因為唔需要 delay, 甚至可以放入 ISR 入面用 (不過, 都唔太建議).

當量程為 1m 時, analogRead 既值就是距離 (cm).
當量程為 3m 時, 只需將 analogRead 既值 X3 就是距離 (cm).

相關資料下載:
US-016-1.1


接線方法:


UNOUS-016
A0Out
空置  - 3m
GND - 1m
Range
5VVCC
GNDGND


測試程式:

1m 量程 (Range 為低電平)
unsigned int ADCValue;
void setup()
{
    Serial.begin(9600);
}

void loop()
{

    ADCValue = analogRead(0);
    Serial.print("Present Length is: ");
    Serial.print(ADCValue, DEC);
    Serial.println("mm");
    delay(1000);//delay 1S
}


3m 量程 (Range 為空置或接高電平)
unsigned int ADCValue;
void setup()
{
    Serial.begin(9600);
}

void loop()
{

    ADCValue = analogRead(0);
    ADCValue *= 3;
    Serial.print("Present Length is: ");
    Serial.print(ADCValue, DEC);
    Serial.println("mm");
    delay(1000);//delay 1S
}

Arduino 測距系列 (二) HY-SRF-05

今次要講既係同 HC-SR04 差唔多既 HY-SRF05




基本資料:

電壓:5V
靜態電流:小於 2mA
電平輸出:高 5V; 低 0V
感應角度:不大於 15度
探測距離:2 - 450 cm
精確度:可達 0.3 cm

相關資料下載:
HY-SRF05


接線方法:

呢塊同 HC-SR04 好相似, 雖然有 5 隻支腳, 但都係用番果四支.  同樣以 D4, D5 接訊號線做例子.

UNOHY-SRF05
D4Echo
D5Trig
5VVCC
GNDGND

OUT 為開關量輸出, 當報警模塊使用 (未詳細研究, 遲下補上)

測試程式 (跟 HC-SR04 相同):

enum {
  SERIAL_BAUD = 9600,
  ECHO_PIN    = 4,
  TRIG_PIN    = 5
};


void setup() 
{
 Serial.begin(SERIAL_BAUD);
 Serial.println("HC-SR04 Tester");

 pinMode(ECHO_PIN, INPUT);
 pinMode(TRIG_PIN, OUTPUT);

}

void loop() 
{
  long duration, distance;
  digitalWrite(TRIG_PIN, LOW); 
  delayMicroseconds(2); 
  digitalWrite(TRIG_PIN, HIGH); // Pulse for 10ms to trigger ultrasonic detection 
  delayMicroseconds(10); 
  digitalWrite(TRIG_PIN, LOW); 
  duration = pulseIn(ECHO_PIN, HIGH); // Read receiver pulse time 
  distance = (duration / 2) / 29.1;
  if ((distance >= 200) || (distance <=0)) {
    Serial.println("Out of range");
  } else {
    Serial.print(distance); //Ourput distance
    Serial.println(" cm");
  }
  delay(500);
}

Arduino 測距系列 (一) HC-SR04

Arduino 用黎測距既模塊多 D 是, 手頭上都有幾塊唔同既, 方便自己, 遂一記低點用.

首先係 HC-SR04


基本資料:

電壓:5V
靜態電流:小於 2mA
電平輸出:高 5V; 低 0V
感應角度:不大於 15度
探測距離:2 - 450 cm


相關資料下載:
HC-SR04


接線方法:

呢個模塊主要得四支針, Vcc, Trig, Echo 同埋 Gnd, 兩條訊號線接乜野 I/O 無所謂, 暫時以 D4, D5 做例子.

UNOHS-SR04
D4Echo
D5Trig
5VVCC
GNDGND


測試程式:

enum {
  SERIAL_BAUD = 9600,
  ECHO_PIN    = 4,
  TRIG_PIN    = 5
};


void setup() 
{
 Serial.begin(SERIAL_BAUD);
 Serial.println("HC-SR04 Tester");

 pinMode(ECHO_PIN, INPUT);
 pinMode(TRIG_PIN, OUTPUT);

}

void loop() 
{
  long duration, distance;
  digitalWrite(TRIG_PIN, LOW); 
  delayMicroseconds(2); 
  digitalWrite(TRIG_PIN, HIGH); // Pulse for 10ms to trigger ultrasonic detection 
  delayMicroseconds(10); 
  digitalWrite(TRIG_PIN, LOW); 
  duration = pulseIn(ECHO_PIN, HIGH); // Read receiver pulse time 
  distance = (duration / 2) / 29.1;
  if ((distance >= 200) || (distance <=0)) {
    Serial.println("Out of range");
  } else {
    Serial.print(distance); //Ourput distance
    Serial.println(" cm");
  }
  delay(500);
}