XBeeモジュールの使い方(画像転送:802.15.4ファームウェア)


  前回はルータXBeeからコーディネータXBeeに画像を転送する方法として、ZigBee3.0又はDigiMesh2.4のいずれのファームウェアでも動作する方法について解説しました。前回の方法ではファームウェアを802.15.4に設定した場合は動作しません。そこで今回は、ファームウェアが802.15.4で動作する画像転送方法について解説します。 今回の解説でも前回と同様に、以下の64×64ピクセルのモノクロ画像(ファイル名:MonaLisa.png)を例にコーディネータXBeeへの転送を試みます。

 画像を送信するルータXBeeのMicroPythonのサンプルコードを以下に示します。 MicroPython Terminalでエンターを押してCtrl+Fで1^^^のプロンプトにしてから、マウスの右クリックでCopyを選択して貼り付けます。その後、Ctrl+Dでコンパイルして、スタートで自動実行に同意する「Y」を押して、一旦このままにしておきます。File System Managerでコンパイルされた実行ファイルmain.mpyが生成されています。ここで、File System Managerを用いて/flashにMonaLisa.pngを書き込んでおきます。

 ZigbeeやDigiMeshファームウェアでは、MicroPythonスクリプトでアクセスするファイルが/flashにすでに配置されており、/flashを明示しなくても正常にファイルにアクセスできます。しかし、802.15.4ファームウェアでは、/flashを明示する必要があります。

ファイルの存在を明示的に/flash/に確認するためにFILE_PATHを以下のように記述します。

FILE_PATH = “/flash/MonaLisa.png”

 また、FILE_PATHが/flash/MonaLisa.pngのような形式であっても、ディレクトリ名を除いたファイル名MonaLisa.pngが、/flash/に存在しなければ”No file!”と表示するため、以下のように記述します。

if FILE_PATH.split(‘/’)[-1] not in os.listdir(‘/flash’):

import xbee
import os
import utime

COORD_ADDR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69'
CHUNK_SIZE = 64
FILE_PATH = "/flash/MonaLisa.png"

def send_file():
    if FILE_PATH.split('/')[-1] not in os.listdir('/flash'):
        print("No file!")
        return

    with open(FILE_PATH, "rb") as f:
        while True:
            chunk = f.read(CHUNK_SIZE)
            if not chunk:
                break
            xbee.transmit(COORD_ADDR, chunk)
            utime.sleep(0.1)

    # 送信完了後に終了チャンクを送信
    xbee.transmit(COORD_ADDR, b"__EOF__")
    print("Send complete")

send_file()

 画像を受信するコーディネータXBeeのMicroPythonのサンプルコードを以下に示します。 ルータXBeeの場合と同様にMicroPython Terminalでエンターを押してコンパイルし、Ctrl+Rであらかじめ実行しておきます。

from xbee import receive
import os
import time

FILE_PATH = "/flash/MonaLisa.png"
RECEIVED_CHUNKS = []

def receive_file_loop():
    while True:
        pkt = receive()
        if pkt:
            payload = pkt['payload']
            if len(payload) < 1:
                print("Invalid payload")
                continue

            # 終了チャンクの検出
            if payload == b"__EOF__":
                print("EOF detected. Saving file.")
                save_file()
                continue

            RECEIVED_CHUNKS.append(payload)
            print("Received chunk. Total:", len(RECEIVED_CHUNKS))

        #time.sleep(0.1)

def save_file():
    with open(FILE_PATH, "wb") as f:
        for chunk in RECEIVED_CHUNKS:
            f.write(chunk)
    print("File save completed!:", FILE_PATH)
    RECEIVED_CHUNKS.clear()

receive_file_loop()

 コーディネータXBeeのコードが実行されていることを確認してから、ルータXBeeからCtrl+Rでコードを実行します。コーディネータXBeeのMicroPython Terminalにはチャンクが受信され、画像ファイルが保存されたメッセージが表示されます。

 さらに、コーディネータXBeeのFile System Managerを用いて/flashを確認してみると、MonaLisa.pngが保存されていることを確認できます。この画像をPC側の適当なディレクトリにダウンロードし、ファイルを開くと以下のように元画像と同じ画像であることを確認することができます。