Raspberry Piでセンサネットワークを構築して実際に稼働してみます。今回は、TWELITE-トワイライト編としてRaspberry Piとセンサを無線で接続する構成です。Raspberry PiからAmbientにデータを送信します。この構成で安定して稼働させるにはどういった課題があるか書いてみます。
TWELITE-トワイライトは以下の製品です。
TWELITE DIP(子機としてセンサと接続)
MONOSTICK(親機としてRaspberry Piと接続)
以下のようなデータの流れになります。
センサとTWELITE DIP(子機) => (無線で2メートルぐらい) => Rapberry Pi本体(親機) => (Wi-Fi) ==> インターネット ==> Ambient(ここでデータを確認)
TWELITE DIPとセンサが以下です。bme280(温度、湿度、気圧センサ)を接続しています。これが子機になります。今回は子機は1台だけですが、必要に応じて1台の親機に複数台の子機が接続出来ます。
(※実は今回使用している上記のTWELITE製品は旧モデルです。現在のモデルとは外観は異なります。使っていなかったのでここで使ってみました。)
この子機についてのモノワイヤレスの説明が以下のページです。このページの設定にしてBME280を接続しました。10分おきにセンサのデータを送信するように設定しました。
I2Cセンサ(BME280)を接続する
どうやらAitendoのBME280は完成品ですがプルアップ抵抗も実装済のようです。以下を参照して下さい。
温湿度・気圧センサモジュール [BME280-6P]
MONOSTICKとRaspberry Piが以下です。Raspberry PiはRaspberry Pi2なのでWi-Fiドングルを使っています。こちら側が親機になります。
親機の方は初期設定のままです。
(※こちらもTWELITE製品は旧モデルです。現在のモデルとは外観は異なります。使っていなかったのでここで使ってみました。)
この構成の特徴や課題
特徴は何といってもRaspberry Piが親機でセンサが子機として独立しているのである程度離れた場所にセンサが設置出来るということです。
どの程度の距離まで電波が届くということですが実際には条件によるということで、詳細が必要な場合は以下を参照して下さい。私の場合はデスクに面した窓際が子機で反対側のデスクの端に親機です。2メートル程度でしょうか。もちろん問題なく通信出来ています。
通信距離について
課題としてはやはり電池でしょうか。以下の説明では例としてボタン電池で10年以上持つとなっています。
省電力
今回の場合はセンサも接続しているのでその分の消費もありますが、年単位で持つということでしょうか。実際には消費電力を測定すればある程度分かるとは思いますが、とりあえずはこのまま稼働を続けます。
Raspberry Pi(親機)のプログラム
無線通信ですが、親機ではシリアル通信からデータが取得出来ます。そのデータを解析してAmbientへ送信しています。
プログラムは以下です。これで稼働していますが、サンプルプログラムのレベルです。動作保証は出来ませんのでご了承ください。
#!/usr/bin/env python # -*- coding: utf-8 -*- import serial import sys import os import ambient argv = sys.argv argc = len(argv) # 9999はチャネルID # aaaabbbbccccddddはライトキー amb = ambient.Ambient(9999,'aaaabbbbccccdddd') def read_serial(s): while True: data = s.readline() data = data[2:] spilitdatum = data.split(":") #print spilitdatum dict = {} for spilitdata in spilitdatum: s_key = spilitdata.split("=")[0] s_val = spilitdata.split("=")[1] dict[s_key] = s_val if ("ed" in dict): if(dict["ed"] == "810078E8"): #子機のID tm = float(dict["tm"]) / 100.0 hu = float(dict["hu"]) / 100.0 at = int(dict["at"]) r = amb.send({"d1": tm, "d2": hu, "d3":at}) #print dict["ed"] # USBデバイスが指定出来る if argc != 2: s = serial.Serial("/dev/ttyUSB0", 115200, timeout=10) else : s = serial.Serial(argv[1], 115200, timeout=10) while True: try: read_serial(s) except KeyboardInterrupt: break except: continue s.close()
稼働状況
今現在で約3週間ですが、問題なく稼働しています。
窓際に何げなく置いていますが、直射日光が当たる時間には40℃を超えている場合があります。室内といっても夏場(特に今年は)は高温になるということが分かります。
引き続き稼働します。
2018/09/10追記
2018/09/06に電池切れになりました。2ヶ月弱ぐらいです。思ったより短かったような気がします。またいろいろと調べてテストしたいと思います。
最後に自社PRですが、Raspberry Pi 関連のご依頼お待ちしております。本記事と同様のセンサネットワークの試用、試作等対応可能です。
Amazon関連リンク