今回は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)”の値を書き換えなければならず、心が折れそうです。もっと簡潔に書く方法や、便利に使う方法もありますので、考えてみましょう。