lipoyang が 2025年01月17日19時10分53秒 に編集
初版
タイトルの変更
PlatformIOでSpresense開発 (マルチコア対応、トラブルシュート)
タグの変更
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```というファイルに記述します。デフォルトでは下記のようになっています。 ```ini [env:spresense] platform = sonyspresense board = spresense framework = arduino ``` ## マルチコアを使用する場合 メインコアとサブコア1を使用する場合、```platformio.ini```を下記のように修正します。 ```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_mainCore``` か ```env: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_command```を```platform.io```に追記します。下記はWindowsの場合です。```${platformio.packages_dir}``` の実際のパスは通常は ```C:\Users\ユーザ名\.platformio\packages\```です。 ```ini [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](https://github.com/SonySemiconductorSolutions/ssih-music)ライブラリのサンプルスケッチである```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 が条件付きコンパイルを考慮するよう指定するとビルドが通ります。 ```ini lib_ldf_mode = chain+ ``` Library Dependency Finder (LDF) についての詳細は下記を参照してください。 https://docs.platformio.org/en/latest/librarymanager/ldf.html ## その他の設定 その他の設定については下記を参照してください。 https://github.com/maxgerhardt/platform-sonyspresense