146電線2本だけでRGB LEDの制御
はじめに
最近は昔々のTapTapRevengeっていうモバイル音ゲーのアーケード筐体を作ってみたくなりました。
このゲームのターゲットは、ノーツを押すタイミングにより色が変わる仕様です。
なお、ターゲットとしてよく他の音ゲーに使われている100φドームボタンを使用したくて、電球はウェッジタイプなのでRGBLEDを対応できません。手元にあるもので済ませたいしOBSA-LHS7Fにアップグレードするのもちょっとバジェット超過です…
自作RGB電球
WS2812をベースにすれば、実はワンワイヤーで制御が可能です!(実際の1Wireではないけど・・)
回路図はこちらです:(CADは直接基板データを作りましたので手書きで失礼致します)
+線はデータ入力と電源入力して使用しています。
ロジック1になってる間はLEDがデータ入力から給電されていてコンデンサーが充電されます。
ロジック0になってる間はLEDがコンデンサーから給電します。
そしてコンデンサーに貯まった電気がデータ通信にならないようにダイオードで分けています。
ということで、データバスの電流キャパが十分であれば、+に普通のWS2812制御信号を通信させたら動作しますね。
データ通信しない間はデータバスを1にすべきだけが注意しないといけません。
なお容量はリフレッシュレート次第にコンデンサーの容量を変える必要になるかもしれません。
今回の動作確認に使用したソースコード:(あんまりよくはない)
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#define LED_PIN 10
#define BTN_PIN 7
Adafruit_NeoPixel pix = Adafruit_NeoPixel(1, LED_PIN, NEO_GRB | NEO_KHZ800);
void doShow() {
digitalWrite(LED_PIN, LOW);
pix.show();
digitalWrite(LED_PIN, HIGH);
}
void setup() {
pix.begin();
pix.setBrightness(255);
pinMode(BTN_PIN, INPUT_PULLUP);
}
void loop() {
pix.setPixelColor(0, 255, 255, 255);
doShow();
while (!digitalRead(BTN_PIN)) delay(10);
while (digitalRead(BTN_PIN)) delay(10);
pix.setPixelColor(0, 255, 0, 0);
doShow();
while (!digitalRead(BTN_PIN)) delay(10);
while (digitalRead(BTN_PIN)) delay(10);
pix.setPixelColor(0, 0, 255, 0);
doShow();
while (!digitalRead(BTN_PIN)) delay(10);
while (digitalRead(BTN_PIN)) delay(10);
pix.setPixelColor(0, 0, 0, 255);
doShow();
while (!digitalRead(BTN_PIN)) delay(10);
while (digitalRead(BTN_PIN)) delay(10);
}
※ Adafruit_NeoPixelライブラリーは必須
次は適当なサイズで基板データを作成しました:Github
そして二つの基板を合わせて先ほどの回路を電球(っぽい)形に実装しました:
動かしてみます
ついにArduinoを以下のように接続します
| Arduino | OBSA-LHSXF |
|---|---|
| スイッチ部 | |
| 5V | 5V |
| GND | GND |
| 7 | OUT |
| 電球部 | |
| 10 | + |
| GND | - |
先ほどのソースをアップロードして・・・
ちゃんと色を変えて光ります!
じゃあこれから本番のIO基板の開発に進むしかないですね…
投稿者の人気記事





-
akasaka
さんが
2025/12/22
に
編集
をしました。
(メッセージ: 初版)
-
akasaka
さんが
2025/12/22
に
編集
をしました。
-
akasaka
さんが
2025/12/25
に
編集
をしました。
ログインしてコメントを投稿する