はじめに
ここでは、Arduino UNOの Lチカ 、
すなわち[ファイル]-[スケッチ例]-[01.Basics]-[Blink]の解説と追加の実験をします。
目次へ戻るには ここ をクリック
※本ページは実験のテキストです。
Blinkのプログラム解説
それでは、Blinkのプログラムコードを読んでみましょう。
理解しやすいように以下に日本語訳しておきました。
// setup関数は電源投入直後、またはリセットボタンを押した直後に、1回だけ呼び出されます。
void setup() {
// LED_BUILTINのデジタルピンを出力モードに設定
pinMode(LED_BUILTIN, OUTPUT);
}
// loop関数は永遠に何度も呼び出されます。
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED点灯(HIGHは電圧を5Vにする)
delay(1000); // 1秒間待つ(ウェイト)
digitalWrite(LED_BUILTIN, LOW); // LED消灯(LOWは電圧を0Vにする)
delay(1000); // 1秒間待つ(ウェイト)
}
プログラムは2つの関数で構成されています。setup()
とloop()
です。
普通のC言語ではmain()
関数を使うのですが、
Arduinoでは プログラムの裏側で以下のような処理が書かれています 。
void main() {
setup(); // setupは1回だけ呼び出される
// while(1)は終わることのない永久ループ
while(1) {
loop(); // loopは何度も呼び出される
}
}
ユーザーはmain関数を書くことなく、setupとloopだけに注力してもらうように工夫されているのです。
それでは、それぞれの関数を見ていきましょう。
まずはsetup関数です。
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTINのデジタルピンを出力モードに設定
}
pinMode
関数は、Arduinoマイコンが持っているデジタル入出力ピンの設定をします。
解説:pinMode解説
入力ではスイッチやセンサの電圧をコンピュータに取り込み、出力はLEDやモータを動かすために電圧を出力します。
具体的には、図で赤く囲われているデジタルピンを、
入力ポート(INPUT)として使うか、出力ポート(OUTPUT)として使うかを決める、という事です。
プログラムはpinMode(LED_BUILTIN, OUTPUT);
となっているので、
LED_BUILTIN ピンを OUTPUT(出力モード) に設定した、という事になります。
LED_BUILTIN ピンというのは、 ボード上に標準搭載されているLED=ビルトインされているLED ,という意味を表しています。
Arduino UNOでは13番ピンがLのLEDですが、違う種類のボードでは13番ピンだったり5番ピンだったりします。
それらの違いを吸収して、どんなボードでも動くように LED_BUILTIN という用語を使っているのですが、
正直ややこしい ですね。。。
pinMode(13, OUTPUT); // 13番のデジタルピンを出力モードに設定
と書いてくれたほうが分かりやすいと思います。
というわけで、setup関数では、ボード上のLEDのピン=13番ピンを出力モードに設定しました。
次はloop関数を見ていきます。
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED点灯(HIGHは電圧を5Vにする)
delay(1000); // 1秒間待つ(ウェイト)
digitalWrite(LED_BUILTIN, LOW); // LED消灯(LOWは電圧を0Vにする)
delay(1000); // 1秒間待つ(ウェイト)
}
digitalWrite
関数は、出力モードに設定したピンから、 HIGH の電圧(5V)か LOW の電圧(0V)を出力させる命令です。
解説:digitalWrite解説
digitalWrite(LED_BUILTIN, HIGH);
とdigitalWrite(LED_BUILTIN, LOW);
が交互に書かれているので、
loopが呼ばれて、 HIGH -> LOW 、loopが呼ばれて、 HIGH -> LOW 、、、、と永遠に繰り返す、
すなわちLEDがずっと点滅することになります。
delay
関数は、プログラムを指定したミリ秒間停止させる命令です。
解説:delay解説
今回はdelay(1000);
なので、 1000ミリ秒=1秒 停止させる、という事になります。
この 1000 の部分を書き換えれば、点灯と消灯の長さを変えることができます。
次の章で試してみましょう。
delayの中身を変えてみる
それではBlinkのプログラムを書き換えてみましょう。
具体的には、delay
関数の中の数値を 50 に変えてみます。
// setup関数は電源投入直後、またはリセットボタンを押した直後に、1回だけ呼び出されます。
void setup() {
// LED_BUILTINのデジタルピンを出力モードに設定
pinMode(LED_BUILTIN, OUTPUT);
}
// loop関数は永遠に何度も呼び出されます。
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED点灯(HIGHは電圧を5Vにする)
delay(50); // 1秒間待つ(ウェイト)
digitalWrite(LED_BUILTIN, LOW); // LED消灯(LOWは電圧を0Vにする)
delay(50); // 1秒間待つ(ウェイト)
}
書き換えたら、コンパイルとプログラム書き込みをして、動作を確認してください。
50ミリ秒おきに点灯・消灯を繰り返すので、非常に高速な点滅ですね。
人間の目が認識できるのは30FPS(毎秒30フレーム)と言われています。
すなわち30ミリ秒です。
したがって、delay
関数の中身を30以下にしてしまうと、
もはや人間の目では認識できなくなり、点灯したままに見えることでしょう。
エラーメッセージ
この場合、エラーメッセージに
expected ';' before 'digitalWrite'
と書かれています。すなわち、
'digitalWrite'関数の前に、セミコロン';'が期待される(=必要じゃないですか?)
という意味ですね。
確かに、エラーで示された行の上の行にセミコロンをつけ忘れていました。
このように、エラーメッセージに従ってプログラムを修正してください。
ほかにも間違い例を示します。
'digitalwrite' was not declared in this scope
従って、
このスコープの中では'digitalwrite'は宣言されていません
ですね。
つまり、digitalwrite
とdigitalWrite
は別物なのです。
こういう大文字・小文字の間違いはよくあります。
stray というのは、迷う・脱線するという意味です。
実際は、コメントを書くために空白をたくさん打ち込んだのですが、全角空白で打ち込んでしまいました。
全角の文字コードは一般的なコンパイラには理解できないので、 '\200' のようなエラーになります。
また、半角セミコロン';'を全角セミコロン';'で書いてしまったときも、 '\357' のようなエラーになります。
'\xxx'(xは適当な数字)のような表示があったら、
「あ、何かを全角文字で書いてしまったんだ」と思いましょう。
大文字小文字にしても、全角半角空白にしても、個人的価値観で
「そんなのどっちだっていいじゃん!」「めんどくさいなあ」
と言う人がいます。
いい加減な性格の人はエラーが多発します。几帳面な性格の人はエラーが少ないです。
プログラムは自分勝手な都合に合わせてくれません。自分をプログラムに合わせるようにしましょう。
#まとめ
デジタル出力では、
- pinMode
- digitalWrite
という関数が重要だ、という事が分かったと思います。
pinModeを設定せずにdigitalWriteを書いてしまうと、予想外の動作をすることがあるので気をつけましょう。
#おわりに
これでデジタル出力の解説は終了です。
目次 へ戻って次の作業を行ってください。