Arduinoはよく知られた小型マイコンで、IoT分野でもよく使われています。そんなArduinoの弱点とも言えたのがネットワーク機能ですが、Arduino YÚNは無線LANと有線LANを備えており、利用範囲が一気に広がったマイコンとなっています。
Arduino YÚNのネットワーク部分は実は組み込み用Linuxで提供されています。そこにはSSHでログインし、ある程度自由にカスタマイズも可能となっています。
そこで今回はArduino IDEで作ったらスケッチから、Linux部分のコマンドを呼び出してmBaaSにデータをアップロードする方法を紹介します。
Linux環境の設定
前述の通り、まずSSHでログインします。ユーザ名はrootで、パスワードはArduino YÚNの初期設定時に指定したものです。
ssh root@arduino.local
ログインして確認すると分かりますが、プログラミング言語としてはLuaまたはPythonがインストールされています。そこで今回はサードパーティ製のNCMBライブラリを利用します。
インストールにはpipが必要なのですがデフォルトでは入っていませんので、インストールします。その後、py_nifty_cloudをインストールします。
# opkg update Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.gz. : Configuring distribute. # opkg install python-openssl : Configuring python-openssl. # easy_install pip Searching for pip : Finished processing dependencies for pip # pip install py_nifty_cloud Collecting py-nifty-cloud : InsecurePlatformWarning
なお、py_nifty_cloudのサポートバージョンはPython 2.7.7ですが、Arduino YÚNに入っているのはPython 2.7.3です。一応動くのですが、保証はありませんのでご注意ください。
設定ファイルの作成
まず設定ファイルを作成します。
# cat nifty_cloud.yml APPLICATION_KEY: '120...e76d' CLIENT_KEY: 'b5f...4c8'
アプリケーションキー、クライアントキーともにmBaaSの管理画面にて確認、置き換えてください。
そしてテスト用のスクリプトになります。こんな簡単なものになります。
# cat test.py #import from py_nifty_cloud.nifty_cloud_request import NiftyCloudRequest # instanciate with yaml file contains APPLICATION KEY and CLIENT KEY ncr = NiftyCloudRequest('/tmp/nifty_cloud.yml') path = '/classes/TestClass' method = 'POST' # post a new recode values = {'key': 'test'} response = ncr.post(path=path, query=values) print(response.status_code)
これを実行してみます。
# python test.py : InsecurePlatformWarning 201
このように表示されればOKです。mBaaSの管理画面にてログインすると、実際にデータが保存できているのが確認できるはずです。
Processingからの実行
では次に考えるのがArduino IDEで使えるProcessingからの実行です。これはProcessオブジェクトのShellCommandを使って行います。例えば次のようなスケッチを書きます。
#include <Bridge.h> #include <Process.h> void setup() { // put your setup code here, to run once: Bridge.begin(); Serial.begin(9600); while (!Serial); } void loop() { // put your main code here, to run repeatedly: Process p; p.runShellCommand("/usr/bin/python /tmp/test.py"); while(p.running()); while (p.available()) { int result = p.parseInt(); Serial.println(result); } delay(5000); }
これを実行すると、シリアルモニターにログが流れていきます。約10秒ごとにデータがmBaaSに追加されていくのが確認できるはずです。
後はPythonのコードを実行する際に引数としてセンサーの値を渡してあげればいいだけです。そうすればセンサーからの取得はProcessingで簡単に、その値はPythonで操作といった仕組みも簡単にできます。何よりArduino本体のメモリでは難しかったHTTPSの扱いもLinux側であれば何も気にすることなく実現します。
ArduinoとmBaaSの連携は複雑そうに見えましたが、Linux側の環境を使うことで容易にできることが分かりました。クラウドサービスが使えるようになれば、Arduinoを使ったIoTの可能性が大きく広がるのではないでしょうか。