ボリュームで7色変化!フルカラーLEDコントローラーを作ろう「ATOM LITE」

ATOM LITEの配線の仕方

「ATOM LITE」本体のフルカラーLED(NeoPixel:WS2812B)の色をボリューム操作で可変させるプログラムの作り方を詳しく紹介します。

フルカラーLEDは一つのLEDの中に赤、緑、青のLEDが入っていて、それぞれの光の強さを変えることで様々な色を表現できるLEDです。

様々な色を表現できますが、好みの色にしようと思うと、どの色のLEDをどれくらいの明るさにしたらよいか、実際に点灯させてみないと分かりにくいです。

今回はボリューム(可変抵抗器)を回すことで、赤、緑、青の中の2色づつで表現できるすべての色を確認できる、フルカラーLEDコントローラーを作ります。

「ATOM LITE」については以下のリンクで詳しく紹介しています。

ATOM LITE の初期設定。プログラミング初心者におすすめ
Platform IOを使用した ATOM LITE の初期設定です。ファイルを作成、必要なライブラリの準備、初期設定方法を紹介。実際に「Lチカ」プログラムを「コピペ」で書き込み動作確認まで行います。
「開発環境の準備」がまだの方は → こちら

スポンサーリンク

1.動作紹介

「ATOM LITE」に接続した「ボリューム」を回すと下画像のように本体のフルカラーLEDの色が徐々に変わっていきます。

ATOM LITEとボリュームの接続

LEDが赤色に点灯

ATOM LITEとボリュームの接続

ボリュームを左に回すとLEDが赤から緑色に徐々に変化

ATOM LITEとボリュームの接続

ボリュームをさらに回すとLEDが緑から青色に徐々に変化

ボリューム可変抵抗については以下のリンクで詳しく紹介しています。

ボリューム(可変抵抗器)の使い方、つなぎ方、抵抗値計算等を回路図も使って詳しく解説
ボリュームというと音量調節のイメージですが、明るさや回転数等を調整するのにも使用されます。「抵抗(固定抵抗器)」が固定の抵抗値を持つのに対して「可変抵抗器」は抵抗値を調整することができます。このボリューム(可変抵抗器)について紹介します。
スポンサーリンク

2.必要なもの(部品リスト)

今回使用した部品は以下になります。


スポンサーリンク

3.「ATOM LITE」と「ボリューム」の接続方法

「ATOM LITE」と「ボリューム」は「Groveコネクタ」と「GROVE – 4ピン – ジャンパオスケーブル」を使用して以下のように接続します。

ATOM LITEとボリュームの接続

「ATOM LITE」と「ボリューム」との接続は「Groveコネクタ」でそれぞれ接続できるといいのですが「ATOM LITE」側「Groveコネクタ」のアナログ端子(G26)と、今回使用する「ボリューム」側のアナログ信号配線(白色)の位置が合わないため「ATOM LITE」のアナログ端子は裏側端子のG33を使用します。

ATOM LITEとボリュームの接続

「ATOM LITE」裏側端子への配線は上画像のようになります。
「ボリューム」側の「Groveコネクタ」配線の赤色(5V)を「ATOM LITE」の5Vへ、配線黒色(GND)をGへ、配線黄色(IN)をG33へ接続し、配線白色(OUT)には何も接続しません。


写真ではわかりにくいかもしれませんので下画像の配線図でも確認してみてください。

ATOM LITEとボリュームの接続配線図
ここで使用した「Groveコネクタ」配線は「GROVE – 4ピン – ジャンパオスケーブル(5本セット)」です。
この配線は「ボリュームユニット」に付属の配線とは白と黄が逆になっています。
「ボリュームユニット」に表示されている「IN(白)」と「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文」については以下のリンクで詳しく紹介しています。

動かして学ぶC言語「if文(条件分岐)」の使い方を基本から詳しく紹介
「C言語」の「if文」について紹介します。「if文」は条件によって実行するプログラムを分岐させたい時に使用します。 基本の書き方や使い方を「Lチカ」プログラムで実際に動かしながら楽しく学びましょう♪

それぞれの動作を表に表すと下表のようになります。

フルカラーLEDの制御方法

フルカラーLEDの色は「ATOM LITE」の「FastLED」ライブラリを使用し、LED赤、緑、青(R,G,B)の明るさを 0~255 の値で指定します。

「FastLEDライブラリについては以下のリンクで詳しく紹介しています。

定番の Lチカ!(ATOM LITE編)で遊びながら自然と身につくプログラミング
プログラミング初心者ならとりあえず「Lチカ」やりましょう!LEDを点灯、消灯(チカチカ)させるものです。サンプルプログラムをコピペでとりあえず動作確認。LEDの色は数値を変えるだけ。いろいろ試して遊びながら学びましょう♪

43行目 ~50行目のシリアル出力で下画像のようにそれぞれの値を確認することができます。

シリアル出力

 AN:アナログ入力値(0~4095)
 VOLT:電圧換算値(0~3.3V)
 R,G,B:LED赤、緑、青の明るさの各指定値(0~255)
メイン(void loop)の処理が約10msごとに繰り返されており、このまま表示すると表示回数が多すぎるので、変数「cnt」で実行回数をカウントし100回(1000ms=1秒)に1回表示するようにしています。

シリアル出力については以下のリンクで詳しく紹介しています。

シリアル(UART)出力で内部データの表示(Arduinoプログラミング)
シリアル出力モニタとはプログラム内の値やデータをパソコンのモニタ上に表示させることができる機能で、ほとんどの開発環境にこの機能があります。表示だけではなく出力したデータを記録して保存したり、機器間でデータをやり取りする時にも使用されます。

「アナログ入力」の使い方は以下のリンクで詳しく紹介しています。

アナログ入力(A/D変換)の使い方(Arduinoプログラミング)
Arduinoコマンドを使用した「アナログ入力」の使い方について紹介します。A/D変換とも呼ばれ「A/D」とは「Analog」と「Digital」の頭文字をとったもので、アナログデータをデジタルデータに変換する処理のことを言います。

コメント

タイトルとURLをコピーしました