土地形状スキャン022 [FriendlyCore編]UI制御部とGNSS受信データ取得部の統合

造成

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点滅が待機モードに変化することを確認。

タイトルとURLをコピーしました