RaspberryPiとArduinoを連携する【Firmata編】
前回のエントリではRaspberryPiとArduinoをUSBシリアルで接続をしてみたというものでした。
すると・・・
@ueponx 綴りは、Firmataね♪
— マツジルシ (@matsujirushi12) 2017年1月1日
ぐえ、スペル適当にしてあとで治そうと思っていたのですが直してませんでした。Johnny-Fiveもスペル違ってたしw。 ってことで、引き続きFirmataでRaspberryPiとArduinoを連携させてみたいと思います。
んでFirmataって?
Firmataとは?
http://firmata.org/wiki/Main_Page
いろいろググってみたところFirmataはシリアル通信を介してPC等のホストマシンから Arduinoやその他マイコンボード等のデバイスを制御するためのプロトコルのようです。
RaspberryPiというかpythonからこのプロトコルを使う場合には
- python-firmata
- pyFirmata
上記2つがあるようです。更新履歴をみるとpyFirmata
のほうが新しいようですのでそれを使用してみます。python-firmata
のメンテナンスは長期間行われていないっぽいですね。
Firmata使用のためのArduino側の準備
以下のドキュメントを見ると
https://raspberrypi-aa.github.io/session3/firmata.html
- Click File->Examples->Firmata->StandardFirmata
- From the Tools->Board menu, select the type of Arduino you are using.
- From the Tools->Serial Port menu, choose the USB port to which your Arduino is connected.
- Click the upload button (it looks like a right arrow, just next to the checkmark) and wait for your sketch to upload. A message in the bottom black windowwill indicate success or failure
- Once the Firmata sketch is loaded on your Arduino, you can test it out with the Firmata Test Program.
という手順で準備ができるそうです。
まずはArduinoIDEを起動します。
メニューバーから【ファイル】→【スケッチ例】→【Firmata】→【StandardFirmata】を選択します。
するとエディタ部分にStandardFirmataのソースコードが表示されます。これを接続したArduinoに書き込みを行います。 このときArduinoを接続したポートとボードタイプを適切にしておく必要があります。
【Ctrl+U】で書き込みを行います。
このようにエラーが無ければ作業は完了です。
pyFirmata
のインストール
続いてはRaspberryPi側でpython環境の Githubのドキュメントを見ながらのインストールになります。
$ sudo pip install pyfirmata Downloading/unpacking pyfirmata Downloading pyFirmata-1.0.3-py2.py3-none-any.whl Requirement already satisfied (use --upgrade to upgrade): pyserial in /usr/lib/python2.7/dist-packages (from pyfirmata) Installing collected packages: pyfirmata Successfully installed pyfirmata Cleaning up...
インストール作業としてはこれで完了です。以下のようにpipのlistで以下のように確認します。
$ pip list (略) pyFirmata (1.0.3) (略)
リスト上に表示されればインストールはできています。 あとはpythonのインタプリタで動作を確認します。 以下では13pinに配置されているLEDのON/OFFを行います。
$ python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from pyfirmata import Arduino, util >>> board = Arduino('/dev/ttyACM0') >>> board.digital[13].write(1) >>> board.digital[13].write(0)
ポートのアクセスですが、
pin13 = board.get_pin('d:13:o') pin13.write(1)
という風にも記載することができます。d:13:o
はデジタル13pinをoutputにするという意味になります。
#!/usr/bin/env python # -*- coding: utf-8 -*- from pyfirmata import Arduino, util import time board = Arduino('/dev/ttyACM0') pin13 = board.get_pin('d:13:o') print('start') pin13.write(1) time.sleep(3) pin13.write(0) time.sleep(3) print('end')
まとめ
使っていて感じたのはFirmataはどちらかというと主従関係がはっきリしている場合に使うのかなと。 Arduino側のコードをほとんど記述しなくてもGPIOなどのポートが自由に使用できるのでそういった意味では実装が容易にできるもメリットだと思います。 接続したArduinoが並列で動作できる点ではシリアルを使っての制御がいいかなと思いますが、データの収受で同期を取るのが面倒かなと思いますが、そのあたりは臨機応変にやるということでしょうか。