2016年07月02日

フルカラーLED -第3回:カラーLEDの制御

はじめに

前回はカラーLED PL9823を動かすための回路を調べました。今回はPL9823を動かして見ます。
 

目次

 

1. 回路

図1がPL9823の基本的な回路です。
 
July01_回路図.png
図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を光らせた写真を何枚か載せます。
 
P2280454.jpg
図2 R:255 G:255 B:255
 
P2280456.jpg
図3 R:255 G:0 B:0
 
P2280457.jpg
図4 R:16 G:0 B:0
 
P2280461.jpg
図5 R:16 G:16 B:0
 
このようにArduinoでPL9823の色や明るさを自由にいじることができました。
 

3. 活用

せっかくなのでカラーLEDを活用したインテリアっぽいものをつくりました(図6)。
 
P2280467.jpg
図6 作成物外観
 
外装は3Dプリントの造形物に塗装などを行い、作成しました。中にはカラーLEDを4つ入れています(図7)。
 
P2280463.jpg
図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円
(2016/7/2 11:49時点)
感想(3件)

タグ:Led Arduino
posted by ました at 11:56| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする