「ATOM LITE」本体のフルカラーLED(NeoPixel:WS2812B)の色をボリューム操作で可変させるプログラムの作り方を詳しく紹介します。
フルカラーLEDは一つのLEDの中に赤、緑、青のLEDが入っていて、それぞれの光の強さを変えることで様々な色を表現できるLEDです。
様々な色を表現できますが、好みの色にしようと思うと、どの色のLEDをどれくらいの明るさにしたらよいか、実際に点灯させてみないと分かりにくいです。
「ATOM LITE」については以下のリンクで詳しく紹介しています。
1.動作紹介
「ATOM LITE」に接続した「ボリューム」を回すと下画像のように本体のフルカラーLEDの色が徐々に変わっていきます。
LEDが赤色に点灯
ボリュームを左に回すとLEDが赤から緑色に徐々に変化
ボリュームをさらに回すとLEDが緑から青色に徐々に変化
ボリューム可変抵抗については以下のリンクで詳しく紹介しています。
2.必要なもの(部品リスト)
今回使用した部品は以下になります。
3.「ATOM LITE」と「ボリューム」の接続方法
「ATOM LITE」と「ボリューム」は「Groveコネクタ」と「GROVE – 4ピン – ジャンパオスケーブル」を使用して以下のように接続します。
「ATOM LITE」と「ボリューム」との接続は「Groveコネクタ」でそれぞれ接続できるといいのですが「ATOM LITE」側「Groveコネクタ」のアナログ端子(G26)と、今回使用する「ボリューム」側のアナログ信号配線(白色)の位置が合わないため「ATOM LITE」のアナログ端子は裏側端子のG33を使用します。
「ATOM LITE」裏側端子への配線は上画像のようになります。
「ボリューム」側の「Groveコネクタ」配線の赤色(5V)を「ATOM LITE」の5Vへ、配線黒色(GND)をGへ、配線黄色(IN)をG33へ接続し、配線白色(OUT)には何も接続しません。
写真ではわかりにくいかもしれませんので下画像の配線図でも確認してみてください。
4.プログラムの書込み(コピペ)
プログラムは以下に準備しましたので「コピペ」して書き込んでみましょう。
下のコードを「コピペ」して書き込んでください。
※コピーは下コード(黒枠)内の右上角にある小さなアイコンのクリックでもできます。
#include <M5Atom.h> //Atomのヘッダファイルを準備
// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
return (CRGB)((r << 16) | (g << 8) | b);
}
// 変数宣言
float an_val; //アナログ換算値(0~4095)格納用
float an_volt; //アナログ電圧(0~3.3V)格納用
float r,g,b; //LED明るさ指定用(赤、緑、青)
int cnt = 0; //シリアル表示周期カウント用
// 初期設定 -----------------------------------------------
void setup() {
M5.begin(true, false, true); //Serial,POWER,LED
Serial.begin(9600); //標準のシリアル通信設定
pinMode(33, ANALOG); //アナログ入力端子設定
}
// メイン -------------------------------------------------
void loop() {
r = 0; //LED赤色0リセット
g = 0; //LED緑色0リセット
b = 0; //LED青色0リセット
// アナログ入力処理
an_val = analogRead(33); //アナログ換算値(0~4095)取得
an_volt = (3.3 / 4095) * an_val; //アナログ電圧(0~3.3V)換算
//LED色可変
if(an_val < 1365) { //アナログ値が1365より小さいなら赤、緑指定
g = (an_val / 5.353); //緑を指定(0~255へ換算)
r = 255 - g; //緑が明るくなったら赤を暗く
} else if(an_val >= 1365 && an_val < 2730) {
//アナログ値が1365以上2730より小さいなら赤、緑指定
b = ((an_val - 1365) / 5.353); //青を指定(0~255へ換算)
g = 255 - b; //青が明るくなったら緑を暗く
} else if(an_val >= 2730) { //アナログ値が1365以上なら青、赤指定
r = ((an_val -2730) / 5.353); //赤を指定(0~255へ換算)
b = 255 - r; //赤が明るくなったら青を暗く
}
M5.dis.drawpix(0, dispColor((int)r, (int)g, (int)b)); //LED点灯
//シリアル出力周期(10ms × 100 = 1000ms)
if(cnt == 100) { //周期カウント100でシリアル出力
// AN:アナログ値 VOLT:アナログ電圧換算値 LED色指定値(R,G,B)
Serial.printf("AN = %d VOLT = %1.2fV R,G,B = %d, %d, %d\n",
(int)an_val, an_volt, (int)r, (int)g, (int)b);
cnt = 0; //周期カウント0リセット
}
cnt++; //周期カウント+1
delay(10); //10ms待機
}
29行目 ~41行目がボリュームを回すことによってLEDの色を変化させるプログラムです。
5.プログラムの動作解説
プログラムの動作について解説します。
今回のプログラムでは「アナログ入力」を使用します。
「アナログ入力」とは「A/D変換」とも呼ばれ「ボリューム」の電圧値をマイコンで処理できる「デジタル値」に変換するものです。
26行目で「ボリューム」の電圧をアナログ変換値(デジタル値)(0~4095)として取得しています。
27行目では取得した値を確認のために電圧(0~3.3V)に換算しています。
「ボリューム」を最小から最大まで回すことで 白ー黒 間の電圧が 0~3.3V まで変化します。
この電圧を「ATOM LITE」のアナログ端子に入力することで 0~4095 に変換して以降の処理に使用します。
29行目 ~41行目のLED色を変化させるプログラムは以下のように動作します。
①0~4095のアナログ変換値(an_val)を3分割し、どの範囲にあるかを「if文」で判別
②範囲内のアナログ換算値をLEDの明るさ指定値(0~255)に換算
③②の値の変化に応じて各色のLEDの明るさを変化
「if文」については以下のリンクで詳しく紹介しています。
それぞれの動作を表に表すと下表のようになります。
フルカラーLEDの色は「ATOM LITE」の「FastLED」ライブラリを使用し、LED赤、緑、青(R,G,B)の明るさを 0~255 の値で指定します。
「FastLEDライブラリについては以下のリンクで詳しく紹介しています。
43行目 ~50行目のシリアル出力で下画像のようにそれぞれの値を確認することができます。
VOLT:電圧換算値(0~3.3V)
R,G,B:LED赤、緑、青の明るさの各指定値(0~255)
シリアル出力については以下のリンクで詳しく紹介しています。
「アナログ入力」の使い方は以下のリンクで詳しく紹介しています。
コメント