ชื่อโปรเจกต์: การควบคุมม่านปรับแสง (หรือมอเตอร์ไฟฟ้า AC อื่นๆ)
บทนำ
หลังจากที่ผมได้ซื้อบ้านใหม่ ความตั้งใจแรกคือการเปลี่ยนให้เป็น Smart Home อย่างเต็มรูปแบบ และจุดเริ่มต้นที่สำคัญที่สุดคือการควบคุมม่านปรับแสงแบบอัตโนมัติ อย่างไรก็ตาม สิ่งที่ดูเหมือนจะเป็นโปรเจกต์ง่ายๆ กลับกลายเป็นฝันร้ายทางวิศวกรรมในตอนแรก มอเตอร์กำลังสูง (150W) ที่ผมเลือกใช้ได้สร้างแรงดันเหนี่ยวนำย้อนกลับ (reverse inductive voltage) ซึ่งสร้างความเสียหายทั้ง Relays และ Triacs นอกจากนี้ ยังมีปัญหาเรื่องสัญญาณรบกวนในสายไฟที่ทำให้ม่านทำงานเองในกลางดึก ซึ่งค่อนข้างน่าตกใจ
ในที่สุด ผมก็สามารถแก้ไขปัญหาเหล่านี้ได้สำเร็จด้วยส่วนประกอบอิเล็กทรอนิกส์ราคาไม่แพง ในบทความนี้ ผมจะแบ่งปันแนวทางแก้ไขโดยละเอียด เพื่อที่คุณจะได้ไม่ต้องเสียเวลาและปวดหัวอย่างที่ผมเจอ สำหรับผู้ที่ไม่ถนัดการเขียนโปรแกรมแต่ชอบการบัดกรี ผมก็มีวงจร Discrete (ที่ไม่มี Microcontroller) ที่ส่วนท้าย ซึ่งทำงานได้คล้ายกัน
การวิเคราะห์ปัญหาเชิงลึกและการออกแบบทางวิศวกรรม
1. การจัดการโหลดไฟฟ้าแบบเหนี่ยวนำ
ปัญหาหลักในการควบคุมมอเตอร์คือ "Inductance" เมื่อเราพยายามเปิดวงจรในขณะที่มอเตอร์กำลังทำงาน กระแสไฟฟ้าจะพยายามไหลต่อไปเนื่องจากสนามแม่เหล็กที่หลงเหลืออยู่ ทำให้เกิดแรงดันไฟฟ้าสูงอย่างกะทันหัน (Back EMF)
จากการวัดด้วย Oscilloscope ผมพบว่ามีแรงดันไฟฟ้าสูงสุดเกินกว่า 1600V แรงดันระดับนี้:
- หากใช้ Relays ขนาดเล็ก: หน้าสัมผัสจะเกิดประกายไฟรุนแรงและติดกัน
- หากใช้ Triacs (Solid State Relay): แรงดันเกิน (overvoltage) จะทำลายวัสดุ Semiconductor ภายในทันที
2. แนวทางการป้องกันวงจร
แทนที่จะใช้ Relays ขนาดใหญ่และราคาแพง ผมเลือกใช้วิธีแก้ปัญหาแบบ "ทางวิศวกรรม" โดยเพิ่มส่วนประกอบเพียงไม่กี่ชิ้นเข้าไปในวงจร:
- Varistor (MOV): ทำหน้าที่เป็นอุปกรณ์หนีบแรงดัน (clamping device) เพื่อป้องกัน Triac จากแรงดันเกิน (Over-voltage)
- RC Snubber Circuit (Resistor + Capacitor): ดูดซับพลังงานที่เกิดขึ้นในระหว่างการสลับวงจร (Commutation) ช่วยลดอัตราการเพิ่มขึ้นของแรงดันไฟฟ้า ($dv/dt$)
คำแนะนำทางเทคนิค: จากการทดลองจริง ผมพบว่าการติดตั้งชุด RC Snubber ระหว่างสายสีน้ำตาลและสีเทาของมอเตอร์ (ตามแผนภาพ) ให้ผลลัพธ์ที่ดีที่สุด นี่เป็นเพราะชุด Snubber ไม่ได้เชื่อมต่อกับสายเมนหลักตลอดเวลา ซึ่งช่วยเพิ่มความปลอดภัยและอายุการใช้งาน

ตรรกะของโค้ดซอฟต์แวร์
เพื่อเพิ่มความทนทานของระบบให้สูงสุด ผมได้ออกแบบลำดับการทำงานอย่างเป็นระบบสำหรับ Arduino โดยใช้เทคนิค Hybrid Switching:
- ลดจำนวน Pin: ผมใช้สายไฟร่วมสำหรับคำสั่งขึ้น/ลง ทำให้สามารถควบคุมมอเตอร์ 4 ตัวได้ด้วย Input pins เพียง 5 ตัว (แทนที่จะเป็น 8 ตัว) พร้อมกับระบบ Debounce ด้วยซอฟต์แวร์เพื่อป้องกันสัญญาณรบกวน
- ลำดับการเปิดเครื่อง:
- Arduino จะเปิด Relay ก่อนเพื่อเลือกทิศทาง (ยังไม่มีกระแสไหล)
- หน่วงเวลาสั้นๆ เพื่อให้หน้าสัมผัสของ Relay ปิดสนิท
- จากนั้นจึงเปิด Triac เพื่อจ่ายไฟ 230 VAC ให้กับมอเตอร์
- ลำดับการปิดเครื่อง:
- ปิด Triac ก่อนเพื่อตัดกระแสไฟหลัก
- หน่วงเวลาเพื่อให้กระแสไฟฟ้าหยุดไหลโดยสมบูรณ์
- จากนั้นจึงปิด Relay
- ผลลัพธ์: Relay จะไม่เกิดประกายไฟเลย (Zero-current switching) ซึ่งช่วยยืดอายุการใช้งานได้อย่างมาก
ระบบควบคุมไร้สายและการผสานรวมกับ Smart Home
ระบบนี้สามารถปรับขนาดได้สูง หากใช้ MySensors คุณสามารถเชื่อมต่อได้สูงสุด 256 Nodes โดยแต่ละ Node ควบคุมม่านปรับแสงได้ 4 ชุด ซึ่งเพียงพอแม้กระทั่งสำหรับคฤหาสน์ขนาดใหญ่

1. การเชื่อมต่อผ่าน Raspberry Pi
ผมใช้ Raspberry Pi เป็นตัวควบคุมหลัก (Master) โดยติดตั้งโมดูล nRF24L01+ และซอฟต์แวร์ Domoticz
ข้อควรระวังสำหรับ Radio Modules:
- ควรติดตั้ง Capacitor ขนาด 10 µF ที่ขา VCC/GND ของ nRF24L01+ เสมอ เพื่อกรองกระแสไฟฟ้า
- หากติดตั้งในกล่องติดผนังที่หนา ควรเลือกโมดูลที่มี External Antenna เนื่องจาก PCB antennas มีระยะการส่งสัญญาณที่จำกัดมาก
2. การตั้งค่า MySensors MQTT Gateway
หากคุณเลือกใช้ MySensors คุณสามารถตั้งค่าบน Raspberry Pi ด้วยคำสั่ง:
sudo ./configure --my-gateway=mqtt --my-controller-ip-address=127.0.0.1 --my-mqtt-publish-topic-prefix=domoticz/in/MyMQTT --my-mqtt-subscribe-topic-prefix=domoticz/out/MyMQTT --my-mqtt-client-id=mygateway1 --my-transport=rf24 --my-port=1883 --my-rf24-irq-pin=15
3. Source Code สำหรับ Raspberry Pi (C++)
โค้ดนี้มีหน้าที่ส่งคำสั่งไปยัง Arduino และรอการตอบรับ (ACK) เพื่อยืนยันว่าม่านปรับแสงทำงานได้อย่างถูกต้อง:
#include <unistd.h>
#include <string>
#include <getopt.h>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <RF24/RF24.h>
using namespace std;
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
unsigned long got_message;
void setup(void){
printf("Preparing interface\n");
radio.begin();
radio.setRetries(15, 15);
radio.setChannel(0x70);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
}
bool sendMessage(int action){
radio.stopListening();
unsigned long message = action;
printf("Now sending %lu...", message);
bool ok = radio.write( &message, sizeof(unsigned long) );
if (!ok) printf("failed...\n");
else printf("ok!\n");
radio.startListening();
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout ) {
if (millis() - started_waiting_at > 1000 ) timeout = true;
}
if( timeout ){
printf("No response received...\n");
return false;
}else{
radio.read( &got_message, sizeof(unsigned long) );
printf("Response received > %lu.\n", got_message);
return true;
}
}
// Remaining part of the main function...
คุณสามารถดาวน์โหลดไลบรารีและไฟล์ที่คอมไพล์แล้วสำหรับ Raspberry Pi 3 ได้ที่นี่: https://goo.gl/ocCwk3
ผลลัพธ์และการใช้งานจริง
การรวมกันของ Arduino, Raspberry Pi และ Google Home ทำให้ผมสามารถควบคุมสิ่งต่างๆ ได้หลายวิธี:
- แบบแมนนวล: กดสวิตช์ผนังตามปกติ
- แท็บเล็ต: ควบคุมผ่านหน้าจอ Domoticz Dashboard ที่ติดตั้งบนผนัง
- การควบคุมด้วยเสียง: สั่งงานด้วยเสียงผ่าน Google Assistant เช่น "Hey Google, blinds down" โดยใช้ IFTTT เพื่อเชื่อมต่อ Webhooks เข้ากับ Domoticz
ข้อมูล Frontmatter ดั้งเดิม
title: "Blinds (Or Any AC Power Motor) Control" description: "How to control several roller shutters with inexpensive relay boards (not ruining them) with physical buttons and remotely simultaneously." author: "gomecin" category: "Home & Automation" tags: - "relay" - "home automation" - "blinds" - "ac motor" - "remote control" views: 59359 likes: 71 price: 2450 difficulty: "Intermediate" components: - "1x Capacitor 100 nF 630 V" - "2x nRF24 Module (Generic)" - "1x Raspberry Pi 3 Model B" - "1x Soldering iron (generic)" - "1x Resistor 100 ohm (0.5 W min!)" - "1x Blind motor" - "1x 4-CHANNEL RELAY CONTROLLER FOR I2C" - "3x Diode generic" - "1x Arduino Nano R3" - "1x Solid state 4 channel board" - "1x Varistor 275 VAC" tools: [] apps: - "1x Domoticz" - "1x Arduino IDE" downloadableFiles: - "https://create.arduino.cc/editor/gomecin/5a010f30-e15a-493f-8283-13c2a3639dc5/preview" - "https://create.arduino.cc/editor/gomecin/5a010f30-e15a-493f-8283-13c2a3639dc5/preview" documentationLinks: [] passwordHash: "9c8cdb57ee81bca556cafb02ab1df0c91d00505ba4a2ce2238490edc75cdf8cf" encryptedPayload: "U2FsdGVkX1/ZpJon0eqoBnIHVRZ8pBw9G7LI6j1R5C6lgh2rNhRufI9eND/EJzW0nbGqEYv0RClvIgYKIbnEJocZTHOaLCgfjVajD94js89Y8pBCfMGiQRXA16Pdxv2a" seoDescription: "Control Blinds and AC Power Motors using inexpensive Relay boards with physical buttons and remote access simultaneously." videoLinks: - "https://www.youtube.com/embed/9AcNr9Ar6D8" heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/blinds-or-any-ac-power-motor-control-71dd97_cover.jpg" lang: "th"