title: การเปลี่ยนแสงไฟให้เป็นภาษา: เรียนรู้การสร้างเครื่องส่งรหัสมอร์สด้วย Arduino และ LED
เปลี่ยน LED ธรรมดาให้เป็นเครื่องสื่อสารรหัสมอร์ส (Morse Code)
รหัสมอร์ส (Morse Code) คือหนึ่งในวิธีการสื่อสารที่เก่าแก่และทรงพลังที่สุดในประวัติศาสตร์วิศวกรรมโทรคมนาคม โดยการใช้เพียงสัญญาณ "จุด" (Dot) และ "ขีด" (Dash) เพื่อแทนตัวอักษรและตัวเลข ในโปรเจคนี้ เราจะสวมบทบาทเป็นวิศวกรระบบฝังตัวเพื่อสร้างอุปกรณ์ส่งสัญญาณแสงผ่าน LED โดยใช้บอร์ด Arduino เป็นตัวประมวลผลหลัก
นี่คือพื้นฐานที่ดีเยี่ยมสำหรับการเรียนรู้เรื่อง Timing Control (การควบคุมจังหวะเวลา) และ Logic Implementation (การนำตรรกะมาปรับใช้ในโค้ด) ในงานด้าน Embedded Systems
Learn how to display Morse code on an average LED.
ส่วนประกอบที่สำคัญในเชิงวิศวกรรม
การจะสร้างวงจรส่งสัญญาณที่มีเสถียรภาพ เราจำเป็นต้องเข้าใจบทบาทของอุปกรณ์แต่ละชิ้นดังนี้:
- Arduino Board (Uno/Nano/Mega): ทำหน้าที่เป็นหน่วยประมวลผลกลาง (MCU) ซึ่งจะเก็บ Logic ของรหัสมอร์สและควบคุมสถานะ Logic High/Low ที่พิน Output
- LED (Light Emitting Diode): อุปกรณ์กึ่งตัวนำที่ทำหน้าที่เปลี่ยนพลังงานไฟฟ้าเป็นพลังงานแสง (Photons) ในโปรเจคนี้มันคือตัวกลางในการส่งสาร
- Resistor (220Ω - 330Ω): มีความสำคัญอย่างยิ่งในการจำกัดกระแสไฟฟ้า (Current Limiting) ตามกฎของโอห์ม ($V = IR$) เพื่อป้องกันไม่ให้ LED เสียหายจากการได้รับกระแสเกิน
- Breadboard และสายจัมเปอร์: สำหรับการสร้างต้นแบบวงจรที่รวดเร็วและไม่ต้องบัดกรี
พื้นฐานรหัสมอร์สและตรรกะการหน่วงเวลา
หัวใจสำคัญของรหัสมอร์สคือ "จังหวะเวลา" (Timing) ซึ่งมีมาตรฐานสากลดังนี้:
- Dot (จุด): หน่วยเวลาพื้นฐาน (เช่น 200ms)
- Dash (ขีด): มีความยาวเป็น 3 เท่าของ Dot (เช่น 600ms)
- ช่องว่างระหว่างสัญลักษณ์ (Inter-element gap): เท่ากับ 1 Dot
- ช่องว่างระหว่างตัวอักษร (Short gap): เท่ากับ 3 Dots
- ช่องว่างระหว่างคำ (Medium gap): เท่ากับ 7 Dots
การต่อวงจร (Circuit Diagram)
การเชื่อมต่อทำได้ง่ายและตรงไปตรงมา:
- ต่อขา Anode (ขอยาว) ของ LED เข้ากับพินดิจิทัล (เช่น Pin 13) ของ Arduino
- ต่อขา Cathode (ขาสั้น) ของ LED เข้ากับตัวต้านทาน 220 โอห์ม
- ต่อปลายอีกด้านของตัวต้านทานลงไปยังพิน GND ของ Arduino
(โปรดคงภาพไดอะแกรมเดิมไว้ที่นี่)
การวิเคราะห์ลอจิกของซอฟต์แวร์ (Code Analysis)
ในการเขียนโปรแกรม เราจะสร้างฟังก์ชันแยกส่วน (Modular Functions) เพื่อให้โค้ดอ่านง่ายและนำไปใช้งานซ้ำได้ โดยมีการใช้พารามิเตอร์ของเวลาเป็นตัวกำหนดความหมายของแสง
// กำหนดพินและหน่วยเวลาพื้นฐาน
const int ledPin = 13;
const int unitDelay = 200; // 1 Unit = 200ms
void setup() {
pinMode(ledPin, OUTPUT);
}
// ฟังก์ชันสำหรับสร้างสัญญาณ Dot
void dot() {
digitalWrite(ledPin, HIGH);
delay(unitDelay);
digitalWrite(ledPin, LOW);
delay(unitDelay); // เว้นระยะระหว่างสัญลักษณ์
}
// ฟังก์ชันสำหรับสร้างสัญญาณ Dash
void dash() {
digitalWrite(ledPin, HIGH);
delay(unitDelay * 3); // Dash ยาวกว่า Dot 3 เท่า
digitalWrite(ledPin, LOW);
delay(unitDelay);
}
// ตัวอย่างการส่งคำว่า "SOS"
void loop() {
// S: . . .
dot(); dot(); dot();
delay(unitDelay * 2); // เว้นระหว่างตัวอักษร (รวมของเดิมเป็น 3 units)
// O: - - -
dash(); dash(); dash();
delay(unitDelay * 2);
// S: . . .
dot(); dot(); dot();
delay(unitDelay * 6); // เว้นระหว่างรอบใหม่ (รวมของเดิมเป็น 7 units)
}
คำอธิบายการทำงานของโค้ด:
- Abstraction: เราแยกการทำงานของ
dot()และdash()ออกมา เพื่อให้ในloop()เราสามารถเขียนโค้ดตามลำดับอักษรได้ทันที - State Management: การใช้
digitalWrite(ledPin, HIGH)คือการปล่อยแรงดันไฟ 5V เพื่อให้ LED สว่าง และLOWคือการตัดไฟ - Timing Ratio: สังเกตว่าในฟังก์ชัน
dash()เราใช้unitDelay * 3ซึ่งเป็นไปตามมาตรฐานสากล ทำให้ผู้รับสารสามารถแยกแยะความแตกต่างระหว่างจุดและขีดได้อย่างแม่นยำ
บทสรุปและการนำไปต่อยอด
โปรเจคนี้ไม่เพียงแต่สอนให้คุณเปิด-ปิดไฟ LED เท่านั้น แต่ยังปูพื้นฐานเรื่อง Serial Communication แบบใช้แสง และการจัดการ Time Management ในระบบสมองกลฝังตัว
หากคุณต้องการยกระดับโปรเจคนี้ คุณสามารถ:
- เพิ่ม Piezo Buzzer เพื่อให้มีเสียงควบคู่ไปกับแสง
- สร้างฟังก์ชันรับค่าจาก Serial Monitor แล้วแปลงข้อความ (String) ให้เป็นรหัสมอร์สโดยอัตโนมัติโดยใช้ Arrays หรือ Switch-Case
- ใช้ปุ่มกด (Push Button) เพื่อฝึกการเคาะรหัสมอร์สด้วยตัวเองและแสดงผลออกหน้าจอ LCD
การสื่อสารด้วยแสงอาจดูเรียบง่าย แต่ในสถานการณ์ฉุกเฉินหรือในงานวิศวกรรมที่ต้องการความประหยัดพลังงานสูงสุด หลักการเหล่านี้ยังคงถูกนำมาใช้งานจนถึงปัจจุบัน