IO 익스팬더로 수백 개 릴레이 동시 제어 및 동기화하기
부품 및 소모품
| 부품 | 수량 |
| IO Expander | 2 |
| Relay Expander | 2 |
| 16채널 릴레이 보드 | 2 |
| Arduino Nano R3 | 1 |
프로젝트 개요
아두이노, ESP8266, 라즈베리파이, PC/맥을 IO 익스팬더에 연결하고 릴레이 익스팬더를 확장해 최대 65,280개 릴레이를 동시 제어할 수 있습니다. 핵심은 외부 래칭(External Latching) 기능: 새로운 릴레이 설정을 비트 압축 포맷으로 전송해 래치에 저장한 뒤, 단일 GPIO 라인으로 모든 릴레이를 동시에 스위칭합니다.
외부 래칭 설정 예시 (단일 IO 익스팬더 + 16채널 릴레이)
>g4o1;g10n;el10
ok
ok
10
>
g4o1: GPIO 4를 출력(HIGH)으로 설정 (래치 트리거용)
g10n: GPIO 10에 네거티브 에지 감지 활성화
el10: 릴레이 익스팬더 외부 래치 핀을 GPIO 10으로 지정
릴레이 제어 및 래칭 실행
>e1o;e10o;e16o
ok
ok
ok
>g4o0,1
ok
>
e1o~e16o: 1, 10, 16번 릴레이 ON
g4o0,1: GPIO 4를 1ms 동안 LOW 펄스 → 모든 래치된 데이터 동시 출력
확장 구성: 2× IO Expander + 2× Relay Expander + 2× 16채널 릴레이
두 IO 익스팬더는 9비트 멀티드롭 프로토콜로 데이지체인 연결 (최대 255개까지 확장 가능). 아두이노 나노로 제어.
외부 래칭 블록 다이어그램
IO 익스팬더 GPIO 4(래치 트리거) → 릴레이 익스팬더 래치 입력(핀 10) 연결 구조. 데이터 시리얼 전송 → 래치 저장 → 단일 펄스로 동시 출력.
아두이노 코드
/* IO Expander - Relay Expander External Latching */
#include <HardwareSerial9Bit.h>
#include "IOExpander9Bit.h"
#include <avr/wdt.h>
#define MAX_BOARDS 2
void setup() {
Serial9Bit.begin(115200, SERIAL_9N1);
Serial9Bit.write(0); // 9비트 모드 설정
wdt_enable(WDTO_8S);
for (uint8_t board = 1; board <= MAX_BOARDS; board++)
SerialCmdDone(board, "eb1"); // 릴레이 익스팬더 활성화
SerialCmdDone(1, "g4o1;g10n;el10"); // 보드 1: GPIO4 출력 HIGH, GPIO10 네거티브 에지, 외부 래치 핀 10
SerialCmdDone(2, "g10n;el10"); // 보드 2: GPIO10 네거티브 에지, 외부 래치 핀 10
}
void loop() {
static uint16_t i = 0;
uint8_t r[2];
// 보드 1: 카운터 패턴
r[0] = ~(uint8_t)(i >> 8);
r[1] = ~(uint8_t)i++;
SerialWriteRelayExpander(1, r, 2);
delay(50);
// 보드 2: 반전 패턴
r[0] = ~r[0];
r[1] = ~r[1];
SerialWriteRelayExpander(2, r, 2);
delay(50);
// 동시 래칭: GPIO4에 1ms LOW 펄스
SerialCmdDone(1, "g4o0,1");
wdt_reset();
}
동작 영상
릴레이 익스팬더 외부 래칭 실제 동작 영상: RelayExpanderLatching.mp4
회로도
아두이노 나노 → IO 익스팬더 2개(직렬) → 각 IO 익스팬더에 릴레이 익스팬더 → 16채널 릴레이 보드 연결 배선도.