ในบทสอนนี้เราจะมาดูกันว่าเราจะสร้างอุปกรณ์ควบคุมไฟด้วยเสียงได้ยังไง โดยใช้โมดูลจาก geeetech
ในบทสอนนี้เราจะมาดูกันว่าเราจะสร้างอุปกรณ์ควบคุมไฟด้วยเสียงได้ยังไง โดยใช้โมดูลจาก geeetech ที่ออกแบบมาสำหรับงานนี้โดยเฉพาะ เราจะดูวิธีการประกอบชิ้นส่วนลงบน PCB ที่ผลิตโดย PCBWay วิเคราะห์คำสั่งแบบฐานสิบหก (Hexadecimal) สำหรับการตั้งค่า และดูซอร์สโค้ดกัน สุดท้ายก็ทดสอบการทำงานของมัน ไปลุยกันเลยวัยรุ่น!
อุปกรณ์อิเล็กทรอนิกส์
Arduino Nano

โมดูลจดจำเสียง (Voice recognition module)

คำสั่งของโมดูลจดจำเสียง
0x00–>เข้าสู่โหมดรอรับคำสั่ง
0x01 –>ลบคำสั่งทั้งหมดในกลุ่ม 1
0x02 –>ลบคำสั่งทั้งหมดในกลุ่ม 2
0x03 –>ลบคำสั่งทั้งหมดในกลุ่ม 3
0x04–>ลบคำสั่งทั้งหมดทั้ง 3 กลุ่ม
0x11–>เริ่มบันทึกคำสั่งในกลุ่ม 1
0x12–>เริ่มบันทึกคำสั่งในกลุ่ม 2
0x13–>เริ่มบันทึกคำสั่งในกลุ่ม 3
0x21–>โหลดกลุ่ม 1 เพื่อใช้งานคำสั่งเสียง
0x22–>โหลดกลุ่ม 2 เพื่อใช้งานคำสั่งเสียง
0x23–>โหลดกลุ่ม 3 เพื่อใช้งานคำสั่งเสียง
0x24–>ตรวจสอบกลุ่มที่บันทึกไว้
0x31–>เปลี่ยนความเร็วเป็น 2400 bps
0x32–>เปลี่ยนความเร็วเป็น 4800 bps
0x33–>เปลี่ยนความเร็วเป็น 9600 bps
0x34–>เปลี่ยนความเร็วเป็น 19200 bps
0x35–>เปลี่ยนความเร็วเป็น 38400bps
0x36–>สลับไปใช้โหมดธรรมดา (Common mode)
0x37–>สลับไปใช้โหมดกะทัดรัด (Compact mode)
0xbb–>ข้อมูลเวอร์ชันของโมดูล
พารามิเตอร์
แรงดันไฟฟ้า: 4.5-5.5V
กระแสไฟ: <40mA
อินเตอร์เฟซดิจิทัล: 5V TTL
อินเตอร์เฟซอนาล็อก: แจ็คไมโครโฟนช่องสัญญาณเดี่ยว 3.5mm + พินอินเตอร์เฟซไมโครโฟน
ขนาด: 30mm x 47.5mm
ชุดอุปกรณ์ (KIT)
ชุดนี้ประกอบด้วยโมดูลจดจำเสียง, โมดูล USB serial, สายเคเบิล และไมโครโฟน

พินตัวผู้ (Male pins)

ปุ่มกด 8 ตัว (Eight Push Buttons)

พินตัวเมีย (Female Pines)

สายดูปองต์ ตัวเมีย-ตัวผู้ (Dupont cables female male)

ไมโครโฟนแบบอิเล็กเตร็ต (Electret microphone)

โมดูลรีเลย์ 8 ช่อง

คุณสมบัติ
ช่วยให้เราควบคุมการเปิด/ปิดอุปกรณ์ไฟฟ้ากำลังสูง (เครื่องใช้ในบ้าน) ได้ ทำงานเข้ากันได้ดีกับ Arduino, Pic หรือระบบดิจิทัลอื่นๆ ตัวนี้แหละที่ทำให้เราสั่ง "เปิดไฟ" ได้แบบเท่ๆ สู้งานนะน้อง!
ในบรรดาโปรเจคเจ๋งๆ ที่เราสามารถทำได้ด้วย Arduino บางทีเราก็อยากจะควบคุมอุปกรณ์ที่ใช้แรงดันสูงหรือกระแสสูง เช่น หลอดไฟหรือปั๊มน้ำ ซึ่ง Arduino ไม่สามารถควบคุมได้โดยตรง ในกรณีแบบนี้ เราจำเป็นต้องใช้ "รีเลย์ (Relay)" ตัวช่วยสำคัญที่ทำให้เราควบคุมโหลดแรงดันสูงด้วยสัญญาณเล็กๆ ได้
โมดูลนี้มีรีเลย์คุณภาพสูง 8 ตัว สามารถรับโหลดได้สูงสุด 250V/10A แต่ละช่องมีการแยกวงจรไฟฟ้าด้วยออปโตคัปเลอร์ และมี LED แสดงสถานะ การออกแบบทำให้ใช้งานร่วมกับ Arduino ได้ง่าย รวมถึงระบบอื่นๆ เช่น Raspberry Pi, ESP8266 (NodeMCU และ Wemos), Teensy และ Pic ด้วย รีเลย์โมดูลนี้จะเปิดหน้าสัมผัสแบบปกติเปิด (NO: Normally Open) เมื่อได้รับสัญญาณลอจิก "0" (0 โวลต์) และจะปิดเมื่อได้รับสัญญาณลอจิก "1" (5 โวลต์) สำหรับการเขียนโปรแกรม Arduino ควบคุมรีเลย์ แนะนำให้ใช้การจับเวลาด้วยฟังก์ชัน "millis()" แทนการใช้ฟังก์ชัน "delay" ที่จะทำให้ระบบหยุดทำงานระหว่างที่รอรีเลย์เปิด/ปิด
โหลดที่เราสามารถควบคุมได้ก็มีหลากหลาย เช่น หลอดไฟ, โคมไฟ, มอเตอร์ AC (220V), มอเตอร์ DC, โซลินอยด์, วาล์วโซลินอยด์, เครื่องทำน้ำร้อน และแอคชูเอเตอร์อีกเพียบ แนะนำให้ต่อวงจรและตรวจสอบให้ดีก่อนจ่ายไฟ และควรใส่กล่องเพื่อป้องกันวงจรด้วยนะน้อง ปลอดภัยไว้ก่อน
ข้อมูลเทคนิค
8 ช่อง อิสระต่อกัน
รีเลย์แบบ 1 ขั้ว 2 ทาง จำนวน 8 ตัว
แรงดันคอยล์รีเลย์ 5 VDC
มี LED แสดงสถานะแต่ละช่อง (ติดเมื่อคอยล์รีเลย์ทำงาน)
กระแสที่ใช้ในการขับ: วงจรควบคุมต้องจ่ายกระแส 15 ถึง 20 mA
ควบคุมได้โดยตรงด้วยสัญญาณลอจิก
ขั้วต่อแบบสกรู (คลิป)
ขั้วต่อสัญญาณลอจิกเป็นเฮดเดอร์ชาย 0.1 นิ้ว
ควบคุมได้โดยตรงด้วยสัญญาณลอจิก
เรื่องไฟเลี้ยงและการกินกระแส
วิธีง่ายที่สุดคือจ่ายไฟให้โมดูลนี้จาก Vcc และ GND ของบอร์ด Arduino โดยปล่อยจัมเปอร์ไว้แบบนั้น (JD-Vcc = Vcc) แต่วิธีนี้มีข้อจำกัดสำคัญ 2 ข้อ:
เราจะเสียการแยกวงจรจากออปโตคัปเลอร์ไป ทำให้ Arduino มีโอกาสเสียหายได้หากโหลดของรีเลย์มีปัญหา
กระแสที่คอยล์รีเลย์ใช้ต้องมาจากบอร์ด Arduino คอยล์แต่ละตัวกินกระแสประมาณ 90 mA รวม 4 ตัวก็ 360 mA แล้ว ถ้าบวกกับกระแสที่ขาอื่นๆ ใช้ด้วย เราก็จะใกล้ๆ กับขีดจำกัด 500 mA ที่พอร์ต USB จ่ายได้ ในกรณีนี้ควรจ่ายไฟให้ Arduino จากแหล่งจ่ายภายนอก ซึ่งจะเพิ่มขีดจำกัดกระแสเป็น 1 A (สำหรับ Arduino UNO)
วิธีที่ปลอดภัยกว่าคือถอดจัมเปอร์ออก แล้วจ่ายไฟให้บอร์ดรีเลย์จากสองแหล่ง: แหล่งแรกจากบอร์ด Arduino ต่อกับ Vcc และแหล่งที่สอง ต่อบวกกับ JD-Vcc และลบกับ GND โดยไม่ต้องต่อกับบอร์ด Arduino วิธีนี้มีข้อดีคือ:
มีการแยกวงจรสมบูรณ์ระหว่างโหลดกับ Arduino
ไฟเลี้ยงรีเลย์ทั้งหมดมาจากแหล่งจ่ายที่สอง ไม่ดึงจาก Arduino หรือพอร์ต USB
เรื่องอินพุต
อินพุตของบอร์ดสามารถต่อตรงกับดิจิตอลเอาต์พุตของบอร์ด Arduino ได้เลย ข้อควรระวังเดียวคือตอนเปิดสวิตช์ Arduino พินจะถูกตั้งค่าเป็นอินพุตอัตโนมัติ อาจมีช่วงเวลาสั้นๆ ระหว่างการสตาร์ทกับการตั้งค่าพินเป็นเอาต์พุตที่สัญญาณควบคุมไปยังโมดูลรีเลย์ยังไม่นิ่ง เราสามารถป้องกันได้โดยต่อตัวดึงขึ้น (pull-up) ด้วยตัวต้านทาน 10K ระหว่าง Vcc กับแต่ละอินพุต เพื่อให้แน่ใจว่าสถานะเป็น HIGH ตอนเริ่มระบบ
PCB

ดาวน์โหลดไฟล์ PCB ได้ที่นี่เลยวัยรุ่น
วงจร (Circuit)

โครงสร้างระบบและรายละเอียดทางเทคนิค
โปรเจคนี้จะพาน้องไปดูวิธีควบคุมด้วยเสียงแบบออฟไลน์ ทำงานในเครื่องเลย ไม่ต้องพึ่งเซิร์ฟเวอร์เมฆแบบ Amazon Alexa หรือ Google Assistant ให้วุ่นวาย หลักการคือใช้สมาร์ทโฟน Android ของเรานี่แหละ ในการแปลงเสียงเป็นข้อความแบบออฟไลน์ แล้วส่งสตริงคำสั่งที่ได้ไปหา Arduino ผ่านทาง Serial (หรือจะใช้ Bluetooth แบบอีกคอนฟิกนึงก็ได้) ง่ายๆ จัดไปวัยรุ่น!
ขั้นตอนการแปลงเสียงเป็นข้อความ (Speech-to-Text Pipeline)
น้องไม่ต้องมานั่งเขียนซอฟต์แวร์จดจำเสียงให้วุ่นวายบน Arduino นะ งานนี้เขาจัดการให้เราไว้ข้างบนแล้ว:
- แอป/โมดูล (The App/Module): เราจะใช้โมดูลจดจำเสียงเฉพาะทาง (ตามรูปชิ้นส่วนด้านบน) หรือถ้าออกแบบแบบใช้ Bluetooth ก็อาจจะโหลดแอปอย่าง `AMR_Voice` (Arduino Voice Control) มาใช้บนมือถือ Android ได้
- การรับคำสั่ง (Command Capture): พูดคำสั่งออกไป เช่น "เปิดไฟครัว"
- ประมวลผลและส่งต่อ (Processing & Transmission): เสียงจะถูกแปลงเป็นข้อความ ถ้าใช้โมดูลเฉพาะทาง มันจะส่งรหัสคำสั่งที่กำหนดไว้ล่วงหน้าออกมา แต่ถ้าใช้แอป Bluetooth มือถือจะส่งสตริงข้อความธรรมดา เช่น
*kitchen light on#ผ่าน Bluetooth ไปหาโมดูลอย่าง HC-05
การแยกวิเคราะห์คำสั่งบน Arduino (Arduino Command Parsing)
Arduino ที่ต่อกับโมดูลเสียงผ่าน Serial (หรือต่อกับโมดูล Bluetooth) จะรอรับข้อมูลเข้ามา มันใช้ routine การแยกวิเคราะห์เพื่อหาจุดเริ่มต้นและจุดสิ้นสุดของคำสั่งที่สมบูรณ์ สำหรับระบบที่ใช้ข้อความ มันจะมองหา delimiter อย่าง `*` (ตัวอักษรเริ่มต้น) และ `#` (ตัวอักษรสิ้นสุด)
if (voiceCommand == "kitchen light on") {
digitalWrite(Relay1, HIGH);
Serial.println("Kitchen executed!");
} else if (voiceCommand == "all lights off") {
digitalWrite(Relay1, LOW);
digitalWrite(Relay2, LOW);
}
แต่สำหรับโมดูล Geeetech ที่ใช้ในโปรเจคนี้ การแยกวิเคราะห์จะอิงตามชุดคำสั่งเลขฐานสิบหก (hexadecimal command set) ที่ลิสต์ไว้ก่อนหน้านี้แหละ
เพิ่มปุ่มกดสำรอง (Adding Manual Overrides (Keys))
ระบบสมาร์ทโฮมที่แมนๆ ต้องมีทางสำรองให้กดด้วยมือเสอนะ นี่แหละคือเหตุผลที่รายการชิ้นส่วนมี ปุ่มกด (Push Buttons) ตามรูปด้านบน พวกนี้จะถูกต่อแบบขนานกับลอจิกของคำสั่งเสียง ไม่ว่า Arduino จะได้รับคำสั่งเสียงที่ถูกต้อง หรือ ตรวจจับการกดปุ่มทางกายภาพ มันก็จะสั่งงานรีเลย์ตัวที่ตรงกัน ทำให้ระบบยังใช้งานได้เสมอ แม้น้องจะไม่มีมือถือหรือโมดูลเสียงมีปัญหา ห้ามช็อตนะตัวนี้!
สรุปการตั้งค่าระบบ (System Setup Summary)
- ตัวควบคุม (Controller): Arduino Nano (ตามรูปด้านบน)
- อินพุทเสียง (Voice Input): Geeetech Voice Recognition Module (วิธีหลักสำหรับบทเรียนนี้)
- ควบคุมแบบไร้สายสำรอง (Alternative Wireless Control): โมดูล Bluetooth HC-05 หรือ HC-06 (สำหรับวิธีใช้มือถือ)
- ตัวสั่งงาน (Actuation): โมดูลรีเลย์ 8 ช่อง (8-Channel Relay Module) (เพื่อจัดการกับแรงดันไฟบ้านสำหรับหลอดไฟอย่างปลอดภัย)
- ควบคุมด้วยมือ (Manual Control): ปุ่มกดจริงๆ สำหรับการควบคุมสำรอง
ภาพรวมซอร์สโค้ด (Source Code Overview)
ตั้งค่าความเร็วพอร์ต Serial เป็น 9600bps ซึ่งเป็นความเร็วมาตรฐานของโมดูลจดจำเสียง
ด้วยคำสั่ง:
Serial.write(0xAA);
Serial.write(0x37);
เราส่งคำสั่ง Serial `AA 37` เพื่อสลับโมดูลไปโหมดกะทัดรัด (compact mode)
ด้วยคำสั่ง:
Serial.write(0xAA);
Serial.write(0x21);
เราส่งคำสั่ง `AA 21` เพื่อเลือกกลุ่มคำสั่งให้โมดูลทำงาน จำไว้ว่ามี 3 กลุ่ม กลุ่มละ 5 คำสั่งเสียง แต่เลือกทำงานได้ทีละกลุ่มเดียวเท่านั้น
โค้ดยังมีฟังก์ชันอย่าง color(255,102,0); ซึ่งถูกเรียกเพื่อส่งพารามิเตอร์ PWM ไปยังขาที่ต่อกับสวิตช์ปรับแสง (dimmer switches) ทำให้เราควบคุมความสว่างของไฟได้ นอกเหนือจากคำสั่งเปิด/ปิดธรรมดา สู้งานนะน้อง!