Arduino基礎01 -Blink-

今回はArduinoのスケッチを具体的に読み解いていこうと思います。

Blinkのスケッチを開きます。z

グレーの部分はコメントアウト(実行されるプログラムではなくメモ部分)です。自分の備忘録としても、スケッチをシェアするときにも、どこのコードがどういう役割となっているのかが明確になるので、逐一メモを書くことをおすすめします。

コメントを日本語にしてみました。大体こんなことが書いてあります。

int led = 13;            //「led」という変数を定義し、「13」という値を格納します。
void setup() {           //セットアップ関数を定義します。これは電源が入ってから1回だけ実行されます。
pinMode(led, OUTPUT);    //「led」(13番ピン)を「出力」に設定します
}                        //セットアップを終了します

void loop() {            //ループ関数を設定します。この中のプログラムは延々と実行され続けます。
digitalWrite(led, HIGH); //「led」の出力を「HIGH」に設定します。
delay(1000);             //1000ミリ秒(1秒)待機します
digitalWrite(led, LOW);  //「led」の出力を「LOW」に設定します。
delay(1000);             //1000ミリ秒待機します
}                        //ループのプログラムはここまでです。

setup()関数でピンの設定をし、loop()関数でピンの出力の制御をしてます。”Blink”の例では1秒毎に点灯、消灯を繰り返す処理をしています。

点灯時間を書き換えればモールス信号みたいな点滅を作る事もできます。
ここからあなたの好きなモールス信号をプログラムしてみてください。「SOS」のシグナル[・・・ーーー・・・]を出す場合はどんなプログラムになるでしょうか?

int led = 13;
void setup() {
pinMode(led, OUTPUT);

}
void loop() {
//[S]
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
//[O]
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
//[S]
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
}

このように書くと実際は点滅が延々と繰り返され、SOSSOSSOSSOSSOSS….というシグナルになってしまいます。これはloop()関数が実行され続けるためです。
setupでは1回しかプログラムが実行されませんので、loop()ではなくsetup()の部分にプログラムを書くと電源を入れて1度だけSOSのシグナルが実行されます。

int led = 13;
void setup() {
pinMode(led, OUTPUT);
//[S]
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
//[O]
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(100);
//[S]
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(100);
}
void loop() {
}

これで完成です。これで雪山で遭難した時でも安心です!
このままでも”機能”という面では全く問題ありませんが、同じようなことが何個も何個も書いてあってわかりづらいですね。また、このような書き方の場合、もしも各シグナルの点灯時間を変えたくなったときに、すべての”delay(xxx)”の値を書き換えなければならず、心が折れそうです。もっと簡潔に書く方法や、便利に使う方法もありますので、考えてみましょう。