กลับไปหน้ารวมไฟล์
morse-code-encoder-68808d.md

รหัสมอร์ส (Morse code) เป็นระบบเข้ารหัสตัวอักษรที่ใช้ในโทรคมนาคม ตั้งชื่อตาม Samuel F. B. Morse ผู้ประดิษฐ์โทรเลข น้องคงเคยเห็นในหนังสายลับที่ส่งข้อความลับกันใช่มั้ย? จริงๆ แล้วสมัยสงครามโลกครั้งที่ 1 และ 2 เค้าใช้รหัสมอร์สส่งข้อความลับกันบ่อยมากเลยนะ ถึงเวลาแล้วที่น้องจะได้ลองสร้างตัวเข้ารหัสมอร์สด้วยตัวเอง!

พี่ใช้ LED สีเขียวกับออดแบบแอคทีฟ (Active Buzzer) ในโปรเจกต์นี้ เผื่อว่าคนที่อาจมีข้อจำกัดทางการได้ยินหรือการมองเห็นจะสามารถรับรู้รหัสได้ จากรูปด้านบน น้องจะเห็นว่ารหัสมอร์สประกอบด้วย 'จุด' (dot) กับ 'ขีด' (dash) โดยจุดจะยาว 1 หน่วย ส่วนขีดจะยาว 3 หน่วย

พี่เตรียมสเก็ตช์ไว้ให้แล้ว โดยออกแบบให้เข้ารหัสตัวอักษรทั้งหมดในหนังสือรูปด้านบนได้ง่ายๆ เลย

การต่อวงจร

LED

  • ขาแอโนด (+) -> D3
  • ขาแคโทด (-) -> กราวด์ (GND)

ออดแบบแอคทีฟ (KY-012)

  • S -> D4
  • (+) -> 5V
  • (-) -> กราวด์ (GND)

เขียนโค้ด

แม้การต่อฮาร์ดแวร์จะดูง่ายมาก แต่สเก็ตช์นี้ยาวถึง 994 บรรทัดเลยนะ (บีบให้เหลือประมาณ 950 บรรทัดได้) ถ้าใครใช้อาร์เรย์เป็นจะบีบให้สั้นกว่านี้อีกได้ พี่จะอธิบายวิธีเตรียมสเก็ตช์ให้นะ แต่ก่อนอื่น น้องควรดูวิดีโอตัวอย่างในส่วนท้ายของหน้านี้ก่อนเพื่อให้เห็นภาพรวมว่ามันทำงานยังไง

สร้างตัวแปรชนิด String ชื่อ morseCode แบบนี้: String morseCode = ""

สร้างตัวแปรระดับโกลบอลสำหรับ LED และออดแอคทีฟ จากนั้นสร้างฟังก์ชันสองฟังก์ชันชื่อ 'dot' กับ 'dash' ฟังก์ชันนี้ไม่ต้องคืนค่าใดๆ ใช้คีย์เวิร์ด void ไปเลย อย่างที่พี่บอกไปตอนแรก รหัสมอร์สประกอบด้วย 'จุด' กับ 'ขีด' น้องอาจสังเกตในวิดีโอแล้วว่า LED จะติดเป็นเวลา 100 มิลลิวินาทีสำหรับจุด และ 300 มิลลิวินาทีสำหรับขีด ออดก็ทำงานเหมือนกันเลย

ภายในฟังก์ชัน dot() ให้เซ็ตพินของ LED เป็น HIGH รอ 100 ms แล้วเซ็ตเป็น LOW ใช้ฟังก์ชัน delay() ได้เลย ก่อนเรียก delay() ให้ใช้ฟังก์ชัน tone() เพื่อควบคุมออดแอคทีซ การเรียก tone() ก่อน delay() จะทำให้ทั้งออดและ LED ทำงานพร้อมกัน ออดต้องมีความถี่ 200 Hz และเปิดเป็นเวลา 100 ms

ภายในฟังก์ชัน dash() ให้เซ็ตพินของ LED เป็น HIGH เป็นเวลา 300 ms ออดก็ต้องมีความถี่ 200 Hz และเปิดเป็นเวลา 300 ms เช่นกัน

ทีนี้ภายใน void setup() ให้ใช้ฟังก์ชัน pinMode() เพื่อกำหนดว่าแต่ละพินเป็น INPUT หรือ OUTPUT เรียกฟังก์ชัน Serial.begin() และในวงเล็บให้ใส่ 9600 ซึ่งหมายถึงอัตราบอด (baud rate) ของพอร์ตซีเรียลเป็น 9600 บิตต่อวินาที ใช้ฟังก์ชัน Serial.print() เพื่อพิมพ์ข้อความ "Morse Code: " ใน Serial Monitor

ตอนนี้ภายใน void loop() ให้พิมพ์โค้ดต่อไปนี้:

while (Serial.available( ) > 0){
int ascii = Serial.read( );
...
}

พี่จะอธิบายให้ฟังว่าโค้ดพวกนี้ทำงานยังไง โค้ดภายในวงเล็บปีกกาจะทำงานก็ต่อเมื่อมีข้อมูลเข้ามา

เราจะใช้ฟังก์ชัน switch...case เพื่อให้ชุดคำสั่งทำงานเฉพาะเมื่อตรงกับเงื่อนไขนั้นๆ อาร์กิวเมนต์ภายใน switch() จะเป็นตัวแปร ascii ค่าทศนิยม (decimal) ของตัวอักษร ASCII แต่ละตัวจะต่างกันระหว่างตัวพิมพ์ใหญ่และพิมพ์เล็ก นั่นหมายความว่าน้องต้องเขียนชุดโค้ดซ้ำเพื่อให้ทั้งตัวพิมพ์ใหญ่และพิมพ์เล็กทำงานฟังก์ชันเดียวกัน (เหมือนในวิดีโอ) เพราะรหัสมอร์สสำหรับตัวอักษรเดียวกันนั้นเหมือนกัน ไม่ว่าจะพิมพ์ใหญ่หรือพิมพ์เล็ก

ปุ่มแบ็กสแลช (Backslash) ต้องถูกกดเพื่อเข้ารหัสข้อความใหม่ ASCII value ของปุ่มแบ็กสแลชคือ 92 ตัวอย่างโค้ดแบบนี้เลย:

switch (ascii){
case 92: //Set of functions that will be executed when backspace is pressed
Serial.println("\<br>\<br>Morse Code: ");
delay(100);
break;
case 82: // Set of functions that will be executed when letter 'R' is pressed.
morseCode.concat(".-.");
Serial.print(".-.   ");
dot();
delay(100);
dash();
delay(100);
dot();
delay(300);
break;
case 114: // Set of functions that will be executed when letter 'r' is pressed.
morseCode.concat(".-.");
Serial.print(".-.   ");
dot();
delay(100);
dash();
delay(100);
dot();
delay(300);
break;
...
}

ฟังก์ชัน morseCode.concat(parameter) เนี่ย มันจะต่อพารามิเตอร์เข้าไปในสตริง morseCode พี่ใส่ช่องว่าง 3 ยูนิต เวลาพิมพ์คำ จะได้มีช่องว่างระหว่างตัวอักษร 3 ยูนิตพอดี ส่วน delay(100) ใช้สร้างช่องว่าง 1 ยูนิตระหว่างส่วนต่างๆ ของตัวอักษร และ delay(300) ใช้สร้างช่องว่าง 3 ยูนิตระหว่างตัวอักษร ฟังก์ชัน delay() นี่แหละที่ทำให้รหัสมอร์สถูกตีความผ่าน LED และบัซเซอร์ได้อย่างแม่นยำ

น้องต้องเขียนโค้ดลักษณะนี้สำหรับทุกตัวอักษร (ตัวหนังสือ, ตัวเลข, เครื่องหมายวรรคตอน และสัญลักษณ์อื่นๆ) สำหรับรหัสมอร์สของแต่ละตัวอักษร ไปดูที่รูปที่สองในส่วนแรกได้เลยจ้า

การแปลงดิจิทัลเป็นเสียง

โปรเจกต์นี้แปลงข้อความตัวอักษรและตัวเลขจากคอมพิวเตอร์เป็นสัญญาณรหัสมอร์สสากลมาตรฐาน

  • การแมปข้อความเป็นสัญลักษณ์: Arduino จะฟังที่ พอร์ต Serial พอมีตัวอักษรเข้ามา เฟิร์มแวร์ก็จะไปดูลำดับ Dit/Dah ที่ตรงกันจากอาร์เรย์ 2 มิติในหน่วยความจำ
  • การกำหนดเวลาที่แม่นยำสูง: โค้ดจะรักษาความยาวเวลาให้เป๊ะ—โดยที่ "Dah" ยาวเป็น 3 เท่าของ "Dit" พอดี และแต่ละส่วนจะถูกคั่นด้วยช่องว่างเท่ากับ Dit หนึ่งตัว

ศูนย์กลางส่งสัญญาณ

  • เอาต์พุตทั้งแสงและเสียง: กะพริบ LED และสั่น Piezo Buzzer ที่ความถี่ 800Hz พร้อมกัน ให้เราเรียนรู้หรือส่งรหัสมอร์สได้หลายประสาทสัมผัส

ถ้ายังมีคำถามเกี่ยวกับโค้ด จัดคอมเมนต์มาได้เลย ไม่ต้องเกรงใจรุ่นพี่

ตัวอย่างผลงาน

ถ้ามีคำถามหรือข้อเสนอแนะเกี่ยวกับโปรเจกต์นี้ จัดคอมเมนต์มาได้เต็มที่เลยน้อง

ข้อมูล Frontmatter ดั้งเดิม

title: "โปรเจคส่งรหัสลับแบบมอร์สโค้ด งานง่ายแต่หล่อ!"
description: "หนังสายลับที่ส่งข้อความลับด้วยเสียงติ๊ดต่อยๆ นั่นแหละเจ้า! มาแปลงตัวเองเป็นสายลับวัยรุ่นด้วยการเข้ารหัสมอร์สโค้ดด้วยตัวเองกัน ใช้ Arduino จัดการเซนเซอร์กดปุ่มกับไฟกระพริบ ตึงๆ รับรองทำเสร็จแล้วเทพอ่ะ!"
author: "RucksikaaR"
category: ""
tags:
  - "sound"
  - "buzzer"
  - "led"
  - "communication"
  - "morse code"
views: 2292
likes: 2
price: 99
difficulty: "Intermediate"
components:
  - "1x Buzzer, Harmony XVB"
  - "1x Resistor 220 ohm"
  - "1x LED (generic)"
  - "3x Male/Female Jumper Wires"
  - "3x Male/Male Jumper Wires"
  - "1x Solderless Breadboard Half Size"
  - "1x Arduino UNO"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles: []
documentationLinks: []
passwordHash: "d30fb6ad2c2498cb25a481809381c28d4b58da6bec06d3233fe90486483806d6"
encryptedPayload: "U2FsdGVkX18Lfv4/dKDlebDp7y+qvIeY14fGOUoi3W3jgxO2hQxDS+5iYj68jKk/Z7HEchTzMH+V0e0Mr4/1z0LSkPTRnG9/jrQVuCJkyKU="
seoDescription: "Build your own Morse Code Encoder. Learn to transmit secret messages like a secret agent using Arduino. Perfect for beginners and hobbyists."
videoLinks:
  - "https://www.youtube.com/embed/aHK1nVEAJ60"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/morse-code-encoder-68808d_cover.jpg"
lang: "en"