โปรเจคนี้คือการควบคุมรีเลย์หลายๆ ตัว (หรืออุปกรณ์สั่งงานอื่นๆ) จากขาออกเพียงขาเดียวของ Arduino
วิธีนี้เหมาะสำหรับสถานการณ์ที่ขาออกของ Arduino ไม่พอใช้ แล้วเราต้องการสั่งงานอุปกรณ์อย่างรีเลย์หลายๆ ตัวพร้อมกันจากขาเดียว
หลักการทำงานคือการใช้ LED strip แบบ NeoPixels (LED SMD5050 ที่มีชิป WS2812B ฝังอยู่) แต่ละพิกเซลจะถูกจับคู่กับ LDR (ตัวต้านทานปรับค่าได้ตามแสง) เพื่อสร้างออปโตคัปเปลอร์ DIY ขึ้นมาเอง (อยากทำกี่ตัวก็ได้ ขึ้นอยู่กับความยาวของ LED strip เช่น 300 พิกเซล และแหล่งจ่ายไฟ 5V ที่มี) วิธีนี้จะเป็นการแปลงสัญญาณจากอนุกรมเป็นขนาน (จาก 1 ไปเป็นหลายๆ)
LED แต่ละดวงจะถูกสั่งงานจากขาออกขาเดียวกันของ Arduino ส่วน LDR แต่ละตัว (ต่ออนุกรมกับตัวต้านทาน 27kOhm) จะถูกต่อเข้ากับรีเลย์ 5V ด้วยวิธีนี้ เราสามารถควบคุม NeoPixel/LDR ได้หลายๆ คู่จากขาออกเพียงขาเดียวของ Arduino โดยใช้ไลบรารี Adafruit NeoPixel นอกจากรีเลย์แล้ว เรายังสามารถต่อกับอุปกรณ์สั่งงานอื่นๆ ได้ โดยใช้ LDR เป็นอินพุตให้กับวงจรนั้นๆ
สำหรับโปรเจคนี้ ซึ่งเป็นส่วนหนึ่งของแผนใหญ่ เราใช้ ESP32 (NodeMCU) แต่ถ้าใช้ Arduino Uno ปกติ (หรือรุ่นอื่นๆ เกือบทั้งหมด) ก็ทำงานได้เหมือนกัน
ขั้นตอนที่ 1: สร้างออปโตคัปเปลอร์จาก NeoPixel
ออปโตคัปเปลอร์ DIY ทำจากวัสดุต่อไปนี้:
- LED strip แบบ WS2812 จำนวน 10 ดวง (ตัดมาจากแถบที่ยาวกว่า) แต่ในโปรเจคนี้ใช้จริงแค่ 4 ดวง
- ฟองน้ำสีเทาเข้ม
- แผ่นเบรดบอร์ด
- เทปพันสายสีดำ
หมายเหตุ: ระยะห่างระหว่างจุดเท่ากับระยะห่างระหว่าง LED
สิ่งสำคัญคือต้องกั้นแสงจาก LED แต่ละดวงไม่ให้รบกวน LDR ตัวอื่น เพื่อป้องกัน "การรบกวนจากแสง" ปรากฏว่าในทางปฏิบัติทำได้ยากมาก ดังนั้นในซอฟต์แวร์เราจึงตั้งค่าให้ความสว่างของ LED แต่ละดวงในสถานะ "เปิด" อยู่ในระดับต่ำ
LED strip ที่ใช้ยาว 10 ดวง แต่ในโปรเจคนี้ใช้จริงแค่ 4 พิกเซล คู่กับ LDR 4 ตัว (เพื่อให้ง่าย)
ขั้นตอนที่ 2: การตั้งค่าอิเล็กทรอนิกส์
ในเซ็ตอัพบนเบรดบอร์ด เราใช้ ESP32s (NodeMCU) แต่ Arduino ตัวไหนก็ทำงานได้
แผนภาพวงจร (สร้างด้วย Fritzing) มีดังนี้:

ในทางปฏิบัติหน้าตาจะเป็นแบบนี้:
อย่างที่เห็น เราใช้ขาออกเพียงขาเดียวในการควบคุมรีเลย์ 4 ตัวแบบขนาน จำนวนนี้สามารถเพิ่มได้สูงสุดถึง 300 ตัว! (เท่ากับจำนวน LED ในแถบยาว 5 เมตร)
ESP32 ทำงานที่ระดับแรงดัน 3.3 โวลต์ (มีเรกูเลเตอร์ 3.3V ในบอร์ด) ในขณะที่ LED strip แบบ 5050 ใช้ไฟ 5V เราให้ไฟ 5V เข้า ESP32 (ผ่านพอร์ต USB จากอะแดปเตอร์ 5V หรือพาวเวอร์แบงค์ 5V) NeoPixel ได้รับไฟ 5V โดยตรงจากขา 5V ของ ESP32 และรีเลย์ที่ใช้ก็เป็นรุ่น 5V เช่นกัน
ในตัวอย่างนี้ เราใช้วงจรออปโตคัปเปลอร์ 4 วงจร เพื่อควบคุมรีเลย์ 4 ตัว ซึ่งแต่ละตัวต่อกับหลอดไฟ 230V หนึ่งดวง
ขาออกที่ใช้คือ GPIO PIN 21 และรีเลย์ถูกควบคุมผ่านพิกเซลหมายเลข 1, 2, 3, 4
ขั้นตอนที่ 3: เขียนโค้ดซอฟต์แวร์
ฟังก์ชัน loop() ใน Arduino Sketch ของเรามันง่ายมากเลยน้อง แค่ใช้ลูป for หลายๆ รอบเพื่อสลับเปิดปิดหลอดไฟให้เป็นแพตเทิร์นต่างๆ โดยควบคุมผ่านรีเลย์แต่ละตัว
เวลาจะสั่งงานรีเลย์ตัวไหน ก็แค่เรียกฟังก์ชันนี้จากในโค้ดลูป:
void ControlRelais (int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15); // turn on/off the LED that belongs to RelaisNo
strip.show();
Serial.print(" RelaisNo "); Serial.print(RelaisNo); Serial.print(" = "); Serial.println(RelaisState);
}
จริงๆ แล้วฟังก์ชันนี้มันก็แค่สั่งให้ LED ตัวที่เราต้องการติดหรือดับเท่านั้นเอง
ตำแหน่งของ LED แต่ละดวงจะตรงกับหมายเลขรีเลย์ของมันเป๊ะๆ เราให้ LED ติดแสงแค่ระดับต่ำๆ พอให้กระตุ้นรีเลย์ผ่าน LDR ได้ ก็พอแล้ว จะได้ไม่เกิด "มลพิษทางแสง" หรือที่เรียกกันเล่นๆ ว่า "แสงเลี้ยวข้ามคัน" (light cross talk) นั่นเอง
ผลงานสุดเจ๋งจากโค้ดที่เราเขียนกัน มันจะออกมาเป็นแบบนี้เลย ดูคลิปนี้เลยน้อง:
ลงลึกรายละเอียดทางเทคนิค
เมทริกซ์ควบคุมกำลังสูงแบบออปโตไอโซเลชัน
โปรเจกต์ระดับอุตสาหกรรมนี้ให้วิธีที่ปลอดภัยและขยาย規模ได้ ในการควบคุมโหลดแรงดันสูง (120V/240V) เป็นสิบๆ ตัว ด้วย Arduino เพียงขาเดียว
- แปลง NeoPixel เป็นสัญญาณออปโต: ใช้สาย WS2812B (NeoPixels) โดยที่ LED แต่ละดวงจะจับคู่ทางกายภาพกับโฟโตทรานซิสเตอร์/ออปโตคัปเปลอร์ Arduino จะส่งคำสั่งไปที่ LED แต่ละตัวแบบอิสระ พอ LED ติด ออปโตคัปเปลอร์ก็จะไปทริกเกอร์ รีเลย์กระแสสูง ต่อ
- ต่อรีเลย์ได้ไม่จำกัด: เพราะว่า NeoPixel ต่อแบบเดซี่เชน ทางทฤษฎีเราควบคุมรีเลย์เป็นร้อยๆ ตัวได้ โดยใช้ขาดาต้าแค่ขาเดียว เฟิร์มแวร์จะจัดการการจับคู่ระหว่างพิกเซลกับโหลดผ่านอาร์เรย์ดิจิทัลง่ายๆ
เรื่องความปลอดภัย
- ฮับกัลวานิกไอโซเลชัน: ออปโตคัปเปลอร์แต่ละตัวสร้างกำแพงฉนวนไฟฟ้าสูงถึง 5,000V มั่นใจได้ว่าแม้จะมีอะไรระเบิดโพ๊ะบนฝั่งแรงดันสูง ก็ไม่สามารถย้อนกลับมาทำลาย Arduino หรือคอมพ์ของเราได้แน่นอน ปลอดภัยไว้ก่อน สู้งานนะน้อง!