LoginSignup
5

More than 3 years have passed since last update.

posted at

updated at

Lチカ(デジタル出力)の解説

はじめに

ここでは、Arduino UNOのLチカ
すなわち[ファイル]-[スケッチ例]-[01.Basics]-[Blink]の解説と追加の実験をします。

目次へ戻るには ここ をクリック

※本ページは実験のテキストです。

Blinkのプログラム解説

それでは、Blinkのプログラムコードを読んでみましょう。
理解しやすいように以下に日本語訳しておきました。

Blink.ino
// 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ではプログラムの裏側で以下のような処理が書かれています

main関数
void main() {
    setup();        // setupは1回だけ呼び出される

    // while(1)は終わることのない永久ループ
    while(1) {
        loop();     // loopは何度も呼び出される
    }
}

ユーザーはmain関数を書くことなく、setupとloopだけに注力してもらうように工夫されているのです。


それでは、それぞれの関数を見ていきましょう。
まずはsetup関数です。

setup関数
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);    // LED_BUILTINのデジタルピンを出力モードに設定
}

pinMode関数は、Arduinoマイコンが持っているデジタル入出力ピンの設定をします。
解説:pinMode解説
入力ではスイッチやセンサの電圧をコンピュータに取り込み、出力はLEDやモータを動かすために電圧を出力します。

具体的には、図で赤く囲われているデジタルピンを、
入力ポート(INPUT)として使うか、出力ポート(OUTPUT)として使うかを決める、という事です。
digitalport.png
プログラムは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関数を見ていきます。

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に変えてみます。

Blink.ino
// 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以下にしてしまうと、
もはや人間の目では認識できなくなり、点灯したままに見えることでしょう。

エラーメッセージ

もしも書き間違いがあると、図のようにオレンジ色になります。
error_semicolon.png

この場合、エラーメッセージに
expected ';' before 'digitalWrite'
と書かれています。すなわち、
'digitalWrite'関数の前に、セミコロン';'が期待される(=必要じゃないですか?)
という意味ですね。
確かに、エラーで示された行の上の行にセミコロンをつけ忘れていました。
このように、エラーメッセージに従ってプログラムを修正してください。

ほかにも間違い例を示します。
error_upperlower.png
'digitalwrite' was not declared in this scope
従って、
このスコープの中では'digitalwrite'は宣言されていません
ですね。
つまり、digitalwritedigitalWriteは別物なのです。
こういう大文字・小文字の間違いはよくあります。

error_dwordspace.png
strayというのは、迷う・脱線するという意味です。
実際は、コメントを書くために空白をたくさん打ち込んだのですが、全角空白で打ち込んでしまいました。
全角の文字コードは一般的なコンパイラには理解できないので、'\200'のようなエラーになります。

また、半角セミコロン';'を全角セミコロン''で書いてしまったときも、'\357'のようなエラーになります。

'\xxx'(xは適当な数字)のような表示があったら、
「あ、何かを全角文字で書いてしまったんだ」と思いましょう。


大文字小文字にしても、全角半角空白にしても、個人的価値観で
「そんなのどっちだっていいじゃん!」「めんどくさいなあ」
と言う人がいます。
いい加減な性格の人はエラーが多発します。几帳面な性格の人はエラーが少ないです。

プログラムは自分勝手な都合に合わせてくれません。自分をプログラムに合わせるようにしましょう。

まとめ

デジタル出力では、

  • pinMode
  • digitalWrite

という関数が重要だ、という事が分かったと思います。
pinModeを設定せずにdigitalWriteを書いてしまうと、予想外の動作をすることがあるので気をつけましょう。

おわりに

これでデジタル出力の解説は終了です。

目次 へ戻って次の作業を行ってください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5