ペット行動管理ツールのプロトタイピング

2023年技術ブログ集

ドッグランでの管理ツールとして、「健康管理ツール」と「行動管理ツール」のプロトタイピングを始めました。「健康管理ツール」はTRP測定を基本とし、まず安静時非接触型を次に接触型を検討しています。「行動管理ツール」はドッグラン内の現在地や行動/運動量履歴を把握することでまずは、位置情報と運動情報のロギングができるツールをプロトタイピングしてみようと思います。
イメージは以下のようなものです。

まず、GPSモジュールを購入して受信データを確認してみました。電源は3.3Vのもの5Vのもの
共用できるものがあります。

GPSモジュールのインターフェースは、シリアル通信です。USB用以外にシリアルを使うためソフトウェアシリアルになります。マイコンによっては、シリアル通信用のPINがfixされているものもあり確認が必要です。また、マイコンにLoRaなどの通信モジュールを搭載するときもシリアル通信を使いますので厄介です。また、GPSの出力フォーマットは決まっています。冗長で、衛星番号や電波強度などどうでも良い情報もいちいち、厄介なフォーマットでシリアルからはきだされます。パーサーに、「TinyGPS++.h」ライブラリを使います。以下、ArduinoとXIAOでのGPSモジュールから、「経度、緯度、速度」の3項目だけを取り出すコードを示します。

GPSモジュールからは、正確な現在時刻も取り出せるのですが、衛星捕捉までに数分~数十分かかります。プログラムコードはGPS様が応答してくださること、GPS様の通信タイミングに支配されます。実は環境センサBME680は、大気汚染測定に時間がかかる場合があるため、GPSとの同期が取れず組み合わせ相性はだめでした。次頁以降にその残念な結果を示します。

プロトタイピング機に搭載するGPSと加速度センサーと環境センサーについて個別評価結果を
報告しました。今回は2種類のマイコン:Arduino(5V)とXIAO(3.3V)をベースに#1と#2
を組み立て動作確認を行いました。結論からいうとGPSと環境センサ(BME680)の相性が
悪くGPSと加速度センサーとアナログ入力が基本構成となりました。

参考までに、XIAO(3.3V系マイコン)を使った#1のプログラムコードとシリアル出力を示します。

GPSは衛星を補足してLEDが点滅しているにもかかわらず、「0」しか吐き出しません。

XIAO(3.3V系マイコン)でだめならArduino(5V系)ならトラブル回避できるのではないかと
試しました。Arduinoのプログラムコードとシリアル出力を示します。

これも同じで、GPSからのデータは「0」となります。GPSモジュールとマイコンの組み合わせやdelay()設定、測定の順番などを変えていろいろ試しましたがダメでした。
問題は、GPSのタイミングにセンサーのスピードが追い付いてないといけないようでBME680のス
ピードが遅く(特にガスセンシング)タイミングが取れないことが原因のようです。動作確認には
GPSモジュールが衛星捕捉する時間を考慮すると、イライラするほど時間が掛かり結果NGが続くと
全てを放り出したい気持ちになります。BME680に臭気センサが問題ですね。

試作にブレッドボートを使っていますが、GPSモジュールやセンサの取り外しを頻繁に行う場合は
やってられないことに気づき、Groveコネクタの拡張基板が使えるXIAOを使うことにしました。
XIAO用のGroveコネクタ基板は\740で秋月電子で手に入れました。プロトタイピング#3は、軽量化も考えて3.3V系のXIAOとGrove接続GPSを使用しました。BME680は検討しましたが同じくNGでした。

BME680は諦め、GPSログと加速度センサデータを記録する方法については、当初はSDカード
ロガーにする予定でしたが、今回はUSBを介して暫定的にタブレットPCにデータ保存をすることにしました。以下に簡単なハンドラソフトと保存データ(csv形式)を以下に示します。

来週から8月ですがタイのような暑さが連日続いて命の危険を感じています。フルタイムエアコンを使用しています。温度設定をこまめに変えて送風が切れない状態にしています。
GPS+加速度センサーに絞ったプロト機(#3)にタブレットPCを組み合わせて、近所を徘徊してきました。怪しさを避けるためカバンにタブレットを入れてカバンの握りてあたりに#3を引き出して歩きました。

外出先でコマンドなどを打ち込むと、さすがに怪しいので、スタート・ストップができるGUIプログラムコードを作りました。

測定開始ボタンを押すとログデータをcsvファイルにPCのタイムスタンプとともに書き込みます。測定は1秒間隔です。以下に結果を示します。

GPSの緯度(lon)、経度(lat)は判りづらいので、pythonのfoliumらいぶっりを使用してマップ表示しました。以下地図に軌跡を表示させた結果を示します。

GPSの緯度経度をマップ表示させる方法は、①pythonでfoliumを使う(出力はhtml形式)もうひとつは、②Node-REDを使う方法です。履歴ではなくリアルタイムマップ位置情報を知るためにはNode-REDのWEBサービス機能が便利です。
以下にプロトタイピング(#1~#3)から得られた知見から導いた基本システム案を示します。

(ドッグラン行動管理システムについての方針)
 当初「LoRaやTWEILITEなどの広域通信モジュールをGPSロガーと組み合わせサーバーに接続
した受信機と通信し各犬のGPSロガーからデータを収集する方式をメインに考えていました。
また、小型犬向けにはオフラインでSDカードにデータを保存する方式も考えていました。」が
ドッグラン内にWiFi_APを複数整備し通常のWiFi環境を整えれば、Node-REDをラズパイで動かし各犬(IPアドレスで識別)がWEBサーバーにGPSの位置マップとセンサ類のダッシュボード表示画面を持ち、Sambaによりログデータを吸い出せるようにします。以下に新システムのプロトタイイングを示します。

現時点ではGPS以外のセンサは加速度センサと2chアナログのみですが、デジタル温度センサは追加、
更にパルス間隔測定方式の脈拍センサの接続を検討しています。マイコンのインターラプト機能を使う
ため本体マイコンとは別マイコンが必要で計測値をPWMでアナログに変換し本体マイコンのアナログ
入力に接続することを考えています。可能であればフィルムセンサの信号をデジタルフィルタで脈波と
呼吸に分離しパルス間隔を測定しアナログ2chに接続できないか検討します。(かなり未来で)
まず、Node-REDを使ったデータ保存プログラムを以下に示します。ポイントは、delayノードをシリ
アル通信の流量制限として使用することです。ロガーからは、GPSに先導された非同期なシリアル通信
出力が出てきます。データ間隔は0.1~2秒です。これを定期的に受け取るため流量制限を行います。
(この処理はPythonでtime.sleep()などを使ってもうまくいきませんでした)

csvノードにデータを書き込ますが、functionノードを使用して、マイコンから出力される11項目
コンマ区切りデータの冒頭にタイムスタンプ情報(ラズパイの時計)を追加しcsvファイルに書き
込みます。このcsvファイルは、Sambaで共有フォルダー設定した/pi/shareフォルダー内に置いて
おきます。(Node-REDでは常にフルパスで指定します) 
これだけでデータ保存プログラム=GPSマイコンとの接続プログラムはこれで完成です。あとは、
データをリアルタイムに表示しWEBサービスを行うプログラムですが次回詳細説明します。
まず、今回の実験システムを紙袋に入れて、前回より広範囲な距離を徘徊しました。
前回、タブレットPCとマイコンのUSBコネクタが外れるアクシデントがあったので、今回はラズ
パイとモバイルバッテリ(こんなに大きくなくても良いのですが)とGPS/センサ/マイコン基板
を同じ紙袋に入れて人目につかないようにしました。

収集したデータは、タイムスタンプ、経度、緯度、加速度センサ6軸値、アナログ1/2chです。
まず、経路表示です。Pythonのfoliumライブラリを使用して以下に表示します。円環状の軌跡は
お寺の境内を回ったためです。炎天下45分歩きました。

ラズパイに搭載するNode-REDのプログラムを説明します。
ポイントは、普通のログデータ保存に加えテンポラリなデータ保存を行いNode-REDのダッシュ
ボードやWordMapの表示には、テンポラリデータを食わせることです。ダッシュボードのグラフ
には内部バッファがあるためトレンドグラフ表示ができます。データ数値そのものをピックアップ
するためドーナッツグラフを使いました。GPSの位置表示にはテンポラリデータから「lat」と
「lon」を取り出してWorldMapに与えます。 上記データ保存処理部分を以下に示します。

ログデータは「GPS00.csv」に保存し共有化します。同時にテンポラリデータを1行だけのcsvファイルに保存します。5秒間隔でデータ更新される1行だけのcsvファイルを使ってWorldMapで現在位置を表示します。冒頭も3データ(tstmp,lat,lon)を取り出しWorldMapノードの送り込みます。https://localhost:1880/worldmap/  に地図とともに現在地が表示されます。
(外部からアクセスする場合はlocalhost→IPアドレス)

次に、センサ値(6軸速度センサとanalog2ch)のダッシュボード表示のプログラムを以下に示します。
一時保存データ(1行csvデータ)からのデータの読み出し、changeノードを使ってコンマ区切データを分割します。tstmp,lat,lon,ax,ay,az,gx,gy,gz,a0,a2の全11データ中[0],[1],[2]はworlsmapで使用したので[4]~[10]をダッシュボード表示に使います。8個のfunctimノードを使用し、各々のデータ番号[n]に相当するデータだけを抽出します。各々をドーナッツグラフと折れ線グラフに接続します。
下図では、axの項目について、functionノード、ダッシュボード用ノードの内容を張り付けています。
他の項目についても同様に設定します。

ダッシュボード内での複数グラフの配置はvegaという機能を使います。(この説明は割愛します)
https://localhost:1880/ui/  にダッシュボードが表示されます。以下グラフでグラフでazのみが大きい理由は重力加速度度を検出しているからです。

最後にGPSロガーの小型化を検討しています。ラズパイZEROが入手できるようになったので
3A+(11acに対応)かZEROを採用したいと思います。問題はケーブル類がかさばることです。

行動管理ツールの開発は継続します。
マイコンを介さずダイレクトにラズパイのGPIOに
GPSやセンサ類を接続しより軽量化を行う予定です。

タイトルとURLをコピーしました