【Edison】Edisonで計測した加速度情報をOSCでoFに送信する

最近耳にするようになった「IoT(Internet of Things)」。しかしARや人工知能と比べると技術ではなく概念であるため漠然としている感じも否めません。そのためIoTって結局何?という思う方も多いのではないでしょうか。ただ企業のCMなどでもIoTの文字がやっと見え始めてきたので、まだまだこれからの分野だと思います。
 
今回は、IoTデバイスであるInetel社の極小コンピュータ「Edison」で加速度を計測し、その情報をopenFrameworks(以下、oF)にOSC通信で送ってみたいと思います。Edisonについてはこちらを参照ください。

(1) Edisonセットアップ

セットアップについては、多くの記事が出回っていますので、ここでは軽く触れさせていただきます。この作業の過程で特に躓いた点は最後にまとめて記述しますので、併せて参照ください。 

・ ファームウェアアップデート
使用したイメージは以下の通りです。
 
初期設定時はusbケーブルで接続しシリアル通信でログインします。
接続が完了したらログインします。
ログイン後、ファームウェアを書き換えます。
 
・ Edison設定
基本設定とwifi設定(wifiのみの設定はconfigure_edison –wifi)
→ifconfigコマンドでネットワーク環境を確認
 
その後は割り当てられたIPアドレスまたはホスト名でSSHログインが可能です。
 or

 

(2) Edisonの組み立て

Edisonだけでは加速度情報は取得できませんので、加速度センサーを取り付けます。また、便宜的にバッテリーを搭載します。今回センサー/バッテリーはSparkfun社から販売されているものを使用しました。
 
 加速度センサー
 バッテリー

 

Edisonに付属するネジとナットだと微妙に数量と長さが足りなかったので、市販のナットと小ネジを駆使して3点を組み立てましたが、Sparkfunから専用のネジも販売されているのでこちらを使うとより簡単に組み立てられると思います。ちなみにネジ/ナットの直径は1.7mmです。

組み立て後はこのような感じになります。
後述しますが、この状態だと途中で「同じWi-Fiに入っていないから設定し直したいけど、SSHでログインできない!」となってもシリアル通信はできないので、ご注意ください。その場合は、都度付属のBreakoutボードに付け替えてUSB接続するか、Sparkfun社から販売されているBase Blockを重ねて組み立てるのも一つの方法です。
ちなみにですが、バッテリーはもって2~3時間程度。短いですね。。

 

(3) 送信側の実装(Edison)

それでは加速度情報の取得とOSC通信のためにEdisonにライブラリ等を組み込んでいきます。使用ライブラリは以下の通りです。どちらもC++となっています。
 加速度取得
 SparkFun_9DOF_Block_for_Edison_CPP_Library-master
 (C++)
 OSC通信
 OSCpack (C++)
 
加速度取得のライブラリは使用したSparkfun社の加速度センサー(9 Degrees of Freedom)のページからダウンロード可能です。

 

 

OSCpackは公式サイトからダウンロード

 

今回使用したファイルの一覧は以下の通りです。
 SparkFun_9DOF_Edison_Block_Example.cpp
 今回編集したファイル
 SFE_LSM9DS0.cpp
 SFE_LSM9DS0.h
 SparkFun_9DOF_Block_for_  
 Edison_CPP_Library
 IpEndpointName.cpp
 IpEndpointName.h
 NetworkingUtils.cpp
 NetworkingUtils.h
 OscException.h
 OscHostEndianness.h
 OscOutboundPacketStream.cpp
 OscOutboundPacketStream.h
 OscTypes.cpp
 OscTypes.h
 PacketListener.h
 TimerListener.h
 UdpSocket.cpp
 UdpSocket.h
 OSCpack

 

それでは9軸センサーのSparkFun_9DOF_Edison_Block_Example.cppを編集していきます。各軸の値はインスタンス化したimuから読み出せます。加速度であれば、imu->calcAccel(imu->ax)のようなで値を取得可能です。このままでもコンパイルすれば9軸の値(加速度、角速度、地磁気)は取れますが、今回は加速度情報のみを抽出し、またわかりやすくするため、加速度センサーの各軸の値を合成し、3軸合成値(S[g])に変換します。3軸合成値にすると、静止時はほとんど1を示し、投げ上げると0(無重力)に近い値を示します。

実際のコードは以下の通りです。

編集したファイルとライブラリをEdisonに組み込みます。Edisonを起動し、SSHでログインしましょう。その後はCyberduck などを使用し、Edisonに割り当てられたIPアドレスで接続すれば簡単にファイル転送できます。

(4) 受信側の実装(oF) 

次に受信側となるopenFrameworks側の実装を行います。ofxOscをAddonとして組み込んでおくことを忘れずに行いましょう。PORT番号はEdison側と合致させます。今回は受信した加速度情報をとりあえずログ出力させてみたいと思います。
 
【ofApp.h】
【ofApp.cpp】

 

(5) 動作確認

それでは、Edison側のファイルをコンパイルし、値を受け取れているか確認してみましょう。まずSparkFun_9DOF_Edison_Block_Example.cpp以外は実行ファイルにしておきます。例のような感じです。

それでは、ファイルをコンパイルします。

testという実行ファイルが作成されると思いますので、そのファイルを実行します。

 

最後にoF側をビルドします。
ログを見ると以下のように加速度情報が受信できていると思います
Edisonのバッテリーの持ちが非常に短いので、なんとも言えませんが、
ボールやおもちゃなどの小物などに組み込んだりすると、
Edisonの特徴を生かしたIoTの使い方ができるのではないかと思います。

 Tips

・Edisonファームウェアの落とし込み
最新のファームウェアだとEdisonに組み込む際、メモリがいっぱいですとエラーが出てしまいます。初期化や隠しファイルなどを削除してもエラーが消えなかったため、旧バージョンのWeekly-149(edison-image-ww18-15)を組み込みました。
 

●この記事を書いた人