การทำให้สิ่งที่มองไม่เห็นเป็นภาพ: มิเตอร์ LED "Distance Magic"
คลื่นเสียงมีการสะท้อนอยู่รอบตัวเราตลอดเวลา ซึ่งมองไม่เห็นด้วยตาเปล่า โปรเจกต์ "Distance Magic" นี้จะนำคลื่นเหล่านี้มาสู่สเปกตรัมที่มองเห็นได้ ด้วยการสร้างมิเตอร์ LED แบบหลายขั้นที่ตอบสนองต่อการเข้าใกล้ทางกายภาพ ด้วยการเปลี่ยนระยะทางให้เป็นสัญญาณภาพ อุปกรณ์นี้จึงเป็นรากฐานสำคัญสำหรับงานด้าน Robotics, ระบบช่วยจอดรถอัตโนมัติ หรือการติดตั้งงานศิลปะแบบอินเทอร์แอคทีฟ
การระบุตำแหน่งด้วยเสียงสะท้อนแบบ Ultrasonic ที่แม่นยำ
หัวใจของโปรเจกต์คือ HC-SR04 Ultrasonic Sensor ซึ่งใช้หลักการเดียวกับโซนาร์ทางชีวภาพที่ค้างคาวและโลมาใช้:
- คลื่นเสียง: ขา Trigger ของเซนเซอร์จะปล่อยคลื่นเสียงความถี่สูง (40kHz) ออกมา
- คลื่นสะท้อนกลับ: คลื่นเสียงจะสะท้อนจากวัตถุและกลับมาที่ขา Echo
- การคำนวณเวลาในการเดินทาง: Arduino จะวัดระยะเวลา (ในหน่วย microseconds) ระหว่างการส่งและรับคลื่นสะท้อน โดยใช้ความเร็วเสียง (ประมาณ 343 m/s) ระยะทางจะถูกคำนวณด้วยสูตร:
Distance = Time / 2 / 28.5
การวัดแบบเชิงเส้นและตรรกะแบบมีเงื่อนไข
โปรเจกต์นี้มี มิเตอร์ LED 5 ขั้น ที่แสดงผลระยะทางที่วัดได้ในรูปแบบภาพที่มีรายละเอียด ตรรกะนี้ถูกตั้งโปรแกรมโดยเพิ่มขึ้นทีละ 7 เซนติเมตร:
- LED 1 (0-7cm): วัตถุอยู่ใกล้มาก
- LED 2 (8-14cm): วัตถุกำลังเข้าใกล้
- LED 3 (15-21cm): ตรวจจับระยะกลาง
- LED 4 (22-28cm): เกณฑ์เตือนภัย
- LED 5 (29-35cm): ตรวจพบวัตถุที่ระยะการตรวจสอบสูงสุด
LED แต่ละดวงได้รับการป้องกันด้วย ตัวต้านทาน 220-ohm และถูกควบคุมผ่าน digital pins (4-8) เฉพาะบน Arduino Uno
การดีบักแบบเรียลไทม์เชิงโต้ตอบ
นอกเหนือจาก LED ที่แสดงผลด้วยภาพ โปรเจกต์ยังใช้ Serial Monitor เพื่อให้ข้อมูลตัวเลขที่แม่นยำ ด้วยการส่งข้อมูลระยะทางที่แม่นยำในหน่วยเซนติเมตรกลับไปยัง PC ผู้สร้างสามารถปรับเทียบเซนเซอร์ได้อย่างมีประสิทธิภาพ หรือใช้ข้อมูลเพื่อกระตุ้นเหตุการณ์ที่ซับซ้อนยิ่งขึ้น เช่น การหยุดหุ่นยนต์ หรือการเปิดใช้งานการแจ้งเตือน IoT ระยะไกลผ่านการอัปเกรดด้วย ESP32 หรือ ESP8266
const int echo = 13;
const int trig = 12;
const int LED1 =8;
const int LED2 =7;
const int LED3 =6;
const int LED4 =5;
const int LED5 =4;
int duration = 0;
int distance = 0;
void setup()
{
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
pinMode(LED5,OUTPUT);
Serial.begin(9600);
}
void loop()
{
digitalWrite(trig,HIGH);
delayMicroseconds(1000);
digitalWrite(trig,LOW);
duration = pulseIn(echo,HIGH);
distance = (duration/2)/28.5;
Serial.begin(distance);
if(distance <=7)
{
digitalWrite(LED1,HIGH);
}
else
{
digitalWrite(LED1,LOW);
}
if(distance <=7)
{
digitalWrite(LED1,HIGH);
}
else
{
digitalWrite(LED1,LOW);
}
if(distance <=14)
{
digitalWrite(LED2,HIGH);
}
else
{
digitalWrite(LED2,LOW);
}
if(distance <=21)
{
digitalWrite(LED3,HIGH);
}
else
{
digitalWrite(LED3,LOW);
}
if(distance <=28)
{
digitalWrite(LED4,HIGH);
}
else
{
digitalWrite(LED4,LOW);
}
if(distance <=35)
{
digitalWrite(LED5,HIGH);
}
else
{
digitalWrite(LED5,LOW);
}
}