NeoPixel と紙で フルカラー LED イルミネーション オブジェを作ってみた

ESP8266 ( ESP-WROOM-02 )

5.NeoPixel の接続

では、ブレッドボード上にESPr Developer と NeoPixel をジャンパーワイヤーで接続していきます。
まず、下図を参照してください。

通信線は1本のみという、とてもシンプルです。
注意していただきたいのは、パソコンからのUSB接続は、USBハブはダメです。
必ずパソコンのUSBポートに直挿ししてください。
電流が足りなくなって、誤動作します。

先にも述べましたが、実は、NeoPixel の動作電圧は5Vなんですが、今回は3.3Vで動作させます。
本来の電圧ではないので、誤作動しても文句は言えませんのでご了承ください
ただ、今回、試しに3.3Vで動作させてみたら、一番スムースに動作しました。

このLEDチップはWS2812B らしいです。
データシートを見ると、電源電圧範囲は3.5~5.3Vで、Input電圧範囲は
-0.5~VDD+0.5
とあります。
若干電圧が足りませんが、動いたのでヨシとします。
当然明るさも5Vより暗くなりますが、3.3Vでも眩しいくらいだったので、このまま使ってみます。
もし、誤動作したら、5V-3.3Vロジック電圧変換を間にかましてください。
ただ、ロジックレベル変換を間にかませると、そのチップの最大速度が問題になってきて、逆にうまく動作しない場合があります。
私も実際にロジックレベル変換を使ってみたら、LEDのフェードイン、フェードアウトがカクカクになってしまって、うまくいきませんでした。
ここは皆さんの判断にお任せします。

次に、ブレッドボード上のジャンパーワイヤーはニッパ等で適当にカットして以下の様にします。

そうしたら、NeoPixelを下図の様に差し込んでください。
差し込む向きに十分注意してください。

ESPr Developer 3.3V — NeoPixel  PWR端子
ESPr Developer GND — NeoPixel  GND端子
ESPr Developer GPIO 5番 — NeoPixel  IN端子

Arduino UNOで接続する場合はこんな感じです。

写真ではこんな感じになります。

Arduino UNO の場合はこんな感じのミニブレッドボードで良いと思います。


ジャンパーワイヤーは固いものを使用して、写真のように机にベッタリ付くように折り曲げておくと良いと思います。

6.Arduino IDE の設定

Arduino IDE を設定します。
予めArduino IDE をインストールしておいてください。
IDE のバージョンは 1.6.13 で動作確認しております(Windows 10の場合)。

ESPr Developer ( ESP-WROOM-02, ESP8266 ) の場合はESP8266ボードをインストールしておく必要があります。
その方法は以下のページを参照してください。
Windows の場合で説明しています。

Arduino IDE に Staging(Stable)版ESP8266 ボードをインストールする方法

Arduino UNO の場合は下図の様に設定してあればOKです。

7.Adafruit ライブラリをインストール

スイッチサイエンスさんの以下のページに
フルカラーシリアルLEDを使うためのライブラリ」というリンクにAdafruit ライブラリがあります。

https://www.switch-science.com/catalog/1593/

GitHub のZIPファイルをダウンロードしていただき、Arduino IDE にインストールしてください。
ZIPファイルから直接インストールする方法は以下のページを参照してください。
(Windows の場合で説明しています)

GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

8.Arduino IDE にスケッチを入力

では、Arduino IDE に以下のサンプルスケッチを入力してみてください。

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

#include <Adafruit_NeoPixel.h>

#define PIN            5 //シリアル通信GPIOピン番号
#define MAXPIXELS      12 //LED素子の最大数

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(MAXPIXELS, PIN, NEO_GRB + NEO_KHZ800);

uint8_t LedNum1_Inc = 9; //最初にフェードインするLED番号
uint8_t LedNum1_Dec = 8; //フェードアウトするLED番号
uint8_t LedNum2_Inc = 5;
uint8_t LedNum2_Dec = 4;
uint8_t LedNum3_Inc = 1;
uint8_t LedNum3_Dec = 0;

uint8_t ChangeType = 0; //LED点灯パターンを決める引数
uint32_t ChangeTime; //LED点灯パターンを変える時間
int cnt = 0; //256段階でLEDをフェードさせるためのカウント

void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setBrightness(255); //Max 255
  ChangeTime = millis();
}

void loop() {
  if(millis() - ChangeTime > 15000){ //15 second Type Change
    ChangeType++;
    if(ChangeType == 4) ChangeType = 0;
    ChangeTime = millis();
  }
  
  switch(ChangeType){
    case 0: //RGB type
      pixels.setPixelColor(LedNum1_Inc, pixels.Color(cnt, 0, 0));
      pixels.show(); // This sends the updated pixel color to the hardware.
      pixels.setPixelColor(LedNum1_Dec, pixels.Color(255-cnt, 0, 0));
      pixels.show();
  
      pixels.setPixelColor(LedNum2_Inc, pixels.Color(0, cnt, 0));
      pixels.show();
      pixels.setPixelColor(LedNum2_Dec, pixels.Color(0, 255-cnt, 0));
      pixels.show();
  
      pixels.setPixelColor(LedNum3_Inc, pixels.Color(0, 0, cnt));
      pixels.show();
      pixels.setPixelColor(LedNum3_Dec, pixels.Color(0, 0, 255-cnt));
      pixels.show();
      break;
      
    case 1: //Blue type
      pixels.setPixelColor(LedNum1_Inc, pixels.Color(0, 0, cnt));
      pixels.show();
      pixels.setPixelColor(LedNum1_Dec, pixels.Color(0, 0, 255-cnt));
      pixels.show();
      break;
      
    case 2: //CMY type
      pixels.setPixelColor(LedNum1_Inc, pixels.Color(cnt, cnt, 0));
      pixels.show();
      pixels.setPixelColor(LedNum1_Dec, pixels.Color(255-cnt, 255-cnt, 0));
      pixels.show();
  
      pixels.setPixelColor(LedNum2_Inc, pixels.Color(0, cnt, cnt));
      pixels.show();
      pixels.setPixelColor(LedNum2_Dec, pixels.Color(0, 255-cnt, 255-cnt));
      pixels.show();
  
      pixels.setPixelColor(LedNum3_Inc, pixels.Color(cnt, 0, cnt));
      pixels.show();
      pixels.setPixelColor(LedNum3_Dec, pixels.Color(255-cnt, 0, 255-cnt));
      pixels.show();
      break;
      
    case 3: //Orange, Green type
      pixels.setPixelColor(LedNum1_Inc, pixels.Color(cnt, 10, 0));
      pixels.show();
      pixels.setPixelColor(LedNum1_Dec, pixels.Color(255-cnt, 10, 0));
      pixels.show();
      break;
  }
  cnt++;
  
  if(cnt == 256){ //フェードが最大、最少になったらLED素子を変える
    LedNum1_Inc++;
    if(LedNum1_Inc >= 12) LedNum1_Inc = 0;
    LedNum1_Dec++;
    if(LedNum1_Dec >= 12) LedNum1_Dec = 0;
    LedNum2_Inc++;
    if(LedNum2_Inc >= 12) LedNum2_Inc = 0;
    LedNum2_Dec++;
    if(LedNum2_Dec >= 12) LedNum2_Dec = 0;
    LedNum3_Inc++;
    if(LedNum3_Inc >= 12) LedNum3_Inc = 0;
    LedNum3_Dec++;
    if(LedNum3_Dec >= 12) LedNum3_Dec = 0;
    cnt = 0;
  }
}

【解説】

●1行目:
Adafuit社のNeoPixelを使うためのライブラリインクルードです。

●3行目:
ESPr Developer または Arduino UNO のGPIOピンの定義です。

●5行目:
今回のNeoPixel Ring のLED素子は12個です。

●6行目:
Adafruit ライブラリのスケッチの例をそのまま流用しました。

●8-13行:
LED素子を最初に光らせる番号を定義します。
_Inc はフェードイン(明るくなる)番号
_Dec はフェードアウト(暗くなる)番号

●19-23行:
このセットアップ内で、NeoPixelライブラリを初期化して、明るさを決めています。
明るさの範囲は 0-255 です。

●26-30行:
ここで、15秒毎にLED点灯パターン番号を変えています。

●32-80行:
LED点灯パターンをswitch文で4タイプに分けています。
34行目でLED素子の番号とカラーをセットして、pixels.show()で初めてLEDが点灯します。
色はRGB ( Red, Green, Blue )で混ぜて作ります。
メインloop内で 引数cnt がカウントアップされ、255 になったらゼロになります。
フェードアウトするLEDには 255-cnt として明るさが減少するようにしてます。

●83-97行:
cntカウントが256になったらゼロにして、LED素子の番号を変えます。
LEDが12になったらゼロにします。

コメント

  1. mgo-tec mgo-tec より:

    管理人の mgo-tec です。

    読者の juchang さんから写真投稿がありましたので、紹介させていただきます。
    3Dプリンターで半透明のSnowmanを作られたそうです。
    comment_led_obj01.jpg
    これは光の屈折や反射で面白い効果が出そうですね。
    ペーパーとは違った雰囲気のイルミネーションですね。
    私はしばらく3Dプリンターを使っていないので、こういうのは刺激になりますね。
    juchangさん、いつもいろいろ試していただき、ありがとうございます。
    m(_ _)m

タイトルとURLをコピーしました