ATtiny1616でフルカラーLEDを光らせる フルカラーRGBLEDモジュール編

前回、ATtiny1616でフルカラーLEDを使用するためにNeoPixel系のモジュール(SK6805)を試したわけですが、以下2つの課題が見つかりました。

  • NeoPixelのライブラリが、動作周波数1MHzでは使用できない
  • 消灯時でも待機電流として0.6mA程度消費してしまう

これらを同時に解消しようと思うと、素直に考えればNeoPixelは使用しない方が良さそうです。自分の場合、ATtiny1616を使用するのは、仮面ライダーの収集系アイテム等の小規模改造のケースが多いかと思いますが、こういう場合はフルカラーLEDは一個使えればおそらく充分かと思います。

ということで、NeoPixel系を使うのではなく、R, G, Bの独立した3つのLEDがパッケージングされているだけのモジュールを使うことにします。

NeoPiexelの良さは、何個繋いでも信号線は一本で済んで制御がラク、というところかと思います。そのため、そもそも使用するフルカラーLEDが1個であれば、独立制御のフルカラーLEDを使ったとしても、デメリットは使用する信号線が1本から3本に増えるぐらいで、これならライブラリの制約も受けませんし、ICも入っていないので待機電流も発生しません。ATtiny1616ではPWM制御ができるGPIOが最大8本ありますので、ピンを3本使うぐらいは問題ないでしょう。

ということで、以下のモジュールを購入しました。

DIP化されていますので、ブレッドボードでも使いやすくなっています。

実物はかなり小さくて見にくいですが、右下の角の切れ込みが入っている側がカソード(−)側です。

さて、これまで私がフルカラーLEDとしてNeoPixelばかり使っていたのは、ひとえに「抵抗計算がめんどくさかったから」です。R, G, B、それぞれの明るさを考慮して、それぞれに最適な抵抗を選んで配線する。。。というのがよくわからなくて敬遠していたのですが、このあたりのめんどくささは最近はChatGPTさんが解決してくれます。例えば、以下のように質問してみました。

ATtiny1616をArduino IDE (megaTinyCore)で開発しています。
三色独立のフルカラーチップLEDを発光させようと思います。
使用するフルカラーチップLEDの詳細仕様は、以下のリンク先を参照してください。 https://akizukidenshi.com/catalog/g/g108954/

ATtiny1616は、動作周波数を1MHzとし、ボタン電池(LR44)を3個直列に繋いで4.5Vで駆動させるものとします。
省電力駆動のため、フルカラーLEDが使用する電流値の合計は、最大でも15mA程度に抑えたいと考えています。
また、フルカラーLEDの各素子のアノードとATTiny1616にGPIOを接続するものとし、
各ピンからのanalogWriteを255としたときの各素子の明るさをできるだけ揃えたいと思います。

このとき、ATtiny1616の各GPIOと、R, G, Bの各LED素子の間に挟むべき抵抗の大きさを教えてください。

この問いに対してのChatGPTの最初の回答は以下のものでした。

推奨抵抗想定電流
R560Ω約4.8mA
G680Ω約2.2mA
B180Ω約7.8mA

LED仕様の順電圧が R=1.8V、G=3.0V、B=3.1V、光度が R=225mcd、G=487mcd、B=140mcd であることから、光度の高いGの電流を少なく、光度が低いBの電流を多めにしているとのことです。なるほど。

これでも全然問題ないのですが、そのあともう少しChatGPTとやりとりしたり(←GPIOの接続をソースじゃなくてシンクにした方が良いのかとか、電流の合計上限を10mAにしたらどうなるか、等)、実際の明るさを確認したりしつつ、自分の手持ちの抵抗器の種類も加味して、最終的には以下の抵抗を挟むことにしました。

抵抗器
R680Ω
G1kΩ
B220Ω

配線は以下になります。「プラス電源 -> 抵抗器 -> LED -> ATtiny1616 GPIO」の順の接続になります。

サンプルソースコードは以下になります。前回同様、5秒ごとに「無色→赤→緑→青→黄→シアン→マゼンタ→白→無色→」と切り替わっていきます。

#define PIN_LED_R PIN_PA3
#define PIN_LED_G PIN_PA4
#define PIN_LED_B PIN_PA5
#define ON_MS 5000

#define ANALOG_WRITE_MAX 255
#define BRIGHTNESS 255

uint8_t colors[][3] = {
  {0, 0, 0}, // BLACK
  {BRIGHTNESS, 0, 0}, // RED
  {0, BRIGHTNESS, 0}, // GREEN
  {0, 0, BRIGHTNESS}, // BLUE
  {BRIGHTNESS, BRIGHTNESS, 0}, // YELLOW
  {0, BRIGHTNESS, BRIGHTNESS}, // CYAN
  {BRIGHTNESS, 0, BRIGHTNESS}, // MAGENTA
  {BRIGHTNESS, BRIGHTNESS, BRIGHTNESS} // WHITE
};

const int NUM_COLORS = sizeof(colors) / sizeof(colors[0]);
uint8_t color_index = 0;

void setup(){  
  ADC0.CTRLA &= ~ADC_ENABLE_bm; // ADC(アナログデジタル変換)を停止
  SPI0.CTRLA &= ~SPI_ENABLE_bm; // SPI停止
  TWI0.MCTRLA = 0;   // I2C マスター停止
  TWI0.SCTRLA = 0;   // I2C スレーブ停止

  Serial.begin(9600);

  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);

  // 省電力化のため、未使用ピンはすべてプルアップする
  pinMode(PIN_PA1, INPUT_PULLUP);
  pinMode(PIN_PA2, INPUT_PULLUP);
  pinMode(PIN_PA6, INPUT_PULLUP);
  pinMode(PIN_PA7, INPUT_PULLUP);
  pinMode(PIN_PB0, INPUT_PULLUP);
  pinMode(PIN_PB1, INPUT_PULLUP);
  pinMode(PIN_PB2, INPUT_PULLUP);
  pinMode(PIN_PB3, INPUT_PULLUP);
  pinMode(PIN_PB4, INPUT_PULLUP);
  pinMode(PIN_PB5, INPUT_PULLUP);
  pinMode(PIN_PC0, INPUT_PULLUP);
  pinMode(PIN_PC1, INPUT_PULLUP);
  pinMode(PIN_PC2, INPUT_PULLUP);
  pinMode(PIN_PC3, INPUT_PULLUP);
}

void loop(){
  analogWrite(PIN_LED_R, ANALOG_WRITE_MAX - colors[color_index][0]); // シンク型接続なので明るさ指定は反転させる
  analogWrite(PIN_LED_G, ANALOG_WRITE_MAX - colors[color_index][1]); // シンク型接続なので明るさ指定は反転させる
  analogWrite(PIN_LED_B, ANALOG_WRITE_MAX - colors[color_index][2]); // シンク型接続なので明るさ指定は反転させる

  delay(ON_MS); 

  color_index++;
  if(color_index >= NUM_COLORS){
    color_index = 0;
  }
}

では、実際に動作させて電流を測っていきます。以下、明るさをMax(=analogWriteで255指定)にした場合の計測値になります。まずは非点灯時。

1.14mA。これは、ATtiny1616を動作周波数1MHzで動作させるのに必要な電流値ですので、フルカラーLEDとしては待機電流がかかっていません。ICがないので当然と言えば当然。

続いて赤。

ATtiny1616の1.14mAを引くと、赤色LED単体での消費電流は4.59mA。

続いて緑。

ATtiny1616の1.14mAを引くと、緑色LED単体での消費電流は2.30mA。

続いて青。

ATtiny1616の1.14mAを引くと、青色LED単体での消費電流は8.72mA。想定通りですが電流喰いです。

続いて黄。

ATtiny1616の1.14mAを引くと、消費電流は6.84mA。当たり前ですが、赤単体と緑単体の電流値の合算(4.59+2.30=6.89)とほぼイコールです。

続いてシアン。

ATtiny1616の1.14mAを引くと、消費電流は10.92mA。当たり前ですが、緑単体と青単体の電流値の合算(2.30+8.72=11.02)とほぼイコールです。

続いてマゼンタ。

ATtiny1616の1.14mAを引くと、消費電流は13.16mA。当たり前ですが、赤単体と青単体の電流値の合算(4.59+8.72=13.31)とほぼイコールです。

最後、白。

ATtiny1616の1.14mAを引くと、消費電流は15.31mA。当たり前ですが、赤単体と緑単体と青単体の電流値の合算(4.59+2.30+8.72=15.61)とほぼイコールです。

ということで、NeoPixel(SK6805)の最大消費電流と大体同じぐらいになりました。analogWriteのMax出力でこの値なので、プログラム上で値を絞ればもっと消費電流を下げることができます。ここは、併用するその他モジュールとの兼ね合いかなと思います。

もちろん、ボタン電池(LR44) x 3個で動作します。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次