気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ArduinoでNeoPixel WS2812B LEDテープライト制御

ホーム前へ次へ
Arduinoって?

ArduinoでNeoPixel WS2812B LEDテープライト制御

ArduinoでNeoPixel WS2812B LEDテープライト制御

WS2812B LEDテープライト 5m Aliexpress/HEGUOGUO Official Store
2020/08/02

 ArduinoでフルカラーLEDテープライトNeoPixelを制御してみるページ。

 試すだけなら、むしろ、Arduino/WS2812B LEDテープライト動作確認の方がわかりやすいかもしれません。

NeoPixelとは

 NeoPixelは、Adafruitの製品・登録商標であり、個々のLEDの点灯・消灯、色(フルカラー)を制御可能なLEDテープライトやLEDマトリックスです。

 これは、LEDテープ上の個々のSMD(表面実装用) LEDチップにLEDと一緒にICチップが埋め込まれていることで実現されています。

同様の製品も流通?

 自身はAliexpressで買いましたが、NeoPixelに限らず、同様の製品がいろいろなところから販売されている?ようです。

WS281xシリーズ

 例えば、SMD LEDが5050の場合、50mm四方のワンチップ内にLED3灯が埋め込まれていますが、これに加え、更に制御用ICが埋め込まれたものにWS2811/WS2812、WS2812BといったWS281xシリーズがあります。

 末尾にBがつかないのは、より多く流通している一般的な入力電圧12Vのもの、Bがついたものは、入力電圧5Vです。

 5V版のArduinoボードなどを使っている場合は、LED1球最大50mAという噂もあり、電流値には要注意も昇圧する必要がない入力電圧5VのWS2812Bの方が扱いやすく、ここでもこれを制御します。

 WS2811の後継がWS2812なわけですが、ひっくるめて、このWS281xシリーズは、デイジーチェーン(バケツリレー)方式で信号入力側からLED1個ずつを通して数珠つなぎに指示が伝達されていく仕組みなので1本(1続き)のLED制御に使う入力信号線(Arduinoなどのピン)は1本で済み、何かと簡便な一方、途中1個でもLEDが破損するとその先の制御ができなくなるという欠点もあります。

WS282x/SK682xシリーズ

 これを解決したものにWS282xシリーズや派生したSK682xシリーズなどがあるようですが、WS281xシリーズほどには、特に格安品としての流通量は、未だ多くはないようです。

防塵・防水対応

 LEDテープライトやLEDマトリックスは、電光掲示板やイベントの装飾、車のドレスアップ等々に使われることもあり、用途によっては、防塵対策や防水対策を求められることがあります。

 詳細は防水・防塵の等級『IPX』とは?に譲りますが、これらの性能には、世界標準としての等級があり、防水においては、例えば、.../IP65/IP67/IP68などがあり、数値1桁目の[6]が防塵等級の最高等級で完全防塵、2桁めが防水等級でIP65から順に大雑把に言うと、ちょっとやそっとの水がかかっても大丈夫なレベル、ちょっとくらいなら水に浸けたって大丈夫なレベル、どっぷり水に浸けて水中で使うこと前提にしちゃっても大丈夫なレベルなどとなっています。

 LEDテープの場合、IP67は、シリコンチューブで覆われていますが、シリコンチューブに単に緩く通してあるイメージで割とブカブカなので比較的簡単に引き抜くこともできますし、市販のサイズの合う専用シリコンチューブを購入して同梱の紐を使って裸のLEDテープを通すこともできます。

 尤もメリットの方が大きいなら、防水性能があればよいわけで、透明な他の用途のシリコンチューブでも、例えば、柔軟性は劣るにしても透明ホースとか、別の素材でも、場合よっては半透明でも良いのですが。

 実物を見たことがないのでなんですが、たぶんIP68も覆っているのはシリコンチューブだと思われ、これについては、LEDテープの隅々までシリコンチューブが密着して密閉されているようなので特殊な方法を使わないと後から入れ、そのような状態にすることも、無理やり引き剥がそうにも封入済みのLEDテープを後から抜くことは容易ではないものと思われます。

 ちなみに、ここでは、購入目的である屋外で屋根のない花壇に鳥よけ装置として設置することからIP67防水を使っています。

回路

ArduinoでNeoPixel WS2812B LEDテープライト制御 by Fritzing

 必要となるのは、Arduinoボード(今回はNano)、USBケーブル(今回はUSB A-miniUSB)、WS2812B LEDテープライト 5V、ブレッドボード、電池ボックスを各1個、ジャンパワイヤ適量と電池4本(ここでは充電池エネループ)。

 テープライトなのかマトリックスなのか、長さや大きさで値段も異なる、電池もいろいろあるのでこれらを別とすれば、Amazon、Amazonマーケットプレイス、100円ショップ価格でも500〜600円前後かと。

 今回は、WS2812B LEDテープライト 5mを調達、適宜切断して短くしても良いですが、ソフトウェア的に使うLED数を指定できるので5mそのままでも構いません。

 並び順には注意が必要ですが、WS2812B LEDテープライトの入力は、VCC/Din/GND、反対側は、VCC/Dout/GNDとなっており、Dinから入ってDoutを通して次のDinにデータが流れていくようになっているのでVCC/GNDはもちろん、Din側にArduinoのLED制御用ピンをつなぐことになります。

 WS2812Bは、入力電圧5Vなので5V版Arduinoなら昇圧する必要もなく、LEDがいくつであってもLEDテープライト1本の入力は、1本で良く、配線としては、VCC/GNDとDinの3本のみ、Arduinoボードの5V/GNDと任意のデジタルポート1つを接続するだけで済むため手軽に使えます。

 が、5050は特にLEDチップ1つに実際には、LEDが3つ搭載されており、大きな電流が流れるので要注意です。

 Arduinoの出力は、最大40mAと言われていますが、IC制御付きLEDチップ1つで50mAなどとも言われているからです。

 幸い、後述のFastLEDライブラリでは、LEDの個数を指定することができますし、setup()内でFastLED.setBrightness()を使うことで明るさを0から255の範囲で指定することができ、これにより電流を絞ることができます。

 よって何も対策をしない場合、点灯させるLEDチップが1個の場合でも、おそらく最大で半分(127)以下で使うのが安全かと思います。

 ちなみに他にセンサーも搭載している自作鳥よけ装置の場合、ランダムな点滅の中でLEDを同時に2つ点灯させること、IP67防水でシリコンチューブに覆われた放熱対策もしていない個別IC付きLEDテープライト、植物の茂みの中とは言え、真夏の炎天下も考慮すると極力熱源となり得るものの出力は抑えた方が良さそうということもあって、安全の上に安全を見て、目的の回路上もこれを8(区切り的には7か...)に設定して実運用しています。

パスコン・抵抗

 尚、WS2811では、電源供給安定化のため、VCC-GND間にバイパスコンデンサ(パスコン)を要したようですが、WS2812/WS2812Bからは、パスコンが内蔵されたのでその必要はないとのこと。

 時にLEDの許容電流以下で安全に制御すべく、Arduinoの出力ピンとLEDテープライトのDinの間に電流制限抵抗を入れているケースも見受けられますが、Arduinoよりも多くの電流が流れる5050チップに関しては、意味がないように思うのですが、どうなんでしょう?(あ、というか、そもそもLEDテープには、LEDチップごとに抵抗が入っているんですよね?)

 一方で仮に逆流があるのなら、むしろ、逆流防止にダイオードを入れた方がいいのかもと思ってみたりしなくもありませんが、LEDから逆流って聞いたことがないのでLEDテープと言えど要らないかなと...。

 というわけで、あまり、自信もありませんが、ここでは、ソフトウェア的に同時に点灯させるLEDチップ数と明るさを抑えるに留め、Arduinoの出力ピンとWS2812B 5Vの入力Dinは直結しています。

スケッチ

 NeoPixel操作で有名なライブラリは、本家Adafruitのadafruit Adafruit_NeoPixelFastLED / FastLEDがあるので好みに合わせて利用させて頂くと良いでしょう(ちなみに自身は、後者を使わせていただきました)。

 例えば、FastLEDのサンプルスケッチBlink自体、また、それを加工するのが最もわかりやすく簡単にNeoPixelらしさを味わうことができるでしょう。

 前述の通り、多くの電流が流れるICチップ付きで3LED搭載の5050 SMD(表面実装) LEDに至っては、尚更、FastLEDライブラリを使う場合、#define NUM_LEDSでLED数を実状に合わせて制限しつつ、setup()内でFastLED.setBrightness()に設定可能な値0-255の内、LED1個でも半分(127)以下にした方が、同様に同時に2個点灯なら63以下などとした方が安全でしょう。

余談

 自作鳥よけ装置においては、もちろん、IP67防水のLEDテープライト自体、また、これを実運用する筐体に接続するにあたっては、相応に処理をしましたが、それについてはリンク先にあります。

 NeoPixelの存在自体は、もう少し前から知っていましたが、主に照明目的でいろいろ使った35x28mm角 1 SMD LEDチップ内蔵のLED 3528 600球 単色テープライト 5mはともかく、50x50mm角 3 SMD LEDチップ内蔵のLED 5050 150球 RGBテープライト 5mを実用品として何に使うか持て余している自身は、自作鳥よけ装置を玄関やバルコニーより開放的な花壇に設置することになったことで、ようやく、使ってみようと思うに至りました。

 RGBタイプなら、青色LEDを点灯させることはできるものの、それは、テープ全体の点灯や点滅であって、LEDチップ個別の制御はできないので最も重要なランダムな点滅ができず、鳥よけ装置には不向きでした。

 RGB LEDテープ、何に使おうかな...。

備考

[2020/08/04]

 この回路の鳥よけ装置は、稼働時間帯は、4〜19時ほど、満充電のエネループ4本で3日程度しかもちませんでした...。

 ライブラリに節電モードとかありそうと探してみるとPower management functions / FastLED 3.1がありました。

 使用電圧と最大の電流値を設定できるらしき、void set_max_power_in_volts_and_milliamps (uint8_t volts, uint32_t milliamps)が使えそう、前述のFastLED.setBrightness()を後置して併用すると良さげです。

 併用したほうが、むしろ併用前提な気もしますが、スケッチのsetup()内に極小電流になると思われるset_max_power_in_volts_and_milliamps(5, 1)、FastLED.setBrightness(1)として電池のもちを検証してみます。

[2020/08/12]

 なぜか、あまり変わらず...でした。

ホーム前へ次へ