🚥

ラズパイのGPIOでエッジ検出してファイルにダンプする

2022/02/13に公開

Raspberry Pi(ラズパイ)のGPIOポートに入力される電圧がHIGH/LOW状態に変化したことをファイルに記録する。

pigpio

https://abyz.me.uk/rpi/pigpio/
pigpioを使えばコマンドラインでGPIOポートのエッジ検出ログをファイルに書き出せる。pigpioのツールpigsコマンドとpig2vcdコマンドを使う。

pig2vcdが出力するファイル形式のVCDフォーマットは、GTKWaveなど波形を表示できる多くのGUIツールで読み込むことができる。

キャプチャのやりかた

### サンプル間隔とバッファサイズを指定してdaemonを起動する
$ sudo pigpiod -s 1 -b 1000

### 通知ハンドルを取得する
$ pigs no
*-----
0	# ハンドルは0以上の整数として与えられる
*-----

### バックグラウンドでpipeからの出力をファイルに書き出す
$ pig2vcd </dev/pigpio0 >gpio.vcd &
# /dev/pigpioN: Nの部分が通知ハンドル
# pig2vcdはpigpio付属のコマンド

### 通知を開始する
$ pigs nb 0 0x10000
# 第2引数 bitsで対象のGPIOポートを指定する
# ここでは例として 0x10000 = GPIO 16(0x10000) + GPIO 12(0x1000)
-> 通知を終了するまでpipeにHIGH/LOWの変化が出力される

### 通知を終了する
$ pigs nc 0

参考: http://abyz.me.uk/rpi/pigpio/ex_LDR.html

シェルスクリプト書いた

通知を開始するpigs nbコマンドの第2引数bitsは、ビット位置がポート番号に対応したビットマスクとして渡す必要がある。ポート番号の数字をスペース区切りで指定できるようにシェルスクリプトを書いた。

使用例
$ sudo pigpiod -s 1 -b 1000
$ ./read_pin.sh 16 12
Hit Enter key to stop

libgpiod

LinuxにはGPIOを管理する新しいインターフェース(Linux kernel GPIO Interface)がある。そのAPIを使用するlibgpiodを使えばpigpioのようにsudoしなくてもGPIOポートにアクセスできる。ツールコマンドのgpiomonを使えば入力のエッジ検出ダンプもできる。
今回pigpioを使用したのは、これまでlibgpiodだけではポートのプル状態の設定ができなかったから。

linux kenrnel v5.5 以降かつ libgpiod v 1.5 以降ならbias設定としてプルアップ、プルダウンの設定ができるようになったらしい。
参考:https://microhobby.com.br/blog/2020/02/02/new-linux-kernel-5-5-new-interfaces-in-gpiolib

Discussion