Posted at

コマンドラインでArduino開発 : vim + platformio

More than 3 years have passed since last update.

arduino_platformio.png


はじめに

前回inoを使ったコマンドラインからのビルドとアップロードだったが、今回はplatformioを使った方法をメモ。


Platformioについて

inoと同じくplatformioもarduinoの公式ページで紹介されている。現在自分はこちらをメインに使わせてもらっている。

platformioがすごいのは、IDEが必要ないということだ。inoは別途IDEが必要だったがplatformioは必要ない。パッケージとして自動でダウンロードしてくれるのだ。さらにすごいのは様々な組み込みボードをサポートしている。

有名どころはばっちり抑えているようで、STM32 Nucleoなど最近のボードもサポートされている。(http://platformio.org/#!/boards)

ino同様、pythonで書かれており、大きな依存はないので簡単にインストールできる。IDEの導入がない分inoよりも楽だと思う。


  • ubuntu 14.04

  • Mac OSX Yosemite(10.10.3)


platformioの導入


udevの設定 (Ubuntuのみ)

※ シリアル機能を使わない場合はこの項目はスキップしてください

platformioはシリアルモニター機能もある。しかしubuntuの場合、権限の関係上udevルールにファイルを追加しておく必要がある。(http://docs.platformio.org/en/latest/platforms/atmelavr.html)


Linux Users: Don’t forget to install “udev” rules file 99-platformio-udev.rules (an instruction is located in the file).


udevルールファイルのみでもいいが、いろいろなボードのサンプルプロジェクトもあるのでgithubから本体をダウンロードしておく。

# platformioプロジェクトをDL

$ git clone https://github.com/platformio/platformio.git

プロジェクトの中にある99-platformio-udev.rulesをコピー

# udevルールファイルを自身のルールフォルダにコピーする

$ sudo cp ./platformio/script/99-platformio-udev.rules /etc/udev/rules.d/


platformioのインストール

virtualenvの仮想環境下でインストールする。(virtualenv環境構築はこちらにメモしてあるので興味があればみてください。)

# virtualenv作成

$ mkvirtualenv --no-site-package platformio
(platformio)$ pip install platformio
(platformio)$ pip install --egg scons # makeに変わるビルドツール。これも必要みたい。


ビルドしてアップロードしてみる


ボード名を調べる

初期化オプションでボードを指定(--board=<ボード名>)すると色々設定してくれる。自分のボード名がわからなければ一覧を表示できるし、サイトでも調べることができる。

(platformio) $ platformio boards

Platform: atmelavr
---------------------------------------------------------------------------
Type MCU Frequency Flash RAM Name
---------------------------------------------------------------------------
flora8 atmega32u4 8Mhz 28Kb 2Kb Adafruit Flora
protrinket3ftdi atmega328p 16Mhz 28Kb 2Kb Adafruit Pro Trinket 3V/12MHz (FTDI)
protrinket3 atmega328p 12Mhz 28Kb 2Kb Adafruit Pro Trinket 3V/12MHz (USB)
# 以下省略

grepして絞ってもいいし、追加オプションでも絞れる。自分はunoなのでこちらを検索してみる。

(platformio) $ platformio boards | grep uno

uno atmega328p 16Mhz 31Kb 2Kb Arduino Uno

別の例として、nano

(platformio) $ platformio boards | grep nano

nanoatmega168 atmega168 16Mhz 14Kb 1Kb Arduino Nano ATmega168
nanoatmega328 atmega328p 16Mhz 30Kb 2Kb Arduino Nano ATmega328

検索で出てきたtype項目をボードオプションで指定すればいい。


プロジェクトを作る : platformio init

プロジェクトの作成は簡単だ。platformio init --board=<ボード名>で、空のサブフォルダとプロジェクトファイル(platformio.ini)が生成される。platformio.iniのフォーマットは INI fileで、様々なオプションがあり細かい設定ができる。(http://docs.platformio.org/en/latest/projectconf.html)

プロジェクト用の空フォルダを作成

(platformio) $ mkdir uno; cd ./uno

arduinoプロジェクトの作成 (今回は一般的なunoボードで生成)

(platformio) $ platformio init --board=uno

# 自動アップロードを有効にするかどうかの質問。
# あとで`platformio.ini`ファイルを編集して変更することもできる
Would you like to enable firmware auto-uploading when project is successfully built using `platformio run` command?
Dont forget that you can upload firmware manually using `platformio run --target upload` command. [y/N]: y

# プロジェクトディレクトリを変更できるよって案内
The current working directory /home/hoge/uno will be used for the new project.
You can specify another project directory via
`platformio init -d %PATH_TO_THE_PROJECT_DIR%` command.

# コンフィファイルを作る場所は`/home/hoge/uno`だけどいい?って質問。
# 迷わず`y`
The next files/directories will be created in /home/hoge/uno
platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-|
src - Put your source code here
lib - Put here project specific or 3-rd party libraries
Do you want to continue? [y/N]: y

# 成功
Project has been successfully initialized!
Useful commands:
`platformio run` - process/build project from the current directory
`platformio run --target upload` or `platformio run -t upload` - upload firmware to embedded board
`platformio run --target clean` - clean project (remove compiled files)


シリアルポート名を調べる : platformio serialports list

ビルドしたファームウェアはシリアルポート経由でアップロードされる。デフォルトは/dev/ttyUSB0となっているためArudinoを接続した場合、ポート名が違うためそのままだとアップデートに失敗する。そこでシリアルポート名を調べてplatformio.iniに指定しておく必要がある。調べ方はいろいろあるが、platformioコマンドを使って調べてみる。

platformio serialports listコマンドでシリアル情報の一覧が表示される。Description項目からArduinoポートかどうかはわかるはずだ。大抵Ubuntuの場合は/dev/ttyACM0、Macの場合はtty.usbserial-*

(platformio)$ platformio serialports list

: # 省略
/dev/ttyACM0
----------
Hardware ID: USB VID:PID=1a86:7523
Description: QinHeng Electronics USB2.0-Serial

Arduinoのシリアルポート名をplatformio.iniに追記する。オプション名はupload_port

(platformio)$ echo -e "\nupload_port = /dev/ttyACM0" >> platformio.ini


ソース書く

お決まりのLED点滅とシリアル表示。ソースは./srcに入れる。


(platformio)$ vim ./src/sketch.ino
#define LED_PIN 13
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println("Hello Arduino");
digitalWrite(LED_PIN, HIGH); delay(100);
digitalWrite(LED_PIN, LOW); delay(900);
}


ビルドしてみる : platformio run

もしビルドターゲットのプラットフォームパッケージがなければダウンロードをするメッセージが表示されるのでyを入力して取得する。ダウンロード先は~/.platformio/packages


(platformio)$ platformio run
If you like PlatformIO, please:
- follow us on Twitter to stay up-to-date on the latest project news > https://twitter.com/PlatformIO_Org
- give us a star on GitHub > https://github.com/platformio/platformio
Thanks a lot!

[Wed May 6 13:06:53 2015] Processing autogen_uno (targets: upload, platform: atmelavr, board: uno, framework: arduino)
---------------------------------------------------------------------------------------------------------
The platform 'atmelavr' has not been installed yet. Would you like to install it now? [y/N]: y

Installing toolchain-atmelavr package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
Installing tool-avrdude package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
Installing framework-arduinoavr package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
Installing tool-micronucleus package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
The platform 'atmelavr' has been successfully installed!

Downloadが終わるとそのままビルドしてアップロードされる。本体を見るとLEDが点滅しているはず。

        : # 省略

Reading | ################################################## | 100% 0.13s

avrdude: verifying ...
avrdude: 998 bytes of flash verified

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK (H:00, E:00, L:00)

avrdude done. Thank you.

=================================== [SUCCESS] Took 64.38 seconds ===================================


シリアルモニターを使ってみる : platformio serialports monitor

platformioは標準でシリアルモニター機能も備えている。別のminicompicocomなどインストールする必要はないが、ここらへんは好みが分かれるところだと思う。

(platformio)$ platformio serialports monitor -p /dev/ttyACM0 -b 9600

# monitor開始
# 終了するにはCtrl + ]
--- Miniterm on /dev/ttyACM0: 9600,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hello Arduino
Hello Arduino
Hello Arduino
Hello Arduino


その他の機能

パッケージのアップロード、本体のアップグレードもコマンドから簡単にできる。



  • platformio upgrade : platformioのアップデート

(platformio)$ platformio upgrade

You're up-to-date!
PlatformIO 1.4.0 is currently the newest version available.



  • platformio update : パッケージのアップデート

(platformio)$ platformio update

Platform atmelavr
--------
Updating toolchain-atmelavr package:
Versions: Current=2, Latest=2 [Up-to-date]
Updating tool-avrdude package:
Versions: Current=3, Latest=3 [Up-to-date]
Updating framework-arduinoavr package:
Versions: Current=16, Latest=16 [Up-to-date]
Updating tool-micronucleus package:
Versions: Current=1, Latest=1 [Up-to-date]

その他、外部ライブラリが簡単にインストールできたり様々な機能がある。詳しくは公式ドキュメントを是非一読してほしい。


まとめ

すぐに遊ぶための基本コマンドをまとめた。

command
Description

platformio boards
ボード一覧表示

platformio init --board=<ボード名>
プロジェクト作成

platformio run
ビルド(設定により自動アップロード)

platformio run --target=upload
ビルドとアップロード

platformio run --target=clean
クリーン

platformio serialports list
シリアルポート一覧表示

platformio serialports monitor -p <デバイス> -b <ボーレート>
シリアルモニタ


おしまい

今後は外部ライブラリの取り込みや、他プラットフォームのボードを試してみたい。何にせよ簡単に様々な組み込みボードを一つのコマンドラインで開発できるのは嬉しい限りである。



  • Arduino IDE v1.6.4 (2015/05/07)でコマンドラインからのライブラリーインストールなどサポートしたようだ。それでもコマンドラインからの開発をメインにする場合、inoplatformioのほうが使いやすいと思う。