กลับไปหน้ารวมไฟล์
blinds-or-any-ac-power-motor-control-71dd97.md

ชื่อโปรเจกต์: การควบคุมม่านปรับแสง (หรือมอเตอร์ไฟฟ้า 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:

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

ระบบควบคุมไร้สายและการผสานรวมกับ Smart Home

ระบบนี้สามารถปรับขนาดได้สูง หากใช้ MySensors คุณสามารถเชื่อมต่อได้สูงสุด 256 Nodes โดยแต่ละ Node ควบคุมม่านปรับแสงได้ 4 ชุด ซึ่งเพียงพอแม้กระทั่งสำหรับคฤหาสน์ขนาดใหญ่

การติดตั้งจริงในกล่องควบคุมขนาด 22 x 15 x 5.2 ซม.

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 ทำให้ผมสามารถควบคุมสิ่งต่างๆ ได้หลายวิธี:

  1. แบบแมนนวล: กดสวิตช์ผนังตามปกติ
  2. แท็บเล็ต: ควบคุมผ่านหน้าจอ Domoticz Dashboard ที่ติดตั้งบนผนัง
  3. การควบคุมด้วยเสียง: สั่งงานด้วยเสียงผ่าน 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"