マイコン内蔵のフルカラーLEDというのものを購入したので、これをArduino互換ボードで動かしてみました。
・動画(youtube)
マイコン内蔵フルカラーLED
型番:WS2812B
ケース内に3つのLED(R,G,B)とマイコンが搭載されており、通常のLEDとは異なりシリアルの制御線によって明るさや色合いを変更できるようです。最近はLED内部にもマイコンが内蔵されるようになったのですね。
もう一つ面白いのは、同じLEDを数珠つなぎにしてシリアル制御で一括制御できることです。
なので電源が許せる限り、いくつもLEDを繋いでイルミネーションのようなものが割と簡単に作れてしまうようです。
機会があればイルミネーションのようなものも作ってみたいですが、今回はお試しということで1個だけ使用して動かしました。
Arduino互換ボード
ブログ(KiCadで基板を作る)の基板作成記事で作ったものを使用しました。
参考:Arduino互換基板の作成(1)
その他基板
電源入力用およびフルカラーLEDの実装用の基板はDCジャック変換基板を利用しました。
これもブログの基板作成記事で作った基板です。
参考:DCジャック変換基板の作成(1)
ブロック図
スケッチ
LEDの制御については、AdafruitのNeoPixelライブラリを使用しました。
スケッチもNeoPixelのサンプルスケッチ「simple」をもとに作成しました。
Arduinoのデジタル入出力6番ピンから制御信号を出力しており、周期的に色合いと明るさが変化する動作となっています。
#include <Adafruit_NeoPixel.h>#ifdef __AVR__#include <avr/power.h>#endif// Which pin on the Arduino is connected to the NeoPixels?// On a Trinket or Gemma we suggest changing this to 1#define PIN 6// How many NeoPixels are attached to the Arduino?#define NUMPIXELS 1// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest// example for more information on possible values.Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);int delayval = 500; // delay for half a secondint ledState = LOW;void setup() {// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket#if defined (__AVR_ATtiny85__)if (F_CPU == 16000000) clock_prescale_set(clock_div_1);#endif// End of trinket special codepixels.begin(); // This initializes the NeoPixel library.pixels.setPixelColor(0,pixels.Color(0,0,0));pixels.show();delay(500);pinMode(7, OUTPUT);}void loop() {// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.for(int i=0;i<100;i++){for(int j=0;j<100;j++){for(int k=0;k<10;k++){pixels.setPixelColor(0,pixels.Color(i,j,30));pixels.show();delay(1);}}for(int j=100;j>0;j--){for(int k=0;k<10;k++){pixels.setPixelColor(0,pixels.Color(i,j,30));pixels.show();delay(1);}}if (ledState == LOW) {ledState = HIGH;} else {ledState = LOW;}digitalWrite(7, ledState);}}