sakura.io HAT for Raspberry PiをRaspberry Pi 3で動かすまで
sakura.io HAT for Raspberry Piを使い、Raspberry Pi 3上でさくらの通信モジュールを動かす手順の備忘録です。
通信モジュールの準備と登録
リファレンスを参照して、通信モジュールをプロジェクトに登録しておいてください。この際、サービス連携としてWebSocketを作っておくと、モジュールから送信された値をWebブラウザーからリアルタイムに確認できるため、便利です。
OSの準備
ドキュメントにRaspbian Jessie 2017-03-02とOSバージョンの指定があるので、それに従いました。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を展開した後、ddでmicroSDカードにイメージを書き込みます。
$ 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]とメニューを辿ってください。
なお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
今回は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()でキューの内容をプラットフォームへ送信します。
まとめ
sakura.ioは、公式ドキュメント、APIリファレンス、製品データシート、GitHubのドキュメント、ライブラリのソース内コメントなど、必要な情報は一通り揃っているのですが、それらがあちこちに散らばっています。そのためファーストステップを踏み出すまでのハードルが必要以上に高く感じてしまうため、誰かが入門記事を書いてくれると嬉しいですね。
sakura.io HAT for Raspberry Piを使えばLinux上のPythonでプログラミングができるので、Arduinoに比べると幾分とっつきやすいのではないでしょうか。