ArduinoIDEからVisualStudioCode+PlatformIO移行した時のメモ
M5StackはArduinoIDEからの方が、初心者の方は入門しやすいです。ただ、ArduinoIDEは分かりやすい反面エディタが貧弱で、コード補完機能も利用できません。筆者はArduinoIDE+他のエディタ(Windowsは秀丸、UbuntuはVim)で開発を行っていましたが、数回VSCodeへの移行を試みたのですが、設定が多く・難しいイメージがあり中々移行できませんでした。しかし、ArduinoIDEを使い始めて2年後、、、WioTerminalを始める際にデバッガを使って開発したいと思い、意を決してVSCode+PlatformIOを使ってみたところ、便利で食わず嫌いだったことを痛感しました。
ArduinoIDEからVisualStudioCode+PlatformIOに移行した時に気づいた違いや行った設定を備忘録として記録しておきます。
もくじ(Index)どちらを選べば良い?
個人的に比較した感じでは下記のとおりです。
ArduinoIDE
- 初心者向け
- GUIで設定等もほぼ完結できる
- 検索すると情報が多い
- すぐに書き始めたい人向け
- 単純なエディタが好き
VSCode+PIO
- コード補完機能を使いたい
- VSCodeに既に慣れている
- デバッガを利用したい
- IDEで開発したい
ArduinoIDEとVSCode+PIOの違い
ライブラリの管理方法
ArduinoIDEはグローバルライブラリ
ArduinoIDEだとスケッチを保存するフォルダ「ドキュメント\Arduino\」にlibrariesというフォルダが存在し、アップデートするとライブラリが最新になるようになっています。
●メリット
- ライブラリマネージャーで管理が楽
ライブラリマネージャーからGUIでインストールや削除、アップデート時のバージョンの変更といった操作が可能です。 - ライブラリの場所を把握するのが楽
Arduinoのデフォルトだと「C:\Users\<user_name>\Documents\Arduino\libraries」というフォルダに全部あります。
●デメリット
グローバルライブラリだと、よく下記の問題が起こります。
- ライブラリを最新にしたらビルドできない問題
スケッチAを開発する時にライブラリを最新にした後、同じライブラリに依存するスケッチBを修正してビルドしたらエラーが出るようになる。 - 調査のためにライブラリのバージョンを戻したらビルドできない問題
スケッチAを開発中に不具合を調査するために一時的に、ライブラリAのバージョンを戻した。その後、バージョンを戻すのを忘れてスケッチBをビルドしようとしたらエラーが出るようになる。 - 久しぶりにメンテしようとしたらライブラリが変わりすぎて途方に暮れる問題
開発して一年後にちょっとした修正を行おうとしたらライブラリが変わりすぎて、ビルドできなくなる/修正箇所も多くてどうしようもなくなる。
②VSCode+PIOはローカルライブラリもグローバルライブラリも利用可能
PlatformIOはplatformio.iniに依存するライブラリ及びバージョンを指定することができ、プロジェクト毎に変えることが可能です。グローバルライブラリは使うこともできますが、あまり利用することはないと思います。
●メリット
- 依存するライブラリのバージョンが指定できるのでいつの間にかビルドできないということが無くなる。
- 公開・配布する際もplatformio.iniを公開すれば依存しているバージョンが分かるので公開・配布元はバージョンの違いによる混乱を防ぐことができる。
●デメリット
- ライブラリのバージョンアップをする時に一括更新ができない
platformio.iniをgrepで一括置換するスキルがあればできますが、無い場合プロジェクト毎に1つ1つ変更が必要です。
機能拡張するとショートカットキーが増える
VSCode+機能拡張のPIOなので、VSCodeのショートカットキー・PIOのショートカットキーが存在します。例えばArduinoIDEではビルドはCtrl+R,UploadはCtrl+Uですが、VSCodeでは動きが異なりPlatformIOのビルドはCtrl+Alt+B,UploadはCtrl+Alt+Uとなります。
inoファイルではなくmain.cpp
ArduinoIDEでは「スケッチフォルダ\スケッチ名\スケッチ名.ino」ファイルがメインとなりますが、VSCode+PIOでは「プロジェクトフォルダ\src\main.cpp」がメインとなります。
あと、VSCode+PIOでは明示的にArduino.hをincludeしないといけません。(※ArduinoIDEではすべてのスケッチで暗黙にincludeされています。)
インストールした機能拡張
自分がインストールした機能拡張は下記のとおりです。
①必須なもの
- Japanese Language Pack for Visual Studio Code
VisualStudioCodeの日本語化機能拡張 - C/C++
C/C++を編集する上で便利な機能拡張 - PlatformIO IDE
ESP32,M5Stack,WioTerminal等様々なプラットフォームで開発を行うための機能拡張
②必須でないもの
- Git History
VSCodeとGitを連携し、履歴を見やすくする機能拡張 - Vim
筆者はUbuntuではVim使いなので入れています。
行った設定変更
platformio.iniの変更
Twitterでお世話になっている@GOB_52_GOBさんからの情報です。ArduinoIDEとPlatformIOの設定が異なり、生成物の挙動が変わるそうです。(VisualStudio+PIOの方が遅い。)
変更点
下記の1行をplatformio.iniに加えます。(※2021/8/14 変更 board_build.flash_mode=qioを指定するとアプリケーションが動かなくなります。恐らくArduino-esp32のバージョンアップの影響ですが詳しいことは分かっていません。)
board_build.f_flash = 80000000L
PlatformIOのBuildとUploadのショートカットキーを変更
ArduinoIDEではCtrl+Rでビルド、Ctrl+UでUploadでした。それがVSCodeだとBuildが「Ctrl+Alt+B」、Uploadが「Ctrl+Alt+U」変わってしまいます。BとUはいいのですが、Ctrl+Altが不便なのでそれぞれ二回ずつ押すと実行されるようにショートカットキーを変更しました。
※ これに慣れてしまうとArduinoIDEで2回押してしまうようになる副作用があります。
VSCode+PlatformIOで作成したプロジェクトをArduinoIDEに移植する。
逆のパターンでArduinoIDEからVSCode+PIOに移植するドキュメントは多いのですが、検索してもあまり見つからなかったので書いておきます。
①スケッチフォルダを作成(空白は使わないように注意)
名前は任意ですが、注意点として下記の2つがあります。
- スケッチフォルダ名とinoファイルの名前は同一
- inoファイルはスケッチフォルダの直下にある必要がある。
②main.cppを①で作成したフォルダの直下に移動しファイル名を変える。
ファイル名は①で作成したスケッチフォルダと同じである必要があります。<スケッチフォルダ名>.inoという拡張子を付けます。
③main.cpp以外のソースの置き場所(*.h,*.cpp,*.hppなど)
ArduinoIDEは制約が多く、スケッチフォルダの内部に置かれたソースは「src」というフォルダ以外見てくれません。(src以外にしてしまうとヘッダファイルが見つからないというエラーがコンパイルの時に出ます。)
従って、main.cpp以外は①のスケッチフォルダ直下に置くか、srcというフォルダを作成しその配下に置きます。srcに置いた場合はmain.cppのincludeのパスが変わるので変更するのを忘れないようにしましょう。
おわりに
個人的な感覚ですが、ArduinoIDEはメモ帳感覚でさっとアプリを書き始めるに向いていてセットアップも簡単で(GUIでほぼ完結する。)初心者にわかりやすい、VisualStudio+PlatformIOは少しArduinoIDEの開発に慣れて機能に不満を持った後に移行するとよいかもしれません。
まあ、自分に合った好きな方を使うというのが一番です。
更新履歴
- 2021/8/14 board_build.flash_mode=qioを削除
- 2021/1/12 新規作成
私がハマったFlashのMode/Freqの合わせ方についての追記も是非!
PlatformIOでは無指定だとDIO/40Mhz (manifestの
default)になってしまうので、ArduinoIDE側で変更している場合に同等になりません)
ArduinoIDE
Freq : [Tool] – FrashFrequency 例:80Mhz
Mode : [Tool] – FlashMode 例:QIO
PlatformIO (例に合わせるなら)
platform.ini
board_build.flash_mode = qio
board_build.f_flash = 80000000L
ありがとうございます。追記させていただきます。
わかりやすいです
ありがとうございます