続編
 前回の狩猟の罠通知装置を作成する。(その1)の続きです。
RaspberryPi3ModelB(3B)での動作が確認できたところで力尽きましたので、その続きです。
今回はRaspberryPiZeroW(ZeroW)で本番環境を構築します。
お品書き
- GPIOからの電源供給
- ZeroWへの移植
- シリアルコンソールの無効化
- UARTの設定
 
- プログラムの自動起動化
- Unitファイルの記述
- pyファイルへの実行権限の付与
 
- メール通知の設定
- ひとまず完成
 です。
GPIOからの電源供給
 ラズパイへの電源供給ですが、普段はUSB端子にACアダプターを繋ぎますが、屋外にはコンセントがありません。
携帯電話用のバッテリーからの給電を想定していますが、USBコネクタがバッテリー側がType-A、ラズパイ側はMicro-BなのでUSBの変換ケーブルが必要となりました。
変換ケーブルを買う必要があるのならば、いっそのことGPIOから給電してしまえばと、USB⇆GPIOコードを購入しました。
 実は、GPIOから給電すればUSB端子が2つ使えると信じていたのですが、片方は電源供給専用なんですね、知りませんでした。
 ジャンパケーブルの接続図を作っておきました。
3点スイッチのトップとダウンを勘違いしていたところがあったので、配線とプログラムを見直してあります。

ZeroWへの移植
シリアルコンソールの無効化
3Bでテストした環境をラズパイZeroに再現します。
手順は同じで、ラズパイの設定画面でシリアルコンソールを無効にします。

UARTの設定
 ZeroWも遅い方(MiniUART)をシリアルポートに、早い方(PL011)をそのままBluetoothに使います。
3Bと同様に /boot/cmdline.txt にenable_uart=1とcore_freq=250を追加します。
pi@zero:~ $ cat /boot/cmdline.txt
console=tty1 root=PARTUUID=884581db-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
pi@zero:~ $ sudo vi /boot/cmdline.txt
pi@zero:~ $ cat /boot/cmdline.txt
console=tty1 root=PARTUUID=884581db-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles enable_uart=1 core_freq=250
追加できました。
確認します。
pi@zero:~ $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 5  3月 23 07:17 /dev/serial0 -> ttyS0
lrwxrwxrwx 1 root root 7  3月 23 07:17 /dev/serial1 -> ttyAMA0 
オッケーです。多分。
プログラムの自動起動化
 屋外の設置場所にはディスプレイはもちろんありません。
現場で電源に接続したらプログラムが自動で走るようにしておく必要があります。
 systemdを使って自動起動する方法が推奨とのことなので、Unitファイルに起動したいコマンドを記述して自動起動となります。なるそうです。
を参考にいたしました、ありがとうございます、勉強になります。
Unitファイルの名前はsendmsg.serviceとしました。
[Unit]
Description = sendmsg
[Service]
ExecStart=/usr/bin/python3 /home/pi/sendmsg.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
有効化しておきます。
pi@zero:~/dev $ sudo systemctl enable sendmsg.service
Created symlink /etc/systemd/system/multi-user.target.wants/sendmsg.service → /lib/systemd/system/sendmsg.service.
pi@zero:~ $ 
ちなみに無効化はsudo systemctl disable sendmsg.serviceです。
 pythonの実行ファイルは前回から少し修正してあります。
スイッチの動作で割り込みして通知することも考えたのですが、リアルタイムで獲物がかかった通知が来ても、どうせ深夜遅くや早朝なので、アクションを起こす必要もなく現実的ではないので、1時間おきの状況の報告にとどめてあります。
どちらかというと、昼間のメール送信を止めるようにしたほうが良いのかとも思いますが、Sigfoxはパケット料が掛かったり、制限がされたりといったことがないので、そのままにしておきます。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
import subprocess
import serial
port = '/dev/ttyS0'
top_input = 23
bottom_input = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(top_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(bottom_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
    while True:
       
        top_state = GPIO.input(top_input)
        bottom_state = GPIO.input(bottom_input)    
        
        if top_state == False:
            switch_position = "0100"   
        elif bottom_state == False:
            switch_position = "0000"
        else:
            switch_position = "1100"
        temp = subprocess.run('vcgencmd measure_temp', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        volt = subprocess.run('vcgencmd measure_volts', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        temp = temp[1].replace("'C",'').replace('\n','')
        volt = volt[1].replace("V",'').replace('\n','')
        message = switch_position+temp.split(".")[0].zfill(4)+ temp.split(".")[1].ljust(4,'0') + volt.split(".")[0].zfill(4)+ volt.split(".")[1].ljust(4,'0')
        
        s = serial.Serial(port, 9600, timeout=10)
        at_command = 'AT$SF={0}\r'.format(message)
        s.write(at_command.encode())
        resp = s.readline()
        #print(temp + volt)
        #print('Response: {}'.format(resp))
        time.sleep(6)#1h=3600
except KeyboardInterrupt:
    GPIO.cleanup()
 自動起動させるために頭にシバン#!/usr/bin/env python3をつけておく必要があります。
あとパーミッションを変更して実行権限を付与しておきます。
pi@zero:~ $ ls -al
-rw-r--r--  1 pi pi 1465  3月 22 22:45 sendmsg.py
pi@zero:~ $ chmod 755 sendmsg.py
pi@zero:~ $ ls -al
-rwxr-xr-x  1 pi pi 1465  3月 22 22:45 sendmsg.py
pi@zero:~ $ 
(他のファイルは一覧から消してあります。)
メール通知の設定
またここは京セラさんの記事を見ながら設定していきます。
Sigfoxの管理画面から設定します。

初めの4桁がスイッチの状態、次の4桁+4桁がCPU温度、次の4桁+4桁がCPU電圧なので、Custom payload configをswitch::int:16 temp1::int:16 temp2::int:16 volt1::int:16 volt2::int:16
と設定しました。
メッセージ欄でswitch:"{customData#switch}" temp:"{customData#temp1}.{customData#temp2}'C" volt:"{customData#volt1}.{customData#volt2}V"と入力して小数点表示をさせます。
前回手こずったのと比較すると、サクサク進んでいます。
ひとまず完成
 USBバッテリーに接続して朝まで動作確認です。
1回目のメールが送られているのを、Sigfoxの管理画面から確認して寝ました。
 USBバッテリーに接続して朝まで動作確認です。
1回目のメールが送られているのを、Sigfoxの管理画面から確認して寝ました。
 朝起きると1時間おきにメールが届いていました。
メールの本文は、
朝起きると1時間おきにメールが届いていました。
メールの本文は、
送信テスト
{
  device:"72E4CC",
  time:"1648039738",  
  data:"01000036300000013500"
switch:"256"
temp:"54.12288'C"
volt:"1.13568V"
}
と送られて来ています。
10進法を16進法に変換せずに送信しているので、メールでの送信時には16進から10進に変換されて、送信した数値とは異なってしまっていますが、まぁよしとしましょう、成功ですね。
でもまだ続けます。
 猟期ももう終わることですし、フィールドのテストは次の機会ということで、ここまでで一区切りです。
とはいいつつ、このままでは実用的ではないので、スマートフォンから設定が出来るとか、罠の位置をマップで表示するとか、消費電力を抑えるなどの工夫が必要になってくると思いますので、時間を見つけては来シーズンの本格運用に向けて改良をしていくつもりです。
 お付き合いいただきありがとうございました。