ช่วงหลังมานี่พี่ติดใจเล่นไฟ LED กับ Arduino ทำโปรเจคต์สนุกๆ ไปเรื่อยเลยอะ นี่คือโปรเจคต์คริสต์มาสปี 2017 ของพี่ ต้นคริสต์มาสไม้ประดับไฟ LED!

ดูมันทำงานจริงๆ แบบนี้เลยจ้า:
มองเผินๆ มันอาจดูง่ายนะ แต่ใช้เวลาทำนานอยู่เหมือนกัน โดยเฉพาะขั้นตอนบัดกรีอะ ต้นนี้พี่ออกแบบให้มีทั้งหมด 6 ชั้น แต่ละชั้นเรียงไฟ LED สลับสีแดง เขียว ขาว เป็นพวงมาลัยรอบต้น แต่ละสีในแต่ละชั้นเป็นวงจรแยกกันหมดเลย พี่เลยควบคุมสีและแถวได้อิสระทุกจุด

พี่พบว่าการใช้ลวด 20ga ตะกั่วอาบ (tinned wire) ต่อไฟ LED ทุกดวงมันสะดวกสุด มันทำให้ด้านหลังดูเรียบร้อยและแข็งแรงพอที่จะแยกวงจรไม่ให้ชนกันได้ (ถึงจะต้องใช้กาวร้อนช่วยยึดเป็นฉนวนบางจุดก็เถอะ) จากนั้นก็ต่อตัวต้านทาน (Resistor) เข้ากับแต่ละแถวของ LED แล้วใช้ลวด 24ga ลงไปที่ฐาน ส่วนขา ground ของ LED ทั้งหมดก็ต่อรวมกัน
สรุปคือต้นไม้มีทั้งหมด 18 วงจร ใช้ Arduino Uno ตัวเดียวควบคุม ส่วนดาวบนยอดเป็นอีกชุดนึงแยกออกมา มี 20 วงจร ใช้ Nano คุม อุปกรณ์ทั้งหมดยัดไว้ในฐานหมดเลย:

ข้างในฐานมันไม่สวยเท่าไหร่หรอก พี่มีแผนจะปรับปรุงใหม่ เพราะตอนนี้พี่ทำแผงสวิตช์บอร์ด (switchboard PCB) ของตัวเองขึ้นมาแล้ว เดี๋ยวพี่จะอธิบายต่อไป แต่นี่คือไส้ในทั้งหมด ณ ตอนนั้น:

ล้วงลึกเทคนิค: สถาปัตยกรรมระบบไฟและการควบคุม
ดาวบนยอดใช้ Nano จ่ายไฟได้สบายๆ แต่ต้นไม้มีไฟ LED เยอะเกินไปนิดนึงสำหรับ Uno ตัวเดียว เพื่อแก้ปัญหาขีดจำกัดกระแสไฟจากขา GPIO ของ Arduino Uno พี่เลยออกแบบ แผงสวิตช์ทรานซิสเตอร์ PNP (PNP Transistor Switchboard) แบบคัสตอมขึ้นมา บอร์ดนี้จะใช้สัญญาณลอจิกจาก Uno มาควบคุมการจ่ายไฟกระแสสูงจากแหล่งจ่ายไฟอีกชุดนึง
- แผงสวิตช์โฟโตนิคส์กระแสสูง: ระบบนี้ใช้ทรานซิสเตอร์ PNP จำนวน 18 ช่อง Arduino Uno จะส่งสัญญาณ 5V HIGH ไปที่ขาเบสของแต่ละทรานซิสเตอร์ผ่านตัวต้านทาน 1kΩ เพื่อเปิดการจ่ายไฟจากเรล 5V อีกเส้น (ซึ่งได้จากบักคอนเวอร์เตอร์) ไปยังแถว LED ที่ต้องการ วิธีนี้ทำให้ Uno สามารถควบคุม LED ได้จำนวนมากโดยไม่ต้องรับโหลดกระแสไฟโดยตรง
- ความเสถียรของเรลไฟ: ความหนาแน่นของ LED บนต้นไม้ต้องการโครงสร้างระบบไฟที่มั่นคง บักคอนเวอร์เตอร์ทำหน้าที่ลดแรงดันไฟ DC เสริม (จากเพาเวอร์ซัพพลาย DVD เสียที่พี่เอามาใช้) ให้เหลือ 5V ที่เสถียร การให้ความสำคัญกับเส้นกราวด์ร่วม (common-ground return paths) ช่วยให้ไฟทุกวงจรจาก 18 วงจรอิสระนี้สว่างได้โดยไม่มีไฟกระพริบ
ช่วงหลังพี่ก็เริ่มสนใจการออกแบบและผลิตแผงวงจรพิมพ์ (PCB) ผ่าน JLCPCB ด้วย ซึ่งพี่ก็วางแผนจะเอามาปรับใช้ในโปรเจคต์นี้เพื่อให้การเดินสายดูสะอาดตาขึ้น นี่คือแผงสวิตช์บอร์ดของพี่ มันทำให้การต่อสายง่ายมากๆ มีด้าน IN รับสัญญาณจาก Arduino และด้าน OUT ส่งต่อไปยัง LED

รายละเอียดทางวิศวกรรมและการลงมือทำ
- การผสานโครงสร้างและแมคคาทรอนิกส์: โครงตัวถังตัดจากไม้อัดหนา 1/2 นิ้ว สร้างเส้นทางนำไฟฟ้าที่ด้านหลังโดยใช้ลวดเปลือยอาบดีบุกเบอร์ 20ga ทำหน้าที่เป็น "บัสบาร์" ส่วนสายไฟเบอร์ 24ga ที่มีฉนวนสีเป็นรหัสใช้เชื่อมต่อระหว่างส่วนลอจิกกับโหลด เราใช้กาวร้อนเคลือบเป็นฉนวนป้องกันการลัดวงจรระหว่างช่องสัญญาณ
- การควบคุมแบบดาวที่ปลายยอด: ดาวบนยอดต้นไม้เป็นระบบโฟโตนิกส์อิสระที่ควบคุมด้วย Arduino Nano มันรันลูปย่อย 20 ช่อง โดยที่ Nano จะทำงานลำดับไฟกระพริบแบบอัตโนมัติแยกจากฮับหลักของต้นไม้ ทำให้เกิดความลึกของภาพหลายชั้น
- ลอจิกของแพตเทิร์นและการบาลานซ์ LED: ด้วยการแยกกลุ่มสีออกเป็นวงจรอิสระ ระบบจึงควบคุมแต่ละส่วนได้อย่างเป็นอิสระ ตัวต้านทานจำกัดกระแส (330Ω) ช่วยให้ LED สีแดง, เขียว, และขาว ให้ความสว่างที่สมดุลกัน ชดเชยค่าโวลเตจตกคร่อมที่แตกต่างกันของวัสดุเซมิคอนดักเตอร์แต่ละสี
บอกตรงๆ นะน้อง รหัสต้นไม้พี่ไม่มีเก็บไว้แล้ว ไม่งั้นพี่แจกให้เลย แต่ด้วยสกิลโค้ดดิ้งระดับ "พอได้" ของพี่ มันเลยออกมาเป็นโค้ดที่เรียบง่าย แต่ยาวเฟื้อย เพราะใช้แค่คำสั่งเปิด/ปิด (HIGH/LOW) เฉยๆ พี่ต้องมานั่งวาดวงจรแต่ละอันลงกระดาษ แล้วไล่คิดว่าต้องเปิดอันไหนก่อน ต่อด้วยอันไหน ฯลฯ เพื่อให้ได้เอฟเฟกต์แบบที่ต้องการ ระบบมันทำงานแพตเทิร์นซับซ้อนแบบ "สายรุ้ง" หรือ "เกลียว" ผ่านลำดับ digitalWrite ที่กำหนดไว้แน่นอน ใช้ delay() แบบเป๊ะๆ (เช่น 60ms) เพื่อให้การเคลื่อนไหวของแสงลื่นไหล ตัวอย่างก็ประมาณนี้:
int delay1 = 60;
int delay2 = 500;
int delay3 = 60;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(2, OUTPUT); //white 1
pinMode(3, OUTPUT); //white 2
pinMode(4, OUTPUT); //white 3
pinMode(5, OUTPUT); //red 1
pinMode(6, OUTPUT); //red 2
pinMode(7, OUTPUT); //red 3
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(2, LOW);
delay(delay1);
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
delay(delay1);
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
delay(delay1);
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
delay(delay1);
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
delay(delay1);
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
delay(delay1);
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
delay(delay1);
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
delay(delay1);
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
delay(delay1);
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
delay(delay1);
}
โค้ดง่ายๆ แต่นั่งเขียนเมื่อยมือเลยว่ะ บางคนอาจมีวิธีเขียนโค้ดหรือต่อวงจรที่ดีกว่านี้ แต่ตอนนั้นนี่คือสุดความสามารถของพี่แล้วแหละน้อง สู้งานนะ!
สรุป
โปรเจกต์นี้คือการลงลึกไปในโลกของการออกแบบฮาร์ดแวร์แบบบูรณาการเลยนะน้อง ถ้าเราจัดการกับบอร์ดสวิตช์ทรานซิสเตอร์แบบทำเอง (custom transistor switchboard) และควบคุม MCU สองตัว (dual-MCU orchestration) ให้เป็นหนึ่งเดียวได้ เราก็จะสามารถสร้างงานติดตั้งภาพ (visual installation) ที่แข็งแกร่งและดูโปรระดับมืออาชีพได้ ซึ่งมันจะพาเราก้าวข้ามขีดจำกัดพื้นฐานของ Arduino ตัวเดียวไปไกลโขเลย
พี่หวังว่าน้องจะสนุกกับการอ่านไม่ต่างจากที่พี่สนุกตอนทำมัน และหวังว่ามันจะจุดไฟให้น้องอยากลงมือทำโปรเจกต์ของตัวเองบ้างนะ พี่ยังไม่เคยเห็นตัวอย่างโปรเจกต์แบบนี้ที่ไหนมาก่อนเลย ก็เลยไม่มีอะไรให้เอามาเปรียบเทียบกับสายไฟหรือโค้ดของเราได้เลย หวังว่าด้วยโปรเจกต์นี้ จะมีใครสักคนได้แรงบันดาลใจ แล้วมาทำงานที่เจ๋งกว่าพี่ให้ดูบ้างนะ! :)