WioLTEで自転車セキュリティシステムを作る


1.はじめに

私はMTBが好きでたまにポタリング途中で喫茶店や中華屋によるのだが、30分以上繁華街に愛車を停めるのはロックをしていてもやはり不安になる。
永らくこの課題に対してのソリューションは、ラズパイに3Gドングルを付けて加速度センサで振動を検知するのが最もコストが安く簡単と思っていたが、コンパクトなLTE Cat1モジュール内蔵のWioLTE登場によりいよいよ実行の時が来たのである。
なお、WioLTEの1stインプレッションはWioLTEを使ってみたにまとめている。

(2017/12/11追加:2017/12/4 WioLTEユーザイベント時のLT資料をアップしました。)
thumbnail

2.調達物

WioLTEとSORACOM Air(Nano SIMタイプ)以外の調達物は以下である。

SORACOM AirのNano SIMカード含め、新規で購入した際の参考価格である。クラウドサービスはThingScaleの「30 days trial freeサブスクリプション」を利用するため、30日間は無料で使用出来る。

Item 価格(税込) 調達元
1.WioLTE(Seeed) 10,584 ソラコム
2.SORACOM Air(ソラコム) 1,313 Amazon
3.薄型モバイルバッテリー(TOPVISION) 1,899 Amazon
4.加速度センサ(Seeed ADXL345) 1,382 スイッチサイエンス
5.ウォーターボトル(CYCLE PRO) 473 Amazon
6.ボトルケージ(MINOURA) 641 Amazon
Total: 16,292

Grove IoT スターターキット for SORACOM購入の場合は1,2,4については同梱

3.仕組み

加速度センサでいたずら(衝撃)を検知したら、MQTTによりクラウドに通知する仕組みを作る。
せっかくなのでMQTTブローカーとして当社のThingScale IoT message broker(以下ThingScale)を使う事にした。
ThingScaleはMQTTでPublishされたデータの蓄積とThingScaleにSubscribeしているデバイスへのコマンド配信も可能なHosted MQTT brokerである。
今回は手元のスマホにgmailでいたずらを通知する仕組みとしたいので、ThingScaleのイベント機能を利用していたずら発生時にメールする事にする。
主なIoT的要素は以下となった。

  • 通信:SORACOM Air/Beam
  • クラウド:ThingScale
  • メール:gmail

4.ベースシステム作成

以下のような要領でベースシステムを作成する。加速度センサは「I2C」ポートに接続する。
取り付けベースはamazonの箱の底になっている段ボールが強度含め丁度良い。今回は段ボールに全ての部品をセロテープで貼り付けた。テキトーである。
ベースシステムを組む順番はWioLTEの動作確認が取れてからでも問題ない。
(左側のLTEアンテナが上部となる)

5.ThingScaleの準備

ThingScaleの30日間フリートライアルを利用するため、30日フリートライアルの開始よりサインアップする。
サインアップ時のメールアドレスにコンソールのログイン用アカウントが送付されてくるので、この情報よりDev Consoleへアクセスする。

ログインするとコンソール画面が表示される。

Dev Consoleの'Admin'メニュー->'View profile'の'Token Information'に含まれる「Device Token」情報をメモする。
アカウント発行時のUser_IDと上記でメモしたDevice TokenはSORACOM Beam設定時のMQTT接続ユーザ/パスワードで必要となる。

6.WioLTEセットアップ

WioLTEはArduino IDEでプログラミングできるのが最高である。いつでもどこでもノートPCがあればプロトタイプが可能だ。
WioLTEのセットアップについてはソラコム社のページLTEモデム搭載プロトタイプ向けデバイス Wio LTE をセットアップするの手順を参考にしながら以下githubのサンプルコードをArduino IDEにコピペしてほしい。

(サンプルコードの修正)
サンプルコード中の以下はユーザ毎に書き換える。
今回はセンサ感度の切り替えをするためMQTT Subscribeによるコマンド受信に必要なIN_TOPICの設定もしておく。SORACOMのSIMのIMSIはユーザーコンソールから確認できる。

thingscale_shockdetect.ino
17: // ThingScale
18: #define OUT_TOPIC         "<YOUR_DEVICE_TOKEN>/json"
19: #define IN_TOPIC          "<YOUR_DEVICE_TOKEN>/<YOUR_SORACOM_IMSI>/subscribe"

振動検出ロジック

振動検出は3軸加速度センサをポーリングして一定以上の加速度の場合はクラウドに通知するロジックになるが、ADXL345がプリセットされた閾値以上の加速度で割り込みをかけるサービス(Active/In-active機能)を持っているので1秒間隔で割り込み発生を確認するロジックで振動検出を行う。
実際の閾値は、ウォーターボトルにケーシングしてMTBに搭載した環境で調整したので好みにより調整して欲しい。

  • Activeモード
    加速度測定有効(平均消費電力23uA)
  • In-activeモード
    加速度測定有効・スリープモードに移行(平均消費電力0.1uA)

※各モードの消費電力はADXL-345データシート 日本語版_Rev.Aを参照

プログラム書き込み後、RSTボタンを押してシリアルコンソールより以下メッセージが確認できればWioLTEの動作確認はOKである。

7.SORACOM Beam設定

WioLTEからThingScaleのMQTTブローカーに直接接続しても良いが、WioLTEはMQTTS(MQTT w/TLS)を利用するのがリソース的に厳しいので以下の構成とする。

  • WioLTE-SORACOM間
    MQTT(閉域網区間なので非暗号化で問題なし)
  • SORACOM-ThingScale間
    MQTTS(SORACOM BeamでTLSオフロードを行う)

これでデバイス-クラウド間がEnd-to-endでセキュアとなった。
WioLTEのMQTTエンドポイントはSORACOM Beam(beam.soracom.io)となる。SORACOM Beamの設定は以下となる。

(転送先)

  • プロトコル:MQTTS
  • ホスト名:m.thingscale.io
  • ポート番号:8883
  • ユーザ名:ThingScale_User_ID
  • パスワード:Device_Token

(オプション)
  • IMSI付与:ON

8.ThingScaleにWioLTEを登録

サンプルコードを実行すると、WioLTEが自動的にSORACOMのAPNに接続し"SORACOM Beam”が付与したIMSIの名前がデバイスIDとして登録されている。
Dev Consoleの'Device'メニュー->'Device Management'ページより、WioLTEが認識されているか確認してみる。認識していない場合は振動を加速度センサに与える。

WioLTE(SORACOM Air)がデバイスとして認識されたら、時系列データベースである'チャネル'の作成とデバイスへのマップを行う。
'Channel'メニュー->'+ New Channel'より新規のチャネル作成を行う。

チャネル作成後、'Device'メニューに戻り、WioLTEのIMSI番号を選択してチャネル設定を行う。自動認識されたデバイスは無効となっているため"Enabled:"を"true"に変更するのを忘れないように。。
(ここではCH2をマップ)

9.WioLTEから送信されてくるデータを確認する。

'Stream'ページから手順8.で設定したチャネルにWioLTEからの送信データ(motion)がJSONで格納されていることを確認する。
監視状態が正常(衝撃が無検知)であれば255秒に1回の頻度で{"motion":0}のデータが送信されるので通信の正常確認ができる。
衝撃を検知し、255秒間何もなければ以後{"motion":0}を送信する。
※In-activeモードへの移行時間を設定するTIME_INACTレジスタが8bitなので最大255秒となる。

加速度センサーの確認

(加速度センサーが動くと{"motion":1}が送信される)

(振動検知時のシリアルコンソール画面)

(約4分毎に振動が無ければ{"motion":0}が送信される)

※ThingScaleのAPIを使う場合
curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -H "X-ENDTIME: last" -H "X-PAGELIMIT: 10" -k https://m.thingscale.io/v2/stream/<CHANNEL_ID> | jq '.stream[]'

データがこない場合は'SESSION'メニューよりMQTTセッションを確認する。
※WioLTEをリセットすると上手くいくケースが多い

※ThingScaleのAPIを使う場合
curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -k https://m.thingscale.io/v2/session | jq '.'

センサ感度の調整

標準の設定値は自転車を軽く揺らした場合で反応する調整としたが、敏感と感じる場合はリモートコマンドでセンサ感度を落とす事ができる。
MQTT Publishにより、以下コマンドをWioLTEに送る事でセンサ感度が切り替わる。

  • mode:1
    センサ感度を落とす
  • mode:0
    センサ感度を標準に戻す

'Tools'メニュ->'Publish'メニューよりコマンドを送る。

※ThingScaleのAPIを使う場合
curl -X POST -H "X-APITOKEN: <API_TOKEN_HERE>" -k -d '{"payload" : "mode:1"}' https://m.thingscale.io/v2/publish/<YOUR_SORACOM_IMSI>

コマンド発行が成功するとmode:0 またはmode:1のメッセージがWioLTEから返って来る。

※ThingScaleのAPIを使う場合
curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -H "X-ENDTIME: last" -H "X-PAGELIMIT: 10" -k https://m.thingscale.io/v2/stream/<CHANNEL_ID> | jq '.stream[].value | select(.mode)'

10.Eventの設定

クラウドまで加速度センサーの状態が上がるようになったので、ThingScaleのEvent機能を利用して、"motion=1"になった時にメール通知するようにする。
'Event'メニュー->'+ New Event'より加速度センサーのチャネルに対して以下のイベントを作成する。

加速度センサーに衝撃を与えるたびに以下メールがくればあとはウォーターボトルに組み込むだけとなる。

11.偽装工作

以下のような要領でウォーターボトルにベースシステムを組み込む。WioLTEのコンパクトさと薄型バッテリーが今回の作戦を容易にしている。
(組み込み)

(外観図)

12.実際に使ってみた。

私の愛車である「KONA Blast 2017」に偽装工作したウォーターボトルを搭載してテストしてみた。
ご覧の通り、全く自然で常時LTE接続で振動検知されているとは誰も思わないだろう。REST APIを使えば世界中どこからでも自転車の状態確認とセンサ感度変更が可能である(笑)

使用感は上々である。私はバイクも乗るので、さらなる小型化を図り出先のバイクセキュリティとして利用する事を検討中である。

今回、ThingScaleからWioLTEへの下り通信でセンサ感度を変更しているが、アラートが来たらGPSをONにして追跡開始などの応用も可能である。
WioLTEによりLTE通信を利用したプロトタイプも手軽にできるようになった。
皆様もアイデア次第で面白いガジェットを作ってみてください!
(WioLTEは”ワイオエルティーイー”と発音するそうですw)