Hatena::ブログ(Diary)

May the Source be with you このページをアンテナに追加 RSSフィード

2017-12-19 sakura.io HAT for Raspberry PiをRaspberry Pi 3で動かすまで

sakura.io HAT for Raspberry Piを使い、Raspberry Pi 3上でさくら通信モジュールを動かす手順の備忘録です。

f:id:MIZUNO:20171219115614j:image

通信モジュールの準備と登録

リファレンスを参照して、通信モジュールをプロジェクトに登録しておいてください。この際、サービス連携としてWebSocketを作っておくと、モジュールから送信された値をWebブラウザーからリアルタイムに確認できるため、便利です。

OSの準備

ドキュメントRaspbian Jessie 2017-03-02OSバージョンの指定があるので、それに従いました。2017-03-02版のRaspbianはこちらからダウンロードできます。

実際はOSのバージョンというよりもカーネルのバージョンの問題のようで、カーネル4.4.50-v7+以降だとI2Cが動作しないようです。ためしに2017-11-29-raspbian-stretch-lite.imgで試してみた所、記載の通り

OSError: [Errno 121] Remote I/O error

が発生して動作しませんでした。

zipを展開した後、ddmicroSDカードにイメージを書き込みます。

$ unzip 2017-03-02-raspbian-jessie-lite.zip
$ sudo dd if=2017-03-02-raspbian-jessie-lite.img of=/dev/(microSDのデバイス名) bs=1M
$ sync

最近のRaspbianはセキュリティ上の理由から、デフォルトSSHサーバーが無効になっています。SSHサーバーを自動的に有効にしたいのであれば、/bootパーティションssh(ないしはssh.txt)という名前の空ファイルを作成します。このあたりの処理は本筋から外れるので省略します。もしも気になるのであれば、/lib/systemd/system/sshswitch.serviceを見てみるとよいでしょう。

I2Cの有効化

Raspberry PiのI2Cはデフォルトで無効になっているため、raspi-configコマンドでこれを有効にします。

raspi-configコマンドを実行すると対話的なメニューが表示されますので、[5 Interfacing Options] → [P5 I2C] → [Yes]とメニューを辿ってください。

f:id:MIZUNO:20171219114742p:image

なおraspi-configコマンドは、引数にnonintを指定すると内部の関数コマンドラインから直接呼び出せます。do_i2c関数引数0を渡すとI2Cを有効化できるため、以下のコマンドを実行するのもお手軽でおすすめです。

$ sudo raspi-config nonint do_i2c 0

パッケージとライブラリインストール

このバージョンのRaspbianにはPython2のみがプリインストールされているため、敢えてPython3をインストールすることはせず、Python2をそのまま使うことにします。

以下のコマンドを実行します。

$ sudo apt update
$ sudo apt install python-pip python-smbus
$ sudo pip install sakuraio

面倒なのでsudoでpipを実行してしまっていますが、ユーザーディレクトリに環境を構築したい場合は--userを使う等して、各自よしなにしてください。

サンプルスクリプトの作成

Pythonスクリプトを作成して、プラットフォームに値を送信してみましょう。以下のスクリプトをsample.pyとして保存し、実行してください。チャンネル0にintの0が送信されます。

#!/usr/bin/python

from sakuraio.hardware.rpi import SakuraIOSMBus

sakuraio = SakuraIOSMBus()

print(sakuraio.get_unique_id())
print(sakuraio.get_firmware_version())
print(sakuraio.get_connection_status())

onlinestatus = sakuraio.get_is_online()

if onlinestatus == True:
    sakuraio.enqueue_tx_raw(0, "i", [0])
    sakuraio.send()

実行例

16AXXXXXXX
v1.0.0-161109-c566dba
128

f:id:MIZUNO:20171219114738p:image

今回はI2Cを使うので、SakuraIOSMBusをimportしています。

get_unique_id()モジュールシリアル番号、get_firmware_version()モジュールファームウェアバージョンを取得できます。

get_connection_status()で現在の接続状態を取得できます。接続状態は8ビットで表され、最上位ビットが接続状態(0=オフライン/1=オンライン)で、残りの7ビットがエラーコードとなっています(オンラインかつエラーなし=128)。

get_is_online()は内部でget_connection_status()を呼んでおり、0x80で最上位ビット以外をマスクした結果をbool値として返しているだけです。このあたりのデータ構造について、詳しくはデータシートを参照してください。

enqueue_tx_raw()送信チャンネルとデータタイプ、送信データを送信キューにキューイングします。send()でキューの内容をプラットフォーム送信します。

ハードウェアAPIについて、詳しくはドキュメントを参照してください。

まとめ

sakura.ioは、公式ドキュメントAPIリファレンス製品データシートGitHubのドキュメントライブラリのソース内コメントなど、必要な情報は一通り揃っているのですが、それらがあちこちに散らばっています。そのためファーストステップを踏み出すまでのハードルが必要以上に高く感じてしまうため、誰かが入門記事を書いてくれると嬉しいですね。

sakura.io HAT for Raspberry Piを使えばLinux上のPythonプログラミングができるので、Arduinoに比べると幾分とっつきやすいのではないでしょうか。