ArduinoとシリアルLEDでRGBライトを作ってみた
最近、デジタル一眼レフを購入したので照明についていろいろと調べていましたら、「RGBライト」という製品を知ることになりました。手持ちのシリアルLED(WS2812B)とArduinoで「RGBライト」を作れないだろうかと思い立ち、さっそくやってみました。
この記事では、私がArduinoで自作したシリアルLEDのRGBライトの作り方を解説します。
具体的には次のようなことをやっていきます。
- ArduinoでシリアルLEDを制御する
- 赤、緑、青のそれぞれの色を可変抵抗で調整可能にする
- モバイルバッテリーを搭載させてケーブルレスにする
実用的なRGBライトができましたので、ぜひご参考になさってみてください。
はじめに
Amazonを見るとRGBライトは三千円ほどで販売されています。安い!、と思いました。正直、自作してもそんなに安くありません^^;
そんなわけで、自作がメンドーな方は素直に製品性を選びましょう。
「どうしても自作したい!」という方は、この先をお読みになさってみてください。自作ですとバッテリー容量を大きくできたり、ライトの数を増やしたり、プログラムを組んでオリジナルの演出効果を作り出したりできるメリットがあるんじゃないかと思っています。
Arduinoの開発環境
次のような開発環境下で作業を行ないました。
項目 | バージョン |
---|---|
Arduinoデバイス | Seeeduino XIAO |
シリアルLED | WS2812B |
Arduino IDE | 1.8.15 |
パソコン | macOS Big Sur 11.2.3 |
Arduinoには互換機の「Seeeduino XIAO」を使用しました。「Seeeduino XIAO」には、WiFiやBluetooth機能などの無線はありませんが、今回のようなモバイル型のスタンドアローンなモノには小さくて便利です。
▼ XIAOの使い方はこちらで詳しく解説しましたので、ご参考になさってみてください。
▼ もちろん、ほかのArduinoをお使いになってもらっても構いません。
もしArduino初心者の方で「どのArduinoを選べばよいか分からない」といった方は、オススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。
RGBライトのに使うシリアルLED
シリアルLED「WS2812B」が60個付いているテープライトを、百均で購入したケースに貼り付けました。横幅が収まるようにカットし、数珠つなぎになるように導線をはんだ付けしました。ライトはすべて直列につないでいます。
このはんだ付け作業はかなり大変でした。もしこれから制作しようとなさるなら、最初からマトリックス状に並べられているものをオススメしておきます。
▼ シリアルLEDの仕組みや使い方は、以前にこちらの記事で詳しく解説しましたのでご覧ください。
ArduinoとシリアルLEDの配線
最初に説明したとおり、今回は赤(R)緑(G)青(B)のそれぞれの色を可変抵抗で調節できるようにします。また、電源スイッチを取り付けたいです。よって、配線は次の図のようになりました。
USBコネクタの部分は、モバイルバッテリーへ接続します。USBコネクタの+5VとGNDの位置を間違えないように注意してください。不安な方は一度テスターで確認すると良いでしょう。
ところで、モバイルバッテリーは2A以上の出力でないと、シリアルLEDを点灯した際に電力不足によってXIAOが落ちてしまいます。本来ならば、XIAOとシリアルLEDの電源は別々に供給したいところですが、手軽さを考えてコレで行きます。。
RGBライトのプログラム
先ほどの配線をブレッドボードで組んで、次のようなプログラムでRGBライトを実現しました。
/*
Created by Toshihiko Arai.
https://101010.fun/iot/arduino-rgb-light.html
*/
#include <Adafruit_NeoPixel.h>
const int POT_R = 3; // A3
const int POT_G = 2; // A2
const int POT_B = 1; // A1
const int DIN_PIN = 0; // D0
const int LED_COUNT = 60; // LEDの数
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(POT_R, INPUT);
pinMode(POT_G, INPUT);
pinMode(POT_B, INPUT);
pixels.begin();
pixels.clear();
Serial.begin(9600);
}
void loop() {
int R = int(analogRead(POT_R) / 1023.0 * 255.0);
int G = int(analogRead(POT_G) / 1023.0 * 255.0);
int B = int(analogRead(POT_B) / 1023.0 * 255.0);
Serial.printf("R:%d G:%d B:%d\n", R, G, B);
for(int i=0; i<LED_COUNT; i++) {
pixels.setPixelColor(i, pixels.Color(R, G, B)); // red
pixels.show();
}
delay(100);
}
可変抵抗を回せば、写真のように色合いや明るさを自由に変えることができます。
loop内のdelayをもっと短くすると、可変抵抗を回した時の色の変化の追従が滑らかになります。ただし、なんとなく消費電力も多くなりそうなので100ms程度に設定しました。
最終的には、銅基板をエッチングして基板をつくり、はんだ付けして下の写真のようにケース内に回路を収めました。
また、カメラの1/4インチネジで取り付けられるように、百均のスマホホルダーを利用してケースに接着してみました。カメラネジにこちらのホットシューを取り付けてありますので、RGBライトをカメラへマウントできるようになっています。
フロントはこんな感じです。半透明なケースがほどよくディフューザーになりました。
三脚、雲台、スマホホルダーそしてホットシューを介してRGBライトを取り付けてみました。部屋を暗くすると怪しい感じの撮影ができますね(笑)
ちなみに、こちらは私が使用している三脚とスマホホルダーです。スマホホルダーはホットシューをマウントできるので、RGBライトをマウントするには便利ですね。
▼ その後さらに進化して、ロータリーエンコーダで色を変えられるようにしました。HSV色空間の色彩を使ってRGBへ変換することで色の移り変わりを実現させています。
▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。
▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。
▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。