Arduinoのスケッチが大きくなると、すべての処理を1つの.inoファイルに書くのは難しくなり、複数ファイルへ分割したくなる場面があります。その際によく登場するのが.cppファイルと.hファイルです。
しかし、C++に慣れていないArduino初心者の場合、「.cppに関数を書けば動くのに、なぜわざわざ.hファイルを作る必要があるのか」と疑問に感じることがあります。この記事では、Arduinoにおけるヘッダファイルの役割や.cppとの関係を、具体例を交えながら解説します。
Arduinoで使われる.ino、.cpp、.hファイルの役割
Arduinoのプログラムは基本的にC++をベースに動作しています。そのため、一般的なC++プログラムと同じように、処理を複数のファイルへ分割できます。
それぞれのファイルには以下のような役割があります。
| ファイル | 役割 |
|---|---|
| .ino | Arduinoのメイン処理を書く場所。setup()やloop()を配置する。 |
| .cpp | 関数やクラスなど、実際の処理内容を書く場所。 |
| .h | 関数やクラスの存在を知らせる宣言を書く場所。 |
つまり、.cppファイルが「実際に仕事をする場所」だとすると、.hファイルは「どんな仕事ができるかを伝える説明書」のような役割を持っています。
ヘッダファイル(.h)が必要になる理由
.cppファイルだけでも、すべての処理を同じファイル内で呼び出すなら動作させることは可能です。しかし、ファイルを分割して管理する場合、別のファイルから関数を利用するためには、その関数が存在することをコンパイラへ伝える必要があります。
例えば、LEDを点滅させる処理を別ファイルへ移動するとします。
led.cppには以下のような処理を書きます。
void blinkLED(){
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
}
しかし、mainとなる.inoファイルから見ると、「blinkLEDという関数が本当に存在するのか」が分かりません。
そこで.hファイルに以下のような宣言を書きます。
void blinkLED();
この宣言によって、Arduino側は「blinkLEDという関数が別の場所に存在する」と理解できます。
.hファイルは関数の中身ではなくインターフェースを書く場所
ヘッダファイルは、単純に.cppファイルの外側だけを書くものという理解でも大きく間違いではありません。ただし、より正確には「そのファイルが外部へ提供する機能を定義する場所」です。
例えば、テレビのリモコンを考えると分かりやすくなります。
リモコンには「電源ボタン」「音量ボタン」などがありますが、内部でどのような回路が動いているかを利用者は知る必要がありません。利用者が必要なのは「このボタンを押せばこの機能が使える」という情報だけです。
C++における.hファイルも同じで、利用する側には関数名や使い方だけを公開し、細かい処理内容は.cpp側へ隠します。
Arduinoで.hと.cppを分ける具体例
例えば、温度センサーを管理するプログラムを作る場合を考えます。
temperature.hには、利用する関数の宣言を書きます。
#ifndef TEMPERATURE_H
#define TEMPERATURE_H
float getTemperature();
#endif
temperature.cppには、実際の処理を書きます。
#include "temperature.h"
float getTemperature(){
return analogRead(A0);
}
.inoファイルでは、以下のように.hを読み込むだけで関数を利用できます。
#include "temperature.h"
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println(getTemperature());
delay(1000);
}
このように分割すると、メインプログラムは何をしているかが分かりやすくなり、センサー処理の詳細を意識せず利用できます。
.hファイルを作らなくてもよい場合とは
すべてのArduinoプログラムで必ず.hファイルが必要になるわけではありません。
例えば、数個の関数しかない小さなスケッチなら、.inoファイルだけで十分です。無理にファイルを分割すると、逆に管理が複雑になることもあります。
目安として、以下のような場合に.hファイルを利用すると便利です。
- 同じ処理を複数の場所で使いたい
- センサーやモジュールごとに処理を分けたい
- プログラムが大きくなり全体を把握しにくい
- 自作ライブラリとして再利用したい
Arduinoライブラリも.hと.cppで作られている
Arduinoで利用する多くのライブラリも、内部では.hファイルと.cppファイルを組み合わせて作られています。
例えば、センサー用ライブラリを読み込むときに使う以下のような記述があります。
#include <ライブラリ名.h>
これは「このライブラリで利用できる機能を読み込む」という意味です。実際の処理コードは別の.cppファイルに保存されています。
つまり、自分で作るArduinoプログラムでも、ライブラリを作る側と同じ考え方で.hと.cppを分けることで、整理されたコードを書くことができます。
まとめ
Arduinoで.hファイルを作る目的は、関数やクラスの存在と使い方を他のファイルへ知らせるためです。.cppファイルには実際の処理を書き、.hファイルには外部から利用するための宣言を書きます。
.ino、.cpp、.hを分けることで、プログラムが大きくなっても管理しやすくなり、自作ライブラリとして再利用することも可能になります。
小さなArduinoスケッチでは無理に使う必要はありませんが、複数の機能を組み合わせるような開発では、ヘッダファイルの役割を理解しておくと、より本格的なC++プログラムを書けるようになります。


コメント