2021年4月19日月曜日

PlatformIOでライブラリのサンプルプログラムを実行する方法


背景

PlatformIOとはマイコン向けのビルド環境の1つです。
Arduino IDEと役割が似ていますが、より多機能な環境です。

さて、Arduino IDEより多機能と自分は思うPlatformIOですが、ライブラリのサンプルプログラムの閲覧と実行に関してはArduion IDEの方が勝ると思います。
それでもPlatformIOでサンプルプログラムを実行したい時があるので、方法をまとめてみました。

他に方法があれば、コメントなどで共有していただけると嬉しいです。

前提: ライブラリのコードは .pio/libdeps/[環境名]に配置される

PlatformIOはplatform.iniのlib_depsにライブラリを指定してビルドすると、.pio/libdeps/[環境名]にライブラリのコードがダウンロードして配置されます。

例としてI2cControlPanelのライブラリをlib_depsとして指定します。
この例ではビルド対象としてleonardoを利用します。
platformio.ini
[env:leonardo]
platform = atmelavr
board = leonardo
framework = arduino
lib_deps = I2cControlPanel_asukiaaa

上記の設定でPlatformIOのビルドを実行すると、ライブラリが配置されます。
pio run
Processing leonardo (platform: atmelavr; board: leonardo; framework: arduino)
----------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/leonardo.html
PLATFORM: Atmel AVR (3.3.0) > Arduino Leonardo
HARDWARE: ATMEGA32U4 16MHz, 2.50KB RAM, 28KB Flash
DEBUG: Current (simavr) On-board (simavr)
PACKAGES:
- framework-arduino-avr 5.1.0
- toolchain-atmelavr 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Library Manager: Installing I2cControlPanel_asukiaaa
Library Manager: I2cControlPanel_asukiaaa @ 1.2.3 has been installed!

lsコマンドで見ると配置されているのが分かります。
ls .pio/libdeps/leonardo


この記事ではI2cControlPanelのPrintOnSerialサンプルをビルドします。
leonardo向けにダウンロードされたサンプルプログラムのパスは下記になります。

.pio/libdeps/leonardo/I2cControlPanel_asukiaaa/examples/PrintOnSerial/PrintOnSerial.ino


方法1: platformio.iniでsrc_dirとしてサンプルプログラムのディレクトリを指定する

platformio.iniにplatformioという設定を追加し、そこでサンプルプログラムのディレクトリをsrc_dirに指定します。
このパスにはビルド対象となる環境名をPIOENVマクロで呼び出せるため、下記のように書けます。
platformio.ini
[platformio]
src_dir = .pio/libdeps/${PIOENV}/I2cControlPanel_asukiaaa/examples/PrintOnSerial

[env:leonardo]
platform = atmelavr
board = leonardo
framework = arduino
lib_deps = I2cControlPanel_asukiaaa

パスが合っていればビルドできます。
pio run
Compiling .pio/build/leonardo/src/PrintOnSerial.ino.cpp.o

注意: .pioの該当するディレクトリがダウンロードされてない場合、エラーになります。
ダウンロードよりsrcディレクトリの解釈が先になるようです。


初回のエラーを回避したい場合は下記のライブラリインストールコマンドをビルド前に実行してください。
pio lib install

方法2: src/main.cppでサンプルプログラムをincludeする

cppファイルはincludeを利用してコードの取り込みが可能なので、下記のように記述するとサンプルプログラムをビルドできます。
src/main.cpp
#include <Arduino.h>
#include "../.pio/libdeps/leonardo/I2cControlPanel_asukiaaa/examples/PrintOnSerial/PrintOnSerial.ino"
cppファイルをArduino向けとするため、コードのinclude前にArduino.hを読み込んでいます。
この書き方だとPIOENVマクロは使えないため、環境名をパスに含めています。

パスが合っていればビルドできます。
pio run

方法3: サンプルプログラムをsrc/main.cppにコピーする

この方法はPlatformIOの仕組みは関係ありません。
main.cppの先頭でArduinoフレームワークに必要なライブラリを読み込み、それ以後にビルドしたいファイルを貼り付ければ、PlatformIOでビルド可能なファイルになります。
src/main.cpp
#include <Arduino.h>

// ライブラリのコードをコピー・ペースト

ライブラリのコードを利用しつつ独自の実装に変更したい場合は、この方法が良いと思います。

まとめ

PlatformIOでライブラリのサンプルプログラムを実行する3つの方法を紹介しました。
  • platformio.iniでsrc_dirにサンプルプログラムのディレクトリを指定
  • src/main.cppでサンプルプログラムのコードをinclude
  • src/main.cppにサンプルプログラムをコピペ

他に方法があれば、コメントなどで共有していただけると嬉しいです。

参考

Best way to run examples of a local installed library?

0 件のコメント :