“光る”という行為はそれだけでテンションがブチ上がる最高の行為です。
古来よりこの国では全身が七色に光り輝くエフェクトが無敵の象徴とされているのは周知の事実ですが、そういった無敵の力を欲する制作者から、きぐイベ会場をフロア熱狂の渦に叩き込まんとするパリピまで、幅広い光りものニーズにお応えしようというのが本項の趣旨です。
ちなみにこちらは8-3-2の動作見本です。
LEDは様々な形状・発光色・明るさ・消費電力の商品が存在します。
一番スタンダードなのはこれまでのレッスンで散々使い倒してきた砲弾型のLED球ですが、こちらはなにかと広い面積の発光を求められがちなきぐるみギミック用途としては使いどころが難しいです。
広い面積や多色表現、複雑な発光パターンが要求されるシーンでは、アドレッサブルLEDを使った電子部品が用いられることが多いです。
電子工作用のLED製品でおそらく最もよく使われているであろうアドレッサブルLEDが、WS2812Bです。
WS2812B 1粒を拡大した写真
WS2812Bはこれ一粒一粒に極小のマイコンが内蔵されており、5V/GND/信号線のたった3本の配線をArduinoに繋いで命令を送ることで、一粒ずつ個別に動作を制御することができます。表現色はフルカラーです。
このWS2812Bを使用した製品の一例をご紹介します。
特に決まった呼び名はないみたいですが、WS2812Bをリング状に配置した商品は、LEDリングとかリングLEDなどと呼ばれている…ような気がします。
画像のLEDリングは講師がAmazonで買ったものです。中国製です。
大きさの異なる複数のリングが同心円状に繋がった状態で製造されていますが、各リングは電気的には繋がっていません
(一つ一つ切り離して個別に使います)
商品によってWS2812Bの密度や基板の大きさが異なります。
LEDテープできれいな円形を作るのはめんどいので、そんな時役立ちます。
画像引用元:https://amzn.asia/d/f6IiyV9
WS2812Bをタイル状に等間隔に敷き詰めたパネルです。
面で発光します。マトリクスLEDのように、電光掲示板っぽい使い方をしている作例が多い印象です。
LEDリングもそうなのですが、すべてのLEDは一筆書きで繋がっているため、基本的に好きな形に切り抜いたりすることはできません。
こちらは講師はまだ買ったことがない商品です。
WS2812Bを一本の薄いテープ状の基板に、連続して等間隔に並べたものです。
きぐるみの発光ギミックではよく使われている印象があります。
LEDテープにはカット可能なセクションがあり、その箇所単位であれば好きな長さにカットすることができます。
また、カットしたLEDテープ同士にワイヤをはんだ付けして繋ぐこともできます。
LEDテープも商品によってWS2812Bの密度が異なります。また防水仕様の商品もあります。
電子工作でLED製品を使いたい場合、下記の4つの事項は考えておいた方がいいかなと思います。
LED製品(特にLEDテープ)には、おそらく電子工作用を想定した5Vのものと、車載用であろう12Vのものがあります。
12Vを電子工作で使うことも不可能ではありませんが、12Vの電源を用意するか12V未満の電源を昇圧する必要があります。
大変めんどくさいので特段の理由がない限りは5V駆動の製品の使用を推奨します。
またAmazonなんかで商品を探していると、家庭用コンセント(100V)の使用を前提とした商品が検索結果やサジェストに紛れて出ることがあります。
LEDは電力消費が非常に激しいので、ある程度デカいものは全部家庭用と思った方がいいです。
大きめのLED商品をお探しの方はご注意ください。
LED製品にはマイコン制御可能なものとそうでないものがあります。
マイコンでコントロールしたければ、マイコン制御可能なものを選びましょう。
Amazonで探す場合は検索ワードに「Arduino」を併記するとざっくりは絞れますが、適当なことを書く中華業者は山のようにいるので、検索結果を信用せずしっかり商品説明を読みましょう。
あとは商品レビューを見て、実際にArduinoで動かしている動画などがあれば、少なくともマイコンで動かせるかどうかについてはかなりの信ぴょう性があるのではないかと思います。
チップで言えば、WS2812BとSK6812なら大丈夫だと思います
LED商品をマイコンで使いたい場合、何らかの加工が必要と思った方がベターです。
自前で電線を用意し、リング裏面のはんだ付け箇所に電線をはんだ付けする必要があります。
Amazonの商品画像を見ると、SMコネクタがついた線がはんだ付けされているものが多いですが、買ったことがないので実際は不明
講師が買った製品は全て、配線の始端終端にSMコネクタ付きの線がはんだ付けされていました。
SMコネクタはブレッドボードやArduinoには挿せませんが、SMコネクタのピン部にジャンパ線のソケット、或いはSMのソケットにジャンパ線のピンを挿すことは不可能ではないです。
テストだけならこれでもOKですが、きぐるみに実装する際は変換ケーブルを入手or自作する等した方がベターだと思います。
LEDは電力消費が非常に激しい電子部品です。
「キャラの全身光らせてェ~」という勢いだけで手を出すと、後からつまずくこと請け合いです。
導入前に下記事項を検討するのをおすすめします。
LEDテープはサーボモータと同じか、それ以上に電力消費が激しい電子パーツです。
当然ながら、Arduinoに長いLEDテープの電源線を直接接続するのは絶対に避けてください。
今回はLEDテープの電力供給用に、電源モジュールを使います。
USBCpowはピン対基板のはんだ付けが必須となります。
はんだ付け箇所が少なく難易度が低めで且つモジュールのお値段も安いので、練習と思ってぜひチャレンジしてみてください。
こちらのモジュールのはんだ付けのコツとしては、まずブレッドボードに基板の穴に合わせピンを挿しておき、ピンの頭を基板の穴に挿し込む形で基板を載せ、その状態ではんだ付けすると安定してやりやすいと思います。
USB挿し口の左右にあるピンだけちょっと大変かもですが、このピンはブレッドボードの上に安定して鎮座してもらうためのピンで、特に電気的な意味はないので、難しければはんだ付けしなくても大丈夫です。
LEDテープを使うにあたって、絶対に失敗できないのが電力計算です。
講師が実際に使ったLEDテープで電力計算の例を掲載します。
こちらが今回使用したLEDテープです。
何年も前にAmazonで買った中華製テープです。LEDの制御チップはもちろんWS2812Bです。
このLEDテープの説明書きを見てみます。
この説明書きの中で、今回特に着目すべき点は3つです。
これらの数値をもとに計算をしていきます。
まずはLEDチップ1球あたりの電流値を計算します。消費電力を求める計算式は
W(消費電力)= V(電圧)× A(電流) なので、
A(電流)= W(消費電力)÷ V(電圧) の式で電流値を計算します。
この式に講師のLEDテープのカタログ値を当てはめていきます。
28.8(W) / 144(球) / 5(V) = 0.04A(=40mA)
とまあこんな感じで、LED1球につき40mA消費することがわかりました。
あとはこれを任意の球数で掛け算すればテープ全体の電流値が出ます。
例えば100球光らせようと思うと 40mA*100=4000mA(=4A) となります。
USBCpowの最大出力は3Aなのでもっと短くする必要があります。絶対にだ。
ちなみに計算上は3Aなら75球、1Aなら25球灯せることになりますが、電力については一般的に定格のギリギリ限界を攻めるスタイルは非常によくないです。
電子部品の定格に対し、多少余裕を持たせた数値の電気を流すよう設計するのが望ましいです。
LEDテープ等のライブラリですが、下の2つが圧倒的二大巨頭なのでこのどちらかを選べば堅いです。
なお今回のサンプルコードではFastLEDを使います。こちらは必ずインストールしておいてください。
ここで本項最大の落とし穴ポイントです。
なんとこの2つのライブラリ、2024年3月現在どちらもArduinoUnoR4シリーズに正式には対応していない模様です。
なので、FastLEDライブラリはR4で使おうとするとコンパイルエラーが出ますし、NeoPixelの方はもっとタチが悪く、コンパイルエラーなしで書き込まれますが正常に動作しません。
【追記(2024/6/20)】
講師が本wikiをチンタラ編集している間にFastLEDはR4に対応したみたいです。時の流れは無常で無情。
本項の元の原稿ではR4使いはArduino nano everyを購入して使っていただく予定だったのですが、FastLEDが対応してくれたおかげでその必要はなくなりました。よかったですね。
そしてwikiリリース直前の土壇場で講師の編集作業が増えました。よかったですね。
ちなみにAdafruit NeoPixelの方は本日時点ではまだ未対応のようです。
なぜこんなことになってしまったのかがわかる(?)解説ページ:7-3 Arduino Uno R4とR3の違い
いきなりですが、大注意です。
今回の作例ではブレッドボードは使わないでください。
理由は、ブレッドボードで流せる電流は約1Aくらいまで であるためです。
もちろんLEDテープが短ければ(=流れる電流が1Aに及ばないのであれば)使えないこともないですが、どんな長さでトライしても対応できるように、今回はブレッドボードは不使用とします。
(このページ冒頭の動画ではブレボ使ってるって? 記憶をうしなえーーーーーーい!!!!!)
そんなわけで、今回はちょっと変則的な繋ぎ方をします。
USBCPowに2つある5Vピンのうち、片方はArduinoのVINに繋ぎます。
5Vではありません。必ずVINに繋いでください。
VINはArduinoから電気を流すピンではなく、Arduinoに給電をするピンです。
つまり、今回ArduinoはUSB-Cからではなく、VINピンから電気の供給を受けます。
そしてUSBCPowのGNDはArduinoのGNDに繋ぎます。
LEDテープは事前に電力計算をして、必要な量だけハサミで切って使ってください。
LEDテープはArduinoに接続する方向が決まっています。
テープの向きはだいたいテープ上に矢印が書いてありますが、Arduinoに繋ぐ箇所が矢印の根元側です。
(Arduinoから矢印に沿ってテープに電気信号が流れ込んでくるイメージ)
もしくはDIN/DOという文字表示がある場合は、DINとArduinoを繋ぎます。
LEDテープの5VはUSBCPowの5Vに繋ぎ、GNDはArduinoのGNDに繋ぎます。
大変便利なことに、ArduinoにはGNDの挿し口が3つもありますので、USBCPowが繋がっているGNDとは別の挿し口を使ってください。
USBCPowにはモバイルバッテリー(推奨)やPCなどから給電してください。
モバブ・PC共通ですが、LEDテープに流したい電流量を出力できる電源をご利用ください。
例えば2.8A流したいのに、2.1Aが最大出力のモバブでは電流量が不足します。
PCから給電する場合は、特にハブを使うと電気が十分供給されない場合があります。
また電子工作でモバイルバッテリーを使う場合は、オートパワーオフ機能の有無や影響を考慮してください。
(オートパワーオフ=モバブが出力する電気がごくわずかな時、自動的に出力をストップする機能)
テープLEDは消費電力が激しいので、この機能は働かない可能性が高いですが、同じ要領で例えばArduinoにモバブから給電しようとすると、勝手に電源OFFになってしまう可能性があります。
ちなみにマイコン用モバブはオートパワーオフしないcheeroのcanvasかslimが個人的にオススメです。
部品 | 個数 |
---|---|
LEDテープ | 1本 |
USBCPow | 1個 |
サンプルコード8-3-1_FastLED_colortest.inoを開いてください。
/// @file Blink.ino /// @brief Blink the first LED of an LED strip /// @example Blink.ino #include <FastLED.h> // How many leds in your strip? #define NUM_LEDS 5 //あなたが使うLEDテープに載ってるLED球の数に打ちかえてね!!!! // For led chips like WS2812, which have a data line, ground, and power, you just // need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock, // ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN // Clock pin only needed for SPI based chipsets when not using hardware SPI #define DATA_PIN 6 //LEDテープの通信線が差してあるArduinoのピン番号を入れてね!!!! //#define CLOCK_PIN 13 // Define the array of leds CRGB leds[NUM_LEDS]; void setup() { //あなたが使うLEDテープに載っているチップの名前が含まれている行だけを有効にしてね!! // Uncomment/edit one of the following lines for your leds arrangement. // ## Clockless types ## //FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // GRB ordering is assumed // FastLED.addLeds<SM16703, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1829, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1812, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1904, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS2903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2852, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<GS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA106, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<PL9823, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2813, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GE8822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886_8BIT, DATA_PIN, RGB>(leds, NUM_LEDS); // ## Clocked (SPI) types ## // FastLED.addLeds<LPD6803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical } void loop() { // Turn the LED on, then pause leds[0] = CRGB::Red; FastLED.show(); delay(500); // Now turn the LED off, then pause leds[0] = CRGB::Black; FastLED.show(); delay(500); }
このコードはサンプルスケッチの「Blink」と同じものです。
ド派手に光らせる前に色表示のチェックをします。
サンプルコードの下記の欄を書き換えてください。
#define NUM_LEDS 25 //あなたが使うLEDテープに載ってるLED球の数に打ちかえてね!!
あなたがArduinoに接続したLEDテープ上にあるLED球の個数を入力してください。
30球あるテープであれば30です。
#define DATA_PIN 6 //LEDテープの通信線が差してあるArduinoのピン番号を入れてね!
配線図ではD6なので6を入れてますが、もし他のピンを使っていたら書き換えます
//あなたが使うLEDテープに載っているチップの名前が含まれている行だけを有効にしてね!! // Uncomment/edit one of the following lines for your leds arrangement. // ## Clockless types ## //FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // GRB ordering is assumed // FastLED.addLeds<SM16703, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1829, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1812, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS1904, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<UCS2903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2852, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<GS1903, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6812, DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA106, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<PL9823, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SK6822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2813, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<APA104, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GE8822, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886, DATA_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<LPD1886_8BIT, DATA_PIN, RGB>(leds, NUM_LEDS); // ## Clocked (SPI) types ## // FastLED.addLeds<LPD6803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<WS2803, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical // FastLED.addLeds<SK9822, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS); // BGR ordering is typical
たくさん行がありますが、この中から“あなたが使うLEDテープに載っているドライバの名前が含まれている行”だけを有効にします。
もし今回推奨のWS2812Bを搭載したLEDテープであれば、38行目の
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical
だけが有効になっていればOKです。
元のスケッチ「Blink」では、第三引数はRGB>(leds, NUM_LEDS)となっていました。
しかしコメントにGRB ordering is typical とあるように、WS2812Bはこの状態では赤(R)と緑(G)の色指定が逆になってしまいます。
なので、RGBをGRBに修正しています。
この3つの設定が完了したらスケッチをArduinoに書き込んでみます。LEDが赤色に光れば成功です。
もしLEDが緑色に光った場合は、あなたのLEDテープのチップはWS2812Bではない可能性があります。
もう一度調べ直してみて、もし違うチップを搭載していれば、21~63行目の行設定を変更してください。
本当にWS2812Bであれば、対症療法として38行目のGRBをRGBに修正してリトライしてください。
色テストが完了したので、いよいよド派手に光らせてみましょう。
Arduinoの配線はそのままでOKです。
サンプルコード8-3-2_FastLED_demo.inoを開いてください。
/// @file DemoReel100.ino /// @brief FastLED "100 lines of code" demo reel, showing off some effects /// @example DemoReel100.ino #include <FastLED.h> FASTLED_USING_NAMESPACE // FastLED "100-lines-of-code" demo reel, showing just a few // of the kinds of animation patterns you can quickly and easily // compose using FastLED. // // This example also shows one easy way to define multiple // animations patterns and have them automatically rotate. // // -Mark Kriegsman, December 2014 #define DATA_PIN 6 //LEDテープの通信線を挿したArduinoのピン番号を入れてね!!! //#define CLK_PIN 4 //4線型LEDテープを使う場合この文を有効にしてCLKのピンを打ち込む #define LED_TYPE WS2812B //WS2812B以外のチップが載ったLEDテープならそれに打ちかえる #define COLOR_ORDER GRB //WS2812Bなら一般的にはGRBでOK! #define NUM_LEDS 25 //あなたのLEDテープに載ってるLED球の数に打ちかえてね!! CRGB leds[NUM_LEDS]; #define BRIGHTNESS 96 //LEDの輝度設定。明るすぎる場合は数値を落とすといいよ #define FRAMES_PER_SECOND 120 void setup() { delay(3000); // 3 second delay for recovery // tell FastLED about the LED strip configuration FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // set master brightness control FastLED.setBrightness(BRIGHTNESS); } // List of patterns to cycle through. Each is defined as a separate function below. typedef void (*SimplePatternList[])(); SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm }; uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current uint8_t gHue = 0; // rotating "base color" used by many of the patterns void loop() { // Call the current pattern function once, updating the 'leds' array gPatterns[gCurrentPatternNumber](); // send the 'leds' array out to the actual LED strip FastLED.show(); // insert a delay to keep the framerate modest FastLED.delay(1000/FRAMES_PER_SECOND); // do some periodic updates EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically } #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) void nextPattern() { // add one to the current pattern number, and wrap around at the end gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns); } void rainbow() { // FastLED's built-in rainbow generator fill_rainbow( leds, NUM_LEDS, gHue, 7); } void rainbowWithGlitter() { // built-in FastLED rainbow, plus some random sparkly glitter rainbow(); addGlitter(80); } void addGlitter( fract8 chanceOfGlitter) { if( random8() < chanceOfGlitter) { leds[ random16(NUM_LEDS) ] += CRGB::White; } } void confetti() { // random colored speckles that blink in and fade smoothly fadeToBlackBy( leds, NUM_LEDS, 10); int pos = random16(NUM_LEDS); leds[pos] += CHSV( gHue + random8(64), 200, 255); } void sinelon() { // a colored dot sweeping back and forth, with fading trails fadeToBlackBy( leds, NUM_LEDS, 20); int pos = beatsin16( 13, 0, NUM_LEDS-1 ); leds[pos] += CHSV( gHue, 255, 192); } void bpm() { // colored stripes pulsing at a defined Beats-Per-Minute (BPM) uint8_t BeatsPerMinute = 62; CRGBPalette16 palette = PartyColors_p; uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); for( int i = 0; i < NUM_LEDS; i++) { //9948 leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); } } void juggle() { // eight colored dots, weaving in and out of sync with each other fadeToBlackBy( leds, NUM_LEDS, 20); uint8_t dothue = 0; for( int i = 0; i < 8; i++) { leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255); dothue += 32; } }
このコードはサンプルスケッチの「DemoReel100」と同じものです。
19~27行目は各種設定にまつわる行です。8-3-1と基本的に同じですが、項目が増えています。
これは、8-3-1でいう38行目、すなわち
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical
の一文で、ベタ打ちしている引数部分をすべて変数化したためです。
ちなみにこの文は8-3-2では下記のようになっています。
FastLED.addLeds<LED_TYPE, DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
このでもコードでは、数パターンの光り方を次々に実行します。
光り方のパターンは関数として記述されていて、それを順番に呼び出すようになっています。
もちろん自分でコードを書いてオリジナルの光り方を作ることもできます。
最初は付属のサンプルコードやネットの有志が書いたコードを眺めたり、ちょっとずつ値を変えたりしながら、どういう処理でどんな光らせ方が実現できるのかを研究してみるといいんじゃないかと思います。