Arduino言語の文法について知ろう

1 はじめに

Arduino の標準的なプログラミング言語は Arduino 言語です。C/C++を基にしているのでC/C++を知っている場合には非常によく似ています。C/C++を知っている人はC/C++との違いを読んでみて下さい。

1.1 最小限のプログラムとプログラムをどこに書くか

Arduino の最小限のプログラム(なにもしない)は次のようになります。

void setup() {
}
void loop() {
}
このプログラムに必要なものを追加していきプログラムを完成させます。追加する場所は次のように (A), (B), (C), (D) があります。最初の内は (A), (B), (C) に書くとよいでしょう。(A)には全体として準備したい内容(主に疑似命令や宣言)を、(B)には最初に1回だけ処理したい内容を、(C)には繰り返す処理を書きます。
(A) 全体として準備したい内容
void setup() {
	(B) 最初に1回だけする処理
}
void loop() {
	(C) 繰り返す処理
}
(D) その他の処理

フローチャートで書くと次のようになります。

1.2 プログラムに使う記号は半角文字

プログラムを書くには半角の英数字と記号を主に使います。全角の空白や文字を混ぜるとエラーになる場合があるので注意して下さい。

; { } の3つの記号はよく使います。プログラムがうまく動かないときには忘れていないか確認してみて下さい。

またスペース(半角空白文字), タブ, 改行をコンパイラは区切り記号としますが、長くても1つの場合と同じ扱いをします。ですから

void setup() {
}
void loop() {
}

void setup(){}void loop(){}
void 
setup
()
{
}
void 
loop
()
{}

は同じプログラムです。プログラムを書くときに適切に空白を入れると構造が分かって読みやすくなります。空白の入れ方は人によって違いますが Arduino の場合には自動的に空白を入れてくれる機能があるので使うといいでしょう。機能を使うには Arduino IDE のメニューの「ツール」の中に「自動整形」がるのでクリックするか Ctrl キーを押しながら t を押す (Windows) もしくはコマンドキーを押しながら T を押します (macOS)。ときどき自動整形を使ってみて下さい。

1.3 プログラムの構成

プログラムの中心となるのはコンピュータ(マイコン)への命令文です。これがコンパイラでコンパイルされて機械語になり、機械語をマイコンへ書き込むことでプログラムが動作します。命令文のほかにコメント、疑似命令、宣言があります。

1.3.1 コメント

コメント(注釈)はコンパイラには無視されます。無視されるので何を書いても構いませんし、全角の文字を使っても大丈夫です。コメントは // を先頭に書くと行末(改行文字)までがコメントになります(エディタの幅を狭くして折り返しているときには行末が分かりにくいので注意する)。また /* と */ で囲まれた範囲は複数行であってもコメントになります。たとえば

    x = x + 1; // ここから行末までがコメントになる
    /*
        ここもコメントになる
    */

と書けます。/* */ を使うとき /* /* */ */ のようには書けないことに注意して下さい。コンパイラは /* /* */ をコメントとして扱い、残った */ をプログラムと解釈しようとしてエラーになります。

コメントにはプログラムの動作についてのメモなど、あとでプログラムを読んだ人へ向けたメッセージを書きます。

1.3.2 疑似命令

疑似命令というのはコンパイラへの指示です。よくつかうのは #include でライブラリを使うことを指示します。たとえば

#include <MmlMusicPWM.h>

と書きます。MmlMuiscPWM がライブラリの名前です。.h はヘッダファイルを表します(ヘッダファイルの説明は省略します)。

1.3.3 宣言

宣言というのはコンパイラに対して変数などを使う前にどういう変数なのかといったことを指示するための文です。たとえば

int i;

と書くと i という名前の変数をこれから使うことを宣言していて、その型は int (整数) であるということをコンパイラに指示します。変数については後述します。

2 マイコンボード上のLEDを使って学ぼう

Arduino マイコンボードには、マイコンから点灯/消灯できる LED がついています。まずはこれを使って学びましょう。Arduino IDE でメニューの「ファイル」から「スケッチ例」→「01.BASICS」→「Blink」を開きます。そうすると次のプログラムリストが表示されます。

/*
  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
}

このプログラムをコンパイルしてマイコンボードに書き込んで(左上の右矢印(→)アイコンで表されている「マイコンボードに書き込む」のボタンをクリックする)みてください。そうするとボード上の LED が1秒点灯して1秒消灯するのを繰り返します。

2.1 プログラムを読んで文法を知ろう

上記のプログラムにはコメントを使って説明が英語で丁寧に書かれていますが、コメントを全部消してみましょう。そうすると次のようになります。

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

最初に見たプログラムと比較すると水色と黄色の文字の部分が増えています。それではここで使っている記号をみていきましょう。pinMode, LED_BUILTIN, OUTPUT, digitalWrite, HIGH, delay, 1000, LOW, (, ), ; と, があります。

2.1.1 文の区切り ;

まず ; は文の終わりを示します。だから、はじめに1回だけする処理は1つの文、繰り返す処理は4つの文から成り立っていることが分かります。基本的に文は左から右、上から下の順に処理されていきます。フローチャートで書くと次のようになります。

2.1.2 関数

pinMode, digitalWrite, delay は関数の名前(関数名)です。Arduino言語で関数というのは命令文を組み合わせたプログラムのことをいいます(数学の関数と似ている部分と似ていない部分があります)。Arduinoではあらかじめいくつかの関数が用意されています。また自分で関数をつくることもできます。関数の名前を書いておくとコンパイラは、マイコンが関数のプログラムを実行する(関数を呼び出すという)ようにしてくれます。

pinMode 関数はマイコンのピン(端子のこと、マイコンボードの周囲にある回路をつなぐ端子の1つずつをピンという、ボードにピンの番号が印刷されている)のモード(入力/出力など)を設定する関数です。

digitalWrite 関数はピンから出力するデジタル信号(電圧が高いまたは低い)を設定する関数です。一度設定すると次に設定するかマイコンがリセットするまで信号は変わりません。

delay 関数は指定された時間(単位は ms (ミリ秒 = 1/1000秒) なにもしない関数です。

2.1.3 数字と数字の代わりの記号

1000 は日常使うのと同じ10進数の数字です。LED_BUILTIN, OUTPUT, HIGH, LOW は数字の代わりに使う記号です。コンピュータには数字でピンや入力、出力、電圧の高低などを指示するのですが、数字ではプログラムが読みにくくなるために記号を使います。必要なら自分で数字代わりに使う記号を決めることが出来ます。

LED_BUILTIN はマイコンボード上の LED がつながっているピンの番号(数字)の代わりに使う記号です。マイコンボードによって番号が違うので使われています。 OUTPUT は出力を表します。HIGH は電圧が高い(ここでは5V)、LOWは電圧が低い(0V)を表します。

2.2 関数の使い方(関数の呼び出し方)

関数を呼び出すには

関数名(引数)

と書きます。引数(ひきすう)というのは関数内のプログラムに与える指示です。たとえばdelay関数ではなにもしない時間(待ち時間)を書きます。

delay(1000)

と書くと1000ms(1000ミリ秒 = 1秒) の間なにもしないことになります。このように関数を呼び出すだけの文をつくるときには関数の ) の後に ; をつけて文末を表して1つの文にします。

delay(1000);

; がないとエラーになります。引数には数字ではなく計算式を書いても構いません。

delay(500 + 500);

pinMode 関数は設定するピンの番号とモードが必要なので引数を2つとります。引数と引数の間は , (コンマ)で区切り、末尾には ; をつけるので

pinMode(LED_BUILTIN, OUTPUT);

と書いてあるのです。digitalWrite 関数は出力を設定するピンの番号と出力の高低が必要なので引数を2つとるので

digitalWrite(LED_BUILTIN, HIGH);

digitalWrite(LED_BUILTIN, LOW);

と書きます。

2.3 もう1度プログラムを見よう

これまでの説明の内容をもとにプログラムにコメントを付けてみると次のようになります。

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);	// LED_BUILTIN ピンを出力に設定
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);	// LED_BUILTIN ピンを HIGH に設定
  delay(1000);				// 1000ms (1秒)待つ
  digitalWrite(LED_BUILTIN, LOW);	// LED_BUILTIN ピンを LOW に設定
  delay(1000);				// 1000ms (1秒)待つ
}

コメントをもとにフローチャートを書き直すと次のようになります。マイコンボード上の LED はピンが HIGH (電圧が5V)の時に点灯する回路になっているので、プログラムを書き込むとLEDが1秒点灯、1秒消灯を繰り返すことが分かります。

1000の数字を小さくすると点滅の間隔が短くなり、大きくすると長くなります。またdelayの文をとってしまうと LED は非常に高速に点滅しますが、目にはずっと点灯しているように見えます。これはマイコンが非常に速いスピードで命令を実行しているからです。実際に試してみて下さい。


戻る
Copyright (c) 2019, Noriaki Mitsunaga