概要
このチュートリアルでは、LoRa子機側として多機能WOR対応HATを使用し、LoRa親機側としてシンプルなLoRaモジュールHATを使用して、WOR機能を利用したRaspberry Piの起動デモを紹介します。
LoRa子機側はWOR機能を利用するため、多機能WOR対応HAT裏面のXHコネクタから5V電源を給電してください。
LoRa親機側はRaspberry PiへのUSB給電を行ってください。
サンプルコード実行環境の構築
GPIOヘッダーのUARTピンでUARTを使用する
デフォルトではRaspberry Piはシリアルポートが無効になっているため、設定を変更します。
ターミナルから、次のコマンドを入力します。
pi@raspberrypi:~ $ sudo raspi-config
次のような画面になるので、「3 Interface Options」を選択します。
再起動後、次のコマンドを入力すると、/dev/配下に有効化されたシリアルポートttyS0が表示されます。
pi@raspberrypi:~ $ ls -l /dev/ttyS*
crw-rw---- 1 root dialout 4, 64 Jul 20 15:39 /dev/ttyS0
ライブラリインストール
以下のライブラリは標準ライブラリではないためインストールする必要があります。下記のコマンドを実行してインストールしてください。
- pySerial
Pythonでシリアル通信を実現するライブラリ
$ pip install pyserial
サンプルコード利用方法
下記からサンプルコードをダウンロードできます。
サンプルコード_ダウンロード
/home/pi/にsample_codeフォルダを配置します。
WOR機能を利用したRaspberry Piの起動デモ
LoRa親機側からWOR信号を送ることによって、LoRa子機側のシャットダウン状態のRPiを再通電によって起動させます。
LoRa親機側、LoRa子機側ともに/home/pi/にsample_codeフォルダを配置しておきます。
LoRa子機側 準備
下記の通り実行してモジュールのコンフィグを行った後、cronにより起動時にスクリプトが実行されるようにしてパワーオフします。
起動時スクリプトtempdata_send.shでの処理は、ノーマルモード(mode 0)に移行し、CPU温度を測定した後、その値を親機側にLoRa送信しています。その後、WOR受信モード(mode 2)に移行し、Raspberry Piをパワーオフします。
pi@raspberrypi:~ $ raspi-gpio set 4 op pn dh
pi@raspberrypi:~ $ cd sample_code/config_code/
pi@raspberrypi:~/sample_code/config_code $ python3 mode3.py
pi@raspberrypi:~/sample_code/config_code $ python3 config_cui.py /dev/ttyS0 --apply
# Command Request
['0xc0', '0x00', '0x08', '0x00', '0x00', '0x70', '0x01', '0x00', '0xc5', '0x00', '0x00']
# Command Response
['0xc1', '0x00', '0x08', '0x00', '0x00', '0x70', '0x01', '0x00', '0xc5', '0x00', '0x00']
pi@raspberrypi:~/sample_code/config_code $ python3 mode2.py
pi@raspberrypi:~/sample_code/config_code $ cd ..
pi@raspberrypi:~/sample_code $ crontab crontab-data
pi@raspberrypi:~/sample_code $ crontab -l
@reboot bash /home/pi/sample_code/tempdata_send.sh
pi@raspberrypi:~/sample_code $ sudo poweroff
LoRa親機側 WOR送信
下記の通り、send.pyを実行して親機側からWOR信号を送ることで、子機側のパワーオフ状態のRPiが再通電によって起動します。
receive.pyを実行して受信待ちしておくと、起動した子機側から送られてくるCPU温度を受信します。
pi@raspberrypi:~ $ cd sample_code/config_code/
pi@raspberrypi:~/sample_code/config_code $ python3 mode3.py
pi@raspberrypi:~/sample_code/config_code $ python3 config_cui.py /dev/ttyS0 --apply
# Command Request
['0xc0', '0x00', '0x08', '0x00', '0x00', '0x70', '0x01', '0x00', '0xc5', '0x00', '0x00']
# Command Response
['0xc1', '0x00', '0x08', '0x00', '0x00', '0x70', '0x01', '0x00', '0xc5', '0x00', '0x00']
pi@raspberrypi:~/sample_code/config_code $ cd ../operation_code/
pi@raspberrypi:~/sample_code/operation_code $ python3 mode1.py
pi@raspberrypi:~/sample_code/operation_code $ python3 send.py /dev/ttyS0 -f --target_address 0 --target_channel 0 < ascii_data.txt
serial port:
/dev/ttyS0
send data hex dump:
00000000: 00 00 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 21 ...hello world!
SENT
pi@raspberrypi:~/sample_code/operation_code $ python3 receive.py /dev/ttyS0 --rssi
serial port:
/dev/ttyS0
receive waiting...
recv data hex dump:
00000000: 74 65 6D 70 3D 34 33 2E 33 27 43 0A E9 temp=43.3'C..
RSSI: -72 dBm
RECEIVED