前日の「信号品質問題」により60cm長の3本組ケーブルが余りました。この有効活用をかね、以前から試してみたかったArduinoのFirmataというものを動かしてみました。ホストに接続したマイコンのIOなどをホストから自在に制御するためのプロトコルというかライブラリです。これでラズパイからArduinoを手足(手下?)にできる。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
Firmata というプロトコルについて書かれているのがGitHubの以下のページです。
プロトコルなので、これに準拠したマイコン側のファームウエアを開発すれば、任意のマイコンシステムを既存のホスト側クライアントソフトウエアを利用して制御できるはずです。ベースとなったのはMIDIシステムの通信の仕組みだったみたいです。また逆に、準拠するファームウエアを搭載したマイコンシステムがあれば、マイコンの中はブラックボックスのまま所望のIO操作を行わせるホスト側のカスタムクライアントを開発することもまた可能ということであります。
とはいえFirmataのマイコン・ファームやホスト・クライアントを自力ですべて作成するのは時間がかかります。特定のシステム、Arduinoであれば、ライブラリなどが充実しているので、ほとんど何もせずに Firmata を使い始めることが可能です。
Arduinoの場合
制御対象のマイコンがArduino環境でファームウエアを構築されるマイコンであるならば、標準でArduino IDEにインストール済であろう以下のライブラリを利用することができます。
ホストとマイコン間のプロトロルの処理は上記のライブラリを呼び出すだけで済みます。マイコン上の処理はコールバック関数として呼び出されるスタイルです。hostと通信してコマンドを受け取ってArduinoを動かすカスタムファームウエアを作るのは容易だと思います。
しかし実際には、カスタムファームウエアなどを自分で書かなくても、標準的なFirmata操作(デジタル、アナログの端子を読み書きするなど)は即利用可能です。上記のライブラリを利用して、プリミティブな操作がいろいろできるようになっているFirmataのサンプル「スケッチ」もインストールされているからです。それらをビルドしてArudinoに書き込めば、まったくコードを書くことなくFirmata対応Arudino機となります。
Arduino IDEから Firmata のスケッチ例を開いているところがこちら。
今回、Arduino Uno(珍しく純正品)上へFirmataを実装するにあたっては、上記のStandardFirmataを使わせてもらい、動作確認をいたしました。
通常ホストとの通信にはUartを使用、デフォルト速度は115200bpsです。これで60cmのケーブルの使い道ができました。上記のスケッチ例のリストを見るとUart以外にもBLEやWiFiなどの対ホスト通信も可能であるようです。ただし、必要とされる通信ハードウエアがArduino機に接続されていればですが。
Firmata専用Arduino互換機の確保
ただ、開発機としての位置づけ?のArudino Unoの純正品にFirmataを書き込んでホストのお供固定にしてしまうのはためらわれます。しかし、以下の投稿にて、Arduino互換のカスタムボードを「お安く」作れるルートを確立?しました。特定目的の「先っぽ」機を作りFirmata書き込んでホストの手足として専用機にするのはアリでしょう。
部品屋根性(48) ATmega328P、ブートローダ書込済、ラベル付
これで手元にあるラズパイ3、4 に周辺デバイス制御用のArduino機を接続することができます。さすれば、
-
- ラズパイ3、4 に無いアナログインタフェースが使える
- ラズパイ3、4に直接接続しずらい5V電圧のデバイスを接続できる
- Arduinoの充実のライブラリを使って、各種デバイスとのインタフェースをとることができる。
- ホスト側の負荷をいくらか減らせる
と期待できます。
1点注意はUart端子の信号レベルです。ラズパイ3、4側が3.3V、Arduino側が5VのIO電圧であります。今回実験には、とりあえず秋月製の「変換ボード」利用しましたが、ぶちゃけNMOSトランジスタ1個で3.3Vと5Vの変換を行う回路です。NMOSトランジスタは手元在庫がかなりあるので、同等な変換器を御手製のArduino互換機に搭載するのは簡単。
とりあえず純正Arduino Unoと秋月製変換ボードとブレッドボードで構成したArduino側がこちら。
ホスト(ラズパイ4)側クライアント・ソフトウエア
ラズパイ4(実験使用機はRaspberry Pi OS 32bit)上でFirmataに指示を出す方は、Python3上で動作するスクリプトとしたいです。お手軽。
さて先ほど出てきた firmata/protocol のページの Firmata client libraries なる項目を参照するとPython上でFirmataのクライアントにできるソフトウエアモジュールは5種類もあるようです。今回はその中から以下を選択しました。
理由は簡単、pipでインストールできるので(使っている人も多そうに見えたので。。。)ラズパイ4上でのインストールはpipで一発。こんな感じ。
$ sudo pip3 install pyfirmata Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting pyfirmata Downloading https://files.pythonhosted.org/packages/14/f0/05e30c9cee38f9c0e8ef08a07ff28e4c391c7d95e2bcb1f334f58cc2bb28/pyFirmata-1.1.0-py2.py3-none-any.whl Requirement already satisfied: pyserial in /usr/lib/python3/dist-packages (from pyfirmata) (3.4) Installing collected packages: pyfirmata Successfully installed pyfirmata-1.1.0
ホストであるラズパイ4のUartは
/dev/serial0
でアクセスできるプライマリのUartを使います。
-
- GPIO14がTXD
- GPIO15がRXD
例の60cmのケーブルをここに接続します(もちろん、Arduino側とTXD, RXDがクロスするように。)なお、raspy-configなどで、ラズパイ4上でUartを使えるように有効化(かつ、コンソール接続にならないように)しておかないとなりません。ラズパイ4からUartの信号を引き出しているところをアイキャッチ画像に(となりにSWD接続のラズパイPicoがいますが無関係)掲げました。
さてPython3のREPLから、ArudinoのFirmataに接続し、D13端子(オンボードのLEDが接続されている)をON、OFFして手動Lチカさせているところがこちら。
$ python3 Python 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pyfirmata import Arduino, util >>> board = Arduino('/dev/serial0') >>> board.digital[13].write(1) >>> board.digital[13].write(0)
Lチカしてます。Firmata動作しているみたい。Firmata専用の「Arduino互換機」を作って、Arduinoに周辺デバイスを接続し、ラズパイ4から制御してみるのは次回ですかね。どこまでやるかね。