misoのアイコン画像
miso 2024年02月11日作成 (2024年02月11日更新) © MIT
製作品 製作品 閲覧数 133
miso 2024年02月11日作成 (2024年02月11日更新) © MIT 製作品 製作品 閲覧数 133

面倒だけどLoRaフィールドテストの準備

面倒だけどLoRaフィールドテストの準備

LoRaのフィールドテストの準備

初代RPiでE220-900T22S(JP)-EV1 LoRaモジュールを使ってみた| elchika の続き。
時短のため、文章やコード全ての部分でGPT-4を利用して作成しています。

リモートワークが日常となり、外出することが少ないなかで、技術的な深みを追求するため、フィールドテストに踏み出しました。不便さと向き合いながらも、知識と経験の拡張を目指して頑張りました😫

今回やりたいフィールドテスト

[受信側: ベランダに設置, 送信側: 人間がリュックに入れて持ち歩き]

+-------------------+
|       LoRa        |
|    受信機器 (Rpi) | -----> [接続] Serial Port /dev/ttyAMA0
|                   |
+-------------------+
         ||
         || (無線通信)
         ||
+-------------------+
|       LoRa        |
|    送信機器 (Rpi) | -----> [持ち歩き] ターゲットエリアを歩く
|                   |
+-------------------+

持ち運べるように100均で買ったケースに組み込み

何処からどう見ても不審物です。ありがとうございます😌

今回は2台分作成、1台はベランダに設置してもう1台はリュックに入れて持ち歩き。

キャプションを入力できます

Systemdを利用したLoRa送受信の自動化

効率的なLoRa通信のセットアップのため、Systemdを使って受信データの自動処理と送信スケジュールの自動化を図りました。

受信側の設定 (arm1rpi1/arm2rpi1)

受信スクリプト: receive_and_log_hexdump.py

LoRa受信データをhexdumpで表示し、ファイルに記録するため、/opt/codes/loraディレクトリにreceive_and_log_hexdump.pyを配置します。

import serial
import argparse
import hexdump

def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("serial_port")
    parser.add_argument("-b", "--baud", default="9600")
    parser.add_argument("-m", "--model", default="E220-900JP")
    parser.add_argument("--rssi", action="store_true")
    args = parser.parse_args()
    return args

def main():
    args = get_args()
    if args.model == "E220-900JP":
        print(f"serial port: {args.serial_port}")
        with serial.Serial(args.serial_port, args.baud, timeout=1) as ser:
            payload = bytes()
            while True:
                data = ser.read(ser.in_waiting or 1)
                if data:
                    payload += data
                else:
                    if payload:
                        formatted_line = hexdump.hexdump(payload, result='return').replace('\n', ' ') + ',RSSI: {} dBm\n'.format(int(payload[-1]) - 256) if args.rssi else '\n'
                        with open('payload_hexdump.txt', 'a') as file:
                            file.write(formatted_line)
                        payload = bytes()
    else:
        print("INVALID")

if __name__ == "__main__":
    main()

Systemd 受信サービスの作成: receive-and-log-hexdump.service

/etc/systemd/system/receive-and-log-hexdump.serviceを作成し、スクリプトの自動起動を設定します。

[Unit]
Description=Receive and Log Hex Dump with RSSI over Serial

[Service]
ExecStart=/bin/bash -c '/usr/bin/python3 /opt/codes/lora/mode3.py; /usr/bin/python3 /opt/codes/lora/config_cui.py /dev/ttyAMA0 --apply; /usr/bin/python3 /opt/codes/lora/mode0.py; /usr/bin/python3 /opt/codes/lora/receive_and_log_hexdump.py /dev/ttyAMA0 --rssi'
WorkingDirectory=/opt/codes/lora
User=root
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

サービスを有効化し、起動します。

sudo systemctl daemon-reload
sudo systemctl enable receive-and-log-hexdump.service
sudo systemctl start receive-and-log-hexdump.service

送信側の自動化 (arm1rpi1/arm2rpi1)

Systemd 送信サービスの作成: send-lora-data.service

サービスファイル/etc/systemd/system/send-lora-data.serviceを作成し、定期的なデータ送信の自動化を行います。

[Unit]
Description=Send LoRa data service

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "$(date +%%I:%%M:%%S)" | /usr/bin/python3 /opt/codes/lora/send.py /dev/ttyAMA0 -f --target_address 0 --target_channel 0'

Systemdタイマーの作成: send-lora-data.timer

タイマーファイル/etc/systemd/system/send-lora-data.timerを作成し、サービスが1分ごとに実行されるようにします。

[Unit]
Description=Runs send-lora-data service every minute

[Timer]
OnBootSec=1min
OnCalendar=*:0/1
Persistent=true

[Install]
WantedBy=timers.target

タイマーを有効化し、起動します。

sudo systemctl daemon-reload
sudo systemctl enable send-lora-data.timer
sudo systemctl start send-lora-data.timer

送受信の確認

これらの設定により、LoRaシステムの送受信プロセスの自動化が実現し、フィールドテストの効率とデータ収集の品質が向上しました。
次のような形式でpayload_hexdump.txtに受信した内容が追記されていくので簡単に確認することが可能。

00000000: 30 33 3A 30 35 3A 31 39  0A D4                    03:05:19..,RSSI: -44 dBm
00000000: 30 33 3A 30 36 3A 30 37  0A D7                    03:06:07..,RSSI: -41 dBm
00000000: 30 33 3A 30 37 3A 31 30  0A D4                    03:07:10..,RSSI: -44 dBm
00000000: 30 33 3A 30 38 3A 31 37  0A D7                    03:08:17..,RSSI: -41 dBm
00000000: 30 33 3A 30 39 3A 32 37  0A DC                    03:09:27..,RSSI: -36 dBm
00000000: 30 33 3A 31 30 3A 33 31  0A D1                    03:10:31..,RSSI: -47 dBm
00000000: 30 33 3A 31 31 3A 31 31  0A D4                    03:11:11..,RSSI: -44 dBm
00000000: 30 33 3A 31 32 3A 30 39  0A D9                    03:12:09..,RSSI: -39 dBm
00000000: 30 33 3A 31 33 3A 30 32  0A DA                    03:13:02..,RSSI: -38 dBm
00000000: 30 33 3A 31 34 3A 34 35  0A D9                    03:14:45..,RSSI: -39 dBm
00000000: 30 33 3A 31 35 3A 31 36  0A D7                    03:15:16..,RSSI: -41 dBm
Waiting for data... (interrupt to abort)
misoのアイコン画像
寝るのが趣味
ログインしてコメントを投稿する