読者です 読者をやめる 読者になる 読者になる

RaspberryPiとArduinoを連携する【Firmata編】

RaspberryPiとArduinoを連携する【Firmata編】

前回のエントリではRaspberryPiとArduinoをUSBシリアルで接続をしてみたというものでした。

uepon.hatenadiary.com

すると・・・

ぐえ、スペル適当にしてあとで治そうと思っていたのですが直してませんでした。Johnny-Fiveもスペル違ってたしw。 ってことで、引き続きFirmataでRaspberryPiとArduinoを連携させてみたいと思います。

んでFirmataって?

Firmataとは?

http://firmata.org/wiki/Main_Page

いろいろググってみたところFirmataはシリアル通信を介してPC等のホストマシンから Arduinoやその他マイコンボード等のデバイスを制御するためのプロトコルのようです。

RaspberryPiというかpythonからこのプロトコルを使う場合には

github.com

github.com

上記2つがあるようです。更新履歴をみるとpyFirmataのほうが新しいようですのでそれを使用してみます。python-firmataのメンテナンスは長期間行われていないっぽいですね。

Firmata使用のためのArduino側の準備

以下のドキュメントを見ると

https://raspberrypi-aa.github.io/session3/firmata.html

  1. Click File->Examples->Firmata->StandardFirmata
  2. From the Tools->Board menu, select the type of Arduino you are using.
  3. From the Tools->Serial Port menu, choose the USB port to which your Arduino is connected.
  4. 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
  5. Once the Firmata sketch is loaded on your Arduino, you can test it out with the Firmata Test Program.

という手順で準備ができるそうです。

まずはArduinoIDEを起動します。

f:id:ueponx:20170101212659p:plain

メニューバーから【ファイル】→【スケッチ例】→【Firmata】→【StandardFirmata】を選択します。

f:id:ueponx:20170101212924p:plain

するとエディタ部分にStandardFirmataのソースコードが表示されます。これを接続したArduinoに書き込みを行います。 このときArduinoを接続したポートとボードタイプを適切にしておく必要があります。

f:id:ueponx:20170101213421p:plain

【Ctrl+U】で書き込みを行います。

f:id:ueponx:20170101213725p:plain

このようにエラーが無ければ作業は完了です。

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が並列で動作できる点ではシリアルを使っての制御がいいかなと思いますが、データの収受で同期を取るのが面倒かなと思いますが、そのあたりは臨機応変にやるということでしょうか。