編集履歴一覧に戻る
misoのアイコン画像

miso が 2024年02月11日21時27分55秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

LoRa

+

RaspberryPi

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

# LoRaのフィールドテストの準備 [初代RPiでE220\-900T22S\(JP\)\-EV1 LoRaモジュールを使ってみた\| elchika](https://elchika.com/article/a8cdf429-23c6-4ba2-b679-9efaafc5d4a3/) の続き。 時短のため、文章やコード全ての部分でGPT-4を利用して作成しています。 リモートワークが日常となり、外出することが少ないなかで、技術的な深みを追求するため、フィールドテストに踏み出しました。不便さと向き合いながらも、知識と経験の拡張を目指して頑張りました。😫 # 持ち運べるように100均で買ったケースに組み込み 何処からどう見ても不審物です。ありがとうございます。 ![キャプションを入力できます](https://camo.elchika.com/cbd923af248e9e81eb4fd7bcd748eed173626401/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32646132616164352d373663382d343562642d393434382d3262306431663736653138352f37376261373164322d393864362d343837362d396637362d393965316635343431663061/) # Systemdを利用したLoRa送受信の自動化 効率的なLoRa通信のセットアップのため、Systemdを使って受信データの自動処理と送信スケジュールの自動化を図りました。 ## 受信側の設定 (arm1rpi1/arm2rpi1) ### 受信スクリプト: `receive_and_log_hexdump.py` LoRa受信データをhexdumpで表示し、ファイルに記録するため、`/opt/codes/lora`ディレクトリに`receive_and_log_hexdump.py`を配置します。 ```python 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`を作成し、スクリプトの自動起動を設定します。 ```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`を作成し、定期的なデータ送信の自動化を行います。 ```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分ごとに実行されるようにします。 ```timer [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) ```