thkana が 2022年05月03日09時15分48秒 に編集
初版
タイトルの変更
[Arduino] マルチタスクのまねごと(4:ふわふわ光る)
タグの変更
Arduino
LED
マルチタスク
記事種類の変更
セットアップや使用方法
Lチカの変更
ライセンスの変更
(CC BY 4+) Creative Commons Attribution CC BY version 4.0 or later
本文の変更
[前回:時間の測り方](https://elchika.com/article/94c942fd-e864-4ce1-8784-b5bc77d7a671/) # ふわふわ光る 単純な点滅ならもう怖くない、というところまで来たかなぁ、と思います。 ではもう一歩踏み込んでみましょう。ちょっと凝った点灯方法、ふわ~っと点灯、ふわ~っと消灯させてみましょうか。 ## まずは1個ふわふわ 最後には複数でふわふわしてもらいますが、まずは一個だけ、これは何も考えずシングルタスクで行ってみましょう。 ``` //Program 1.1 const int LED1 = 11; void setup() { pinMode(LED1, OUTPUT); } void loop() { for (int bright = 0; bright < 256; bright++) { analogWrite(LED1, bright); delay(4); // 4ms*256=約1秒かけてじわじわ点灯 } delay(500); for (int bright = 255; bright >= 0; bright--) { analogWrite(LED1, bright); delay(4); // 約1秒かけてじわじわ消灯 } delay(500); } ``` これでふわふわ光ります。では、これを2個のLEDで、別々の周期で光らせてみましょう。 今まで同じように100ミリ秒毎にloop()を回して...としようとしても、今回は ``` for (int bright = 0; bright < 256; bright++) { analogWrite(LED1, bright); delay(4); // 4ms*256=約1秒かけてじわじわ点灯 } ``` このループに入ってから抜けるまで約1秒かかってしまいます。そうするともう1個のLEDはその間なにもできない...なので、このループもバラバラに分解しなければいけません。 このループはどういう動作をしているか考えてみましょう。 最初、brightに0を設定して LEDにbrightの輝度を設定して 4ミリ秒待って brightを1増やして LEDにbrightの輝度を設定して 4ミリ秒待って brightを1増やして LEDにbrightの輝度を設定して 4ミリ秒待って これを256回繰り返して 最大輝度のまま 4ミリ秒待って 4ミリ秒待って これを500ミリ秒分だから125回繰り返して brightに255を設定して LEDにbrightの輝度を設定して 4ミリ秒待って brightを1減らして LEDにbrightの輝度を設定して 4ミリ秒待って これを256回繰り返して 輝度0のまま 4ミリ秒待って これを500ミリ秒分だから125回繰り返して ということになります。 待ち時間が共通で4ミリ秒、これまでのパターンに持ち込めそうです。 ``` // Program 1.2 const int LED1 = 11; void setup() { pinMode(LED1, OUTPUT); } int bright; int count; void loop() { if (count++ == 0) { bright = 0; } else if (count < 255) { bright++; } else if (count < 255 + 125) { bright = 255; } else if (count < 255 + 125 + 255) { bright--; } else if (count < 255 + 125 + 255 + 125) { bright = 0; } else { count = 0; } analogWrite(LED1, bright); delay(4); } ``` ## では2個に ここまでくれば、2個目のLEDの追加も今までと同じパターンですね。 ``` // Program 1.3 const int LED1 = 11; const int LED2 = 10; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); } int bright1, bright2; int count1, count2; void loop() { if (count1++ == 0) { bright1 = 0; } else if (count1 < 255) { bright1++; } else if (count1 < 255 + 125) { bright1 = 255; } else if (count1 < 255 + 125 + 255) { bright1--; } else if (count1 < 255 + 125 + 255 + 125) { bright1 = 0; } else { count1 = 0; } if (count2++ == 0) { bright2 = 0; } else if (count2 < 255) { bright2++; } else if (count2 < 255 + 200) { bright2 = 255; } else if (count2 < 255 + 200 + 255) { bright2--; } else if (count2 < 255 + 200 + 255 + 200) { bright2 = 0; } else { count2 = 0; } analogWrite(LED1, bright1); analogWrite(LED2, bright2); delay(4); } ``` ちょっとした応用だけでしたので、今回はこんな感じで...というか、そろそろネタ切れ連載?終わりかなぁ。 あとは、マルチタスクとは直接には関係のないテクニックをちょっと紹介してシメにしましょうか