GPIO Character Device で GPIO を制御するライブラリ。

Raspberry PiでGPIOを制御する複数のライブラリが公開されているが好みのシンプルで使いやすそうなライブラリがないので作ってみた。

数年前にsysfsを使ったものなら作ったことがあるがsysfsは非推奨となっていたのでその後継となるGPIO Character Deviceを使ってみた。

汎用的に使えるはずなのでRaspberry Piはもちろんのこと全てのLinuxで使えるはず。試してないけど。

いつものようにArduino風に作ってあるが仕様拡張しているため完全互換ではない。

なお、アプリやライブラリ終了時にdigitalWrite()で設定したピンの状態が変わることがあるらしいがGPIO Character Deviceの仕様らしいのであきらめること。(-_-;)

参考までにdigitalWrite()の速度を試してみたら約120KHz弱しか出なかった。ioctl()しか呼び出してないんだけどなぁ...HWダイレクトアクセスなら12MHzぐらい出ましたけど。って、早けりゃいいってもんでもないか。

【Lチカのサンプル】

【ピン変化割り込みのサンプル】

【概要】

このライブラリにアクセスするためのグローバル変数。

ライブラリを初期化。

ライブラリを終了し使用中の全てのピンを解放する。

ピンの入出力モードやプルアップ・モード、デバウンス時間を設定する。

ピン状態を設定する。

ピン状態を取得する。

ピン変化割り込み、エッジタイプ、デバウンス時間を設定する。割り込み対応はポーリングスレッドにて行っているのでリアルではないことに注意。

release()と同じ。

ピンを解放し他のアプリで使えるようにする。

GPIOチップ情報を取得する。numが取得したチップ数を超えるとNULLを返す。

指定マイクロ秒の間スリープする。(おまけ)

指定ミリ秒の間スリープする。(おまけ)

指定マイクロ秒の間ビジーループする。(おまけ)

指定ミリ秒の間ビジーループする。(おまけ)

システムタイマーをマイクロ秒で返す。(おまけ)

システムタイマーをミリ秒で返す。(おまけ)

【ピン割り当て】
gpiochip0 … 0 – 63
gpiochip1 … 64 – 127
gpiochip2 … 128 – 191
gpiochip3 … 192 – 256

【修正】
2022-07-31
OPEN_DRAIN/OPEN_SOURCEの処理が間違っていたので修正。

2022-07-28
pinmode.hを追加。

2022-07-26
detachInterrupt()の仕様変更。

2022-07-24
デバウンスの設定にミスがあったので修正し動作も確認できた。スイッチ入力等を想定し1秒毎に10ms幅のパルスを入力した場合、デバウンスに10ms以上を指定したときは無反応となり、10ms以下を指定すると反応するようになる。ただ、デバウンス時間に5ms未満を指定したときは問題ないのだが、5-10msを指定すると2回に1回取りこぼしが発生してしまう。つまり、デバウンス時間とチャタリング時間との兼ね合いによりとりこぼしが発生するのが避けられないということになるので現状では使うのは避けた方が良さそうだ。GPIO Character Deviceのバグだと思うが、デバウンス機能はスイッチ入力のチャタリング処理をお任せすることができて凄く便利なのでぜひ改善をお願いしたい。

【ダウンロード】
pinctrl.zip

【ライブラリ】
pthreadを使っているのでリンカーオプション-lpthreadの指定を忘れずに。