thkanaのアイコン画像
thkana 2022年05月03日作成 © CC BY 4+
セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 1158
thkana 2022年05月03日作成 © CC BY 4+ セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 1158

[Arduino] マルチタスクのまねごと(4:ふわふわ光る)

前回:時間の測り方

ふわふわ光る

単純な点滅ならもう怖くない、というところまで来たかなぁ、と思います。
ではもう一歩踏み込んでみましょう。ちょっと凝った点灯方法、ふわ~っと点灯、ふわ~っと消灯させてみましょうか。

まずは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);
}

ちょっとした応用だけでしたので、今回はこんな感じで...というか、そろそろネタ切れ連載?終わりかなぁ。

あとは、マルチタスクとは直接には関係のないテクニックをちょっと紹介してシメにしましょうか

thkanaのアイコン画像
一応組み込みエンジニアのつもり... でも最近製品になるようなコード書いてないなぁ。
  • thkana さんが 2022/05/03 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する