โปรเจกต์นี้จะพาน้องสร้างระบบตรวจจับและวัดระยะห่างจากวัตถุแข็งๆ รอบตัว ใช้เซ็นเซอร์อัลตราโซนิก (Ultrasonic Sensor) เป็นตัวหลัก แล้วเรายังติดมันไว้บนเซอร์โวมอเตอร์ (Servo Motor) ให้มันหมุนสแกนไปมาได้ด้วย รับรองว่าสแกนได้เป็นพื้นที่ครึ่งวงกลมด้านหน้าแน่นอน
เพื่อให้มันตื่นเต้นกว่าเดิม เรายัด LED สีแดงกับบัซเซอร์ (Buzzer) เข้าไปด้วย โค้ดเราตั้งค่าไว้ว่า ถ้ามีอะไรเข้ามาใกล้เกิน 15 ซม. LED จะสว่างนิดหน่อย แต่ถ้าเข้ามาใกล้เกิน 5 ซม. ละก็ LED จะสว่างจ้าและบัซเซอร์จะส่งเสียงเตือนทันที น้องสามารถแกะโค้ดไปปรับระยะเหล่านี้ได้ตามใจเลย
ล้วงลึกเทคนิค
โปรเจกต์ "Sonic-Sentinel" นี้คือการลงลึกเบื้องต้นเกี่ยวกับ Active Acoustic Sensing โดยการจับคู่ทรานซิฟเวอร์อัลตราโซนิกกับเซอร์โวมอเตอร์ที่หมุนสอดคล้องกัน เราก็จะได้ระบบ "เรดาร์" (จริงๆ คือโซนาร์) ราคาประหยัด มันแสดงให้เห็นจุดตัดระหว่างฟิสิกส์กับเฟิร์มแวร์ ที่ใช้การจับเวลาในระดับไมโครวินาทีเพื่อคำนวณพิกัดตำแหน่ง
- การวิเคราะห์ Acoustic Time-of-Flight (ToF):
- การส่งพัลส์ 40kHz: เซ็นเซอร์ HC-SR04 จะส่งพัลส์เสียงอัลตราโซนิก 8 รอบที่ความถี่ 40kHz ออกไป เมื่อถูกกระตุ้นด้วยพัลส์ 10µs จาก Arduino
- การแปลงเป็นระยะทาง: ระบบจะวัดความยาวของพัลส์ "Echo" ที่สะท้อนกลับมา โดยใช้ความเร็วเสียงในอากาศ ($343m/s$ หรือ $0.0343cm/µs$) เฟิร์มแวร์จะคำนวณระยะทางด้วยสูตร: $Distance = \frac{Time \times 0.0343}{2}$ การหารด้วย 2 นี่คือเพื่อชดเชยการเดินทางไป-กลับของคลื่นเสียงจากเซ็นเซอร์ไปยังวัตถุแล้วกลับมา
- การสแกนพื้นที่แบบประสานงานกับเซอร์โว:
- การทำแผนที่พิกัดเชิงขั้ว: เพื่อสแกนมุมมอง 180º เซอร์โว SG90 จะกวาดไปเป็นขั้นๆ (discrete steps) โค้ด Arduino จะทำให้แน่ใจว่าการ "ปิง" ของเซ็นเซอร์อัลตราโซนิกเกิดขึ้นหลังจากเซอร์โวหมุนไปยังตำแหน่งที่ตั้งไว้แล้วเท่านั้น ป้องกันข้อมูลเบลอ
- ข้อดีของไลบรารี NewPing: ต่างจากวิธีมาตรฐานอย่าง
pulseIn()ไลบรารี NewPing ใช้ลอจิกจับเวลาที่ออปติไมซ์และไม่บล็อกการทำงาน ทำให้อัตราการสแกนเร็วและเสถียรกว่า
- การตอบสนองแบบสัมผัสและหลายระดับ:
- การปรับความสว่างด้วย PWM: LED สีแดงต่อกับขาพิน PWM (Pulse-Width Modulation) ซอฟต์แวร์จะแมประยะทาง (ซม.) ไปเป็นค่าความสว่าง (0-255) เมื่อวัตถุเคลื่อนจาก 15 ซม. เข้ามาใกล้ 5 ซม. วงจรทำงาน (duty cycle) จะเพิ่มขึ้น ทำให้เกิด "แสงเตือน" ที่เข้มข้นขึ้นเรื่อยๆ
- การเตือนเมื่อถึงขีดจำกัด: เมื่อวัตถุล้ำเข้าไปใน "โซนวิกฤต" 5 ซม. บัซเซอร์จะทำงานทันที ให้สัญญาณเตือนทางเสียง
วิศวกรรมและการลงมือทำ
ประกอบชิ้นส่วนต่างๆ ตามแผนภาพวงจรด้านล่างนี้เลย
- การติดตั้งส่วนกลไก: ติดเซ็นเซอร์อัลตราโซนิกบนเซอร์โวมอเตอร์ให้มั่นคง โดยให้เซ็นเซอร์สามารถกวาดได้ 180 องศาตามการเคลื่อนที่ของเซอร์โว ทำได้ด้วยเทปกาวสองหน้าหรือปืนกาว จากนั้นติดเซอร์โวให้แน่น โดยให้เซ็นเซอร์หันไปทางพื้นที่ที่ต้องการสแกน เราใช้กระดาษลังทำที่ยึดเซอร์โวแบบง่ายๆ การยึด HC-SR04 ให้แน่นเป็นเรื่องสำคัญมาก เพราะการสั่นไหวแม้เพียงนิดจะทำให้เกิดความคลาดเคลื่อนเชิงมุมในการอ่านค่าระยะทางได้
- ความแน่นอนของเฟิร์มแวร์: โปรเจกต์นี้แสดงวิธีลงมือทำสองแบบ: แบบจัดการขา Trig/Echo ด้วยตัวเอง (raw bit-banging) กับแบบใช้ไลบรารี แบบแรกช่วยให้เข้าใจการทำงานระดับฮาร์ดแวร์ชัดเจน ส่วนแบบหลังให้เฟรมเวิร์กที่แข็งแรงกว่า
ก่อนจะใส่โค้ด ไปที่ตัวจัดการไลบรารีก่อน (Tools->Manage Libraries) แล้วดาวน์โหลดไลบรารี NewPing (พิมพ์ในช่องค้นหา แล้วกดติดตั้งเมื่อมันโผล่มาในลิสต์) น้องทำโปรเจกต์นี้โดยไม่ใช้ไลบรารีนี้ก็ได้ วิธีทำจะอธิบายไว้ตอนท้าย
อัพโหลดโค้ดลงบอร์ด Arduino ของน้องได้เลย บอร์ด Arduino รุ่นไหนก็ใช้ได้ แต่ถ้าน้องเปลี่ยนพินที่ต่อกับชิ้นส่วน อย่าลืมเปลี่ยนในโค้ดด้วยนะ
ดูผลลัพธ์ เช่น ระยะห่างจากสิ่งกีดขวาง ได้ใน Serial Monitor หรือจะดูเป็นกราฟในเครื่องมือ Serial Plotter ก็ได้
- การแสดงผลข้อมูล: ด้วยการส่งค่าตัวเลขระยะทาง (ซม.) ออกไปยัง Serial Plotter ระบบจะให้มุมมองแบบ "ออสซิลโลสโคป" แสดงสภาพแวดล้อมรอบตัวแบบเรียลไทม์ ทำให้ง่ายต่อการตรวจหาสัญญาณรบกวนหรือจุดที่เซ็นเซอร์อ่านค่าไม่ได้

มาลองใช้งานเจ้าเซ็ตอัพสุดเท่ของเรากัน!! จะเอาไปตรวจจับผู้บุกรุกในห้องก็ได้ ทำเซ็นเซอร์จอดรถราคาถูกก็ดี หรือแม้แต่จับขโมยที่แอบมากินขนมเราก็ยังได้!!
มาเพิ่มทิปส์เล็กๆ น้อยๆ ให้หน่อย;
โค้ดที่ให้ด้านล่างใช้ไลบรารี่ NewPing นะ ถ้าน้องไม่อยากลงไลบรารี่ ก็ทำได้โดยไม่ต้องใช้มัน แค่แทนที่บรรทัดนี้
int cm = sonar.ping_cm();
ด้วยโค้ดชุดยาวเหยียดนี้แทน
long duration, inches, cm;
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm
อย่างที่เห็น มันยาวและดูซับซ้อนดีเนอะ แต่มันจะทำให้น้องเห็นภาพชัดเจนขึ้นว่าเซ็นเซอร์อัลตราโซนิกทำงานยังไง มันคือการส่งสัญญาณไปที่ขา trigpin เป็นเวลา 10 ไมโครวินาที แล้วคำนวณเวลาที่ใช้ในการเดินทางไปกลับถึงขา echoPin เนื่องจากระยะทางที่เดินทางไปกลับ (จากเซ็นเซอร์ไปหาวัตถุแล้วสะท้อนกลับมา) เท่ากับความเร็ว (ความเร็วเสียง ซึ่งคือ 0.0343 cm/ไมโครวินาที) คูณกับเวลา (duration) เราก็จะได้ค่าของระยะทางเก็บไว้ในตัวแปร cm นั่นเอง
สำหรับโปรเจคที่อยากให้ง่ายกว่านี้ เราสามารถตัด LED กับ Buzzer และแม้แต่ Servo ออกไปได้เลย แค่ไม่ต้องต่อมันในวงจร แล้วใช้โค้ดด้านล่างนี้แทน
#include <NewPing.h>
const int TriggerPin = 6;
const int EchoPin = 7;
// 100 = maxDistance
NewPing sonar (TriggerPin, EchoPin, 100);
void setup() {
Serial.begin(9600);
}
void loop() {
int cm = sonar.ping_cm();
Serial.println(cm);
delay(50);
}

สรุปเลยวัยรุ่น
Sonic-Sentinel นี่เป็นตัวอย่างที่เจ๋งมากที่แสดงให้เห็นว่าเซ็นเซอร์พื้นฐานๆ สามารถเอามารวมกันสร้างเป็นระบบตรวจจับพื้นที่รอบตัวที่ล้ำขึ้นได้ยังไง การเข้าใจเรื่อง Acoustic Ranging และ Servo Synchronization จะช่วยให้น้องมีสกิลที่จำเป็นสำหรับการสร้างระบบหลบหลีกสิ่งกีดขวางขั้นสูงในวงการหุ่นยนต์อัตโนมัติและ IoT Security ได้เลย
Sonic Visualization: การทำแผนที่สิ่งที่มองไม่เห็นผ่านเสียง
จัดไปวัยรุ่น!! สู้งานนะน้อง อย่าหยุดสงสัย อย่าหยุดสร้างแรงบันดาลใจ!!