โปรเจกต์ Fairytale
กล่องขนาดเล็กที่ขับเคลื่อนโดย Arduino Uno, Adafruit MP3 Music Maker Shield และ NFC breakout board เพื่อเล่นไฟล์ MP3 ด้วยคำสั่งจาก tag
กล่องขนาดเล็กที่ขับเคลื่อนโดย Arduino Uno, Adafruit MP3 Music Maker Shield และ NFC breakout board เพื่อเล่นไฟล์ MP3 ด้วยคำสั่งจาก tag

Fairytale คือเครื่องเล่น mp3 ที่ขับเคลื่อนด้วย Arduino ซึ่งออกแบบมาเพื่อเล่น Audiobook (หรือไฟล์ MP3 ใดๆ ก็ตาม) จาก SD Card โดยผู้ใช้สามารถควบคุมการเล่นเพลง ไม่ว่าจะเป็น Audiobook หรืออัลบั้มไหน ผ่าน NFC tags ที่นำไปวางใกล้กับ NFC Reader
แท็กเหล่านี้สามารถนำไปติดกับตุ๊กตาตัวเล็กๆ ได้ เช่น สโนว์ไวท์ หรือจะติดไว้บนลูกเต๋าเล็กๆ หรืออะไรก็ตามที่เหมาะกับคุณ เพียงแต่ต้องจำไว้ว่ากล่องของผมออกแบบมาเพื่อให้ลูกสาววัย 4 ขวบใช้งาน ผมจึงเลือกใช้ตุ๊กตาตัวเล็กๆ
Fairytale ทำงานด้วย Arduino UNO V3 ซึ่งมีการติดตั้ง Adafruit Music Maker Shield ไว้ด้านบน
นอกจากนี้ยังมี Sunfounder PN532 NFC breakout board เชื่อมต่ออยู่ และสุดท้ายคือ Potentiometer
สำหรับควบคุมระดับเสียง และปุ่ม 4 ปุ่มสำหรับ pause/unpause, เลือกแทร็กถัดไป (next) หรือก่อนหน้า (previous) และเอฟเฟกต์ไฟ (สำหรับเปิดและปิด)
และแน่นอนว่าต้องมี LED สำหรับเอฟเฟกต์ไฟ :-) รวมถึงสำหรับแจ้งเตือน Warnings และ Errors ต่างๆ
เนื่องจากเครื่องเล่น MP3 นี้ไม่มีหน้าจอ สถานการณ์บางอย่าง (โดยเฉพาะ Warnings และ Errors) จะถูกแจ้งเตือนผ่านเสียงพูดแทน
หากต้องการอ่านเรื่องราวที่เป็นแรงบันดาลใจเริ่มแรกให้ผมทำโปรเจกต์นี้ สามารถเข้าไปดูได้ที่: https://gist.github.com/wkjagt/814b3f62ea03c7b1a765
ความพยายามครั้งแรกด้วย Raspberry PI
ผมเริ่มโปรเจกต์นี้ด้วย Raspberry PI แต่ก็ล้มเลิกไป โดยมีสาเหตุหลัก 3 ประการ:
1. Raspberry PI ใช้เวลาในการ Startup นานเกินไป
2. ผมไม่สามารถปิดเครื่องทันทีได้เพราะเสี่ยงที่จะทำให้ SD Card เสียหาย
3. ระดับเสียง (Volume) จาก Output ของ Raspberry PI นั้นเบามาก
สรุปคือ แนวทางของ Raspberry PI นั้นไม่ Failsafe พอสำหรับเด็ก 4 ขวบ ผมจึงเลิกใช้และเปลี่ยนมาใช้ Arduino UNO เป็นแพลตฟอร์มหลักแทน แต่ถ้าคุณยังอยากลองแนวทาง Raspberry PI ดู คุณสามารถหาผลงานล่าสุดได้ในโฟลเดอร์ย่อย RASPI-stuff อย่างไรก็ตาม โปรดทราบว่าผมทำมันยังไม่เสร็จและไม่มีคู่มือวิธีสร้างให้
ความพยายามครั้งที่สอง / ครั้งสุดท้ายด้วย Arduino
และนี่คือสิ่งที่ผมนำเสนอที่นี่ เครื่องเล่น Audiobook MP3 ที่ควบคุมด้วย NFC สำหรับลูกสาวของผม โดยใช้พื้นฐานจาก Arduino UNO, Adafruit Music Maker Shield และ Sunfounder PN532 NFC Breakout Board
ส่วนนี้จะอธิบายถึงส่วนประกอบและการจัดวาง Hardware รวมถึงการต่อสายไฟของส่วนประกอบต่างๆ ที่ประกอบขึ้นเป็น Fairytale
Components
Hardware layout

ส่วนประกอบทั้งหมดถูกใส่ลงในกล่องใบ "เล็ก" ของผมทำจากไม้ซึ่งซื้อมาจากร้านทั่วไป ผมถอดฝาด้านบนออกและเปลี่ยนเป็นแผ่นเรียบขนาดเดียวกันแทน
Speaker
ลำโพงถูกหันลงไปที่ด้านล่าง แต่อยู่เหนือพื้นกล่องเล็กน้อย ประมาณ 1 เซนติเมตร ผมติดลำโพงเข้ากับแผ่นไม้สี่เหลี่ยมที่มีรูขนาดเท่าลำโพง แล้วติดเสา 4 ต้นเพื่อยกระดับแผ่นไม้นี้ขึ้นจากก้นกล่อง ผมยังเจาะช่องที่ก้นกล่องและติดใยไฟเบอร์เพื่อป้องกันลำโพง สุดท้ายผมติดขาตั้ง 4 จุดที่ก้นกล่องเพื่อยกตัวกล่องให้สูงจากพื้น

บอกตามตรงว่า การจัดวางแบบนี้เป็นการตัดสินใจที่ไม่ค่อยดีนัก เพราะเสียงไม่ดังและไม่ใสเท่าที่ควร หากผมหันลำโพงไปด้านหน้า เสียงน่าจะดังกว่าและไม่มัว แต่ผมต้องการให้ปุ่มควบคุมระดับเสียง (ดูด้านล่าง) ยื่นออกมาจากด้านหน้ามากกว่า
NFC Reader

NFC Reader ถูกติดไว้ที่ใต้ฝาด้านบนของกล่อง และฝาด้านบนถูกยึดติดกับกล่องด้วยตะปูตัวเล็กๆ ผมยังเจาะช่องสี่เหลี่ยมผืนผ้าบนแผ่นฝาด้านบนเพื่อเว้นที่สำหรับปุ่มกดทั้ง 4 ปุ่ม โดยปุ่มเหล่านี้จะถูกยึดเข้ากับฝาด้านบนด้วยชิ้นไม้เล็กๆ ที่ทากาวติดไว้ ดูรูปประกอบได้ที่นี่
Adafruit Powerboost 1000c / LiPo Battery

Adafruit Powerboost 1000c ถูกติดกาวไว้ที่ด้านข้างใกล้กับก้นกล่อง และแบตเตอรี่วางแนวตั้งอยู่ที่มุมซ้ายด้านหน้า สำหรับส่วนนี้ผมต้องเจาะช่องเล็กๆ บนแผ่นไม้ที่รองรับลำโพง
Arduino / Music Maker Shield

ฝั่งตรงข้ามกับแบตเตอรี่จะเป็น Arduino UNO พร้อมกับ Adafruit Music Maker Shield ที่ติดกาวไว้กับกล่อง ซึ่งช่วยให้สามารถเจาะช่องเล็กๆ ที่ด้านหลังกล่องได้ ช่องนี้ใช้สำหรับดึงและเสียบ SD card เข้ากับ Music Maker Shield และยังช่วยให้เข้าถึงพอร์ต USB เพื่อโปรแกรม Arduino ได้ โดยไม่ต้องเปิดฝาด้านบนของกล่องออก
Buttons

ปุ่มกด 4 ปุ่ม (ดูด้านล่าง) อยู่บนฝาด้านบน และ Potentiometer ควบคุมระดับเสียงอยู่ที่ด้านหน้า
Lights
ด้านหน้ายังมีไฟสถานะการทำงาน (Operations light) ส่วนไฟ Error (ซึ่งใช้สำหรับแจ้งเตือน LBO ด้วย) จะอยู่ที่ด้านหลัง และ LED สำหรับ Warning จะอยู่ที่ด้านซ้าย คุณสามารถดูการออกแบบได้จากในรูป
การออกแบบกล่องเครื่องเล่น Audiobook Fairytale มาพร้อมกับ 4 ปุ่มเพื่อควบคุมการทำงาน:
นอกจากนี้ยังมีปุ่มสำหรับการโปรแกรม (A3 ดูด้านล่าง) ซึ่งจะเปลี่ยนการทำงานของโปรแกรมให้รอรับแท็ก "ใหม่" โดยจะถามหา Directory และหมายเลขแทร็กที่จะจับคู่กับแท็กนี้ และจะอัปเดต TrackDb ตามข้อมูลนั้น (เพื่อให้ฟังก์ชันนี้ทำงานได้ กล่องจะต้องเชื่อมต่อกับ Arduino IDE และ Serial Console ต้องเปิดใช้งานอยู่ ปัจจุบันฟังก์ชันนี้ยังไม่ได้ถูกเขียนโค้ดลงไป)
ปุ่มควบคุมทั้ง 4 ปุ่มเชื่อมต่อกับ Analog Pins เพียงตัวเดียว (ในที่นี้คือ A1) เพื่อแยกแยะว่าปุ่มไหนถูกกด ผมได้ติดตั้ง Resistor ที่มีค่า Ohm ต่างกันในแต่ละปุ่ม โดยผมใช้ค่าดังนี้:
Volume Control
Potentiometer ที่เชื่อมต่อกับ Analog Input Pins A0 บน Arduino ใช้สำหรับควบคุมระดับเสียง ในขณะที่เล่นเพลง โปรแกรมจะตรวจสอบการเปลี่ยนแปลงของ Potentiometer และคำนวณระดับเสียงที่สอดคล้องกันจากค่าของมัน
Pins ของ Arduino ถูกใช้งานไปค่อนข้างเยอะ หรือเรียกได้ว่าเกือบทั้งหมด
SPI
- 13 : CLK / PN532_SCK : SPI Clock ใช้งานร่วมกันระหว่าง VS1053, SD card และ NFC breakout board
- 12 : MISO / PN532_MISO : รับข้อมูลจาก VS1053, SD card และ NFC breakout board
- 11 : MOSI / PN532_MOSI : ส่งข้อมูลไปยัง VS1053, SD card และ NFC breakout board
VS1053 Music Maker Shield
- 7 : SHIELD_CS : Pins สำหรับเลือกชิป (Chip Select) ของ VS1053 (Output)
- 6 : SHIELD_DCS : Pins สำหรับเลือก Data/command ของ VS1053 (Output)
- 3 : DREQ : การร้องขอข้อมูลของ VS1053 ซึ่งตามอุดมคติควรเป็น Interrupt Pins
SD Card
- 4 CARDCS : Pins สำหรับเลือกชิป (Chip Select) ของ SD Card
PN532 NFC Reader
- 10 : PN532_SS : Pins สำหรับเลือกชิป (Chip Select) ของ NFC breakout board
LEDs
- 5 : ledPin : Pins ที่เชื่อมต่อกับ LED สถานะการทำงาน
- 8 : warnPin : Pins ที่เชื่อมต่อกับ LED สำหรับ Warning
- 9 errorPin : Pins ที่เชื่อมต่อกับ LED สำหรับ Error (เช่น ใช้สำหรับ LBO ของ Powerboost 1000c)
Input Buttons etc.
- A0 : volumePotPin : Analog Input Pins ที่ใช้สำหรับ Potentiometer
- A1 : btnLinePin : Pins ที่เชื่อมต่อกับสายปุ่มกด (4 ปุ่ม)
- A2 : batLowInputPin : Pins ที่ Powerboost 1000c ใช้ระบุว่าแบตเตอรี่ต่ำ (LBO) - แสดงผลผ่าน errorPin (ยังไม่ได้เขียนโค้ดส่วนนี้)
- A3 : programming : Pins ที่เชื่อมต่อกับปุ่มโปรแกรม (ยังไม่ได้เขียนโค้ดส่วนนี้)
Power line duplicator
เนื่องจาก Arduino มี Pins สำหรับ Output ไฟเลี้ยงและ Ground จำกัด ผมจึงตัดสินใจดึงไฟ +5V, +3V และ Ground จาก Adafruit Powerboost มาเข้า "Power line duplicator" ขนาดเล็ก ซึ่งเป็นแผ่นวงจรเล็กๆ (3ซม. x 1.5ซม.) ที่มี Male Headers ติดไว้ เชื่อมต่อกับ +5V, +3V และ GND ของ Powerboost ทำให้ผมมี Pins สำหรับ +5V 5 ช่อง, +3V 5 ช่อง และ Ground 5 ช่อง
ผมเชื่อมต่อส่วนประกอบภายนอกทั้งหมดที่ต้องการไฟเลี้ยงและ Ground เข้ากับ "Power line duplicator" นี้ เช่น PN532 NFC Reader breakout board หรือไฟเลี้ยงสำหรับปุ่มกดและ Volume Control
Buttons
ผมต้องจำกัดจำนวน Input Pins ที่ใช้สำหรับปุ่มกด เพราะ Digital Pins และ Analog Input Pins ของ Arduino ถูกใช้งานไปเกือบหมดแล้ว
ผมเชื่อมต่อปุ่มควบคุม 4 ปุ่มเข้ากับ Analog Input Pins เพียงตัวเดียว (A1) และใช้ Resistor ที่มีค่าต่างกันเพื่อแยกแยะว่าปุ่มใดถูกกด โดยรับไฟเลี้ยงจากสาย +5V นอกจากนี้ Output ของปุ่มยังถูกต่อลง Ground (ผ่าน Resistor 10KOhm) เพื่อป้องกันสัญญาณลอย (Floating)
Potentiometer สำหรับควบคุมระดับเสียงเชื่อมต่อกับ A0 และต่อลง Ground ผ่าน Resistor 10KOhm เช่นกัน โดยรับไฟเลี้ยงจากสาย +5V
ปุ่มสำหรับการโปรแกรมเชื่อมต่อกับสาย +3V และขาที่สองต่อเข้ากับ A3 โดยไม่มีการเชื่อมต่อกับ Ground
Low Battery Output
Adafruit Powerboost 1000c มาพร้อมกับ LBO (Low Battery Output) ซึ่งปกติจะเชื่อมกับสายบวกของแบตเตอรี่ แต่จะเปลี่ยนเป็น Ground เมื่อแบตเตอรี่ลดระดับลงเหลือประมาณ 3.4V ผมจึงต่อสายไฟจาก Pins LBO ของ Powerboost ไปยัง A2 และต่อลง Ground (ผ่าน Resistor 100KOhm)
คำเตือน: ส่วนนี้ยังไม่พร้อมใช้งาน!!!
โปรแกรม Fairytale จะเล่นอัลบั้ม (Audiobooks หรือเพลง) ที่เก็บไว้ใน SD Card ซึ่งเสียบอยู่ใน Adafruit Music Maker Shield การเลือกอัลบั้มที่จะเล่นทำได้โดยการวาง NFC Tags ที่เกี่ยวข้องลงบน NFC Reader
Track DB - เชื่อมต่อ NFC Tag เข้ากับ Audiobook
เมื่อตรวจพบ NFC Tag โปรแกรมจะอ่าน UID ของแท็กนั้นและนำไปค้นหาในสิ่งที่ผมเรียกว่า TrackDB เพื่อหา Directory ที่ตรงกันเพื่อเล่นเพลง
TrackDB คือรายการไฟล์ใน Directory พิเศษ (SYSTEM00) บน SD Card ไฟล์ใน TrackDB จะอยู่ในรูปแบบ:
taguid:directory:track number
ตัวอย่างเช่น:
46722634231761290:findorie:1
จากตัวอย่างข้างต้น:
Playback
โปรแกรมจะนำข้อมูลที่ได้จาก TrackDB มาเริ่มรัน For-loop โดยเริ่มจากแทร็กแรกที่ระบุไว้ ไปจนกว่าจะเล่นไฟล์ที่เรียงลำดับไว้จนครบ เมื่อเล่นไฟล์ทั้งหมดจบแล้ว โปรแกรมจะกลับเข้าสู่ Loop หลัก โดยจะหน่วงเวลาประมาณ 15 วินาที (เพื่อให้ผู้ใช้มีโอกาสนำ Tag ที่เพิ่งใช้ออกไปจากเครื่องอ่าน) จากนั้นจะรอจนกว่าจะตรวจพบแท็กถัดไป
ในระหว่างที่เล่นไฟล์ต่างๆ ใน Directory โปรแกรมจะทำการอัปเดตไฟล์ TrackDB ด้วยหมายเลขแทร็กที่กำลังเล่นอยู่ การทำเช่นนี้ช่วยให้สามารถเล่นเพลงต่อเนื่องได้แม้จะมีการหยุดกลางคัน โดยเมื่อนำแท็กออกและวางกลับลงไปใหม่ภายหลัง การเล่นจะเริ่มจากแทร็กสุดท้ายที่เล่นค้างไว้
Restrictions
เพื่อให้ระบบทำงานได้ มีข้อจำกัดบางประการดังนี้:
1. ชื่อไฟล์ทั้งหมดต้องอยู่ในรูปแบบ trackXXX.mp3 โดย XXX คือตัวเลขตั้งแต่ 001 ถึง 127
2. คุณสามารถมีไฟล์ได้สูงสุด 127 ไฟล์ต่อหนึ่ง Directory เนื่องจากผมใช้ตัวแปรแบบ char ในการนับจำนวนไฟล์เพื่อประหยัดหน่วยความจำ
3. ชื่อ Directory ทั้งหมดต้องมีความยาว 8 ตัวอักษรพอดี โดยใช้ตัวอักษร a-z และ 0-9 ผสมกันได้
4. หากมีไฟล์ใดหายไปในลำดับของไฟล์ใน Directory คุณอาจพบอาการหยุดชั่วคราว (สั้นมากๆ) ซึ่งอาจส่งผลให้เสียงสะดุดในขณะที่เครื่องกำลังคำนวณหมายเลขแทร็กถัดไป
5. Directory ทั้งหมดต้องอยู่ที่ Root Directory ของ SD Card เท่านั้น ไม่อนุญาตให้มี Directory ย่อย เนื่องจากผมใช้ Char Array ขนาด 9 ตัวอักษรสำหรับส่วน Directory ของ Path ไฟล์
Lights
ในขณะที่อัลบั้ม (หรือไฟล์) กำลังเล่น ไฟสถานะการทำงานจะค่อยๆ สว่างขึ้นและดับลง (Fading)
เมื่อมี Warning หรือ Error ไฟแจ้งเตือนที่เกี่ยวข้องจะสว่างขึ้นตามลำดับ
มีสถานะคำเตือนหรือข้อผิดพลาดอยู่ 3 รูปแบบ:
1. ข้อมูลสูญหายหรือไม่ถูกต้องสำหรับการเล่นเพลง (Warning)
2. แบตเตอรี่ต่ำ (Warning)
3. อุปกรณ์สูญหายหรือ Hardware ล้มเหลว (Error)
นอกจากนี้ เรายังแยกความแตกต่างระหว่าง Warning และ Error ด้วยเกณฑ์ที่ว่าเราจำเป็นต้องปิดเครื่องหรือไม่
Errors
Error ที่แสดงผ่านไฟ Error (และทำให้ระบบหยุดทำงานจนต้องปิดเครื่อง):
Warnings
Warning ที่แสดงผ่านไฟ (Arduino ยังคงทำงานต่อไปได้):
นอกจากนี้ หาก Adafruit Powerboost 1000c ตรวจพบระดับแบตเตอรี่ต่ำ (LBO ของ Powerboost ต่อลง Ground) LED สำหรับ Error จะติดสว่าง แม้ว่า Arduino จะดับลงในที่สุด แต่จนกว่าจะถึงตอนนั้นมันจะยังคงทำงานต่อไป
Voice feedback
นอกเหนือจากไฟแจ้งเตือนแล้ว ข้อความบางอย่างจะถูกส่งผ่านเสียงทาง Music Maker Shield ด้วย
ข้อผิดพลาดและคำเตือนที่มีเสียงบอกได้แก่:
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย