Series: Lập trình Raspberry Pi & Ứng dụng thực tế Phần 2 — Lập trình GPIO & phần cứng Bài 9: Relay + an toàn điện + chống nhiễu (opto, flyback, ground)
1) Mục tiêu bài học
Sau bài này bạn sẽ:
- Điều khiển relay 1 kênh bằng Raspberry Pi (bật/tắt tải).
- Biết cách chọn relay an toàn (opto-isolated, low-level trigger).
- Hiểu các nguyên tắc chống nhiễu: ground, flyback, snubber, tách nguồn.
- Có code Python chạy được ngay + checklist debug “relay không nhả/nhấp nháy”.
Lưu ý an toàn: phần điện AC 220V nguy hiểm. Bài này tập trung vào nguyên tắc + đấu nối an toàn (không làm ẩu).
2) Chọn module relay “đúng chuẩn”
Khuyến nghị
- Relay module có opto (opto-isolated)
- Có jumper chọn LOW trigger / HIGH trigger (ưu tiên LOW trigger phổ biến)
- Có diode chống ngược (đa số module tốt có sẵn)
Tránh
- Relay trần không có transistor driver/opto (Pi kéo trực tiếp GPIO rất rủi ro)
- Module “mập mờ” thông số, không rõ điện áp kích, không rõ cách tách nguồn
3) 3 nguyên tắc an toàn quan trọng
- GPIO chỉ 3.3V: không đưa 5V vào GPIO.
- Tách phần công suất và phần điều khiển:
- Pi điều khiển relay (logic)
- Relay đóng/cắt tải (power)
- Đấu COM/NO/NC đúng:
- COM: chân chung
- NO (Normally Open): mặc định hở, bật relay mới đóng (khuyến nghị)
- NC (Normally Closed): mặc định đóng, bật relay mới hở (cẩn thận)
4) Wiring điều khiển relay (DC, phần logic)
Ví dụ dùng GPIO17 (Pin 11) điều khiển relay IN:
Trường hợp A: Module relay hỗ trợ 3.3V logic tốt
- VCC → 5V (Pin 2 hoặc 4) (đa số relay coil cần 5V)
- GND → GND (Pin 6)
- IN → GPIO17 (Pin 11)
Trường hợp B: Module nhạy kém với 3.3V
- Dùng relay module loại “3.3V compatible”
- Hoặc dùng transistor/optocoupler driver (khuyến nghị nếu module kén)
Quan trọng: GND Pi và GND relay phải chung (trừ khi bạn dùng opto cách ly hoàn toàn + nguồn riêng và wiring cách ly đúng).
5) Phần tải: ví dụ “an toàn” trước khi đụng AC
Trước khi thử 220V, hãy test bằng tải DC thấp áp:
- Đèn LED strip 5V/12V
- Quạt DC nhỏ 5V/12V => ít nguy hiểm hơn, dễ debug.
Nếu bạn đóng cắt AC 220V:
- Dùng hộp cách điện
- Dây đúng chuẩn, siết domino chắc
- Có cầu chì/breaker phù hợp
- Không chạm tay khi đang cấp điện
6) Code Python: bật/tắt relay
Tạo thư mục:
mkdir -p ~/apps/relay-control
cd ~/apps/relay-control
nano relay_toggle.py
Dán code:
from gpiozero import OutputDevice
from time import sleep
# Nhiều relay module là "LOW trigger" (IN=0 -> ON)
RELAY_PIN = 17
relay = OutputDevice(RELAY_PIN, active_high=False, initial_value=False)
print("Relay demo: ON 2s -> OFF 2s (loop)")
while True:
relay.on() # ON
print("Relay: ON")
sleep(2)
relay.off() # OFF
print("Relay: OFF")
sleep(2)
Chạy:
python3 relay_toggle.py
Nếu relay module của bạn là HIGH trigger, đổi active_high=True:
relay = OutputDevice(RELAY_PIN, active_high=True, initial_value=False)
7) Chống nhiễu: tại sao relay hay làm Pi “reset”?
Khi relay đóng/cắt tải cảm (motor, coil, quạt), nhiễu sẽ:
- gây sụt áp nguồn
- tạo spike điện áp
- làm Pi reboot / Wi-Fi rớt / log lỗi ngẫu nhiên
Checklist chống nhiễu thực tế
- Nguồn riêng cho relay/tải (đừng lấy 5V relay từ Pi nếu tải nặng)
- Chung GND đúng cách (star ground, dây gọn)
- Với motor/coil DC: flyback diode song song tải (nếu module chưa có)
- Với tải AC cảm: cân nhắc snubber RC hoặc MOV (tùy tải)
- Dây AC và dây tín hiệu GPIO tách xa nhau, không đi song song dài
8) Lỗi thường gặp & cách fix nhanh
- Relay không kêu “tạch”:
- sai VCC (relay coil cần 5V)
- sai trigger (LOW/HIGH)
- GPIO sai pin
- Relay nhấp nháy khi boot:
- GPIO mặc định trạng thái floating → set initial_value=False
- thêm pull-up/pull-down (nếu cần)
- Pi reboot khi relay đóng tải:
- nguồn yếu / dùng chung nguồn
- tải gây nhiễu mạnh → tách nguồn + chống nhiễu như mục 7
9) Bài tập nâng cấp
- Làm “relay controller” có 2 mode:
- Mode A: ON 5 giây → OFF 10 giây (theo chu kỳ)
- Mode B: bấm button (Bài 6) để toggle relay
- Chạy script bằng systemd service (Bài 3) để tự chạy khi boot.


