Arduino & NeoPixel 自作オプトカプラで複数リレーを 1 ピン制御
概要
Arduino の出力ピンが足りないとき、NeoPixel(WS2812B)LED とフォトレジスタ(LDR)を組み合わせた自作オプトカプラで、1 本の出力ピンから複数のリレー(またはアクチュエータ)を独立制御する手法を紹介します。最大 300 系統(5m/300 LED ストリップの全長)まで拡張可能です。
原理
- NeoPixel ストリップの各 LED を個別にアドレッシング(1 ピンで制御可能)
- 各 LED に LDR を対向配置し、遮光材(黒色フォーム+黒テープ)で「光クロストーク」を防止
- LDR と直列抵抗(27kΩ)で分圧回路を構成、リレー駆動トランジスタのベースへ入力
- LED 点灯 → LDR 抵抗値低下 → トランジスタ ON → リレー駆動
必要な部品
| 部品 | 数量 | 備考 |
|---|---|---|
| WS2812B LED ストリップ(5V、300 LED/m、5m巻き) | 1 | 10 LED 程度切り出して使用 |
| フォトレジスタ (LDR, CdS セル) | 4 | リレー数に合わせて |
| 抵抗 27kΩ | 4 | LDR 直列用(光電流調整) |
| 5V リレーモジュール(4 回路版等) | 1 | または個別リレー ×4 |
| Arduino UNO / Nano / ESP32 等 | 1 | 本例では ESP32 (NodeMCU) 使用 |
| 黒色フォーム、ブレッドボード、黒テープ | 適宜 | オプトカプラ筐体用 |
| はんだ付け工具、配線材 | 1式 |
製作手順
ステップ 1: 自作オプトカプラアレイの作成
- LED ストリップから必要数(例: 4)を切り出し、ピッチに合わせて LDR を配置
- 黒色フォームに LED と LDR のペアを埋め込み、黒テープで完全遮光
- LED のピッチ=LDR のピッチになるよう精密に配置(クロストーク防止の要)
- 実験では 10 LED 中 4 ペアのみ使用し、残りは未接続
ステップ 2: 電子回路の組み立て
ブレッドボード上に以下を構築:
- ESP32 GPIO21 → NeoPixel DIN
- ESP32 5V ピン → NeoPixel VCC / リレー VCC
- 各 LDR + 27kΩ 直列 → 5V と GND 間、中点をリレー制御入力(またはトランジスタベース)へ
- リレー出力側に AC 100V/200V 負荷(例: 照明)を接続
注意: ESP32 は 3.3V ロジックですが、NeoPixel は 5V 駆動。ESP32 の 5V ピン(USB 入力直結)から NeoPixel とリレーに給電し、GPIO21 の 3.3V 出力で NeoPixel 制御可能(WS2812B は 3.3V ロジックでも動作)。
ステップ 3: ソフトウェア実装
Adafruit NeoPixel ライブラリを使用。リレー制御関数 ControlRelais(relayNo, state) で指定番目の LED を低輝度(RGB=15,15,15)点灯/消灯し、strip.show() で反映。
#include <Adafruit_NeoPixel.h>
#define NUM_LEDS 10
const int RelaisPin = 21; // ESP32 GPIO21
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, RelaisPin, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
pinMode(RelaisPin, OUTPUT);
strip.begin();
// 起動時テスト: 全 LED を順次点灯
for (int t = 0; t < 10; t++) {
strip.setPixelColor(t, 15, 15, 15);
strip.show();
delay(500);
strip.setPixelColor(t, 0, 0, 0);
}
}
void loop() {
// パターン 1: 1→4 へ順次 ON/OFF
for (int r = 1; r < 5; r++) {
ControlRelais(r, true); delay(500);
ControlRelais(r, false); delay(500);
}
// パターン 2: 4→1 へ順次 ON/OFF
for (int k = 4; k > 0; k--) {
ControlRelais(k, true); delay(500);
ControlRelais(k, false); delay(500);
}
// パターン 3: 交差点灯
for (int r = 1; r < 5; r++) {
for (int k = 4; k > 0; k--) {
ControlRelais(r, true); ControlRelais(k, true); delay(500);
ControlRelais(r, false); ControlRelais(k, false);
}
}
}
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo "); Serial.print(RelaisNo); Serial.print(" = "); Serial.println(RelaisState);
}
重要な設計上の考慮点
- 光クロストーク対策: 完全遮光が困難なため、LED 輝度を最小限(15/255)に抑制
- 応答速度: LDR の応答は ms オーダー。高速スイッチングには不向き
- 絶縁耐圧: 物理的ギャップのみで絶縁。高電圧用途では市販オプトカプラ併用推奨
- 電流容量: NeoPixel 1 個約 20mA(全点灯白色時)。4 個なら 80mA + MCU 消費。USB 給電で十分
- 拡張性: LED ストリップ長の限り(300 個まで)チャンネル増設可能
応用例
- ピン数の少ない MCU(ATtiny, ESP-01 等)での多チャネル制御
- 既存基板への後付け制御チャネル追加
- 照明、ポンプ、ファン、ソレノイド等の並列制御
- PWM 制御可能なアクチュエータへの応用(LED 輝度でデューティ比制御)
リソース
- Fritzing 回路図: プロジェクトページの Schematics セクション(
.fzzファイル) - Adafruit NeoPixel ライブラリ: GitHub
製造プロセス
- Satellite CCRMAキットでセンサー駆動オーディオエフェクトを構築
- Arduino Nano 33 IoT製 フライトシミュレーター2020用コックピットパネル - LCD&CDI表示
- Microsoft Flight Simulator 2020用Arduinoスイッチ&LEDパネル
- NeoPixelリングとArduinoで作るインタラクティブジャイロスコープLEDディスプレイ
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- ArduinoとAndroidでRoomba Create 2をリモコン操作 ─ Bluetooth経由のステップバイステップガイド
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- Bolt IoTとArduino UNOでLED輝度をシームレス制御