プログラミング

VSCodeを開いたら、「環境構築」の「プロジェクトの作成」に従って、プロジェクトを新規に作成しましょう。

プロジェクトの作成が完了したら、src > main.cppを開いてみましょう。プログラム02aまたは02bのようなプログラムが書かれています(インストールされている環境のバージョンにより異なります)。

main.cpp 02a

#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}
Code language: Arduino (arduino)

main.cpp 02b

#include <Arduino.h>

// put function declarations here:
int myFunction(int, int);

void setup() {
  // put your setup code here, to run once:
  int result = myFunction(2, 3);
}

void loop() {
  // put your main code here, to run repeatedly:
}

// put function definitions here:
int myFunction(int x, int y) {
  return x + y;
}
Code language: Arduino (arduino)

先述のとおり、本テキストでは「Arduino」というマイコンボード向けに作られたプログラムのフレームワークを使います。

上記のプログラムのうち、プログラム02aはArduinoフレームワークのプログラムの骨格となる部分です。プログラム02bは、Arduinoフレームワークの骨格に「STEP09 関数」で触れる関数の定義と使用の骨組を加えたものであり、プログラム02aに含まれる要素は全てプログラム02bでも含まれています。

Arduinoフレームワークを理解するために、まずはプログラム02aの内容を見ていきましょう。

ヘッダファイルの読み込み

#include <Arduino.h>Code language: Arduino (arduino)

プログラム02aの1行目は、#includeというマクロ命令(コンパイル時に、プログラム本体のコンパイル前に行われる「プリプロセス」で処理される命令)で「Arduino.h」というヘッダファイルの読み込みを行っています。「Arduino.h」にはマイコンを制御する上で便利な関数や定数が定義されています。また、この「Arduino.h」の中で更に別のヘッダファイルの読み込みも行われています。

Arduino.h」はエディタ上の「Arduino.h」を右クリックし、「定義へ移動」を選択することで開くことができます。なお、このヘッダファイルを編集すると、作成したプログラムが機能しなくなる可能性があります。フレームワークが提供しているヘッダファイルは、通常は変更を加えることなく使います。

setup関数およびloop関数

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}
Code language: Arduino (arduino)

C言語では、全ての処理は「関数」によって行われ、処理は「関数」の中に書いていきます。

通常のC言語は「main」という関数からプログラムの実行が始まりますが、Arduinoフレームワークでは「setup」「loop」という2つの関数が準備されています。英語のコメントにもあるとおり、setup関数の中には一度だけ実行したい処理を、loop関数の中には繰り返し実行したい処理を記述していきます。

main.cpp 02c

#include <Arduino.h>

void setup() {







}

void loop() {







}
Code language: Arduino (arduino)

ここに一度だけ実行したい処理を上から順番に記述していきます

ここに繰り返し実行したい処理を上から順番に記述していきます

プログラムを実行すると、まずはsetup関数の { } 内に記述した処理を上から1行ずつ実行していきます。setup関数の処理を終えると、次はloop関数の { } 内に記述した処理を上から1行ずつ実行していき、それが終わると再度loop関数の処理を上から1行ずつ実行していき、以降loop関数の処理を永久に繰り返します。

図2-3 setup関数とloop関数のフローチャート

つまり、無限ループに入る前に行いたい処理はsetup関数内に、無限ループ内で行いたい処理はloop関数内に書けば良いのです。Arduinoフレームワークでは、マイコンのプログラムが終わらないようにする仕組みはフレームワークの中に既に組み込まれており、プログラミングの際に別途行う必要はありません。

以下に、「LEDの点灯 – フローチャート」で考えたフローチャート(図2-2)を再掲します。

図2-2 フローチャート

このフローチャートをsetup関数とloop関数を用いたものに描き直してみましょう。

図2-4 setup関数とloop関数を用いたフローチャート

永久ループに入る前に行う入出力設定と電圧レベル設定はsetup関数で行うことになります。また、永久ループ内では何も行わないのでloop関数も何も処理を行わずに終了します。

setup関数とloop関数の呼び出し場所

setup関数とloop関数は、

(ホームディレクトリ) > .platformio > packages > framework-arduinoespressif32 > cores > esp32 > main.cpp

にある「main.cpp」ファイル(今まで見てきたmain.cppとはファイル名が同じだけで、別の場所にある別のファイルです)の、以下の箇所で呼び出されています。

void loopTask(void *pvParameters)
{
    setup();
    for(;;) {
#if CONFIG_FREERTOS_UNICORE
        yieldIfNecessary();
#endif
        if(loopTaskWDTEnabled){
            esp_task_wdt_reset();
        }
        loop();
        if (serialEventRun) serialEventRun();
    }
}
Code language: Arduino (arduino)

いくつかの処理が行われていますが、重要なのはsetup関数とloop関数の呼び出しです。まず最初にsetup関数が実行され、その後 for(;;){ } のループに入ります。このループは { } 内の処理を永久に繰り返すループであり、ループ内にあるloop関数が無限に繰り返されることになります。

以上の処理は、loopTaskという関数の中で行われていますが、このloopTask関数もさらに別の関数によって呼び出しに相当する処理がなされています。

コメント文

先ほどのsetup関数、loop関数内にも書かれていましたが、コメント文とは、プログラマのメモ書きにあたるもので、C言語の場合、範囲コメント /* */ と行コメント // があります。

範囲コメント

/* コメント */

/*
     複数行での
     コメント
 */Code language: Arduino (arduino)

「/*」と「*/」で囲んだ範囲がコメントになります

複数行を囲んでコメントとすることも可能です

行コメント

// コメントCode language: Arduino (arduino)

「//」から行末までがコメントになります

コメントは、プログラムの本文ではないので全角の日本語でも書くことができます。

プログラムを分かりやすくするために、こまめにコメントを書くようにしましょう。

プログラミング

それでは、ここまで学んできた内容を内容を基に、本STEPの課題を実現するプログラムを書いてみましょう。

課題 2-1

ドットマトリクスLEDの右上のLED1つだけを点灯させる。

プログラムは書けましたか? 次にプログラミング例を載せているので見比べてみましょう。

前の記事

LEDの点灯 – プログラム例

次の記事

LEDの点灯 – 関数