lipoyangのアイコン画像
lipoyang 2025年01月17日作成 (2025年01月17日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 16
lipoyang 2025年01月17日作成 (2025年01月17日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 16

PlatformIOでSpresense開発 (マルチコア対応、トラブルシュート)

なぜ PlatformIO か?

Arduino IDEは初心者でも導入のハードルが低い開発環境ですが、その代償として使い勝手が悪い面があります。

  • ビルドに無駄に時間がかかることがある。
  • ボードの設定をスケッチごとに保存できない。
  • ライブラリをスケッチごとに管理できない。
  • エディタが貧弱。 ← Arduino IDE 2.xでは改善されました。

加えて、Spresenseのマルチコアプログラミングでは、コアごとに別々にスケッチを開いてコアを選択して書き込むのが少し不便です。(シンプルなやり方ではありますが。)

VSCode + PlatformIOを使えばこれらの問題が解決します。

セットアップ

PlatformIOのセットアップ

VSCode および PlatformIO のセットアップについての情報はすでに沢山あるので省略します。

Spresenseのパッケージをインストール

PlatformIOはデフォルトではSpresenseをサポートしていないようなので、有志の方が公開されている下記のデバイス情報パッケージを利用します。
https://github.com/maxgerhardt/platform-sonyspresense

「QUICK ACCESS」→「Miscellaneous」→「PlatfromIO Core CLI」をクリックすると TERMINALが開くので、そこで下記コマンドを実行します。

pio pkg install -g -p https://github.com/maxgerhardt/platform-sonyspresense.git

キャプションを入力できます

使い方

プロジェクトの作成

「PROJECT TASKS」→「Create New Project」をクリックし、「+ New Project」をクリックすると「Project Wizard」が開きます。「Name」に適当な名前を付け、「Board」で「Spresense (1.5MB RAM, 768k Flash)(Sony)」を選択します。「Finish」をクリックするとプロジェクトが作成されます。初回はビルドツール等のダウンロードのため時間がかかります。

キャプションを入力できます

プロジェクトの設定はplatformio.iniというファイルに記述します。デフォルトでは下記のようになっています。

[env:spresense] platform = sonyspresense board = spresense framework = arduino

マルチコアを使用する場合

メインコアとサブコア1を使用する場合、platformio.iniを下記のように修正します。

[env] platform = sonyspresense board = spresense framework = arduino [env:spresense_mainCore] build_src_filter = +<main/> [env:spresense_subCore1] build_flags = -DPIO_FRAMEWORK_ARDUINO_CORE_SUB_CORE_1 build_src_filter = +<sub1/>
  • [env]セクションには共通の設定を書きます。
  • [env:spresense_mainCore]セクションにはメインコア用の設定を書きます。メインコア用のソースはsrc/mainフォルダに配置します。
  • [env:spresense_subCore1]セクションにはサブコア1用の設定を書きます。サブコア1用のソースはsrc/sub1フォルダに配置します。

サブコア2~を使用する場合は、同様にセクションを増やします。build_flagsにサブコア用のビルドを指示するオプションを指定することに注意してください。

メインコア/サブコアの切り替えとビルド&アップロード

下部のバーにある、プロジェクト環境切り替えボタンをクリックすると、env:spresense_mainCoreenv:spresense_subCore1かを選択できます。それぞれに切り替えてビルドとアップロードをおこないます。

キャプションを入力できます

ところが、アップロードを実行しようとすると下記のエラーが発生しました。これについては次に述べます。

if isinstance(callback, collections.Callable): AttributeError: module 'collections' has no attribute 'Callable'

トラブルシュート

アップロード時のエラー

原因はPythonのバージョンでした。Spresenseへのアップロードをおこなうflash_writer.pyはpython 3.9以前に書かれたもののようで、python 3.10以降の環境ではエラーになります。

アップロードツールはPythonスクリプト以外にOSごとのバイナリもあるのでそちらを使うようにupload_commandplatform.ioに追記します。下記はWindowsの場合です。${platformio.packages_dir} の実際のパスは通常は C:\Users\ユーザ名\.platformio\packages\です。

[env] platform = sonyspresense board = spresense framework = arduino upload_command = ${platformio.packages_dir}/tool-spresense/flash_writer/windows/flash_writer -s -c $UPLOAD_PORT -b $UPLOAD_SPEED -d -n -s $SOURCE

なお、LinuxやMacの場合は、アップロードツールを実行可能なようにパーミッションの設定も必要です。

Library Dependency Finder の設定

条件付きコンパイルするようなソースの場合、ライブラリの依存関係が正しく認識されないことがあります。 例えば、ssprocLibライブラリのサンプルスケッチであるYuruHorn_SubCore1をビルドすると下記のようなエラーが出ます。

LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Scanning dependencies... (中略) .platformio\packages\framework-arduinosonyspresense\libraries\File\src\File.cpp:35: File.h:24:2: error: #error "File library is NOT supported by SubCore."

このような場合、platform.ioに下記を追記して、Library Dependency Finder が条件付きコンパイルを考慮するよう指定するとビルドが通ります。

lib_ldf_mode = chain+

Library Dependency Finder (LDF) についての詳細は下記を参照してください。
https://docs.platformio.org/en/latest/librarymanager/ldf.html

その他の設定

その他の設定については下記を参照してください。
https://github.com/maxgerhardt/platform-sonyspresense

lipoyangのアイコン画像
奈良県在住の組込み系なんでも屋。 そんなことよりハンダ付けしようぜ!
ログインしてコメントを投稿する