SSブログ

Grid-EYE(AMG88xx)データの無線伝送(1)

Panasonic製AMG88xx(Grid-EYE) は8x8 (64画素)で2次元エリア温度検知を行うデバイスです。
このデバイスで観測した温度データをMONO TWELITEを用いて無線伝送する事を考え(図1)、TWELITEのプログラムを改造したので紹介します。

図1 AMG88xx データ無線伝送システム図
図1_構成.jpg

プログラム検討に使った子機の回路は図2に示すようなものです。
AMG8833はスイッチサイエンスで基板に搭載済みのものを購入して使いました。(AdafruitやSparkfunでも同様のものがあるようです。)
I2Cラインのpull-up抵抗を入れ、必要に応じてアドレス設定変更をしてください。

図2 AMG88xx & TWELITE接続回路図
図2_回路図.jpg


TWELITEプログラム
TWELITEは子機、親機用は改造したプログラムへの変更が必要です。中継器用はプログラムの改造不要です。
資料を参照の上、TWELITE Stage を使ってソースファイルのコンパイルと書き込みを行ってください。
ソフトウェア・資料のダウンロードは以下から。
送信パケットサイズが大きすぎて規定外であることがわかりましたので修正し、V2.0としました。(2021.03.28)
=> 改造用ソースファイル_V2.0
=> TWELITEプログラム方法_V2.0
=> 測定送信フローとパケット構成_V2.0

基本となるTWELITEのアプリケーションは無線Tagアプリです。
プログラム内で使っているセンサーIDは新規に作ると全体への影響が大きく変更が多くなるので、BME280と MPL115A2 関連の部分をAMG88xx用に書き替えています。(子機・親機のTWELITEはAMG88専用なので他のセンサーの通信には使えません)
パケットサイズの制約もあり8x8点の温度データは2つのパケットに分けて送っていて、これが若干処理を複雑にしています。
AMG88xxのI2Cアドレスや設定値は子機用TWELITEをプログラムする前にAMG88.hファイルに記入してコンパイルします。

親機のUART出力データはバイナリー形式です。アスキー形式ではパケットのバイト数が大きくなり受信側のPCによってはシリアル入力のバッファーサイズが心配なので、出来るだけ小さくなるようにそうしました。(それでもArduinoやESP8266を使う場合シリアル処理はトラブるかもしれません。)

送信レートについて
AMG88のデータ測定は1秒あたり10回行いますがそのレートでのデータ伝送はできません。
パケットサイズの制約もありAMG88xxのデータは測定ごとに2パケットに分割して送信されますが、受信側TWELITEは送信の順番にデータを出力するとは限らず、また2回出力されたり抜けてしまったりすることも発生します。2つのセンサーが繋がっている場合には2つのセンサーのパケット間でも順番の入れ替わりが起きます。
こういったことから受信側マイコンはちょっと厄介な処理をすることになって時間を要します。
受信側がどこまで短い送信間隔に対応できるかはセンサーの数やパケット数、受信側マイコン処理スピード、TWELITEのUARTへの出力間隔に依存します。
Raspberry pi 3BでPythonで作ったプログラムで試したところ、1子機1センサーで2パケット送信の場合 ある程度安定して受信するには200mS程度の間隔が必要でした。
安定といってもパケットの間隔は一定ではなく、150mS程度のこともあれば500mS程度もあって平均すると200mS程度かなといった具合で、時々取りこぼしもあります。
1子機2センサーだと500mS位の間隔が必要でした。
送信間隔の設定はこのように実際に受信するシステムで安定して(プログラムが止まらないという意味)動作する事を確認することが必要です。

受信データ表示プログラム
Raspberry pi用のPython3で作ったデータ受信プログラムをリリースしますが、受信性能は結構妥協しています。
TWELITEのversionと同じものを使ってください。
=> 受信データ表示ソフト_V2.0 (Raspberry pi用)
=> 修正 を適用してください。(2021.03.31)

親機のTWELITEから出力されるデータ(パケット)が多いのでPythonの入力処理が間に合わず、シリアル入力バッファがたちまち一杯(4096 bytes)になってしまいます。
パケット毎に割り振られているFRC(Frame counter)を見ると重複しているものがあるので、いくつかの数のパケットを取得したらバッファをクリアするようにしました。
パケットの抜けは発生しますが、この方がセンサーデータを早く反応させることが出来、動作としてはより自然になります。

根本的な改善にはUART入力処理とパケット選択処理をC言語で高速化する必要があると思いますが、今回はとりあえずPythonのまま検討を進めようと思います。

欲張って2センサー対応の子機が2台まで受信できるようになっていますが、送信間隔によっては上述のような理由で1親機でこれら全てのセンサーに対応できるわけではありません。送信間隔250mSでは1センサー、500mSでは2センサーが限界だと思います。

今後これを基にいろいろ実験を進めたいと思います。


===== 関連記事 =====
Grid-EYE(AMG88xx)データの無線伝送(2)
Grid-EYE(AMG88xx)データの無線伝送(3)


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

nice! 0