การวัดระยะทางด้วยโมดูลอัลตราโซนิกส์

หลักการวัดระยะทางด้วยคลื่นอัลตราโซนิกส์

การวัดระยะทางด้วยคลื่นเหนือเสียงหรือคลื่นอัลตราโซนิกส์ ใช้หลักการของการสะท้อนคลื่น โดยโมดูลส่งและรับคลื่นอัลตราโซนิกส์ HC-SR04 (รูปที่ 7.1) เป็นโมดูลที่ใช้ในการวัดระยะทางโดยอาศัยหลักการสะท้อนของคลื่นอัลตราโซนิกส์ ที่ความถี่ประมาณ 40 kHz ในโมดูลนี้มีแหล่งกำเนิดคลื่นอัลตราโซนิกส์ส่งไปสะท้อนวัตถุแล้วสะท้อนกลับยังตัวรับสัญญาณ โดยระยะทางจะสัมพันธ์กับระยะเวลาที่คลื่นเดินทางตัวส่งไปสะท้อนวัตถุแล้วกลับมายังตัวรับ เมื่อได้เวลาในการเดินทางของคลื่นแล้วจึงนำมาคำนวณหาระยะทางระหว่างโมดูลกับวัตถุที่สะท้อนคลื่น

 

1

รูปที่ 5.1 โมดูลวัดระยะทางด้วยคลื่นอัลตราโซนิกส์ HC-SR04

 

หลักการทำงานของโมดูล HC-SR04

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

 

ข้อมูลเชิงเทคนิคของโมดูล HC-SR04

• ใช้แรงดันประมาณ +5 V

• กินกระแสประมาณ 15 mA

• ช่วงการวัดระยะทาง (measurement range): ประมาณ 4 cm ถึง 4 m

• ความกว้างเชิงมุมในการวัด (measuring angle): 15 องศา

• ความกว้างของสัญญาณ Pulse สำหรับ Trigger: 10 µsec

• ระดับแรงดันลอจิกสำหรับขา TRIG และ ECHO คือ 5 V (TTL)

 

 

คำสั่งที่เกี่ยวข้องและไลบรารี Ultrasonic.h

ในการอ่านค่าระยะทางจากโมดูล HC-SR04 จะสามารถทำได้สองวิธีหลัก ๆ คือ การเขียนโค้ดควบคุมและคำนวณระยะทางด้วยตนเอง และการใช้ไลบรารี Ultrasonic.h ซึ่งในหัวข้อนี้ จะกล่าวถึงทั้งสองวิธี

การเขียนโค้ดควบคุมและคำนวณระยะทาง

1. ให้ไมโครคอนโทรลเลอร์ส่งสัญญาณพัลส์ความกว้างอย่างน้อย 10 µsec ออกไปที่ขาเอาต์พุตที่ต่อกับขา TRIG ของโมดูล

2. วัดระยะเวลาที่คลื่นเดินทางโดยอ่านค่าจากสัญญาณพัลส์ที่เป็นอินพุตจากขา ECHO ของโมดูลโดยใช้คำสั่ง/ฟังก์ชัน pulseIn() ซึ่งเป็นฟังก์ชันภายในภาษา Arduino และจะได้ค่าเป็นจำนวนเต็ม (หน่วยเป็นไมโครวินาที)

3. นำค่าที่ได้มาคำนวณเป็นระยะทาง (โดยใช้ความเร็วคลื่นเสียง 340 m/s ประกอบ)

4. แสดงค่าของระยะทางที่คำนวณได้ แล้วเว้นระยะเวลาประมาณ 300 msec (0.3 วินาที) แล้วทำขั้นตอนซ้ำ

การคำนวณระยะทางสามารถทำได้ตามสูตรที่แสดงในรูปที่ 7.2

 

1

 

รูปที่ 7.2 การคำนวณค่าระยะทางจากค่าที่อ่านได้จากโมดูล HC-SR04

 

ฟังก์ชันหลักที่ใช้ในการคำนวณคือฟังก์ชัน pulseIn(pin, value) เป็นฟังก์ชันที่ใช้แสดงค่าความกว้างของพัลส์สัญญาณที่เข้ามาที่ขา pin โดยจะกำหนดพัลส์สัญญาณที่ค่า value (HIGH หรือ LOW)

pulseIn(pin, value, timeout) จะทำงานเหมือนฟังก์ชัน pulseIn ภายในช่วงเวลา timeout ที่กำหนด (ในหน่วยไมโครวินาที)

 

ตัวอย่างการใช้ฟังก์ชัน pulseIn

 

 

int pin = D0; // กำหนด pin ที่ต้องการอ่านค่าความกว้าง

unsigned long duration; // กำหนดตัวแปรที่เก็บค่าความกว้าง

void setup() {

    pinMode(pin, INPUT); // กำหนด pin ที่ใช้อ่านค่า เป็นอินพุต

}

void loop() {

    duration = pulseIn(pin, HIGH); //อ่านค่าความกว้างพัลส์

}

 

 

ฟังก์ชัน digitalWrite(pin, value) เป็นฟังก์ชันที่เขียนค่า HIGH หรือ LOW ไปที่ pin

 

ตัวอย่าง การสร้างสัญญาณ pulse ความกว้าง 12 µsec ไปที่ขาเอาต์พุต TRIG ของโมดูล HC-SR04

 

 

int TRIG = D1;   // กำหนด pin TRIG

                 // อาจเขียนเป็น #define TRIG D1 ก็ได้เช่นกัน

void setup() {

    pinMode(TRIG, OUTPUT); // กำหนด pin TRIG นี้เป็นเอาต์พุต

}

 

void loop() {

    digitalWrite(TRIG, HIGH); // เขียนค่า HIGH ไปที่ pin TRIG

    delayMicroseconds(12);    // หน่วงเวลา 12 ไมโครวินาที

    digitalWrite(TRIG, LOW);  // เขียนค่า LOW ไปที่ pin TRIG

}

 

 

 

การใช้ไลบรารี Ultrasonic.h

นอกจากการเขียนโปรแกรมเพื่อส่งพัลส์ อ่านค่าพัลส์ และ คำนวณระยะทางด้วยตนเองแล้ว เรายังสามารถใช้ไลบรารีสำเร็จรูปที่ชื่อ Ultrasonic.h มาอ่านค่าระยะทางได้ ไลบรารีนี้สามารถหาดาวน์โหลดได้ทั่วไป เช่น จาก https://github.com/hemalchevli/
ultrasonic-library
หลังจากโหลดแล้วก็คัดลอกลงในโฟลเดอร์ C:\Arduino18\libraries โดยค่าที่ได้จะมีหน่วยเป็นเซนติเมตรหรือนิ้วก็ได้ และมีรูปแบบการใช้คือ

 

 

#include <Ultrasonic.h>

 

// กำหนด instance ของวัตถุชื่อ ultrasonic

// กำหนดขา TRIG ต่อกับขา D6 และ ECHO ต่อกับขา D7

 

Ultrasonic ultrasonic(D6, D7);

 

// อ่านค่าระยะทางในหน่วย cm และเก็บไว้ในตัวแปรจำนวนเต็มชื่อ dist

int dist = ultrasonic.Ranging(CM);

 

 

 

การทดลองวัดระยะทาง

วัตถุประสงค์

1. สามารถอธิบายหลักการวัดระยะทางด้วยคลื่นอัลตราโซนิกส์ได้

2. สามารถเขียนโปรแกรมให้ NodeMCU v.3 คำนวณค่าระยะทางได้อย่างถูกต้อง

3. สามารถเขียนโปรแกรมให้ NodeMCU v.3 แสดงค่าระยะทางบนจอ OLED และพอร์ตอนุกรมได้

 

อุปกรณ์ที่ใช้ในการทดลอง

1.     เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ Windows (ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม
Arduino IDE 1.8.8 IoT                            1 เครื่อง

2.     NodeMCU v.3                                                             1 บอร์ด

3.     NodeMCU Base Ver 1.0                                                 1 บอร์ด

4.     บอร์ดโมดูลอัลตราโซนิกส์ HC-SR04                                       1 บอร์ด

5.     บอร์ดโมดูล OLED Display ขนาด 128×64 พิกเซล                      1 บอร์ด

6.     สาย USB                                                                    1 เส้น

7.     สายต่อวงจร (สายจัมพ์ เมีย-เมีย)                                           8 เส้น

 

วิธีการทดลอง

1. ต่อวงจรดังรูปที่ 7.3

 

1

 

รูปที่ 7.3 การเชื่อมต่อ NodeMCU v.3 กับจอแสดงผล OLED และ โมดูล HC-SR04

 

 

2. เขียนโค้ดข้างล่างนี้แล้วอัปโหลดลง NodeMCU v.3 แล้วสังเกตสิ่งที่แสดงบนจอ OLED

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

 

33

34

35

36

// Read Distance by HC-SR04 with NodeMCU ESP8266

// Display on OLED

 

#include <Wire.h>

#include <SH1106.h>

 

int TRIG_PIN = D6;

int ECHO_PIN = D7;

 

SH1106 display(0x3c, D1, D2);

 

void setup() {

    display.init();

    pinMode(TRIG_PIN, OUTPUT);

    pinMode(ECHO_PIN, INPUT);   

}

 

unsigned long read_dist() {

    digitalWrite(TRIG_PIN, HIGH);

    delayMicroseconds(12);

    digitalWrite(TRIG_PIN, LOW);

    unsigned long duration = pulseIn(ECHO_PIN,HIGH);

    unsigned long dist = (17.0*duration)/1000.;

    return(dist);

}

 

void loop() {

    unsigned long distance = read_dist();

    display.clear();

    display.setFont(ArialMT_Plain_16);

    display.drawString(25, 0, "Distance");

    display.drawString(54, 15, String(distance) + " cm.");

    display.display();

    delay(200);

}

 

 

3. ทำการติดตั้งไลบรารี Ultrasonic.h แล้วเขียนโค้ดข้างล่างนี้แล้วอัปโหลดลง NodeMCU v.3 แล้วสังเกตสิ่งที่แสดงบนจอ OLED

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 

24

25

26

27

// Read Distance by HC-SR04 with NodeMCU ESP8266

// Use Ultrasonic.h library and Display on OLED

 

#include <Ultrasonic.h>

#include <Wire.h>

#include <SH1106.h>

 

// SH1106(Addr, SDA, SCL)

SH1106 display(0x3c, D1, D2);

 

// Ultrasonic(Trigger PIN, Echo PIN)

Ultrasonic ultrasonic(D6, D7);

 

void setup() {

    display.init();

}

 

void loop() {

    unsigned long distance = ultrasonic.Ranging(CM);

    display.clear();

    display.setFont(ArialMT_Plain_16);

    display.drawString(25, 0, "Distance");

    display.drawString(54, 15, String(distance) + " cm.");

    display.display();

    delay(200);

}

 

 

รูปที่ 7.4 แสดงภาพผลลัพธ์ที่ได้จากโค้ดในการทดลองข้อที่ 2 และ 3 โดยเมื่อเราทำการวางวัตถุไว้ที่หน้าโมดูลอัลตราโซนิกส์ที่ระยะห่างต่าง ๆ จะพบว่า ค่าตัวเลข Distance เปลี่ยนแปลงไป

แผนผังการทำงาน (flowchart) ของโปรแกรมในการทดลองนี้ แสดงได้ดังรูปที่ 7.5

 

1

 

รูปที่ 7.4 ผลลัพธ์จากการทดสอบโปรแกรมตามการทดลองข้อที่ 2 และ 3

 

 

1

 

รูปที่ 7.5 แผนผังการทำงานของโปรแกรม

 

4. เขียนโค้ดข้างล่างนี้แล้วอัปโหลดลง NodeMCU v.3 แล้วสังเกตสิ่งที่แสดงผ่านพอร์ตอนุกรม โดยดูผ่าน Serial Monitor ใน Arduino IDE / Tools จะได้ผลดังแสดงตัวอย่างในรูปที่ 7.6

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// Read Distance by HC-SR04 with NodeMCU ESP8266

// Display on Serial Monitor

 

#include <Ultrasonic.h>

 

// ultrasonic(Trigger PIN, Echo PIN)

Ultrasonic ultrasonic(D6, D7);

 

void setup() {

    Serial.begin(9600);

}

 

void loop() {

    unsigned long distance = ultrasonic.Ranging(CM);

    Serial.println(distance);

    delay(200);

}

 

1

 

รูปที่ 7.6 ผลลัพธ์จากการทดสอบโปรแกรมตามการทดลองข้อที่ 4