ATtiny1616でフルカラーLEDを光らせる NeoPixel編

自分の作品作りにおいては、特撮玩具の改造が主ですので、

  • 発光させる
  • 音声を再生させる

この2つは毎回ほぼ必須になります。しかも発光については、八割方、フルカラーLED(=電力喰い)を使用します。いくらATtiny1616が低消費電力でボタン電池で駆動できたとしても、発光・音声再生部品が電力喰いだと、結局それらに引っ張られてリッチな電源を用意しなくてはいけなくなります。

ということで、まずは出来る限り低消費電力でフルカラー発光させる方法を探りたいと思います。

自分が普段使っているフルカラーLEDモジュールは、元祖NeoPixelとも言える「WS2812B」なのですが、昔からある製品ということで、あんまり電力効率は良くなさそうです。

少し調べたところ、NeoPiexel系でWS2812Bよりもう少し低消費電力なものはいくつか出ているようで、自分の手元にあるものを探してみたところ、以下で購入していた部品に「SK6805」というNeoPixel系の低消費電力部品が使用されていることがわかりました。

なんでも、通常のNeoPixelだとMaxで50mAぐらい消費するのが、SK6805だとMaxでも16mAぐらいで抑えられるのだとか。これで発光も充分なら、ATtiny1616と組み合わせとしては良さそうです。ということで、これをATtiny1616で光らせてみます。

サンプルコードは以下のようにしました。5秒ごとに「無色→赤→緑→青→黄→シアン→マゼンタ→白→無色→」と切り替わっていきます。

#include <Adafruit_NeoPixel.h>

#define PIN_LED PIN_PB4
#define NUM_LED 1
#define ON_MS 5000

#define BRIGHTNESS 96

Adafruit_NeoPixel pixel(NUM_LED, PIN_LED, NEO_GRB + NEO_KHZ800);

uint32_t colors[] = {
  pixel.Color(0, 0, 0), // BLACK
  pixel.Color(BRIGHTNESS, 0, 0), // RED
  pixel.Color(0, BRIGHTNESS, 0), // GREEN
  pixel.Color(0, 0, BRIGHTNESS), // BLUE
  pixel.Color(BRIGHTNESS, BRIGHTNESS, 0), // YELLOW
  pixel.Color(0, BRIGHTNESS, BRIGHTNESS), // CYAN
  pixel.Color(BRIGHTNESS, 0, BRIGHTNESS), // MAGENTA
  pixel.Color(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_PA1, INPUT_PULLUP);
  pinMode(PIN_PA2, INPUT_PULLUP);
  pinMode(PIN_PA3, INPUT_PULLUP);
  pinMode(PIN_PA4, INPUT_PULLUP);
  pinMode(PIN_PA5, 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_PB5, INPUT_PULLUP);
  pinMode(PIN_PC0, INPUT_PULLUP);
  pinMode(PIN_PC1, INPUT_PULLUP);
  pinMode(PIN_PC2, INPUT_PULLUP);
  pinMode(PIN_PC3, INPUT_PULLUP);

  pixel.begin();
  pixel.show();
}

void loop(){
  pixel.setPixelColor(0, colors[color_index]);
  pixel.show();

  delay(ON_MS); 

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

明るさ指定(BRIGHTNESS)は255がMaxですが、Maxにすると電流消費が激しいことになるので、個人的には少なくともこれぐらいは欲しい、ということで96を指定しています。

プログラムとしてはこれで問題ないはずなのですが、プログラムのビルドの段階で以下のようなエラーが発生。

/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp:1843:2: error: #error "CPU SPEED NOT SUPPORTED" #error "CPU SPEED NOT SUPPORTED" ^~~~~ 
/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp: In member function 'void Adafruit_NeoPixel::show()': 
/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp:469:21: warning: unused variable 'i' [-Wunused-variable] volatile uint16_t i = numBytes; // Loop counter ^ 
/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp:471:7: warning: unused variable 'b' [-Wunused-variable] b = *ptr++, // Current byte value ^ 
/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp:472:7: warning: unused variable 'hi' [-Wunused-variable] hi, // PORT w/output bit set high ^~ 
/Users/nick/Documents/Arduino/libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp:473:7: warning: unused variable 'lo' [-Wunused-variable] lo; // PORT w/output bit set low ^~ 
exit status 1 Compilation error: exit status 1

どうやら、省電力動作のために動作周波数を1MHzにしていたのがよろしくないようです。

これ。いくつか値を試してみましたが、使用しているライブラリだと16MHzしか受け付けてくれませんでした。

今回の検証目的は、

  • そもそもATtiny1616でNeoPixelが使えるのか
  • NeoPixelの消費電流はどれぐらいか

の2つなので、ATtiny1616自体の消費電流が気になりますが、一旦は16MHzでビルドして、以降の検証を進めることにします。

で、とりあえず動作はしましたので、各色発光時のNeoPixel (SK6805)の消費電流を測ってみました。

まず赤。

緑。

青。

黄。

シアン。

マゼンタ。

白。

最後、非点灯時。

ということで、明るさ指定を96にした場合ですが、

  • R, G, Bの一色発光 … 2.44mA程度
  • R, G, Bから二色発光 … 4.28mA程度
  • R, G, B全色発光 … 6.14mA程度

となりました。前情報では全点灯で16mA程度という話でしたので、およそ合っているんじゃないかなと思います。

さて、これぐらいであればボタン電池駆動でもギリいけそうではありますが、問題は非点灯時です。NeoPixelがICを内蔵しているため、何も光っていなくても0.6mA程度消費してしまっています。うーん、これは地味にきつい。NeoPixelを普通に使うのであれば、大元の電源ON/OFFスイッチはちゃんと用意しておかないと、電池がどんどん減っていってしまいます。

これを回避しようと思うとMOSFETを利用して。。。とかになってくるのですが、それに加えて、そもそもNeoPixelを使おうとするとマイコン側の動作周波数が強制的に16MHzを要求される、というのが、消費電流をさらに増加させてしまいます。

ということで、ATtiny1616とNeoPixel系は、普通に使う分には問題ないのですが、低消費電力を追求しようとすると相性が悪くなる、という感じになりました。個人的には、ATtiny1616が1MHz動作であってもフルカラーLEDを使用したいところなので、次回、別のやり方を考えてみることにします。

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

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

コメント

コメント一覧 (1件)

コメントする

目次