2015.01.14
Raspberry Piを使ったArduinoのバルクライター
Kickstarterプロジェクトのロボットを大量に生産しなければならず、何千個ものArduinoにプログラムを書き込む必要が生じた。ひとつひとつやっていたのでは永遠に終わらない。こんなときこそ、本業の製品作りと同じぐらい楽しいメタプロジェクトのチャンスだ。こんなものを作ろうと思った。
- 複数のArduinoに同時にプログラムを書き込める。
- 画面を使わない。
- 書き込みに成功したかどうかを知らせてくれる。
- 簡単で素早く使える。
ポゴピンは、プリント基板に臨時にコネクトしたいときに便利だ。私はすぐにこれを使うことを決めた。Arduinoを固定するために、レーザーカットで小さな留具を作った。ユーザーインターフェイスはシンプルにしたいので、LEDで光るアーケードゲームタイプのボタンを使うことにした。若者の改造車みたいだが、Arduinoのプログラマーとしてちゃんと働いてくれる。あとは、レーザーカットで全体のフレームを作った。Arduinoを差し込んでボタンを押すだけでよいように作った。書き込みが終わるとボタンが点灯する。成功すればそのまま点灯を続け、失敗したときは消える。
各ポゴピンの組に対応させたシリアルコンバーターにUSBをつなぎ、すべてをUSBハブに接続する。ユーザーインターフェイスを駆動するために、Arduinoのための簡単なスケッチを書いた。外部LEDのコントロールと、ボタンを押したときのイベントを発生させるものだ。これもUSBハブに接続し、そいつをRaspberry Piにつないだ。
Node.jsで、こうした並列処理に適した簡単なソフトを書いた。これが行うのは、UI用Arduinoとのコミュニケーションと、ボタンが押されたときに、正しいポートのサブプロセスでAVRDUDEを実行すること。これにより、UI用Arduinoが対応するLEDを点灯させ、外部プロセスからのコードの返り値を見て、成功か失敗かを表示する。
これらをすべて組み上げたあとは、ランタイムで起動するよう伝えることだ。それには crontabを使った。ここで唯一複雑なのが、ひとつのUSBポートに常に同じIDが割り当てられるようにすることだった。幸いなことに、Linuxでは、これはudevスクリプトで対応できた。USBハブのどこにデバイスが挿入されているかによってsymlinkが生成される。つまり、USBをリブートしても、シリアルコンバーターでは同じ名前が保持されるわけだ。
それぞれ独立して処理されるため、次々に挿入してボタンを押せば、即座に書き込みが行われる。5つめのArduinoを入れるころには、最初のやつの書き込みが終わってる。並列処理なので、ひとつのArduinoの書き込みは数秒で済む。通常はひとつで30秒ほどかかるところだ。
すべてオープンソースなので、同じようなものを作りたい方はご自由に。
他のタイプのArduino用にプログラムを変更しても、ソフトウェアはそのまま使えるはずだ。シリアルポートはいくつでも増やせるようになっている。
[原文]