はじめに
前回はカラーLED PL9823を動かすための回路を調べました。今回はPL9823を動かして見ます。
目次
1. 回路
図1がPL9823の基本的な回路です。
図1 PL9823動作回路
電源ピンにはパスコンとして0.1[uF]のコンデンサ、データ入力ピンにはダンピング抵抗として33[Ω]の抵抗器を入れています。
あとはそれぞれのピンをArduinoと接続すれば動きます。
2. スケッチ
PL9823をArduinoで動かすにはGitHubに公開されているAdafruit NeoPixcel Libraryを使います。あとはサンプルスケッチをカラーLEDのRGBを指定すれば光らせることが出来ます。
とりあえずシリアル通信でRGBを設定できるスケッチを書きました。"R255"や"G064"、"B002"などとシリアル通信で送信すればRGBを設定できます。
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson // released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library #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_RGB + NEO_KHZ800); //NEO_GRBをNEO_RGBへ変更 char type, buf_val[4]="000"; int i, red, green, blue; //LED関連 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 code */ Serial.begin(9600); red = 0; green = 0; blue = 0; pixels.begin(); // This initializes the NeoPixel library. pixels.setPixelColor(0, pixels.Color(red, green, blue)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware. } void loop() { if (Serial.available() >= 4) { // if (Serial.available() >= 5) { //終端文字有りの場合 type = Serial.read(); for( i=0; i<3; i++ ){ buf_val[i] = Serial.read(); } // Serial.read(); //終端文字有りの場合 switch(type){ case 'R': red = atoi(buf_val); break; case 'G': green = atoi(buf_val); break; case 'B': blue = atoi(buf_val); break; default: Serial.println("Error"); break; } Serial.print("R:"); Serial.print(red); Serial.print(" G:"); Serial.print(green); Serial.print(" B:"); Serial.println(blue); pixels.setPixelColor(0, pixels.Color(red, green, blue)); pixels.show(); // This sends the updated pixel color to the hardware. } }
上記のスケッチでカラーLEDを光らせた写真を何枚か載せます。
図2 R:255 G:255 B:255
図3 R:255 G:0 B:0
図4 R:16 G:0 B:0
図5 R:16 G:16 B:0
このようにArduinoでPL9823の色や明るさを自由にいじることができました。
3. 活用
せっかくなのでカラーLEDを活用したインテリアっぽいものをつくりました(図6)。
図6 作成物外観
外装は3Dプリントの造形物に塗装などを行い、作成しました。中にはカラーLEDを4つ入れています(図7)。
図7 作成物中身
また、色をいちいち指定するのは面倒なので、電源を入れると勝手にフェード点灯/消灯を繰り返すようスケッチを書き換えました。
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson // released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library #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 4 // 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_RGB + NEO_KHZ800); //NEO_GRBをNEO_RGBへ変更 char type, buf_val[4]="000"; int i, led, red, green, blue; //LED関連 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 code */ Serial.begin(9600); red = 0; green = 0; blue = 0; pixels.begin(); // This initializes the NeoPixel library. for(led=0; led<NUMPIXELS; led++) pixels.setPixelColor(led, pixels.Color(0, 0, 0)); pixels.show(); // This sends the updated pixel color to the hardware. } void loop() { i=0; while(i<256){ Serial.println(i); red=i; green=i; blue=0; for(led=0; led<NUMPIXELS; led++) pixels.setPixelColor(led, pixels.Color(red, green, blue)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware. delay(100); if(i<16) i=i+1; else if(i<32) i=i+2; else if(i<64) i=i+4; else if(i<128) i=i+8; else i=i+16; } i=255; while(i>-1){ Serial.println(i); red=i; green=i; blue=0; for(led=0; led<NUMPIXELS; led++) pixels.setPixelColor(led, pixels.Color(red, green, blue)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware. delay(100); if(i<16) i=i-1; else if(i<32) i=i-2; else if(i<64) i=i-4; else if(i<128) i=i-8; else i=i-16; } i=0; while(i<256){ Serial.println(i); red=i; green=0; blue=i; for(led=0; led<NUMPIXELS; led++) pixels.setPixelColor(led, pixels.Color(red, green, blue)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware. delay(100); if(i<16) i=i+1; else if(i<32) i=i+2; else if(i<64) i=i+4; else if(i<128) i=i+8; else i=i+16; } i=255; while(i>-1){ Serial.println(i); red=i; green=0; blue=i; for(led=0; led<NUMPIXELS; led++) pixels.setPixelColor(led, pixels.Color(red, green, blue)); // Moderately bright green color. pixels.show(); // This sends the updated pixel color to the hardware. delay(100); if(i<16) i=i-1; else if(i<32) i=i-2; else if(i<64) i=i-4; else if(i<128) i=i-8; else i=i-16; } }
実際に動かしたものがこちらです。
まとめ
カラーLED PL9823をArduinoで制御でき、また3Dプリントと組み合わせることでインテリアっぽい物が作れました。
これでカラーLEDのシリーズは終わりです。また何かネタが出来るまでブログの更新はお休みします。
はじめての「123D Design」 [ nekosan ] 価格:2,700円 |