Xbeeでリモート気象観測・子機編

気温や湿度などの情報を記録したい場合には,パソコンなどにつないだ機器からデータを取り込んだり,スタンドアローンの計測機器にデータを保存してあとでデータを取り出すといった方法が考えられます.今回は,Xbeeという電子工作しやすい無線機器を使って,リモートで測定したデータをパソコンで記録するための実験をしてみたいと思います.

この図の右半分をつくります.BME280は気温,湿度,気圧が測定できます.これをPIC 16F1827でコントロールしてデータを取得し,得たデータをUARTでXbeeに送り,そのまま親機からパソコンへ送ります.今回の実験ではそれに加えて,太陽光電池と電気二重層コンデンサを電源にするということにチャレンジしてみたいと思います.

実は以前に(ZigBeeを始めていた.)一度触ったことがありました.2016年の記事なのでもう9年が経ってしまっています.今回改めてソフトウェアやハードウェアをつくりましたが,開発のためのソフトもいろいろと変わってしまっており,ゼロからはじめたような感じになってしまいました.

Xbeeとパソコンを接続するためにはインタフェースが必要です.また,Xbeeのピンの幅はよく使われるブレッドボードなどには直接させないので変換アダプタも必要です.そして,Xbeeの各種設定を行うには,XCTUというソフトを使います.

今回使用したのはXbee S2です.ほかに秋月電子通商のXBee USBインターフェイスボードキットとXBee用2.54mmピッチ変換基板を使いました.

まずはそれぞれのXbeeの初期設定を行います.

ソフトウェアもだいぶ古くなってしまっていたので,最新のものにアップデートしました.Xbee同士の接続のためには,Xbeeのモード設定,デバイスIDなどをあわせて置く必要があります.

Xbee間の接続はすんなりできたので,デバイス間でデータのやり取りをしてみることにしました.Xbeeはピン設定によりADコンバータとしてデータを取り込んでそのまま送信することができますので,一般的な温度センサーをつないでデータをXbee経由でパソコンに飛ばしてみることにしました.

APIモードにして,Xbeeの端子で読み取った電圧をそのまま送信し,パソコン側のプログラムで温度に変換しています.プログラムはChatGPTの力を借りてPythonでコーディングしました.

import serial

PORT = "COM_"
BAUD_RATE = 9600
V_REF = 3.6             # 基準電圧(ADCリファレンス)
LM61_OFFSET = 0.6       # LM61BIZ :0℃ = 0.6V

def read_exactly(ser, size):
    buf = b''
    while len(buf) < size:
        chunk = ser.read(size - len(buf))
        if not chunk:
            break
        buf += chunk
    return buf

def parse_api_frame(frame):
    if frame[3] != 0x92:
        return

    source_addr = frame[4:12]
    addr_str = ''.join('{:02X}'.format(b) for b in source_addr)
    rf_data = frame[15:-1]

    if len(rf_data) >= 6:
        raw_byte = rf_data[-1]  # 最後のバイト(LSBとして処理)

        # 10bit値(0〜1023)として換算
        voltage = (raw_byte / 1023.0) * V_REF
        temperature = (voltage - LM61_OFFSET) * 100.0
        print(f"🌡️ D1 Raw(10bit)={raw_byte}, V={voltage:.3f}V → 温度={temperature:.1f}℃")
    else:
        print(f"⚠️ ペイロードが短すぎます: {rf_data.hex(' ').upper()}")

def main():
    try:
        with serial.Serial(PORT, BAUD_RATE, timeout=1) as ser:
            print("✅ LM61BIZ 温度モニター開始(簡易モード)")
            while True:
                if ser.read(1) != b'\x7E':
                    continue
                length_bytes = read_exactly(ser, 2)
                if len(length_bytes) != 2:
                    continue
                frame_len = (length_bytes[0] << 8) | length_bytes[1]
                frame_data = read_exactly(ser, frame_len)
                checksum = read_exactly(ser, 1)

                if len(frame_data) == frame_len and len(checksum) == 1:
                    full_frame = b'\x7E' + length_bytes + frame_data + checksum
                    parse_api_frame(full_frame)
                else:
                    print("⚠️ フレーム読み込みに失敗")
    except KeyboardInterrupt:
        print("\n🔚 終了しました。")
    except Exception as e:
        print(f"❌ エラー: {e}")

if __name__ == "__main__":
    main()

写真のように問題なくデータが受信できることが確認できましたので,リモート観測装置の製作に移ります.

まずはブレッドボードで回路を組みました.Xbeeは3.3V系のデバイスなので注意が必要です.手持ちのPICは古いものが多くて5V系のものばかりでしたので新しくPIC 16F1827を用意しました...とはいえこれを買ったのももう数年前ですけどね.

PICのプログラムをつくってみて気づいたのですが,BME280はライブラリの用意されているArduinoやRaspberry piのほうが使いやすいです.PICで使う場合,生データの取得後に補正データを踏まえて計算を行い測定値とする必要があります.それらを含めてコーディングしてみると,16F1827のプログラムメモリをほぼ100%使用していて余裕はあと数語という容量でした.

電源には秋月電子通商の携帯機器用ソーラーモジュール(太陽電池・ソーラーセル) 300mWを2枚と電気二重層コンデンサ(25F,5.4V)を使いました.機器をモバイル仕様にするときに電源は悩みのタネです.以前に制作した屋外気象観測装置は鉛蓄電池を使用しました.鉛蓄電池は電解液に硫酸を使用している点を除けば比較的安全ですが,どうしても重くなってしまいます.リチウムポリマー電池という手もありますが,屋外などのハードな使用では安全性に懸念があります.昼間であれば太陽電池が使えますが,晴れの日以外には動かせません.そこで,前々から気になっていたスーパーキャパシタを使ってみることにしました.

太陽電池は300mWを2枚直列にしました.開放電圧は10V超でしたので,ボルテージレギュレーターとダイオードで5V台に落としています.電気二重層コンデンサからはもう一段ボルテージレギュレーターを挟んで3.3Vをつくっています.

屋外で稼働させてみたところ,初期の充電に1時間ほど要しました.それもそのはずで電気二重層コンデンサはほかの電池に比べて内部抵抗が低く短時間で充放電できますが,放電特性は線形という特徴があります.しばらく放っておいたコンデンサは完全放電していて,各種デバイスが稼働できる電圧まで充電されるのに時間がかかっていたのでした.その後は順調にデータを送信してくれましたが,日が陰るとあっという間に電圧がさがり,長時間の運用は難しそうでした.Xbeeが40mAほど消費していますので,それが大きそうです.Xbeeは設定によって省電力化することもできるので,電源を今回のような構成にする場合には,検討が必要です.それはまた今度.

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA