SORACOM LTE-M Button plus で簡易位置情報を連続送信させる装置を作成してみた

#背景#
SORACOM LTE-M Buttonで簡易位置情報が出せるようになったので、さっそく使ってみました。

　想定した用途は高齢者の外出時の見守り用で、ざっくりした位置情報を定期的に取得し、異常時にはボタンを押してSOS通知をすると同時に位置情報が取れるというものです。

　ただし残念ながら、簡易的な位置情報（無線基地局の位置と電波強度から位置を求める）のデータが取得できるのはボタンを押して通信したとき（信号線を短絡したとき）のみです。

　したがって連続的(定期的に)に位置情報を得るためにはボタンを定期的にポチポチ押すか、信号線を定期的に短絡する仕組みを作る必要があります...。

　現実的な使用方法を考えると定期的にボタンを押すのはまず無理なので、信号線を定期的に短絡する付加回路を作成することにしました。

#使用した部品#
　単に定期的に短絡させるパルス信号を発生する回路ならば発信器とロジック回路だけでも可能ですが、30分とか1時間の長めのタイマーをそれなりの精度で作成するのが面倒そうだったので、ここは割り切ってArduinoを使ってON信号を発生させました。Arduinoはできるだけ小型でボタン電池（3V）でも動作する物がいいわけですが、手持ちで3.3Vで動作するArduino Mini互換機版が大人買いしてあったので（安かったので実験用にストックしてある）これを使いました（3Vでも動作するみたいです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/dc72c395-f190-c567-b3e1-cfa3fc2b03ad.png)
写真（右はプロトタイプでArduino NANO互換機を使用した）

　もし、小型化を目指すならばPICかATtiny85などの8ピンタイプ（作成確認済み）、省電力化を目指すならばMSP430を選択する手もあります。

　電源は、SORACOMボタン側の電池から3Vを取り出すのもできそうですが、ボタン側に物理的な改造が必要だったので、今回は別電源でボタン電池（CR2032)を使うことにしました。

　最初、SORACOM LTE-M Button plusの信号の短絡は、最初アナログスイッチ回路のMC4066を使う予定で作成していました。 面倒なバイアスとか考えなくてアナログ信号をON/OFFできる便利なICなのですが、ON/OFFする信号は電源電圧+0.5Vまでしか使えません。それで、SORACOM LTE-M Button plusの端子の電圧の実測値は2.8Vだったので、とりあえず大丈夫だろうということでブレッドボード上で組み立てテストを行いましたが、問題なくSORACOM LTE-M Button plus端子を短絡できました。

　ところが、SORACOM LTE-M Button plusのIF仕様をソラコムのサイトで見直してみていたら、
「コネクタに電圧を印加しないでください。コネクタには電圧がかかっており、接続機器には電圧DC3.6V／電流1mAの耐性が必要となります」という記述を見つけました。
　電源電圧が3.3Vや5Vの場合は、この回路でOKですが、3Vのリチウムボタン電池で動作させるには、ぎりぎり上限値3.0+0.5=3.5V）を超えてしまいます。
　公開する以上はスペックを外れた使い方はまずいので、結局別の方法のフォトカプラ（TLP421）を使って信号線を短絡させることにしました。

##回路図##
フォトカプラTCP421のスペックシートから
If=10mAでVf=1.2VになるようにR=180Ω、If=1mAでVf=1.08VになるためにはR=1920Ωで
　　(3-1.08)/0.001 = 1920
　　(3-1.2)/0.01 = 180
Ifの電流を1mAから10mAぐらいに収めたいときには180Ωから1920Ωの間の抵抗を使えばいいので、今回は１KΩにしています。
ソラコムボタンは電圧がかかっているので、フォトカプラに対して＋GNDを間違えないように配線します。
左＋、右GNDのようです（テスターで確認してください）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/d25bffd4-bf34-4895-09ae-8f4ba663c8d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/2ba0d583-5711-d239-fbfd-20731c172017.png)

Arduino上のPowerON LEDは消費電力を考えて外しました。

●外形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/e0ece758-8675-9c4a-9c42-2583f8e3a546.png)

今回はタカチのボタン電池ホルダ付きケースに収めてみました。幅は目視でソラコムボタンと同じくらいかなと思ったのですが、実際には若干大きく、重ねると少し横にはみ出します。
ATtiny13A,PICなどの小型CPUを使って専用基板を起こせば半分ぐらいの長さまでには小型化が出来そうです。

●Arduinoプログラム
定期的な位置送信は30分毎とします。
異常時のボタン押し（短押し、長押し）と併用したかったので、ON信号はダブル押しの信号を発生させました。

SORACOMの仕様によれば
シングル:CLOSE 0.1秒～1.2秒, ダブル:2秒以内にシングル制御を2回の短絡を行うということなので、
250ms短絡＞250ms解放＞250ms短絡>解放という動作をさせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/c8378b9c-0b92-c0fa-f10f-f9d44f80048c.png)

ボタン電池で動作させるために、何もしない30分待ちの間はスリープ状態にします。

##ソラコムの設定##
簡易位置情報を出力させる場合ははソラコムのコンソールで簡易位置情報出力をONにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/84c6ab6e-b4bb-f6c7-9d84-f4591eb376a4.png)

 結果を確認するのに一番簡単なのが、ソラコムハーベストをONにして、ソラコムコンソールに地図で表示する方法です。

**参考**
SORACOMのあのボタンで位置情報が取れるようになったとのことで試してみた（＋おまけ）
https://qiita.com/ryo_naka/items/f1e66c381582b4014da5

##サーバーの処理##
　今回は自分のサーバーのDBに位置情報のログを記録したかったので、Beamsで用意したサーバーのAPIをWebHookでコールさせました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33661/e3911232-2d3e-3725-0bc3-297215f56a9f.png)

サーバー側のPHPファイルはこんな感じです

```soracom.php
<?php
date_default_timezone_set('Asia/Tokyo');
$myHeader = $_SERVER['HTTP_X_SORACOM_IMSI'];
$json_string = file_get_contents('php://input');

error_log("soracom json=".$json_string."header=".$myHeader.". date=".strftime('%Y-%m-%d %H:%M:%S',time())."\n", 3, "/var/www/log/debug.log");
$obj = json_decode($json_string);
$head = json_decode($myHeader);   //SORACOM Key
$type = $obj->{'clickType'};
$bat = $obj->{'batteryLevel'};

$lnd = 0;
$lon = 0;
try {
    $location = $_SERVER['HTTP_X_SORACOM_GEO_POSITION'];
    if($location != null){
        $sp = explode(";",$location);
        $lnd = $sp[0];
        $lon = $sp[1];
    }
} catch(PDOException $e){
    die('エラーメッセージ'.$e->getMessage());
}

```

簡易位置データは　$_SERVER['HTTP_X_SORACOM_GEO_POSITION']　で取り出します。
各パラメータが取り出せたら、後は自分のシステムのDBに書き込むだけです。

##実験結果##
　マイコン上で発信間隔を30分に設定して、通信ログによりほぼ30分おきに通信できていることが確認できました。
GPSと違って、あくまで簡易位置情報なので、ずれるときは50㎜-100mぐらい位置がずれます。あくまでもざっくりとした位置情報として使うのがいいでしょう。

　ただ通信失敗する場合も結構多く、室内ではその確率が高くなります。今回の構成では通信の失敗のフィードバックができないので再送処理ができないため、その点は割り切るしかないようです。

　今回は30分毎に通信させましたが、1ヶ月の連続使用では無料枠をオーバーして余分にお金がかかります。使用用途に応じて発信間隔と通信料を考察する必要がありそうです。

##まとめ##
簡易位置情報ですが、ある程度精度を割り切れば使えます。本来ならばボタン側に連続発信機能を付けてほしいところですが、外部回路で連続発信ができるようにはなりました。ATiniy系などの小型マイコンを使えばかなり小さくできるので、SORACOMボタンに張り付けるような形のものを製作したいと思います。