動機
最近Arduinoが自分の中でアツい。が、結局マネタイズも考えると、別のプラットフォームへのポーティング労力を最小化できるようにしたい。また、いい加減ウン十年もC/C++を使ってきて、しかも組み込みがルーツである技術者にとって、sketch(限定されたC/C++)よりは、普通にC/C++で書きたいし(というかnewやmallocも使いたくない、ほぼC言語一択)、モジュール分けしたい。既に作ったたくさんの汎用モジュールを活用したい。
色々と調べたが、
Arduino IDE 1.8.x (Legacy IDE)
Visual Studio Code
Arduino for Visual Studio Code(VSCode機能拡張)
の組み合わせで行ってみることにした。
開発環境
1. Arduino IDE
arduino.cc、Downloads
から、 Legacy IDE をダウンロード、インストール。
執筆時点(2023/04/14)では、1.8.19であった。
2.xも試してみたが、Arduino for Visual Studio Codeがうまく動作しなかった。
2. Visual Studio Code
Download Visual Studio Code
からダウンロード、インストール。
3. Arduino for Visual Studio Code
VSCodeのExtensionsからインストール。Microsoft製。(少なくともpeepされてなさそうという意味で)安心。
ディレクトリ構成
- 「スケッチ名」(ここでは"AppName")ディレクトリ以下に、「src」ディレクトリを作り、それ以下にCソースを配置すると、自動的にプロジェクトのメンバとして認識し、コンパイル・リンクしてくれる。これは、なぜか「src」じゃないとうまくいかない。eclipse系の何か?のような気がするが、ひとまずこれで行く。
がカギでした。ありがとうございます。
- 出力ディレクトリをworkspace下のbuildとする。
出来上がったelfやhexがすぐ目に付くところに出来上がる。安心。
cleanする場合には、buildディレクトリを削除。
Arduino IDEには、cleanがない?
プロジェクト作成
ディレクトリ準備
まず、以下のディレクトリを準備する。
AppName.inoは新規スケッチの例のアレ。
注意点として、 BOM付きのUTF8は許容されない。コンパイルエラーになる。
Arduinoに関しては、自分はBOMなしUTF8、LFでソースコード作っていくことになると思う。
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
パス設定(Arduino for Visual Studio Codeの設定)
F1をHit、「Open Workspace Settings」。
「もしかしたらプロジェクトごとに別のバージョンにせざるを得ない日が来るかもしれない」ことを念頭に、Workspaceでの設定とする。Userの設定としない。
Arduino: PathにArduino IDEへのパスを入力。
自分はそれに加え、出力を詳細化している。
不要と言えば不要だが、どのようなbuildが走っているのか確認できるようにしておきたいため。
この時点でのsettings.jsonは以下。
{
"arduino.path": "C:\\Program Files (x86)\\Arduino\\1.8.19",
"arduino.logLevel": "verbose"
}
プロジェクトの初期化
この時点でarduino.jsonが自動生成される。
{
"sketch": "AppName\\AppName.ino"
}
ボード設定
F1をHit、「Arduino: Board Config」を起動。
ボードを選択する。以下は自分の環境で、「Portenta H7」。
arduino.jsonが更新される。
{
"sketch": "AppName\\AppName.ino",
"configuration": "target_core=cm7,split=50_50,security=none",
"board": "arduino:mbed_portenta:envie_m7"
}
また、しばらくすると、c_cpp_properties.jsonが自動生成される。
C/C++モジュールの配置
スケッチディレクトリ下に、C/C++モジュールを配置する。
既出のとおり、「src」ディレクトリ以下に配置すること。
出力ディレクトリ、インクルードパスの追加
「output」で出力ディレクトリを設定、「buildPreferences」でインクルードパスを設定。
自分はいつも-Wallも指定している。
{
"buildPreferences":[
["compiler.c.extra_flags","-Wall -IAppName/src/Category01/inc"],
["compiler.cpp.extra_flags","-Wall -IAppName/src/Category01/inc"]
],
"output": "build",
"sketch": "AppName\\AppName.ino",
"configuration": "target_core=cm7,split=50_50,security=none",
"board": "arduino:mbed_portenta:envie_m7"
}