วันพฤหัสบดีที่ 21 กันยายน พ.ศ. 2560

การใช้งาน Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04)

การใช้งาน Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04)          



        ก่อนที่เราจะเข้าสู่ขั้นตอนการใช้งาน  Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04) นั้น เรามาทำความรู้จักเจ้า Sensor ตัวนี้กันก่อนดีกว่า
        โมดูล HC-SR04 เป็นอุปกรณ์อิเล็กทรอนิกส์ราคาถูก สำหรับวัดระยะห่างด้วยคลื่นอัลตราโซนิค (ใช้คลื่นเสียงความถี่ ประมาณ 40kHz) มีสองส่วนหลักคือ ตัวส่งคลื่นที่ทำหน้าที่สร้างคลื่นเสียงออกไปในการวัดระยะแต่ละครั้ง ("Ping") แล้วเมื่อไปกระทบวัตถุหรือสิ่งกีดขวาง คลื่นเสียงถูกสะท้อนกลับมายังตัวรับแล้วประมวลผลด้วยวงจรอิเล็กทรอนิกส์ภายในโมดูล ถ้าจับเวลาในการเดินทางของคลื่นเสียงในทิศทางไปและกลับ และถ้าทราบความเร็วเสียงในอากาศ ก็จะสามารถคำนวณระยะห่างจากวัตถุกีดขวางได้


รูปที่ 1 แสดง Ultrasonic Module HC-SR04

       โมดูล HC-SR04 ทำงานที่แรงดันประมาณ +5V (4.5V ถึง +5.5V) โดยป้อนให้ขา VCC และ GND โมดูลนี้ มีขาสัญญาณดิจิทัล TRIG (อินพุต) และ ECHO (เอาต์พุต) ที่นำไปเชื่อมต่อกับไมโครคอนโทรลเลอร์ได้ อย่างเช่น Arduino ในการวัดระยะห่างแต่ละครั้ง จะต้องสร้างสัญญาณแบบ Pulse ที่มีความกว้าง (Pulse Width) อย่างน้อย 10 usec ป้อนให้ขา TRIG และหลังจากนั้นให้วัดความกว้างของสัญญาณช่วง HIGH จากขา ECHO ถ้าวัตถุอยู่ใกล้ ความกว้างของสัญญาณ Pulse ที่ได้ก็จะน้อย แต่ถ้าวัตถุอยู่ไกลออกไป ก็จะได้ค่าความกว้างของสัญญาณ Pulse ที่มากขึ้น

รายละเอียดสำคัญของตัวเซ็นเซอร์ 
          ·       ใช้แรงดันประมาณ +5V
          ·       กินกระแสประมาณ 15mA
          ·       ช่วงการวัดระยะทาง (measurement range): ประมาณ 4cm ถึง 4m
          ·       ความกว้างเชิงมุมในการวัด (measuring angle): 15 องศา
          ·       ความกว้างของสัญญาณ Pulse สำหรับ Trigger: 10 usec
          ·       ระดับแรงดันลอจิกสำหรัขา TRIG และ ECHO: 5V TTL
Datasheet: http://elecfreaks.com/store/download/HC-SR04.pdf (local copy)

การต่อใช้งานระหว่าง Arduino uno r3 กับ Ultrasonic Module HC-SR04

  • Vcc -> 5v
  • Gnd -> Gnd
  • Trig -> 10
  • Echo -> 9
Example Code

#define ECHO_PIN  9 
#define TRIG_PIN  10 

void setup() {
  pinMode( TRIG_PIN, OUTPUT ); 
  pinMode( ECHO_PIN, INPUT ); 
  digitalWrite( TRIG_PIN, LOW ); // output LOW to the TRIG pin
  Serial.begin( 115200 ); // initialize serial, use baudrate=115200
}

void loop() {
 
   Distance();
 // Serial.println(  cm  );

}
void Distance()
{
   int  cm;
  unsigned long duration_usec;
  unsigned long distance_mm;
  // v = 340 m/s = (340 * 100)/10^6 cm/usec = 34/1000 cm/usec
  // 2*d = v*t => d = v*t/2 = (17*t)/1000 cm = (17*t)/100 mm. 

    duration_usec = ping();
    distance_mm = (17*duration_usec)/100;
    if ( distance_mm > 4000 ) { // out of range (beyond 4 meters)
       // Serial.println( "Out of range!" );
      
    }
    else
    {
    Serial.print( "Distance: " );
    cm = distance_mm / 10;
    Serial.print( cm );
    Serial.print( '.' );
    Serial.print( distance_mm % 10 );
    Serial.println( " cm" );
    }
}
unsigned long ping() {
  // send a pulse (at least 10 usec long) to the TRIG pin
  digitalWrite( TRIG_PIN, HIGH );
  delayMicroseconds( 12 );
  digitalWrite( TRIG_PIN, LOW );
  // measure the ECHO pulse width (in microseconds)
  unsigned long duration_usec = pulseIn( ECHO_PIN, HIGH );
  return duration_usec;
}
/////////////////////////////////////////////////////////////////////
ผลลัพท์ที่ได้


อ้างอิงข้อมูลจาก