ในช่วงยุคเริ่มต้นของวิทยุนั้น เริ่มต้นมาจากเครื่องส่ง และเครื่องรับ ที่ทำมาจากหลอดสุญญากาศ ในสมัยนั้นที่นักวิทยาศาสตร์ค้นพบคลื่นผ่านอากาศเป็นครั้งแรก พวกเขาใช้วิธีการเข้ารหัสสัญญาณแบบ AM (Amplitude modulation) ซึ่งใช้วิธีรวมสัญญาณพาหะเข้ากับสัญญาณข้อมูล แต่ด้วยในสมัยนั้นการสร้างสัญญาณพาหะที่มีความถี่สูงและสเถียรยังเป็นไปได้ยาก ผลที่ได้คือพวกเขาส่งสัญญาณแบบ AM ด้วยความถี่พาหะที่ต่ำ ทำให้ได้สัญญาณรบกวนมาก เสียงที่ได้จึงไม่ดีนัก
ต่อมาได้มีการคิดค้นวิธีเข้ารหัสสัญญาณแบบใหม่เรียกว่า FM (Frequency modulation) ผลที่ได้คือสัญญาณรบกวนต่ำกว่ามาก และได้คุณภาพเสียงที่ดี
พัฒนาต่อมาในยุคของเครื่องส่ง - รับ ที่ทำด้วยทรานซิสเตอร์ แล้วในยุคเมื่อ 10 กว่าปีที่ผ่านมา ได้เข้ามาสู่ยุคของไอซี แต่ในยุคของไอซียังจำเป็นต้องใช้อุปกรณ์ต่อร่วมจำนวนมาก โดยเฉพาะภาคจูนเนอร์ที่ยังต้องอาศัยตัวเก็บประจุปรับค่าได้มาต่อภายนอกเพื่อปรับช่องสัญญาณที่ต้องการรับ ในปัจจุบันเป็นยุคของชิป เครื่องรับวิทยุทั้งตัวได้ถูกรวมมาใส่ในชิปไอซีขนาดเล็ก ๆ แล้วสั่งงานผ่านสัญญาณดิจิตอลแทน และยุคต่อไปคือยุคของ IoT ที่อินเตอร์เน็ตจะเข้ามาอยู่ในอุปกรณ์ทุกชิ้นรอบตัวเรา บทความนี้ก็เป็นหนึ่งในบทความที่จะมาสอนให้ทุกคนลองก้าวเข้าไปในยุคของ IoT เพื่อเตรียมตัวให้พร้อมกับโลกอนาคต
อินเตอร์เน็ตในปัจจุบัน เป็นช่องทางที่ทำงานได้ถูกต้องแม่นยำ และเร็วสูงมาก หากเทียบกับสัญญาณ FM AM ในสมัยก่อนนั้น สัญญาณอินเตอร์เน็ตมีประสิทธิภาพดีกว่ามากเพราะสามารถส่งข้อมูลปริมาณมาก ๆ ได้โดยไม่ตกหล่น ทำให้เมื่อนำมาใช้สตรีมสัญญาณเสียงแล้ว ไม่มีสัญญาณรบกวนใด ๆ เข้ามากวนได้ แต่ก็มีข้อเสียเช่นเดียวกัน หากสัญญาณเน็ตไม่ดี เสียงที่ได้ก็จะหยุดไปเลย แตกต่างจากการรับสัญญาณ FM AM ตรงที่หากสัญญาณรับได้ไม่ดีก็มีเสียงซ่า ๆ หรือฟังได้ไม่ชัดเท่านั้น
โปรโตคอลในโลกอินเตอร์เน็ตที่เป็นพื้นฐานจริง ๆ มีแค่ TCP และ UDP เท่านั้น ซอฟต์แวร์สตรีมมิ่งเสียงส่วนใหญ่เลือกใช้โปรโตคอล TCP และสิ่งที่รับส่งกันผ่านโปรโตคอล TCP คือโปรโตคอล HTTP (เป็นส่วนใหญ่) นั่นเอง เริ่มต้นฝั่งที่ต้องการเสียงจะส่งส่วนหัวแบบเดียวกับ HTTP ไป แล้วฝั่งเซิร์ฟเวอร์จะตอบข้อมูลสัญญาณเสียงกลับมา จุดแตกต่างก็คือ โปรโตคอล HTTP แบบปกติ จะมีการระบุจำนวนข้อมูลที่เซิร์ฟเวอร์ส่งกลับ และจบการเชื่อมต่ออัตโนมัติเมื่อรับ-ส่งข้อมูลเสร็จ แต่เนื่องจากการสตรีมเสียง (สำหรับในบทความนี้) เป็นการขอข้อมูลที่ไม่มีวันจบสิ้น เนื่องจากทุกวินาทีจะมีสัญญาณเสียงจากสถานีส่งมาตลอด ทำให้ไม่มีการปิดการเชื่อมต่อในกรณีนี้ และโดยปกติจะต้องไม่มีการปิดการเชื่อมต่อเลย เพราะต้องรับข้อมูลเสียงมาตลอด แต่กรณีที่มีการปิดการเชื่อมต่อสามารถเป็นได้ 2 ทาง คือ ผู้ใช้ (คนฟัง) ตัดการเชื่อมต่อเอง กับปัจจัยภายนอกอื่น ๆ เช่น อินเตอร์เน็ตล่ม เซิร์ฟเวอร์ดับ เป็นต้น ซึ่งหากเป็นกรณีหลัง ควรจะต้องมีการเชื่อมต่อใหม่ได้ทันทีที่การเชื่อมต่อเก่าหยุดลงโดยผู้ใช้ไม่ต้องการ
สัญญาณเสียงที่ส่งมาผ่านโปรโตคอล TCP เป็นสัญญาณเสียงที่ถูกแปลงเป็นดิจิตอลแล้ว และถูกเข้ารหัสในมาตรฐานต่าง ๆ เช่น MP3 เป็นต้น ข้อมูลที่ได้รับมาจากเซิร์ฟเวอร์หากต้องการแปลงกลับเป็นสัญญาณเสียงแบบง่าย ๆ จะต้องใช้การถอดรหัส MP3 เป็น WAV เพื่อให้ส่งข้อมูลเสียงดิบไปยัง DAC เพื่อแปลงออกมาเป็นสัญญาณอนาล็อกได้นั่นเอง
สัญญาณเสียงที่นำไปใช้งานจริง ๆ จะต้องอยู่ในรูปแบบของ WAV ซึ่งการแปลงจากไฟล์รหัส MP3 เป็น WAV เฉพาะตัว ESP32 เองก็สามารถทำได้ แต่เนื่องจากต้องใช้ไลบรารี่ยุ่งยากและต้องใช้อุปกรณ์ภายนอกมาต่อร่วมเพื่อให้สร้างสัญญาณเสียงออกมาได้ การเลือกอุปกรณ์ถอดรหัสเสียงเฉพาะมาใช้จึงดูจะง่ายกว่ามาก
VS1003 เป็นไอซีที่รองรับการถอดรหัสไฟล์ MP3 และส่งสัญญาณเสียงผ่าน DAC ออกมาได้เลย ทำให้ง่ายต่อการใช้งานกว่ามาก เพียงส่งข้อมูลทั้งหมดของไฟล์ MP3 ไป แล้วเอาหูฟังเสียบ ก็จะได้ยินเสียงออกมาแล้ว
VS1003 ไม่ใช่โมดูลที่เหมาะสำหรับการเล่นเสียงจาก MicroSD Card มากนัก เพราะไม่สามารถต่อเข้ากับ MicroSD Card โดยตรง แต่เหมาะสำหรับการนำไปใช้ร่วมกับการนำสัญญาณเสียงที่เข้ารหัสมาจากที่อื่น ๆ มากกว่า อย่างในบทความนี้ที่นำไฟล์ MP3 มาจากอินเตอร์เน็ต ก็เหมาะจะใช้งานร่วมกับ VS1003 มาก
VS1003 รองรับการถอดรหัสไฟล์ MP3 (MPEG) บาง Bitrate และบาง Samplerate เท่านั้น ดังนั้นจึงอาจไม่ใช่ทุกไฟล์ MP3 จะสามารถนำมาให้ VS1003 ถอดรหัสได้ สำหรับ Bitrate และ Samplerate ให้ดูจากตารางด้านล่างประกอบ
ในการใช้งานด้านการสตรีมมิ่งเสียง นอกจากชนิดของการเข้ารหัส (ต้องเป็น MP3) ค่า Bitrate - Samplerate แล้ว ยังมีเรื่องของความเร็วในการรับ-ส่งข้อมูล และจำนวนข้อมูลสูงสุดที่ใส่ไว้ในแรมของ VS1003 อีกด้วย ด้วยปัจจัยหลาย ๆ อย่างเช่นนี้ ทำให้ผู้เขียนได้ทดสอบแล้วพบว่า หากค่า Bitrate สูง จะทำให้ ESP32 รับข้อมูลจากอินเตอร์เน็ต แล้วส่งต่อให้ VS1003 เก็บลงแรมไม่ทัน ทำให้เสียงที่ได้กระตุก และบางครั้งก็ขาดช่วงไปเลย ดังนั้นการเลือกเซิร์ฟเวอร์สตรีมเสียง จะต้องเลือกที่ค่า Bitrate ต่ำกว่า 128kBit/s จึงจะทำให้เสียงที่ได้นั้นต่อเนื่อง และฟังได้ลื่นไหลไม่ผิดจังหวะ
สำหรับโมดูล VS1003 รุ่นที่ร้านไอโอเอ็กซ์ฮ๊อบนำมาจำหน่ายนั้น มีขาต่อใช้งานจำนวน 9 ขา ซึ่งแต่ละขามีรายละเอียดดังนี้
จะเห็นว่า ขาที่ 4 ถึง 6 และ 8 เป็นขาที่ใช้รับ-ส่งข้อมูลแบบอนุกรมโปรโตคอล SPI ดังนั้น หากต้องการย้าย VS1003 ไปใช้งานกับไมโครคอนโทรลเลอร์อื่น ๆ ก็สามารถทำได้ โดยต่อเข้าช่อง SPI ให้ถูกต้องเท่านั้น
การพิจารณาว่าจะเลือกใช้ ESP8266 หรือ ESP32 สามารถเลือกได้จากงานที่จะให้ทำ ว่าต้องการความรวดเร็วมากเพียงใด ต้องใช้ CPU แบบเต็มประสิทธิภาพหรือไม่ และ ESP8266 สามารถตอบสนองขา GPIO ได้เพียงพอหรือไม่ เมื่อพิจารณาปัจจัยเหล่านี้นพบว่า การสตรีมมิ่งเสียงบนไมโครคอนโทรลเลอร์ถือเป็นงานที่หนักหน่วง ตั้งแต่การสตรีมข้อมูลในหลัก kBit ต่อวินาที และการส่งข้อมูลผ่าน SPI ไปให้ทัน รวมทั้งต้องรอจัดการส่วนรอการควบคุมจากผู้ใช้ จึงจำเป็นต้องใช้ไมโครคอนโทรลเลอร์ที่ทำงานได้เร็ว มี I/O เพียงพอ และมีการส่งข้อมูลผ่าน SPI ที่เร็วด้วย (มี DMA) การใช้งาน ESP32 จึงเหมาะกับงานนี้มากกว่า ESP8266
ขั้นตอนที่ 1 คือ การเตรียมอุปกรณ์ที่ใช้ทั้งหมด อุปกรณ์ที่เราใช้กันในบทความนี้หลัก ๆ มี 2 ชิ้นเท่านั้น คือ
อุปกรณ์ที่ใช้เพิ่มสำหรับการทดสอบ คือ สายจั้ม และโพรโทรบอร์ด หรือหากไม่ต้องการเสียบโมดูลทั้ง 2 ชิ้น เข้ากับโพรโทรบอร์ด ก็สามารถใช้สายจั้มเมีย - เมีย จั้มจากบอร์ดพัฒนา ESP32 ไปยังโมดูล VS1003 ก็ได้เช่นเดียวกัน
ขั้นตอนที่ 2 เป็นขั้นตอนต่อวงจรจาก VS1003 เข้ากับบอร์ดพัฒนา ESP32 เนื่องจากหากวาดรูปวงจรจริง จะซับซ้อนและดูยากมาก จึงแนะนำให้ไล่ต่อตามตารางด้านล่างนี้ โดยเส้นที่ต่อแล้วให้กดติ๊กทำเครื่องหมายหลังช่องได้เลย
บอร์ด ESP32 | โมดูล VS1003 | ต่อแล้ว |
Vin | 5V | |
GND | GND | |
GPIO26 | XRES | |
GPIO12 | MISO | |
GPIO13 | MOSI | |
GPIO14 | SCLK | |
GPIO25 | DREQ | |
GPIO27 | XCS | |
GPIO23 | XDCS |
ขั้นตอนที่ 3 เป็นขั้นตอนที่เริ่มอัพโหลดโปรแกรมแล้ว โดยขั้นตอนนี้จะต้องต่อบอร์ดพัฒนา ESP32 เข้ากับคอมพิวเตอร์เพื่อเตรียมอัพโหลดโปรแกรม
ก่อนที่จะอัพโหลดโปรแกรม มีความจำเป็นอย่างมากที่ต้องอัพเดท ESP32 Core for Arduino เนื่องจากก่อนหน้าวันที่เขียนบทความนี้ กลุ่มนักพัฒนาพึ่งแก้ปัญหาความช้าในการยุติการเชื่อมต่อ HTTP ไป โดยหากไม่อัพเดทก่อน การเปลี่ยนสถานีในขั้นตอนการทดสอบจะใช้เวลาเป็นนาทีเลยทีเดียว โดยขั้นตอนการอัพเดท ให้เข้าไปลบโฟลเดอร์ Documents\Arduino\hardware\espressif ทิ้ง แล้วทำตามขั้นตอน การติดตั้ง Arduino core for ESP32 อีกครั้ง
ในโค้ดโปรแกรมจำเป็นต้องมีการติดตั้งไลบรารี่ ESPVS1003 เพิ่ม ให้เข้าไปที่ https://github.com/mengguang/ESPVS1003 กด Clone or download แล้วคลิกที่ปุ่ม Download ZIP
เปิดไฟล์ ZIP ที่ได้ดาวน์โหลดมา เข้าไปในโฟลเดอร์ ESPVS1003-master แล้วลากโฟลเดอร์ ESPVS1003 มาใส่ใน Documents\Arduino\libraries
เปิดโปรแกรม Arduino ขึ้นมา ก๊อบโค้ดด้านล่างนี้ลงโปรแกรม Arduino แล้วแก้ไขดังนี้
แล้วเลือกบอร์ด เลือกพอร์ต กดอัพโหลดโปรแกรมได้เลย
ขั้นตอนที่ 4 ทดสอบโดยเสียบสายหูฟังเข้าที่ช่องแจ๊ค 3.5 มิล ช่องที่ไกลจากไมค์ แล้วเปิด Serial Monitor ขึ้นมา กดปุ่ม Reset ในบอร์ด ESP32 แล้วรอเชื่อมต่อ WiFi จากนั้นจะแสดงหมายเลขรหัสพร้อมชื่อสถานีขึ้นมาให้เลือก
ปรับเป็น No line ending ใส่หมายเลขสถานีที่ต้องการลงในช่อง แล้วกดปุ่ม Enter บนคีย์บอร์ด หรือ กดปุ่ม Send จากนั้นรอซักครู่ เสียงจะปรากฏที่หูฟังให้ได้ยิน
หากต้องการหยุด ให้ใส่ -1 และหากตองการเปลี่ยนสถานีที่จะฟัง สามารถกรอกรหัสสถานีลงไปได้เลย
เมื่อได้ผลถูกต้อง เป็นอันจบการทดสอบ และได้เครื่องเล่นวิทยุออนไลน์ที่สร้างด้วย ESP32 + VS1003 มาแล้ว
บทความนี้เน้นอธิบายหลักการเพื่อให้เข้าใจว่าการสตรีมเสียงมีหลักการอย่างไร จากนั้นจึงให้ทดลองก๊อบโค้ดไปใช้เพื่อทดลองว่าหลักการนั้นเป็นจริงหรือไม่ จะเห็นได้ว่าบทความไม่ได้อธิบายโค้ด เนื่องจากก่อนที่จะมาทำบทความนี้ ผู้อ่านควรมีพื้นฐานการใช้งาน ESP32 มาพอสมควรแล้ว หากดูโค้ดจะพบว่าฟังก์ชันต่าง ๆ ด้วยเป็นฟังก์ชันพื้นฐานที่มีใช้กับ ESP32 Core for Arduino อยู่แล้ว มีเพียงการติดตั้งไลบรารี่ ESPVS1003 เพิ่มเท่านั้น แต่ฟังก์ชันที่เพิ่มมาไม่ได้เข้าใจยากมากนัก จุดสำคัญอยู่ที่บรรทัดที่ 91 เป็นฟังก์ชันส่งข้อมูลเสียงเข้ารหัส MP3 ไปให้ VS1003 เท่านั้น
สำหรับบทความนี้ผู้เขียนขอจบไว้เท่านี้ แล้วบทความหน้าจะเป็นเรื่องเกี่ยวกับอะไร ฝากติดตามกันด้วยนะครับ
~ สวัสดีครับ ~