ArduinoIDEでM5Stackのプログラムを書くのは使いやすくて気に入ったのですが、ちょっと何かムズムズする感じなのが、ヘッダファイルです。普通のCやC++ならヘッダを沢山インクルードしないとイケない筈なのに、M5Stack.hをインクルードするだけで、ほとんど何でも書けてしまう。楽でいいけれども、ちょっとどうなっているのか知っておかないと落ち着かないです。
※「IoT何をいまさら」投稿順Indexはこちら
まず、前回に戻ってM5StackのマイクロSDカードコネクタが見える写真を1枚貼り付けておきます。下の方に見えるコネクタにシャーシに空いているソケット孔からカードを入れようとしてナナメってトラブッたのでした。
しかしね、その時、SDカードにアクセスするプログラムを書きながら(といってもIDEがExampleを見せてくれるので、だいたいはサンプルそのままのコードを組み合わせただけなのですが)とても気になったのが、
File f;
とか、
if (!SD.begin()) {
などと書きながら、ヘッダファイルはただ一つ
#include <M5Stack.h>
だけで足りてしまっていることです。SDカード自体はFAT32のファイルシステムなので、それなりのライブラリが裏にいなければファイルアクセスなどできないと思われるので、どこでどうなってヘッダ1個で何でもできてしまうのでありましょうや。そこで少し追いかけてみました。なお、ArduinoIDEはWindows10上にインストールしてありますので、以下は、私のWindows10のPC上で特定のArduinoIDEバージョン(1.8.9)の場合の情報であります。
まず根っ子にいるM5Stack.hの在りかは自分のドキュメントフォルダの中にあるので直ぐに分かりました。私の場合、
C:\Users\ユーザ名\Documents\Arduino\libraries\M5Stack\src
の中にM5Stack.hが存在しました。このフォルダの中には、utilityというサブフォルダもあり、その中にMPU9250センサを使用するために以下のようにインクルードしている
#include "utility/MPU9250.h"
MPU9250.hヘッダも存在しました。しかし、SDカードにアクセスするためのヘッダは何処から来ているのでしょ? M5Stack.hの内部をのぞいてみます。
M5Stack.hより一部引用 ~前の方省略 #include <Arduino.h> #include <Wire.h> #include <SPI.h> #include "FS.h" #include "SD.h" ~後の方省略
M5Stack.hの中で、SD.h(SDカード上のFATファイルを操作するためのオブジェクト群が定義されているヘッダ)がインクルードされていました。だから、突然、SD.begin()などと書いても大丈夫なのか。しかし、それにしても、SD.hの実体ファイルはどこにあるのだろう?
先ほどの自分のドキュメントフォルダの中にあるヘッダファイル類を探してみまましたがありません。そうであれば、ArdinoIDEのインストールフォルダを探してみるしかありますまい。
結論から言えば、ちょっと探しにくいところに置かれていました。
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\libraries\SD\src
Windows StoreからArdinoIDEをインストールしたためでしょう。WindowsAppsの中にありました。WindowsAppsフォルダは、隠しフォルダな上に、Userは読み書き実行はできてもファイルの一覧は見れないような設定になっているようです。中身を調べるには非常に操作性が悪いです。ま、仕方ないので、管理者権限のコマンドプロンプトを開いて、中身を調べていきました。
SD.hの中で、さらにその下のutilityフォルダ内にあるSdFat.hを取り込んでいました。どうもArduinoのスタイルは、ヘッダファイルを一か所のincludeといった名のフォルダに集めておくのではなくて、各機能毎に分かれたフォルダの中のsrcというフォルダの中に
ヘッダとソースの両方を格納しておく
というスタイルのようです。そのため、SdFat.hの横には関数実体コードを収めた.cppファイルなども格納されていました。普通のビルド環境のようにコンパイル済のバイナリのライブラリを置いておくのでは、機械語コードの異なるCPUにマルチ対応できないので、必要に応じ各マシン用のライブラリをその場でビルドして使うための仕組みなのでしょうかね?
SD.hの在りかも分かり、内部を覗いてみることもできたので、少しスッキリしたかも。でも、もう一つ、Arduinoの大本のヘッダと思われる
Arduino.h
は何処にあるのかしら? 先ほどのパスのlibrariesの中を調べてみたのですが、見当たりません。そこにはSDのような機能毎のファイルのみが入っていて、COREな部分は別の以下のパスに入っているのを見つけました。
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino
ちょっとavrという名が引っかかりましたが、オリジナルのArduinoがAVRであるからでしょうか?
そこにあったArduino.hの中を覗いてみて、ますます?スッキリ。以下のようなおなじみさんのヘッダ達がArduino.hの中でインクルードされていました。
-
- stdlib.h
- stdbool.h
- string.h
- math.h
だから、大抵のものが直ぐに使えるようになっていたわけか。まあ便利で良いけれども、何も分からず使っていると落ち着かないんだ、これが。