การวัดระยะทางด้วยโมดูลอัลตราโซนิกส์
หลักการวัดระยะทางด้วยคลื่นอัลตราโซนิกส์
การวัดระยะทางด้วยคลื่นเหนือเสียงหรือคลื่นอัลตราโซนิกส์
ใช้หลักการของการสะท้อนคลื่น โดยโมดูลส่งและรับคลื่นอัลตราโซนิกส์ HC-SR04 (รูปที่ 7.1) เป็นโมดูลที่ใช้ในการวัดระยะทางโดยอาศัยหลักการสะท้อนของคลื่นอัลตราโซนิกส์
ที่ความถี่ประมาณ 40 kHz ในโมดูลนี้มีแหล่งกำเนิดคลื่นอัลตราโซนิกส์ส่งไปสะท้อนวัตถุแล้วสะท้อนกลับยังตัวรับสัญญาณ
โดยระยะทางจะสัมพันธ์กับระยะเวลาที่คลื่นเดินทางตัวส่งไปสะท้อนวัตถุแล้วกลับมายังตัวรับ
เมื่อได้เวลาในการเดินทางของคลื่นแล้วจึงนำมาคำนวณหาระยะทางระหว่างโมดูลกับวัตถุที่สะท้อนคลื่น
รูปที่
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
รูปที่
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
รูปที่
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
รูปที่
7.4
ผลลัพธ์จากการทดสอบโปรแกรมตามการทดลองข้อที่ 2 และ 3
รูปที่
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); } |
รูปที่
7.6
ผลลัพธ์จากการทดสอบโปรแกรมตามการทดลองข้อที่ 4