0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(MA-X320/LAD)DIを検知してプログラムを起動する

Last updated at Posted at 2024-10-03

■概略

センチュリー・システムズのMAシリースはLinuxアプライアンス
ラズベリーパイと同等のことができるが、屋外でも安定して動作するのでIoTソリューションに利用している
*動作保証が-20度~60度(Raspberry Pi 3 model Bは0~70度)
 屋外だと氷点下以下になることがある!
*SLC(書込み回数が多い)SDカード(8GB)もオプション提供あり
*機種によりLTE標準対応で、海外LTE対応機種もある

■GPIOとDIN、DOUT

MAシリーズは標準で2以上のアナログ入力(DIN)インターフェースがある
DINを使えば物理的なスイッチを押せば特定のプログラムを起動させることが可能になる
物理スイッチが押された時、python3の常駐プログラム(gpio)で検知し特定のプログラムを起動する方法をまとめた

MA-X320/LADはDINが標準で2個、拡張で24個ある
メインボード側(裏/ACアダプタ側)のDIの名称 DIN_S0とDIN_S1
拡張ボード側(表)のDIの名称 EXT_DI0 - EXT_DI23
DI/DOの利用…DINの名前他

■GPIO検知常駐プログラム

◯DIN名に対応するgpiochip名とoffset番号

DIN名に対応するgpiochip名とoffset番号をMA-X320/LADにsshログインして調べることができる

# gpiofind {DIN名}

例)

# gpiofind DIN_S0
gpiochip2 60

gpiochip毎に常駐プログラムが必要で、筆者の手元のMA-X320/LADではgpiochipが3つあった
この場合3プログラムを常駐させる

*DIN名に対応するgpiochipとoffset番号一覧(筆者の手元で調査。各人調査すること)

DIN名 gipochip名 offset番号
DIN_S0 gpiochip2 60
DIN_S1 gpiochip2 61
EXT_E0 gpiochip4 0
EXT_E1 gpiochip4 1
EXT_E2 gpiochip4 2
EXT_E3 gpiochip4 3
EXT_E4 gpiochip4 4
EXT_E5 gpiochip4 5
EXT_E6 gpiochip4 6
EXT_E7 gpiochip4 7
EXT_E8 gpiochip4 8
EXT_E9 gpiochip4 9
EXT_E10 gpiochip4 10
EXT_E11 gpiochip4 11
EXT_E12 gpiochip3 0
EXT_E13 gpiochip3 1
EXT_E14 gpiochip3 2
EXT_E15 gpiochip3 3
EXT_E16 gpiochip3 4
EXT_E17 gpiochip3 5
EXT_E18 gpiochip3 6
EXT_E19 gpiochip3 7
EXT_E20 gpiochip3 8
EXT_E21 gpiochip3 9
EXT_E22 gpiochip3 10
EXT_E23 gpiochip3 11

◯GPIO常駐プログラム

gpiofind pythonスクリプトを常駐に改造した

gpiomon.py

#!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1-or-later
# https://github.com/aswild/python-gpiod/tree/master/examples
#
import os, io, sys, re
import gpiod
# gpiomon.pyと同じディレクトリにconfig.py
sys.path.append(os.path.dirname(__file__))
import config

if __name__ == '__main__':
    def print_event(event):
    	if event.type == gpiod.LineEvent.RISING_EDGE:
    	    evstr = ' RISING EDGE'
    	elif event.type == gpiod.LineEvent.FALLING_EDGE:
    	    evstr = 'FALLING EDGE'
    	else:
    	    raise TypeError('Invalid event type')
    
    	print('event: {} source: {} timestamp: [{}.{}]'.format(evstr,
    							       event.source,
    							       event.sec, event.nsec))

    with gpiod.Chip(sys.argv[1]) as chip:
	offsets = []
	for off in config.gpio_offsets[sys.argv[1]]:
	    offsets.append(int(off))

	lines = chip.get_lines(offsets)
	lines.request(consumer=sys.argv[0], type=gpiod.LINE_REQ_EV_BOTH_EDGES)

	try:
	    while True:
		ev_lines = lines.event_wait(sec=1)
		if ev_lines:
		    for line in ev_lines:
			event = line.event_read()
			print_event(event)
			if event.type == gpiod.LineEvent.FALLING_EDGE:
                            if 'DIN_S0' in event.source:
            			        # DIN_S0時のプログラムを起動する
                            elif 'DIN_S1' in event.source:
            			        # DIN_S1時のプログラムを起動する
                            elif 'EXT_E0' in event.source:
            			        # EXT_E0時のプログラムを起動する
                            …
                            elif 'EXT_E23' in event.source:
            			        # EXT_E23時のプログラムを起動する
	except KeyboardInterrupt:
	    sys.exit(130)

config.py

## GPIO
gpiodir = "system_gpiomon_*.pyのあるディレクトリ"
# https://ma-tech.centurysys.jp/doku.php?id=use_di_do:start#:~:text=また、外部電源の接続
# メインボード側(裏/ACアダプタ側) DIN_S0とDIN_S1
# 拡張ボード側(表) EXT_DI0 - EXT_DI23
gpio_chip_S00_S01 = 'gpiochip2'   # gpiofind DIN_S0|awk '{print $1}'
gpio_chip_E00_E11 = 'gpiochip4'   # gpiofind EXT_DI0|awk '{print $1}'
gpio_chip_E12_E23 = 'gpiochip3'   # gpiofind EXT_DI12|awk '{print $1}'
gpio_offsets = {}
gpio_offsets[gpio_chip_S00_S01] = [60,61] # gpiofind DIN_S0,S1|awk '{print $2}'
gpio_offsets[gpio_chip_E00_E11] = [0,1,2,3,4,5,6,7,8,9,10,11]  # gpiofind EXT_DI0-11|awk '{print $2}'
gpio_offsets[gpio_chip_E12_E23] = [0,1,2,3,4,5,6,7,8,9,10,11]  # gpiofind EXT_DI12-23|awk '{print $2}'

◯GPIO起動スクリプト

DIN_S0-S1用起動スクリプト
systemd_gpiomon_s0.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#
# systemd_gpio_*.py
#
# 標準
import os, io, sys, re
import subprocess
# systemd_gpio_*.pyと同じディレクトリにconfig.py
sys.path.append(os.path.dirname(__file__))
import config

cmd_template = "{0}/gpiomon.py {1}"
cmd = cmd_template.format(config.gpiodir, config.gpio_chip_S00_S01)
ret = subprocess.run(cmd, shell=True)

EXT_E0-E11用起動スクリプト
systemd_gpiomon_e0.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#
# systemd_gpio_*.py
#
# 標準
import os, io, sys, re
import subprocess
# systemd_gpio_*.pyと同じディレクトリにconfig.py
sys.path.append(os.path.dirname(__file__))
import config

cmd_template = "{0}/gpiomon.py {1}"
cmd = cmd_template.format(config.gpiodir, config.gpio_chip_E00_E11)
ret = subprocess.run(cmd, shell=True)

EXT_E12-E23用起動スクリプト
systemd_gpiomon_e12.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#
# systemd_gpio_*.py
#
# 標準
import os, io, sys, re
import subprocess
# systemd_gpio_*.pyと同じディレクトリにconfig.py
sys.path.append(os.path.dirname(__file__))
import config

cmd_template = "{0}/gpiomon.py {1}"
cmd = cmd_template.format(config.gpiodir, config.gpio_chip_E12_E23)
ret = subprocess.run(cmd, shell=True)

◯GPIO常駐設定

DIN_S0-S1用起動設定
/etc/systemd/system/gpiomon_s0.service

[Unit]
Description=GPIO Monitor S00-S01
After=network.target

[Service]
Type=simple
PIDFile=/var/run/systemd_gpiomon_s0.pid
RemainAfterExit=no
Restart=on-failure
RestartSec=10
ExecStart=/var/www/diomail/batch/systemd_gpiomon_s0.py
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

EXT_E0-E11用起動設定
/etc/systemd/system/gpiomon_e0.service

[Unit]
Description=GPIO Monitor E00-11
After=network.target

[Service]
Type=simple
PIDFile=/var/run/systemd_gpiomon_e0.pid
RemainAfterExit=no
Restart=on-failure
RestartSec=10
ExecStart=/var/www/diomail/batch/systemd_gpiomon_e0.py
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

EXT_E12-E23用起動設定
/etc/systemd/system/gpiomon_e11.service

[Unit]
Description=GPIO Monitor E12-23
After=network.target

[Service]
Type=simple
PIDFile=/var/run/systemd_gpiomon_e12.pid
RemainAfterExit=no
Restart=on-failure
RestartSec=10
ExecStart=/var/www/diomail/batch/systemd_gpiomon_e12.py
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
# systemctl enable gpiomon_e0
# systemctl enable gpiomon_e12
# systemctl enable gpiomon_s0
# systemctl start gpiomon_e0
# systemctl start gpiomon_e12
# systemctl start gpiomon_s0

■ログ出力

※DIN_S0をon/offすると以下の出力がでる

/var/log/syslog

2024-09-30T18:05:24.400672+09:00 max300lad systemd_gpiomon_s0.py[4053]: event: FALLING EDGE source: 'gpiochip2:60 /DIN_S0/' timestamp: [26166.410662111]
※print("FALLING_EDGE")が実行された
2024-09-30T18:05:24.401485+09:00 max300lad systemd_gpiomon_s0.py[4053]: FALLING_EDGE
2024-09-30T18:05:37.098265+09:00 max300lad systemd_gpiomon_s0.py[4053]: event:  RISING EDGE source: 'gpiochip2:60 /DIN_S0/' timestamp: [26179.108469019]

■USBステップアップコンバータ

*写真の組み合わせを作り出力をMA-X320/LADの裏側のDIN_0とDIN_Cに挿した
*青い基盤は以下のリンクを購入した
*黒いスイッチのON/OFFで上記ログが出力される
USBStepUp.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?