นี่คือโปรเจกต์แรกของพวกเราที่ใช้ Arduino สำหรับวิชา Digital Systems ในหลักสูตรวิทยาการคอมพิวเตอร์
เป้าหมายสุดท้ายของเราคือการสร้างต้นแบบของ Art Installation ซึ่งก็คือวิดีโอวอลล์ที่ทำจากเมทริกซ์ไฟ LED สร้างเป็นแผงภาพพิกเซลแบบอินเทอร์แอคทีฟที่ตอบสนองกับผู้ชม
เพื่อให้ถึงเป้าหมายนั้น นี่คือก้าวเล็กๆ ก้าวแรกของโปรเจกต์: สร้างแผง LED ขนาดเล็ก (32x16 ซม.) ที่จะสุ่มจุดพิกเซลสีสันสดใสเมื่อมีคนเดินผ่านหน้าหรือมีปฏิกิริยากับเซ็นเซอร์อัลตราโซนิก
1. การตั้งค่าแหล่งจ่ายไฟ (Power Supply Setup)
เมทริกซ์ LED ขนาด 16x16 มีจุดทั้งหมด 256 จุด และเนื่องจากเป็น RGB ดังนั้นมันจึงมี LED อยู่ 768 ดวง โดยแต่ละดวงกินกระแสประมาณ 20mA (mA = มิลลิแอมป์) นั่นหมายความว่า ถ้าเปิดทุกดวงเต็มสว่าง จะต้องใช้กระแสถึง 15.36A สำหรับเมทริกซ์เดียวเท่านั้น! ต่อมาเราก็สรุปว่าเราไม่จำเป็นต้องใช้พลังงานถึง 50% ของค่านั้นด้วยซ้ำ และเราสามารถควบคุมมันได้ง่ายๆ ผ่านโค้ด แต่อย่างไรก็ตาม ต้องระวังแหล่งจ่ายไฟ ที่โปรเจกต์ของคุณจะต้องใช้เมื่อเล่นกับเมทริกซ์หรือแถบ LED นะตัวนี้
LED โดยทั่วไปทำงานที่ 5V เหมือนกับบอร์ด Arduino
อย่างแรกเลย บอร์ด Arduino จ่ายไฟไม่พอสำหรับ LED แน่นอน ดังนั้นคุณต้องหาแหล่งจ่ายไฟภายนอกมาใช้:

จากนั้นก็ต่อสายเข้าเทอร์มินัล:

ต่อสายไฟไลน์ (Line), นิวทรัล (Neutral) และกราวด์ (Ground) เข้าเทอร์มินัลที่ถูกต้อง:
(แนะนำให้หาข้อมูลเรื่องรหัสสีของสายไฟ และตรวจสอบสัญลักษณ์บนตัวเครื่องให้ดีๆ อีกที)

ทีนี้ เราต้องจ่ายไฟให้เมทริกซ์ LED ตามที่เห็นในรูปด้านล่าง เราเชื่อมต่อสาย 5V และ GND (สายกลาง) เข้ากับเทอร์มินัลของแหล่งจ่ายไฟ:


2. การตั้งค่าแผง LED (LED Panels Setup)


ต่อสายดังนี้:
- Data In (DIN) ของแผง LED ไปที่ พิน 3 ของ Arduino
- Ground (GND) ของแผง LED ไปที่ GND ของ Arduino
- สายไฟ 5V ของแผง LED ไปที่ 5V ของ Arduino
คุณสามารถจ่ายไฟให้บอร์ด Arduino และอุปกรณ์รอบข้างด้วยแหล่งจ่ายไฟเดียวกัน โดยใช้ขั้วต่อ 5V เพิ่มเติมที่แผง LED มีให้ หรือแค่ต่อ GND ร่วมกันแล้วจ่ายไฟให้บอร์ดผ่าน USB หรือแหล่งจ่ายไฟอื่นก็ได้
** นอกจากนี้คุณยังใช้เบรดบอร์ดเพื่อจัดระเบียบสายไฟให้เป็นระเบียบขึ้นได้ ดังที่จะเห็นด้านล่าง

จากจุดนี้ เราก็เริ่มทดสอบโค้ดควบคุมแผง LED ได้แล้ว แต่ก่อนอื่นเราจะเพิ่มแผง LED อีกหนึ่งแผง:
แค่ต่อขั้ว Output จากแผงแรก เข้ากับขั้ว Input ของแผงที่สอง:

3. ตั้งค่าเซ็นเซอร์อัลตราโซนิก (Ultrasonic Sensor)


ต่อสายเลยจ้า:

สุดท้าย เอาทุกอย่างมารวมกัน:

4. โครงสร้างต้นแบบ (Prototype Structure)
เราทำโครงสร้างง่ายๆ ขึ้นมาแค่ให้จับถนัดมือและโชว์สวยขึ้นเฉยๆ นะ
เราใช้แผ่น MDF ขนาด 60x30 ซม. จำนวนสามแผ่น ออกแบบกล่องในเว็บ MakerCase แล้วเอามาปรับแต่งใน Adobe Illustrator ก่อนจะเอาไปตัดด้วยเลเซอร์ที่ LOUCo / Porto Digital

ไฟล์ .ai เก็บไว้ให้ด้านล่างแล้วจ้า
5. โค้ด (Code)
เราใช้ Arduino IDE, ไลบรารี FastLED และไลบรารี Ultrasonic by Erick Simões
เราเคยทดลองเล่นกับไลบรารี Adafruit´s NeoMatrix บ้าง แต่สุดท้ายไม่ได้ใช้ในโค้ดนี้ ไลบรารีนี้ก็แนะนำเหมือนกันนะ มันทำงานร่วมกับ FastLED ได้และมีฟีเจอร์สำหรับเมทริกซ์โดยเฉพาะ แต่เพราะเราอยู่ในโหมดเรียนรู้ เลยตัดสินใจใช้แค่ FastLED ให้โค้ดเรียบง่ายและเข้าใจหลักการได้ชัดเจนขึ้น
เราไปหยิบตัวอย่างโค้ดมาจากหลายที่ ทั้งใน fastLED´s github, Adafruit´s github, รวมถึงจาก coberfranc´s instructables และโปรเจกต์ HeathenHacks
รายละเอียดเพิ่มเติมอ่านได้ในคอมเมนต์ในโค้ดด้านล่างเลย
รายละเอียดทางเทคนิคแบบจัดเต็ม
ตัวแสดงผลจริงๆ: จอ P10 RGB Matrix ขนาด 32x16
พวกเมทริกซ์ MAX7219 แบบสีเดียวเนี่ย ของเล่นเด็กเลยจ้า ใช้ SPI ธรรมดาๆ แต่เจ้า HUB75 P10 RGB LED Matrix นี่มันสถาปัตยกรรมป้ายบิลบอร์ดเลยนะเว้ย! มันไม่มีไอซีไดรเวอร์บนบอร์ดคอยเก็บภาพให้หรอก! โปรแกรมเมอร์ Arduino ต้องเขียนโค้ด C++ ที่ออปติไมซ์สุดๆ ใช้แมพปิงอาร์เรย์แบบจัดหนัก เพื่อสโตรบพิกเซลสีแดง, เขียว, น้ำเงิน เป็นพันๆ พิกเซล หลายร้อยครั้งต่อวินาที (Multiplexing) แค่เพื่อไม่ให้จอมันดับเป็นสีดำ!
ฝันร้ายเรื่องไทม์มิ่งของ HUB75 (RGBmatrixPanel.h)
บอกเลยว่าใช้ไป 13 พิน บน Uno เฉพาะสำหรับจอนี่แหละ!
- เมทริกซ์ต้องการอาร์เรย์มหาศาลของ
R1, G1, B1และR2, G2, B2พร้อมกับA, B, C, D (ตัวเลือกแถว)และที่สำคัญมากคือCLK, Latch, และ Output Enable - ฟังก์ชัน
loop()ของ Uno ว่างเปล่าแทบจะหมด เพราะไลบรารี<RGBmatrixPanel.h>จาก Adafruit มันใช้ Timer Interrupts แบบไม่ปรานีข้างหลัง! - นาฬิกา 16MHz ข้างใน ATmega เนี่ย จัดสรรไป 40% ของพลังประมวลผลทั้งหมดให้กับการส่งสัญญาณ HUB75 โดยเฉพาะ เหลือแค่ 60% ให้โค้ด C++ ของเราทำงาน!
- การฉีดภาพเข้าไป: เพราะจอนี้เป็น RGB บริสุทธิ์ เลยวาดรูปทรงสวยๆ ได้แบบเนียนสุดๆ:
// สร้างสี RGB แบบตรงไปตรงมา!
uint16_t crimsonHex = matrix.Color333(7, 0, 0); // แดงเต็มที่, เขียวศูนย์, น้ำเงินศูนย์!
matrix.fillScreen(0);
matrix.fillCircle(16, 8, 5, crimsonHex); // Execute drawing the geometric primitive!
จับคู่กับข้อมูลจาก HC-SR04
วาดภาพนิ่งๆ มันเบื่อแล้ว โปรเจคนี้สร้าง เรดาร์วัดระยะ อันน่ากลัวและใหญ่โตที่เปลี่ยนไปได้ตามข้อมูลจริง!
- โค้ดใช้พัลส์จาก เซนเซอร์อัลตราโซนิค HC-SR04
- ถ้า
ระยะทาง < 10cmตรรกะจะล้างหน้าจอแบบไม่ไว้หน้า:matrix.fillScreen(matrix.Color333(7,0,0));(แฟลชสีแดงเลือด!) - ถ้า
ระยะทาง > 50cmมันจะรัน:matrix.fillScreen(matrix.Color333(0,7,0));(เรืองแสงสีเขียว!) - Arduino ทำหน้าที่เป็นตัวควบคุมหลักสุดเจ๋ง ผสานฟิสิกส์จากโซนาร์ภายนอก เข้ากับอาร์เรย์มัลติเพล็กซ์ RGB HUB75 แบบจัดหนักไปพร้อมกัน!
ฮาร์ดแวร์ HUB75 ที่กินกระแสสูง
- Arduino Uno/Mega (แนะนำ Mega อย่างแรง! เพราะอาร์เรย์สี RGB ของ HUB75 กิน
SRAMเยอะมากขี้เกียจ Uno ที่มีแค่ 2KB แทบจะรันไลบรารีฟอนต์ไม่ได้ ถ้าใช้จนหมดชิปอาจรวนได้!) - จอ RGB Matrix Panel ขนาดใหญ่ 32x16 หรือ 64x32 แบบ P10/P6/P3
- พาวเวอร์ซัพพลาย 5V 10-Amp ตัวใหญ่เท่าอุ้งมือ (ห้ามเสียบจอ RGB ใหญ่ๆ เข้ากับไฟ USB เด็ดขาด! ถ้าจอแสดงสีขาวเต็มที่ LED 512 ดวง ดวงละ 20mA รวมกันได้ 10 แอมป์! มันจะระเบิด USB คอนโทรลเลอร์ในพีซีทันที! สู้งานนะน้อง).