質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

577閲覧

Arduino FastLED 3つのLEDを遅延させて発火させたい

ruizu

総合スコア35

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

2クリップ

投稿2023/02/07 12:35

編集2023/02/07 12:50

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 3つのLEDテープをそれぞれ遅延させて発火させたい。

前提

Arduino言語やマイコン系について素人です。
なるべくわかりやすく教えて頂けると嬉しいです。
全体的につたない文章で申し訳ありません_(..)
(FastLEDでなく、このライブラリを使った方がいいなどのアドバイスも嬉しいです。)

Arduino に WS2811を繋ぎLEDを制御しています。
FastLEDを利用して3つのテープを遅延させて発火させたいです。


任意のアクション(シリアル通信で何か受け取ったらなど)

  • LED1発火
  • delay(100)
  • LED2発火
  • delay(100)
  • LED3発火
  • delay(100)

のようなイメージです。

発生している問題・エラーメッセージ

一つのテープだけを光らせた場合、綺麗にすべてのLEDが光るのですが、以下のコードですと、3つのテープが飛び飛びで光る形になります。

一つのテープ三つのテープ
一つのテープ三つのテープ

おそらく(?) 3つの関数によって光らせる場所のLEDが書き換えられてしまって飛び飛びになっている?と考えているのですが、それが正しいのかと、どのように直せるのかがわからず困っています。これが、Arduino言語の仕様なのか?など自分なりにドキュメントや調査したのですが、わかりませんでした。

Q関数Aが2度呼び出された場合、中の変数は共有されているのでしょうか?

該当のソースコード

arduino

1CRGB leds[3][100]; 2 3void setup() { 4 delay(3000); 5 FastLED.addLeds<LED_TYPE, 5, COLOR_ORDER>(leds[0], 100).setCorrection(TypicalLEDStrip); 6 FastLED.addLeds<LED_TYPE, 6, COLOR_ORDER>(leds[1], 100).setCorrection(TypicalLEDStrip); 7 FastLED.addLeds<LED_TYPE, 7, COLOR_ORDER>(leds[2], 100).setCorrection(TypicalLEDStrip); 8 9 FastLED.setBrightness(96); 10} 11 12void loop() { 13 shower(led[0]); 14 delay(100); 15 shower(led[1]); 16 delay(100); 17 shower(led[2]); 18} 19 20 21// 発火させたいコード 22void shower(CRGB l[NUM_STRIPS]) { 23 fadeToBlackBy(l, NUM_LEDS, 50); 24 int pos = beatsin16(20, 0, NUM_LEDS); 25 static int prevpos = 0; 26 if (pos > prevpos) { 27 fill_solid(l + prevpos, (pos - prevpos) + 1, CHSV(gHue, 220, 255)); 28 } 29 prevpos = pos; 30 FastLED.show(); 31}

試したこと

このコードは1ループ単位でLEDを一つずつずらして、光らせる形です。
おそらく、LEDの個数分forで回す関数を作って光らせる形に変えればもっと簡単に出来ると思うのですが、for一回回る速度(?)より、loopの速度の方が早く光が滑らかに発光する為上記のshower的関数をなるべく利用したいです。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

深く確認はしていませんが

static int prevpos = 0;
とあるので、この変数はled[0]~[2]で共通になってしまっています。

投稿2023/02/08 00:46

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

今実験する気力がないので話だけですが、次のいずれかの手段ということになるのでは。

・LEDテープを3本つなげてしまう(一本目のDO-二本目のDI, 二本目のDO-三本目のDI)につないで全体を一本として制御する

・各テープを別個につなぎたいなら、それぞれのテープ毎にFastLEDのインスタンスを作成してそれぞれ操作する。
(昔作ったプログラムの抜粋改なので、いろいろ適当に合わせてください)

Arduino

1CFastLED tape1,tape2,tape3; 2void setup(){ 3tape1.addLeds<SK9822, LEDPIN, LEDPIN2, BGR>( leds, LEDNUM );// FastLEDライブラリの初期化 LEDの種類によって変更が必要な場合あり 4//tape2, tape3についても適宜 5}

みたいなことでなんとかなるのではないかと。

投稿2023/02/08 13:02

thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問