เรื่องราวเบื้องหลัง
ลูกสาวผมกับเพื่อนๆ เค้าเป็นแฟนพันธุ์แท้เพลง K-POP กันเลยทีเดียว และก็อยากได้เจ้าไฟสติ๊กสุดเท่ที่เห็นในคอนเสิร์ตวงเคป๊อปกันทั้งนั้น แต่ราคามันช่างสูงลิ่วเกินไป (ทั้งผม ลูกสาว และเพื่อนๆ) เลยตัดสินใจสร้างเวอร์ชั่นของเราขึ้นมาเองไงล่ะ แค่ใส่ LED กระพริบๆ ในท่อพลาสติกมันดูเบื่อไปหน่อย พวกเราก็เลยทำอะไรที่มันว้าวขึ้นมาหน่อย!
ฟีเจอร์เด็ดๆ
- มีลวดลายไฟหลากสีให้เลือกเพียบ
- มี โหมดเฉพาะเพลง ที่เปลี่ยนรูปแบบและสีไฟให้เข้ากับจังหวะเพลง (ท่อน verse, chorus, ระหว่างท่อน...)
- มีเว็บอินเตอร์เฟซ (ใช้บนมือถือได้ด้วย) สำหรับเลือกเพลง โปรแกรมไฟ และตั้งค่าเครือข่าย
- ตรวจจับ BPM และซิงค์กับจังหวะได้ด้วยปุ่มกดในตัว
- โปรแกรมโชว์ไฟสำหรับเพลงอะไรก็ได้แบบสดๆ
- บันทึกและโหลดโชว์ไฟทั้งหมดลงในหน่วยความจำภายในได้
เรื่องการเชื่อมต่อ
- เปิดโหมด Access Point WLAN ของตัวเองอัตโนมัติ ถ้าเชื่อมต่อกับเครือข่ายที่มีอยู่ไม่ได้ หรือกดปุ่มค้างตอนเปิดเครื่อง
- เชื่อมต่อกับ WLAN ได้โดยใช้ข้อมูลที่เคยบันทึกไว้ หรือตั้งค่าใหม่ผ่านเว็บอินเตอร์เฟซ
ตัวอย่างการทำงาน
วัสดุอุปกรณ์
นอกจากชิ้นส่วนอิเล็กทรอนิกส์ (ดูรายการในส่วนคอมโพเนนต์) เราก็ต้องมีของมาประกอบเป็นตัวแท่งไฟด้วย แบบของเราได้แรงบันดาลใจจาก "BTS Armybomb" เลยใช้วัสดุประมาณนี้:
- ท่อพลาสติกยาว 30-40 ซม. เส้นผ่านศูนย์กลาง 4 ซม. พร้อมฝาปิดด้านหนึ่ง
- ลูกบอลพลาสติกขนาด 10 ซม. และ 8 ซม.
- กระดาษทราย
- สีอะครีลิคสีดำ (เลือกไม่ค่อยดีเท่าไหร่ เพราะมันลอกง่าย)
- เพชรอะคริลิกแก้ว ขนาด 4 ซม.
- FIMO (แป้งโดว์แห้งเร็ว) เอามาทำเป็นฐานสำหรับชุดเลนส์และไฟ
- กาวร้อน
ขั้นตอนการประกอบ
การต่อวงจรเป็นส่วนที่ง่ายที่สุด การเขียนซอฟต์แวร์คือส่วนที่สนุก และการประกอบตัวแท่งไฟคือช่วงลองผิดลองถูก มาดูขั้นตอนหลักๆ ตามลำดับกัน:
วงจรไฟฟ้า
อันนี้ใครๆ ก็ทำได้อยู่แล้ว แต่อย่างนึงที่ต้องบอกไว้: ตอนพัฒนาและทดสอบเอฟเฟกต์ไฟทั้งหมด ผมใช้ Arduino Uno นะ เพราะคอมไพล์และอัพโหลดโค้ดเร็วกว่าเยอะ บน Arduino Uno ปุ่มกดจะต่อกับขา D5 และขา Data ของ Neopixel ต่อกับ D12 ซึ่งเป็นตัวเลขที่เห็นในโค้ด ความสับสนเรื่องหมายเลขขาในโค้ดกับขาจริงนี่เป็นเรื่องแปลกๆ ของ ESP8266 นี่แหละ ดังนั้นแผนภาพนี้จะแสดงวิธีต่อเข้ากับ ESP8266 NodeMCU
ซอฟต์แวร์
ใน repository มีสเก็ตช์หลักๆ อยู่ 3 ไฟล์:
- the_light_stick: เฟิร์มแวร์สุดท้ายสำหรับ ESP8266 NodeMCU
- LightShow_preparation: เวอร์ชั่นที่ตัดฟังก์ชันเครือข่ายและเว็บ UI ออก เหลือแต่ฟังก์ชันหลักสำหรับโชว์ไฟ เอาไปรันบน Arduino Uno ได้ เวลาจะเปลี่ยนหรือทดสอบโปรแกรมไฟ ให้ดูคำสั่งที่สามารถส่งผ่าน Serial Interface ได้
- ui_preparation: เวอร์ชั่นที่เหลือแต่โค้ดเครือข่ายและ UI ทำให้ไฟล์เล็กลงและอัพโหลดลง NodeMCU ได้เร็วขึ้น รวมไฟล์ css และ html ต้นแบบไว้ด้วย การปรับแต่งเลย์เอาต์ทำได้โดยแค่แก้ไฟล์พวกนี้แล้วเสิร์ฟผ่านเว็บเซิร์ฟเวอร์เล็กๆ (เช่น miniweb)
มีไฟล์นึงที่ขาดไปโดยตั้งใจ น้องต้องสร้างไฟล์ `wifi_credentials.h` ขึ้นมาเอง โดยมี `#define STASSID` และ `#define STAPSK` อยู่ข้างใน
ถ้าน้องอยากเพิ่มหรือเปลี่ยนเพลงที่ตั้งค่าไว้ในโค้ด (hard coded song presets) ให้ไปดูในไฟล์ "SongPresets.ino" ที่อยู่ในโฟลเดอร์ "the_light_stick" เลยจ้า
รายละเอียดเทคนิคแบบจัดเต็ม
ประสบการณ์คอนเสิร์ตสมัยใหม่มันคือภาพของไฟ LED 50,000 ดวงในไลท์สติ๊กที่สว่างพร้อมกันเป็นแพทเทิร์นใหญ่โตเต็มสนาม โปรเจค K-Pop Lightstick นี้คือการย่อเทคโนโลยีนั้นลงมาให้อยู่ในมือเรา สอนให้น้องๆ ได้สร้างงานศิลปะจาก LED ความหนาแน่นสูงแบบพกพา ที่สามารถตอบสนองต่อคำสั่งภายนอกและเสียงเพลงได้
ทรงกลมแห่ง NeoPixel (The Spherical NeoPixel Array)
ถ้าอยากได้แสงออร่าที่เจิดจ้าเห็นชัด น้องต้องไม่ใช้แค่ LED ดวงเดียวแน่นอน ในโปรเจคนี้เราใช้ NeoPixel Jewel ที่มี LED 7 ดวงเป็นแหล่งกำเนิดแสงหลัก เอาไปติดตั้งไว้ในถ้วยที่ทำขึ้นเอง แล้วปิดทับด้วยเพชรอะคริลิกเพื่อกระจายแสง จากนั้นแสงจะถูกกระจายอีกครั้งผ่านทรงกลมพลาสติก ทำให้เกิดแสงเรืองที่สม่ำเสมอ
โดยใช้ไลบรารี FastLED Arduino จะทำการแมป LED เหล่านี้ให้เป็นอาร์เรย์เชิงตรรกะ โค้ดจะรันอนิเมชั่นซับซ้อนอย่าง sinelon(), juggle(), และ rainbow_beat() ทำให้แสงเต้นเป็นจังหวะได้อย่างเป็นธรรมชาติ ส่วนอินเทอร์เฟซเว็บจะช่วยให้เราสามารถโปรแกรมแพทเทิร์นเหล่านี้ได้แบบเรียลไทม์ และซิงค์กับเพลงผ่านการตรวจจับ BPM ได้อีกด้วย
การซิงค์ในคอนเสิร์ต (Wireless Triggers)
ไลท์สติ๊กของจริงมันไม่ได้แค่ลูปซ้ำๆ นะ มันต้องตอบสนองได้ด้วย แม้ว่าตัวที่เราสร้างกันนี้จะใช้ WiFi และอินเทอร์เฟซเว็บสำหรับควบคุม แต่แนวคิดนี้สามารถขยายไปสู่การซิงค์แบบไร้สายเป็นกลุ่มได้
- ESP8266 (อย่าง NodeMCU หรือ D1 Mini ที่เราใช้กัน) จะเปิด WiFi Access Point ของตัวเองขึ้นมา ทำให้สมาร์ทโฟนหรือแล็ปท็อปสามารถเชื่อมต่อโดยตรงเพื่อทำหน้าที่เป็น "ผู้จัดการเวที (Stage Manager)"
- ผ่านอินเทอร์เฟซเว็บ ผู้จัดการสามารถเลือกเพลงที่ตั้งค่าไว้ (song presets) หรือสั่งให้แสดงแพทเทิร์นแสงเฉพาะได้
- เฟิร์มแวร์รองรับเพลงที่ตั้งค่าไว้ในโค้ด (hardcoded song presets) ซึ่งจะเปลี่ยนแพทเทิร์นและสีให้สอดคล้องกับโครงสร้างเพลง (ท่อน verse, chorus, breaks) ในกรณีที่ใช้เป็นกลุ่ม การเรียกใช้ preset จะทำให้ไลท์สติ๊กทุกอันที่เชื่อมต่ออยู่เปลี่ยนไปพร้อมกัน
- ปุ่มที่ติดตั้งมาด้วยช่วยให้เราสามารถแตะจังหวะ BPM ด้วยมือได้ เพื่อซิงค์อนิเมชั่นแสงให้เข้ากับจังหวะของเพลงที่เล่นสด
อุปกรณ์แบบ Wearable และความต้องการพลังงาน
- ESP8266 NodeMCU หรือ D1 Mini: ต้องใส่เข้าไปในด้ามจับทรงท่อได้ รุ่น D1 Mini จะมีขนาดกะทัดรัดและเป็นโมดูลาร์มากกว่า
- NeoPixel Jewel (7 x WS2812B LEDs): โมดูล LED RGB แอดเดรสได้หลักของเรา
- แบตเตอรี่ LiPo 18650 และวงจรชาร์จ: NeoPixels ที่เปิดสีขาวเต็มความสว่างจะกินไฟมหาศาล ดังนั้นการจัดการพลังงานในโค้ดให้มีประสิทธิภาพจึงสำคัญมากสำหรับอายุการใช้งานแบตเตอรี่ อุปกรณ์นี้ใช้ไฟผ่าน USB
- ชิ้นส่วนที่ต้องทำเอง (Custom Fabrication): ท่อพลาสติก, ทรงกลม, และถ้วยที่ทำขึ้นเอง (จาก FIMO หรือ Sugru) เพื่อใช้เป็นที่ยึดชุดแสง
ชุดแสง (The optical unit):
- ทำถ้วยขึ้นมาอันนึงจาก FIMO หรือวัสดุปั้นอื่นๆ
- เส้นผ่านศูนย์กลางด้านใน: เล็กกว่าเพชรอะคริลิกนิดนึง
- เส้นผ่านศูนย์กลางด้านนอก: พอดีกับเส้นผ่านศูนย์กลางด้านในของท่อ
- ความลึกด้านในเท่ากับความสูงของเพชร
- เจาะรูที่ก้นถ้วยสำหรับสายไฟ
- บัดกรีสายไฟเข้ากับ NeoPixel Jewel
- กาว NeoPixel Jewel เข้ากับก้นถ้วย
- กาวเพชรไว้ในถ้วย (ต้องกาวให้แน่นๆ ไม่งั้นมันจะหลุดและเด้งไปมาเวลาเขย่า)
ทรงกลม (The spheres)
- ขัดทรงกลมพลาสติกขนาด 8 ซม. ให้ทั่วด้วยกระดาษทราย
- ตัดรูในทรงกลม (เราใช้ใบเลื่อยเหล็กเล็กๆ ตัดร่องก่อนเพื่อทำให้พลาสติกอ่อนตัวตรงที่ต้องการ จากนั้นใช้คีมดึงส่วนที่เตรียมไว้ออกมา)
การประกอบ (Assembly)
- เจาะรูบนท่อสำหรับปุ่มกด
- ต่อสายไฟทั้งหมดและจัดเส้นสายไฟให้เรียบร้อยผ่านท่อ
คู่มือ (Manual)
ไปหาคู่มือเต็มๆ (ภาษาอังกฤษและเยอรมัน) ได้ในไดเรกทอรี "docs" ของโปรเจกต์บน git นะ ตรงนั้นจะอธิบายด้วยว่าเราจะตั้งค่าแพทเทิร์นสำหรับเพลงเองผ่านเว็บอินเตอร์เฟซยังไง ถ้าอยากแฮดโค้ดแพทเทิร์นลงในเฟิร์มแวร์โดยตรง ก็แค่คัดลอกสตริงโปรแกรมที่เราสร้างในเว็บอินเตอร์เฟซไปวางในโค้ดไฟล์ "SongPresets.ino" ได้เลย
ตัวแปรฮาร์ดแวร์ - D1 Mini
เพื่อให้บอร์ดคอนโทรลเลอร์กินพื้นที่น้อยลง และให้การติดตั้งมันแน่นหนาเป็นโมดูลมากขึ้น พี่เลยทำตัวแปรที่ใช้บอร์ด D1 Mini กับ PCB เล็กๆ สำหรับติดตั้งง่ายๆ ขึ้นมา
แล้วเราก็เปลี่ยนวัสดุท่อด้วย โดยเอากล่องกระดาษแข็งจากม้วนกระดาษห่อของกลับมาใช้ใหม่ ดูรูปพวกนี้เลย: