IoTLT アドベントカレンダー 2020のアンカーでございます。
まずは無事に掲載できることを心から安堵しております。なんせ、完全見切り発車でエントリーしたもんだから。
やったことは「KeiganMotorでリモート雲台」
KeiganMotorをMQTTでリモート操作できるようにしました。
構成
LTEモデム搭載しているマイコン「Wio LTE JP Version (以下、Wio LTE)」とKeiganMotorをI2Cで接続し、IoT データ通信「SORACOM Air」とデータ転送サービス「SORACOM Beam」を使ってMQTT経由でKeiganMotorを操作します。
各要素の解説
KeiganMotor
KeiganMotorは BLE / USBシリアル / I2C で操作できるモーターモジュールです。
"0.3N・m" というトルク(力)で動くそうです。このトルク、全然イメージがわかないので比較を探すと、見つかったのはミニ四駆のモーターでした。ライトダッシュモーターPRO1のトルクは1.9mN・m(0.0019N・m2)とのことで、あのミニ四駆のモーターよりも力強く動くという理解です。
Wio LTE JP Version
Wio LTE JP Version(以下、Wio LTE)は、LTEモデム搭載のマイコンです。
Arduino IDEやPlatform IOで開発できます。Groveコネクタを持っており、色々なセンサーやモジュールを接続できます。UARTやI2Cもあるため、それらのI/Fを持った機器との通信にも活用できます。
Wio LTEは3.3V動作です。I2CはPULLUPされているため、M5Stackと同様に直接接続が可能できました。
SORACOM Air / Beam
SORACOM AirはSORACOMが提供しているデータ通信サービスです。IoTデバイスで3G/LTEやSigfoxが利用できるようになります。
また通信だけでなく、暗号化や通信先(エンドポイント)の管理を行ってくれるデータ転送サービス「SORACOM Beam」を始めとした、IoT開発の面倒なところを肩代わりしてくれるプラットフォームサービスが利用できます。
今回はSORACOM AirはLTE通信に、そしてSORACOM Beamはエンドポイント管理の肩代わりとして使っています。shiftr.io(後述)への接続情報であるアドレスやトークンをWio LTEのスケッチから無くすことができるので、コードをそのまま公開できますし、アドレスやトークンが変わってしまってもスケッチを編集しなくても対応できます。
shiftr.io
shiftr.ioはデバイス間メッセージングプラットフォームです。いわゆるマネージドMQTTサービスです。MQTT(S)/HTTP(S)/WebSocket(S)をサポートしています。
手軽なMQTTサービスが無いかと探していたら MQTTブローカー shiftr.io の新バージョンをチェックしてみる! 〜デスクトップアプリ編〜を発見し、SORACOM Beamでの接続チェックをしたら一瞬でつながったので利用してみました。
仕組み
コードはGistで公開しています。
Wio LTEからSORACOM Beamを経由してMQTT接続してトピック /DEVICE_ID/command
をsubscribeします。PC等の他環境から /DEVICE_ID/command
に対してJSONをpublishし、Wio LTEで受け取ったら中身に応じて実行する流れです。
KeiganMotor のマウント
KeiganMotorは底面にUNC1/4インチねじ穴3がありまして、カメラ用の機材と接続可能です。
また、私が購入した [KM-1U] カメラアダプタキットなら、KeiganMotorの上部に同様にUNC1/4インチねじ穴による取り付けができます。
GoPro(TM)のマウンターも使えるようになるので、いろんなものを付けられるのではないでしょうか。
エッジAIカメラ「S+ Camera Basic」を取り付けた時の様子を動画にしておきました。
KeiganMotor を Wio LTE を I2C で接続する
前述した通り、Wio LTEは3.3V動作で I2C がPULLUPされているため直接接続できました。
ケーブルはKeigan社から販売されているI2Cケーブルを利用し、Groveケーブルとジャンパワイヤーで直結です。ここ、いい感じの方法が無いものか🤔
電源は不要なので接続していません。
ケースはWio LTE用 SORACOM UG ロゴバージョンです。ずーーとお世話になっております!
KeiganMotor操作のためのコマンド体系(JSON)
実装をシンプルにするため、KeiganMotorをArudinoから操作するライブラリ Arduino-I2C-KM1のメソッドを直接実行するコマンド体系としました。
パースにはArduinoJsonを利用しています。
{"method": "FOO", "params": [10.5, true]}
例えば現在地から角度を指定して回転させる moveByDistanceDegree()
なら
{"method": "moveByDistanceDegree", "params": [120, 6]}
で、120度を6rpmで回転します。4
実装済みメソッド
SORACOM Beam 設定
SORACOM Beamはデバイスとクラウドでデータ変換やエンドポイントが可能です。
今回はTLS化(MQTT => MQTTS)と、エンドポイント(アドレスやトークン)の管理と2つの目的で利用しました。
このように設定することでデバイスからは beam.soracom.io:1883
へ MQTT 接続すると、 **.cloud.shiftr.io:8883
に中継してくれます。
shiftr.ioを無料枠で使おうとすると比較的頻繁にアドレスやトークンの変更が必要となります。その都度マイコン側のコードを書き換えることなく、サービス側の変化に対応できます。
一般的なMQTTブローカーだけでなく、AWS IoT Core や Azure IoT Hubなどなど、様々なサービスに対応しています。
error_t
の競合でコンパイルに失敗したら (Arduino-I2C-KM1 を Wio LTE で動かすためには)
Arduino IDE のライブラリ管理からインストールできる Arduino-I2C-KM1 2.0.2 を使って Wio LTE 向けにコンパイルすると以下のエラーが発生します。
In file included from C:\Users\A\non-sync\Arduino\WioLTE_KeiganMotor_bridge\WioLTE_KeiganMotor_bridge.ino:7:
C:\Users\A\non-sync\Arduino\libraries\Arduino-I2C-KM1\src/KM1_I2C.h:34:3: error: conflicting declaration 'typedef struct error_t error_t'
} error_t;
^~~~~~~
In file included from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\cerrno:42,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\ext\string_conversions.h:44,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\bits\basic_string.h:6400,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\string:52,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\stdexcept:39,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\array:39,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\tuple:39,
from c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\c++\8.2.1\functional:54,
from C:\Users\A\AppData\Local\Arduino15\packages\SeeedJP\hardware\stm32\1.4.0\cores\arduino/WInterrupts.h:25,
from C:\Users\A\AppData\Local\Arduino15\packages\SeeedJP\hardware\stm32\1.4.0\cores\arduino/wiring.h:39,
from C:\Users\A\AppData\Local\Arduino15\packages\SeeedJP\hardware\stm32\1.4.0\cores\arduino/Arduino.h:32,
from sketch\WioLTE_KeiganMotor_bridge.ino.cpp:1:
c:\users\A\appdata\local\arduino15\packages\seeedjp\tools\arm-none-eabi-gcc\8.2.1-1.7\arm-none-eabi\include\errno.h:5:13: note: previous declaration as 'typedef int error_t'
typedef int error_t;
^~~~~~~
exit status 1
ボードSeeed Wio LTE Cat.1に対するコンパイル時にエラーが発生しました。
原因は error_t
という型の競合です。
すでに https://github.com/keigan-motor/Arduino-I2C-KM1/commit/cb8ac567588667ae9f7dda5e379e921c28c4fecf で修正がされていますので、すぐに使いたい場合はZIPからインストールしてください。
Arduino-I2C-KM1 側のエラー構造体は km_error_t
にリネームされていますのでご注意を。
なぜLTE通信?
KenganMotorは無線でBLE、有線でUSBシリアルとI2Cで制御できます。I2Cはケーブルの販売もされており、工作の手間もありません。
USBシリアルとRaspberry Piを組み合わせれば簡単にKeiganMotorを操作できるのですが、「リモート雲台」には通信の手段が必要です。ネット接続にWi-Fiを考えた場合、(今年は規模縮小だったけど) Maker Faireといった展示会の2.4GHz/5GHzの嵐の中で動かすのは至難の業であることは、これを見ている方ならご存知の通りでしょう。
3G/LTEとったセルラー通信であれば混線の心配なく通信が可能です。Raspberry PiであればUSBドングル型モデムが使えるので、これで後は中継システムを検討すればOKとなります。
って、ここまで書いてて、なんでRaspberry Piにしなかったんだろう🤔まあいいか。
あとがき
なんとかアンカー分をかき揚げることができて良かったです。
来年もよろしくお願いします!
EoT
-
私はハイパーミニモーター世代です。 ↩
-
単位変換はオリエンタルモーターさんのページを利用しました。ありがとうございます。 ↩
-
UNC1/4インチねじ穴なんて、初めて知った ↩
-
RubyやPythonのように
eval()
やObj.send("method_name")
ができないので、"method" に対応して一対一で実装しました。 ↩