8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-04-19

はじめに

ここでは、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を書いてしまうと、予想外の動作をすることがあるので気をつけましょう。

#おわりに

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

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

8
5
0

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
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?