太陽光発電の発電量をロギングしてみた。(3)Microbit間無線通信とRaspberryPi-Microbit間シリアル通信で、測定値をロギング


【太陽光発電の発電量をロギングしてみた。目次】

Microbit間無線通信とRaspberryPi-Microbit間シリアル通信で、測定値をロギング

ここでは、電流・電圧測定モジュールINA260を接続したMicrobitから、他のMicrobitに測定データを無線通信で転送し、USB接続されたRaspberryPiとシリアル通信してRaspberryPiで測定値をロギングする。

● Microbitの無線通信

Microbitは独自の無線通信により、他のMicrobitとデータ通信することができる。
Microbitの無線通信は意外とすごい。
冷蔵庫の中にMicrobitを入れて、庫外のMicrobitに温度データを送信できる。
試しに停止中の電子レンジにも入れてみたが、通信可能だった。

無線を使用するには、MakeCodeでは以下のブロックを使用するだけである。
・イニシャル処理で、送信側・受信側で同じ無線グループを設定 

・送信側:「無線で送信」する。

・受信側:「無線で受信したとき」トリガーを使用して受信値を取得する。

以下、MakeCodeで編集した、センサー接続側のソースの全体像である。
測定値を無線で他のMicrobitに送信している。

【センサー接続側プログラム】

● Microbit-Raspberry間のシリアル通信

Microbitでシリアル通信すれには、MakeCodeで「高度なブロック」-「シリアル通信」を使用する。
以下はRasberryPiにUSB接続するMicrobitのプログラムである。
無線受信したデータをシリアル通信で送信する。

【シリアル通信側プログラム】

● RaspberryPi側シリアル通信

RaspberryPiとMicrobitは、USBケーブルで接続する。
RasberryPiでLXTerminalを起動し、以下のscreenコマンドを実行することでMicrobitの送信データを受信して表示することができる。

sudo screen /dev/ttyACM0 115200

しかし、ロギングするならもう少し手を加えたいので、pythonで書いてみる。

import serial
import struct
import datetime as dt

use_port = "/dev/ttyACM0"

_serial = serial.Serial(use_port)
_serial.baudrate = 115200
_serial.parity = serial.PARITY_NONE
_serial.bytesize = serial.EIGHTBITS
_serial.stopbits = serial.STOPBITS_ONE
_serial.timeout = 15

try:
    while True:
        rx = _serial.readline()
        st = "{0},{1}".format(dt.datetime.now(), rx)
        print(st)
        with open('/home/pi/current_{}.log'.format(dt.date.today()), mode="a") as f:
            f.write(st)

except Exception as ex:
    print(ex)
finally:
    _serial.close()

【太陽光発電の発電量をロギングしてみた。目次】