Arduinoを触り始めて一番最初に触れるスケッチは通称「Lチカ」、サンプルスケッチの「blink.ino」ではないでしょうか。
同時に世界一有名で、世界一たくさん実行されてるスケッチかもしれませんね。(だってみんな最初に試すもん…)
このblink.inoについて、処理の中身や実際の動作の様子を詳しく見ていきたいと思います。
ポイントは、「電子回路から見た見たArduino」と「プログラミングからで見たArduino」を理解することだと考えています。
電気とプログラミングの両方を理解する必要があることがポイントであり、特に初心者にとってのつまづきポイントではないかと思います。
後日それぞれまとめてみたいと思います。
今はこのまま、
改めて「blink.ino」を見てみる
ということで、blink.inoの全文を載せてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to the correct LED pin independent of which board is used. If you want to know what pin the on-board LED is connected to on your Arduino model, check the Technical Specs of your board at: https://www.arduino.cc/en/Main/Products modified 8 May 2014 by Scott Fitzgerald modified 2 Sep 2016 by Arturo Guadalupi modified 8 Sep 2016 by Colby Newman This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Blink */ // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } |
ArduinoIDEでの表示と色が違いますが、なんか気づきません?
実は半分以上「コメント」じゃね?
そう。このプログラム、半分以上コメントなんです(笑)
まず冒頭の「/*」から「*/」で囲まれた部分(1~23行目)は、すべてコメントです、実際のプログラムの動作には影響しない部分です。
ここではスケッチの動作内容についての説明やスケッチの変更履歴が書かれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to the correct LED pin independent of which board is used. If you want to know what pin the on-board LED is connected to on your Arduino model, check the Technical Specs of your board at: https://www.arduino.cc/en/Main/Products modified 8 May 2014 by Scott Fitzgerald modified 2 Sep 2016 by Arturo Guadalupi modified 8 Sep 2016 by Colby Newman This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Blink */ |
ざっくり和訳するとこんな感じですかね。↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* Blink LEDが1秒間点灯、1秒間消灯を繰り返します。 ほとんどのArduinoの基板上のLEDをコントロールできます。 UNO、MEGA、ZEROではD13ピンに接続されています。 MKR1000では6ピンに接続されています。 LED_BUILDINを使うとArduinoの種類に関係なく基板上のLEDを設定できます。 LED_BUILDINのLEDがどのピンにつながっているか知りたい場合は、次のURLで技術仕様を確認してください。 https://www.arduino.cc/en/Main/Products Scott Fitzgerald が2014年5月8日に修正 Arturo Guadalupi が2016年9月2日に修正 Colby Newman が2016年9月8日に修正 このサンプルコードはパブリックドメインです。 http://www.arduino.cc/en/Tutorial/Blink */ |
このスケッチを利用する上で重要なメモ書きですが、スケッチの動作そのものには影響しません。
Arduinoのコメントの書き方にはもう一つあります。「//」(スラッシュ2回)と記入すると、その行の「//」以降がすべてコメントになります。
1 2 3 4 5 6 7 | // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } |
1行目は行の頭に「//」があるので1行丸ごとコメント、3~6行目は途中に「//」があるのでそれ以降がすべてコメントです。
コメントについては以前エントリにまとめているのでそちらも時間のある時に読んでみてください。
コメントを制する者はプログラミングを制す?【コメントをガンガン使おう】
あ、ちなみにコメントには日本語(2バイトコード)を入力することもできますが、しょーもないミスを招くことがあるのでご注意を。
これを防ぐ意味も込めて、私はコメントは雰囲気英語で書くことが多いです。
スケッチの実行順
スケッチに書かれた命令は基本的に「上から順番に」実行されます。
setup()はArduinoの電源を入れた直後やリセットをかけた直後に1回だけ実行し、その後はloop()を無限ループで実行します。
電源を入れると、
setup()を上から→loop()を上から→loop()を上から→loop()を上から→loop()を上から→…
という順番で命令が実行されていきます。
順番に見ていきましょう。
setup()部分
1 2 3 4 5 | // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } |
1行目は先頭に「//」があるのですべてコメントですね。
ちなみに和訳すると「setup関数はリセットボタンを押した時や電源を入れたときに1度だけ実行します」という意味です。
2行目はここからsetup()部分とするという命令で、5行目の「} (閉じカッコ)」までがsetup()の内容になります。
3行目も丸ごとコメントになっています。和訳すると「LED_BUILDIN のピンを出力モードで初期化します」。
そして4行目でpinMode命令を実行し、LED_BUILTINのピン(ここではD13ピン)を出力に設定します。
setup()部分ではこれだけのことを行っています。
そして、コメントの通りリセットボタンを押した時や電源を入れたときに1度だけ実行します。
loop()部分
つづいてloop()部分を見ていきましょう。
1 2 3 4 5 6 7 | // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } |
こちらも1行目はいきなりコメントです。「loop関数は永遠に実行し続けます」。
永遠にとか言ってますが電源切ったらそこまでです(笑)
2行目はここからloop()部分とするという命令で、7行目の「} (閉じカッコ)」までがloop()の内容になります。
そして3行目が「digitalWrite(LED_BUILDIN,HIGH);」。コメント通り、LEDのつながっている(ArduinoUNOではD13)ピンにHIGHを出力し、LEDを光らせます。
4行目は「delay(1000);」。1000ミリ秒(=1秒)の間、スケッチの実行を止めて待ちなさいという意味です。
その後、5行目で「digitalWrite(LED_BUILDIN,LOW);」。LEDのつながっている(ArduinoUNOではD13)ピンにLOWを出力し、LEDを消灯します。
6行目は4行目と同じで1000ミリ秒間、スケッチの実行を止めて待ちます。
6行目の時間待ちが終わったらこれでloopの終わりまで来ましたので、またloop部分の先頭に戻って同じことを繰り返します。
結果的に、
LED点灯→1000ミリ秒待つ→LED消灯→1000ミリ秒待つ→LED点灯→1000ミリ秒待つ→LED消灯→1000ミリ秒待つ→LED点灯→…
という動作を繰り返します。
動画で確認
以上を、動画で確認してみましょう。
delay命令の数字(スケッチの動作を止めて待っている時間)を変えるとどうなるのか、についても実験をしています。
(後日追加します(o_ _)o)))
自分でやってみよう
Arduinoや部品、スターターキットを持っている方はぜひ自分で確かめてみてください。
コメント