Arduino IDEでスケッチを複数ファイルに分割する方法

スポンサーリンク
お役立ち情報

Arduino IDEでは、スケッチ(.inoファイル)を複数ファイルに分割することができます。
例えば、編集頻度の少ない関数と、頻繁に編集する「setup()」「loop()」を別ファイルにすることで、スケッチを見やすくすることができます。

ここでは、スケッチを分割する方法について説明します。

  • Arduino IDEウィンドウの右上にある「▼」をクリックし、「新規タブ」を選択します。
  • 画面下の「新規ファイルの名前」でファイル名を入力し、「OK」をクリックします。この際、ファイル名には拡張子を付けません。ここで「.h」「.cpp」などの拡張子を付けると、この後のArduino IDEでの処理内容が変わってきます。
  • 新規ファイルのタブが追加されます。
  • スケッチのフォルダの中を見ると、.inoファイルがふたつに増えています。

スケッチの一部を、新規につくったタブに移動させることで、スケッチが見やすくなります。

なお、「Sketch build process」の「Pre-Processing」の項によると、このようにしてつくった、複数ファイルに分かれたスケッチをコンパイルする際、Arduino IDEは単純に複数の.inoファイルを連結するようです。
連結順は、「フォルダ名と同じ名前の.inoファイル」→「アルファベット順」となります。

スケッチを複数ファイルに分割した時、「#include」「#define」「グローバル変数」がどのように扱われるのか確認してみました。

以下のようなスケッチ(top.ino)を準備しました。

#include <M5Stack.h>
#define DELAYTIME 1000
int count = 0;

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(3);
}

void loop() {
  displayMessage();
}

void displayMessage() {
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("COUNT : %d", count++);
  delay(DELAYTIME);
}

M5StackのLCD画面に、一定時間の間隔で、1ずつカウントアップした数字が表示されます。
LCD画面表示の際に必要となるM5Stackライブラリ(M5Stack.h)は「#include」で、画面表示間隔(DELAYTIME)は「#define」で、表示する数字(count)は「グローバル変数」で、それぞれtop.inoファイルの先頭部分に定義されています。

このスケッチをM5Stackに読み込ませると、所望のとおりに動作します。

次に、上記の方法で「sub.ino」ファイルをつくり、そこに「displayMessage()」関数のみを移動します。

top.inoファイルは以下のようになります。

#include <M5Stack.h>
#define DELAYTIME 1000
int count = 0;

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(3);
}

void loop() {
  displayMessage();
}

sub.inoファイルは以下のようになります。

void displayMessage() {
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("COUNT : %d", count++);
  delay(DELAYTIME);
}

このスケッチをM5Stackに読み込ませると、先ほどと同じく、所望のとおりに動作します。

sub.inoファイルの中で「M5Stackライブラリ(LCD画面表示)」「DELAYTIME」「count」が使われており、それらはいずれもtop.inoファイルで定義されていますが、これで問題なく動作しています。
sub.inoファイルで、改めてライブラリをインクルードしたりする必要はなく、先頭(フォルダ名と同じファイル名)の.inoファイルのみで定義しておけば良いようです。

 

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。