LoginSignup
2
3

More than 1 year has passed since last update.

Arduino開発、ファイルを分割してC/C++で書く、VSCode

Posted at

動機

最近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されてなさそうという意味で)安心。
image.png

ディレクトリ構成

結論として、以下のようにする。
image.png
【ポイント】

  • 「スケッチ名」(ここでは"AppName")ディレクトリ以下に、「src」ディレクトリを作り、それ以下にCソースを配置すると、自動的にプロジェクトのメンバとして認識し、コンパイル・リンクしてくれる。これは、なぜか「src」じゃないとうまくいかない。eclipse系の何か?のような気がするが、ひとまずこれで行く。

Arduino用スケッチのサブルーチンをサブディレクトリに配置する

がカギでした。ありがとうございます。

  • 出力ディレクトリをworkspace下のbuildとする。
    出来上がったelfやhexがすぐ目に付くところに出来上がる。安心。
    cleanする場合には、buildディレクトリを削除。
    Arduino IDEには、cleanがない?

プロジェクト作成

ディレクトリ準備

まず、以下のディレクトリを準備する。

image.png

AppName.inoは新規スケッチの例のアレ。
注意点として、 BOM付きのUTF8は許容されない。コンパイルエラーになる。
Arduinoに関しては、自分はBOMなしUTF8、LFでソースコード作っていくことになると思う。

AppName.ino
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の設定としない。
image.png

検索ボックスに「arduino」を入力、
image.png

Arduino: PathにArduino IDEへのパスを入力。
image.png

この時、以下のような警告が出るが、ここでは無視。
image.png

自分はそれに加え、出力を詳細化している。
不要と言えば不要だが、どのようなbuildが走っているのか確認できるようにしておきたいため。
image.png

この時点でのsettings.jsonは以下。

.vscode\settings.json
{
    "arduino.path": "C:\\Program Files (x86)\\Arduino\\1.8.19",
    "arduino.logLevel": "verbose"
}

プロジェクトの初期化

F1をHit、「Arduino: Initialize」。
image.png

この時点でarduino.jsonが自動生成される。

.vscode\arduino.json
{
    "sketch": "AppName\\AppName.ino"
}

ボード設定

F1をHit、「Arduino: Board Config」を起動。
image.png

ボードを選択する。以下は自分の環境で、「Portenta H7」。
image.png

arduino.jsonが更新される。

.vscode\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が自動生成される。
image.png

C/C++モジュールの配置

スケッチディレクトリ下に、C/C++モジュールを配置する。
既出のとおり、「src」ディレクトリ以下に配置すること。
image.png

出力ディレクトリ、インクルードパスの追加

「output」で出力ディレクトリを設定、「buildPreferences」でインクルードパスを設定。
自分はいつも-Wallも指定している。

.vscode\arduino.json
{
    "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"
}

ビルド

AppName.inoをアクティベート、Verify
image.png

ビルド完了し、elf、hexが生成される。
image.png

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3