Firmataの背景
ArduinoとPCが一緒に仕事をするには通信することが必要だ。
今、日本国内でのArduinoの使われ方において、PCはスケッチを書き、できあがったプログラムをアップロードする役割しかもっていない場合が多い。
それはArduinoが単体でいろんなことができるという面に着目したものだ。しかし、ArduinoとインターネットにつながったPCを考えると、ArduinoをPCからコントロールする必要がある。具体的にいうと、PCからArduinoのピンのモードがセットでき、出力、入力ができるということ。
ArduinoにつながったUSBはシリアル通信である。シリアル通信でコントロールする標準的なプロトコルがFirmata(フェルマータ)である。
ArduinoとFirmataは強い関連をもっていて、Arduinoの標準ライブラリーにFirmataを実現したものがあるし、サンプルに完全にPCからArduinoをFirmataプロトコルで操作できるファームウェアも準備されている。
さて、日本国内でFirmata.orgの文献の翻訳を見つけることができなかった。
面倒くさいけど、少しやっておくことにする。
<h2>MIDI
その前に少しMIDIについて勉強。なぜならば、FirmataはMidiを踏襲したプロトコルだからである。
MIDIで使用されるデータは「ステータスバイト」か「データバイト」の大きく2種類に分けられる。ステータスバイトとはMSB(Most Significant Bit:最上位ビット)が「1」の80H〜FFHまでの128種類の数値を指し、データバイトとはMSBが「0」、すなわち00H〜7FHまでの128種類のバイトを指す。
MIDIメッセージの先頭は常にステータスバイトで始まり、ステータスバイトの後に任意の個数のデータバイトが続く。ステータスバイトでは、機器の動きを定義する。データバイトは、ステータスバイトで定義したものについて、その内容や数値を指定するのに使用する。
ステータスバイトが80H〜FFHのうち何であるかによって、「チャンネルメッセージ」、「システムメッセージ」に分かれ、機器の指定などを行うが、Firmataの場合はピン、ポートの指定となっている。
なお、SysexとはMidiにおいては機器固有の機能を制御するために使用される。データとしては16進数の「F0」ではじまり「F7」で終了する。
Firmaプロトコル
さて、Firmataの
FirmataがカバーするI/Oピンは以下のとおり。
- 16アナログピン
- 128デジタルピン(8ビットポートx16)
FirmataプロトコルはMIDIメッセージフォーマットを踏襲しているが、すべてのプロトコルをサポートしているわけではない。以下にほとんどのコマンドを記載するが、MIDIコントローラやシンセサイザーにはそのまま使えるわけではない。狙いはMIDIと共存して問題が起きないようにしていることと、MIDIインタープリターでもきちんと分解できることである。メッセージデータによっては違う使い方をしている。
MIDIについては、http://www.harmony-central.com/MIDI/Doc/table1.html
| タイプ | コマンド | チャネル | 第一バイト | 第二バイト | |
| アナログI/Oメッセージ | 0xE0 | pin番号 | LSB(bits0-6) | MSB(bits 7-13) | |
| デジタルI/Oメッセージ | 0×90 | Port | LSB(bits 0-6) | MSB(bits 7-13) | |
| レポートアナログピン | 0xC0 | pin番号 | disable/enable(0/1) | - n/a - | |
| レポートデジタルピン | 0xD0 | port | disable/enable(0/1) | - n/a - | |
| sysexスタート | 0xF0 | ||||
| セットピンモード(i/o) | 0xF4 | pin # (0-127) | pin state(0=in) | ||
| sysexエンド | 0xF7 | ||||
| プロトコルバージョン | 0xF9 | メジャーバージョン | マイナーバージョン | ||
| システムリセット | 0xFF |
| タイプ | コマンド | 第一バイト | 第二バイト | … | |
| 文字列 | 0×71 | 文字列… | |||
| ファームウェア名/バージョン | 0×79 | メジャーバージョン | マイナーバージョン | 文字列… |
データ構造
デジタル2バイトデータ
- 0 デジタルデータ 0×90-0x9f
- 1 デジタルピン 0-6 ビットマスク
- 2 デジタル 7-13 ビットマスク
アナログ14ビットデータ
- 0 アナログピン 0xE0-0xEF
- 1 アナログ下位 7ビット
- 2 アナログ上位 7ビット
バージョンレポート
- 0 バージョンレポートヘッダー(0xF9)
- 1 メジャーバージョン(0-127)
- 2 マイナーバージョン(0-127)
コントロールメッセージ
セットピンモード
- 1 セットピンモード(0xF4)
- 2 ピン番号(0-127)
- 3 状態 (INPUT/OUTPUT/ANALOG/PWM/SERVO, 0/1/2/3/4)
ピン毎のアナログ入力レポートの切り替え
- 0 デジタルにゅうryク レポート切り替え(0xC0-0xCF)
- 1 disable(0)/enable(non-zero)
ピン毎のデジタルポートの切り替え
- 0 デジタルポートレポートの切り替え(0xD0-0xDF)
- 1 disable(0)/enable(non-zero)
バージョンレポートの要求
- 0 バージョンレポート要求(0xF9)
SysEX
SysExはSysExスタートバイトの次のSysExコマンド部分を二番目のコマンドスペースと考える。データはどんなサイズでもよい。
- 0 START_SYSEX (0xF0)
- 1 コマンド(0×00-0x7F)
- x 0からMAX_DATA_BYTESまでの長さで7ビットバイトデータ
- 最後 END_SYSEX (0xF7)
後は必要に応じて翻訳。。。

