前回、ESP32ボードで、LittleFSとSqlite3を使用してデータを呼び出すを終えた。
ArduinoIDEとPlatformIOの違い
PlatformIOの存在は知っていたのだが、Arduinoとは別のIDEなんだろうなくらいにしか思っていなくて、気に留めていなかったのだが、Arduino IDEで開発していて、Buildも遅いし、コード画面も分割できないし不便だなと思いながらArduinoでコード書いてた。
最近はコードだけはVSCodeで書いて、実行だけArduino IDEで行っていた。
しかし、partitionテーブルの設定で色々とArduinoだと不便なところがあり(別記事で記載予定)、PlatformIOだと、設定ファイルに記述するだけで良いから楽みたいな記事を見て、調べていくうちに、これはPlatformIOに移行した方が良さそうだと合点。
だいぶ、コードをすでにArduinoで書いてしまっていたが、PlatformIOに移行することに決めた。正直、最初からPlatformIOで書いておけばよかったと思ったが、情弱だったorz
PlatformとArduinoの比較は下記記事など参照
https://qiita.com/Ninagawa_Izumi/items/6f58d9dbfdfe99be9c13
ArduinoからPlatformIOへ移行
さて、下記記事を参考にして、移行開始
https://qiita.com/Le_yon/items/878ce32c20a4f762e303
PlatformIOでプロジェクト作成
コードエディタでVSCodeを使っている前提。
下記URLを参考に、VSCodeの拡張機能としてPlatformIO IDEをインストール
https://platformio.org/install/ide?install=vscode
インストールが終了したら、PlatformIOで新規プロジェクトを作成
今回は、名前、ボード、フレームワークを下記で指定している。名前は任意。ボードは、自分が使用しているボード名で

Finishボタンを押すと、Documents→PlatformIO→Projectsフォルダ配下に新規作成したプロジェクトが表示される

設定した内容(borad、framework)が、設定ファイルのplatorm.iniに記載されている

srcディレクトリ以下にソースをコピー
platformIOの場合には、プロジェクト名のルートディレクトリ配下にsrcフォルダが自動で作成されるので、この中に、ArduinoIDEで作成していたコードを一旦全部入れる。

ライブラリの導入
物は試しで、一旦この状態でBuildしてみる。
VSCodeエディタの最下部にチェックボタンがあり、これがBuildアイコン。ここをクリック。

当然、めっちゃエラー出てくる。現時点で61エラー出現

上記エラーは「ESP32Serovライブラリが入ってないよ」と怒られている。
→確かに、まだplatform.iniにインストールするライブラリを何も定義していないので。
親切にも、ESP32Servo.hを探しているの?
platform IOだったらこちらのライブラリが該当するよとリンク付きで伝えているので、web>URLのURLの部分をクリック
https://registry.platformio.org/search?q=header:ESP32Servo.h
こんな画面に移動する。

This library attempts to faithfully replicate the semantics of the Arduino Servo library (see http://www.arduino.cc/en/Reference/Servo) for the ESP32, with two (optional) additions.
→ArduinoのESP32用のサーボモーターのライブラリを完全に補完しているので、このライブラリをインストールしてね
と書いてある。Installationタブをクリック

platform.iniのlib_depsセクションに、ライブラリを記載してねと書いてある。
lib_deps セクション
・プロジェクトで使用するライブラリの依存関係を定義するためのセクション
・library dependenciesの略
・公式サイト
https://docs.platformio.org/en/latest/projectconf/sections/env/options/library/lib_deps.html
というわけで、platformio.iniファイルにlib_deps=と記載して、さっきのinstallationに記載されていたライブラリを貼り付け。

61個あったエラーが56個に減った。

ターミナルでライブラリが入っていないことによるエラーメッセージの、Web > URLのURLをクリック
→開いたサイトでInstallationをクリック
→lib_depsセクションに貼り付けるべきライブラリをコピーして、platformio.iniのlib_depsセクションにコピー
→ライブラリが自動でインストールされるで、終わったら「upload」を押してライブラリの該当エラーがなくなったことを確認
これを繰り返して、必要なライブラリをインストールしていく。
拡張子inoファイルの修正
ライブラリを入れ終わったら、次は、拡張子inoファイルの修正と、他のエラーをつぶす。
・拡張子を.inoから.cppへ変更(PlatformIOでは.inoはサポートされていないため)
・.cppファイルの先頭に#include <Arduino.h>を追加(VSCode+PlatformIOでは明示的にArduino.hをincludeする必要あり)
また、arduino IDEの時は、複数の.inoファイルがあったので、そのまま拡張子をcppファイルにしただけでは、変数や関数の未定義エラーが続出した。
一旦、全部main.cppファイルにぶち込む。loop関数の後で、関数を定義している場合(.inoファイルの場合は、関数の順序に依存せずコードを実行できる)には、loop関数内で該当の関数を呼び出そうとすると未定義エラーが出るので、全部の個別関数をsetup()関数の前に持ってきて、とりあえずエラーを回避してビルドできるようにすることを先決。
関数プロトタイプを追加して、loop関数の後に定義した個別関数も正常に読み込まれるようにする方法もあるが、一旦後回し。
Build→Upload
VSCodeエディタ画面下部のBuildを押して、その後にUploadを押して、プログラムをESP32ボードに反映させる。

Arduino IDEの場合、ポートをいちいち、タブメニューから選択する必要があったが、PlatformIOの場合は、ポートを自動検出してくれるので選択不要なのが地味に嬉しい

動作しない→LittleFSへデータをアップロード
これで、エラーが解消されて、無事動くはずと思ったが、なぜか動かない。。
Serial monitorを開くと下記のエラーが。
sqlite3がDBとして認識できていないとのこと

そういえば、PlatformIOでLittleFSへのデータアップロードを、まだしていなかったことに気づき、DBもLittleFSへアップロードしてアクセスするものなので、確かにSQLクエリ走らせてもDBがそもそもないので、エラー発生するよなと。
というわけで、chat-gptにやり方を聞いたところ
ーーーーーーー
PlatformIOでのSPIFFSまたはLittleFSへのデータアップロードは、Arduino IDEのような直感的な方法ではなく、設定と手順が少し異なります。以下に、PlatformIOでLittleFSへのデータアップロードの一般的な手順を示します。
- まず、データファイルをプロジェクト内の特定のディレクトリに配置します。Arduino IDEの場合、これは通常、メインの**.inoファイルと同じレベルのdataディレクトリです。PlatformIOでは、デフォルトの設定ではdata**ディレクトリも同様に使われます。
**platformio.ini設定ファイルを開き、board_build.filesystemをlittlefs**に設定します。これにより、LittleFSがファイルシステムとして使われます。
- [env:your_env_name] board = your_board_name board_build.filesystem = littlefs
- 上記の**your_env_nameとyour_board_name**は、あなたの環境名とボード名に適切に置き換えてください。
その後、PlatformIOのターミナルまたはCLIで以下のコマンドを実行します。
- pio run -t uploadfs
このコマンドにより、**data**ディレクトリ内のファイルがLittleFS形式でビルドされ、その結果のイメージがESP32などのデバイスにアップロードされます。
ただし、Arduino IDEと同じく、この手順はボードがSPIFFSまたはLittleFSをサポートしていること、そして十分なストレージ領域があることを前提としています。
ーーーーーーー
とのこと。
言われた通りに、platform.iniにlittlefsのファイルシステムを定義し、
pio run -t uploadfs
をターミナルで走らせたがエラーに。
dataディレクトリを変更
Ardiuno ideの時に作成していたコードを、すべてplatform ioのsrcディレクトリに移管したため、dataディレクトリが、root→src→dataになっていたことが原因。これをroot→dataに戻す必要あり。

再び、下記コマンドを実行してファイルシステムにデータをアップロード。今回はできた
pio run -t uploadfs
完成(したが、別問題浮上)
以上で、Uploadのエラーもなくなり、動くようになったのだが、下記のように目の画像がチラつくという別問題が浮上。
こちらに関しては、今後対応。

でも、これで、コード作成→Build→Uploadの全てをVSCodeで一元にできるようになったし、Buildの速度も体感的にはArduinoの時の2倍くらいにはなっている気がするので、移行してよかった。
コメント