LEDとタクトスイッチを使った簡単なUIの制御ができるようになったので、GNSS受信機のデータ取り込み制御と組み合わせる作業を行う。
GNSS受信アプリの状態とLED点滅対応
アプリの状態
1. アプリ起動後待機
2. 受信Log記録中
3. 受信Log記録終了後待機
LED点滅の3タイプ
pwm周波数とduty比の様々なパターンを試してみた。
結果、以下の3パターンがそれぞれ区別可能として採用することに。
1. 周波数1Hz Duty比5
2. 周波数1Hz Duty比50
3. 周波数1Hz Duty比90
GNSS受信データ取り込み処理を追加
UI処理に条件分岐部に追加
pythonでLinuxコマンドを使うためにsubprocessモージュールを使う
work_gnsslogger_000.py の一部
while True:
if GPIO.input(PIN_NUM_SWITCH)==0:
time.sleep(1) #0.1s wait
if state==0:
subprocess.run([‘systemctl’, ‘–user’, ‘start’, ‘str2str.service’])
pwm.ChangeDutyCycle(5)
state=1
elif state==1:
subprocess.run([‘systemctl’, ‘–user’, ‘stop’, ‘str2str.service’])
pwm.ChangeDutyCycle(90)
state=0
これを実行するとエラー発生
$ sudo python3 work_gnsslogger_000.py
Failed to connect to bus: No such file or directory
色々試したところ、systemctl –user コマンドのsubprocessをpythonからsudo権限で実行する条件で発生している模様。
sudo無でsystemctl –user コマンドのsubprocessを実行すると正常にstr2strが実行されることを確認。
ただしsudo無ではRPi.GPIOのメソッドでエラーとなる
$ python3 work_gnsslogger_000.py
Traceback (most recent call last):
File “work_gnsslogger_000.py”, line 13, in
GPIO.setup(PIN_NUM_LED, GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
RPi.GPIOモモジュールによるGPIO制御ができないとUIが実現せずスタンドアロンで実行することができない。
systemctl –user を使わず、str2strコマンドを直接実行する方法に戻すことにする。
$ vi work_gnsslogger_003.py
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
import subprocess
PIN_NUM_LED = 11 #PA0
PIN_NUM_SWITCH = 15 #PA3
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN_NUM_LED, GPIO.OUT)
GPIO.setup(PIN_NUM_SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
pwm = GPIO.PWM (PIN_NUM_LED,1)
pwm.start(90)
cmd=”str2str -in serial://ttyACM0:115200#ubx -out /home/share/`date +%Y%m%d%H%M%S`.ubx”
state=0
try:
while True:
if GPIO.input(PIN_NUM_SWITCH)==0:
time.sleep(1) #0.1s wait
if state==0:
subrun=subprocess.Popen(“exec ” + cmd, shell=True)
pwm.ChangeDutyCycle(5)
state=1
elif state==1:
subrun.kill()
pwm.ChangeDutyCycle(90)
state=0
except KeyboardInterrupt:
pass
pwm.stop()
GPIO.cleanup()
これを実行すると、タクトスイッチを押すとGNSS受信機のデータ記録が開始し、共有フォルダに受信データが書き込まれ、LED点滅も書き込みモードに変化。
もう一度タクトスイッチを押すと、受信データ記録が終了し、LED点滅が待機モードに変化することを確認。