PlatformIOというArduino/mbed/MSP430などに対応したパッケージマネージャ兼ビルドツールをセットアップした。

PlatformIO


http://platformio.org
https://github.com/platformio/platformio

本体はPythonで書かれている。

たしか半年ほど前に気づいたんだけど、githubのArduino関係のリポジトリにlibrary.jsonというファイルを追加するプルリクが大量に送られていた。何だこりゃと思ったらplatformioの中の人が新しいパッケージマネージャ作ったから〜と送りまくっていた。library.jsonはNode.jsのpackage.jsonを参考にしているらしくてだいたい同じ仕様になっている。

地道な努力のおかげかすでに260個もライブラリが登録されている

そもそもArduinoにはパッケージマネージャなどという物は存在していなくてzipでダウンロードしてArduino.appの中に突っ込むという感じだった。ライブラリが簡単にインストールできるだけでもとてもありがたい。library.jsonには別ライブラリへの依存関係も書けるので、単一巨大でモノリシックではない小さなライブラリを作るのも楽になりそう。

ビルドツールとしても、inoと違ってArduino IDEを使わず、ビルド環境をプロジェクトルートのplatformio.iniに基いて自前でセットアップしてくれるので、GitHubにプルリクが来たらCIサービス上でビルドする、とかできるはず。便利そう。


インストール


参考:Installation — PlatformIO 2.2.0 documentation

環境はMac OSX Yosemiteで最初から入っているPython2.7.9を使っている。

% pip install platformio
% pip install --egg scons
これでplatformioコマンドが使えるようになった。
pipはPythonのパッケージマネージャでeasy_installの置き換えとして出来た物らしい。


プロジェクトを作る


その前にターゲットのマイコンボードを確認しておく。Arduino Microでやりたいので
% platformio boards | grep -i micro

たくさん出てきた。Blend Microもある。他にDigisparkやTIのMSP430等もあった。

micro atmega32u4 16Mhz 28Kb 2Kb Arduino Micro
168pa16m atmega168p 16Mhz 15Kb 1Kb Microduino Core (Atmega168PA@16M,5V)
168pa8m atmega168p 8Mhz 15Kb 1Kb Microduino Core (Atmega168PA@8M,3.3V)
328p16m atmega328p 16Mhz 31Kb 2Kb Microduino Core (Atmega328P@16M,5V)
328p8m atmega328p 8Mhz 31Kb 2Kb Microduino Core (Atmega328P@8M,3.3V)
32u416m atmega32u4 16Mhz 28Kb 2Kb Microduino Core USB (ATmega32U4@16M,5V)
1284p16m atmega1284p 16Mhz 127Kb 16Kb Microduino Core+ (ATmega1284P@16M,5V)
1284p8m atmega1284p 8Mhz 127Kb 16Kb Microduino Core+ (ATmega1284P@8M,3.3V)
644pa16m atmega644p 16Mhz 63Kb 4Kb Microduino Core+ (Atmega644PA@16M,5V)
644pa8m atmega644p 8Mhz 63Kb 4Kb Microduino Core+ (Atmega644PA@8M,3.3V)
blendmicro16 atmega32u4 16Mhz 28Kb 2Kb RedBearLab Blend Micro 3.3V/16MHz (overclock)
blendmicro8 atmega32u4 8Mhz 28Kb 2Kb RedBearLab Blend Micro 3.3V/8MHz
uview atmega328p 16Mhz 31Kb 2Kb SparkFun MicroView
sparkfun_promicro8 atmega32u4 8Mhz 28Kb 2Kb SparkFun Pro Micro 3.3V/8MHz
sparkfun_promicro16 atmega32u4 16Mhz 28Kb 2Kb SparkFun Pro Micro 5V/16MHz


ディレクトリを作ってinitする

% mkdir tmp
% cd tmp/
% platformio init --board micro
–boardオプションは複数指定できるらしい。
ビルド成功後に自動的にボードに書き込むか質問される。yesにしておいた。


コードを書く

src/にあればファイル名は何でもいいっぽい

src/main.ino
void setup(){
pinMode(13, true);
}

void loop(){
digitalWrite(13, true);
delay(500);
digitalWrite(13, false);
delay(500);
}


ビルド

% platformio run
最初にrunした時、Arduinoのビルド環境を自動でセットアップしはじめる。すぐ終わる。
~/.platformio/ に保存されていて、 .pioenvs/ にコピーされる。

ビルド成功すると自動的にArduino Microに書き込まれてプログラムが動き出す。この設定は platformio.ini に書かれている。

自動アップロードを無効にしている場合はtargetにupload指定でできる。
% platformio run --target upload

逆にアップロードしない場合は
% platformio run --target ./
もともと–targetはビルドするソースコードがあるディレクトリを指定するオプションみたいだけど、uploadが指定された時だけカレントディレクトリをビルドしてArduinoに書き込むらしい。あとclean指定で中間ファイル削除とか。なんか実装がやっつけっぽい?


ビルド環境


今使っているビルド環境の情報はplatformsコマンドで確認できる
% platformio platforms list
% platformio platforms show atmelavr


ライブラリのインストール


ArduinoをMIDIデバイス化してみたかったので、何か無いか探してみる
% platformio lib search midi
% platformio lib install 62
ライブラリは通し番号で管理されているらしい。名前が重複しても良いようにする為か?

これをインストールしてみた。
http://platformio.org/#!/lib/show/62/MIDI

いきなり src/main.ino 内で #include <MIDI.h> と書いて使えた。
でもこのライブラリはデジタルIOをMIDI化する物だったので、欲しかったのとちょっと違う。
まあとりあえずライブラリのインストールが一発でできて、すぐ使える事がわかった。


気になる事

ライブラリは ~/.platformio に保存されてグローバルに使われる。プロジェクト毎にどのライブラリのどのバージョンを使っているかを記録する仕組みが無いみたい。
プロジェクト毎に使用ライブラリのバージョンを固定して、別のマシンでも同じライブラリを一発でインストールできるようになってないと、あるプロジェクトでupdateをかけたら別のプロジェクトがビルドできなくなったりするので良くないと思う。
ライブラリ作者も、後方互換性が無いアップデートができないので実装速度が落ちる。

ライブラリを公開する時にメタデータを書くlibrary.jsonには別ライブラリをdependenciesプロパティで指定できるみたいなので、たぶんそのうちplatformio initで作ったプロジェクトにも依存解決機能が付くと思う。

まあ現状でもinoと同等の機能を持っていて、Arduino IDEに依存してない分だけinoより良さげ。