#pigpioライブラリを使って割り込み
pigpio library
http://abyz.me.uk/rpi/pigpio/cif.html
充実したライブラリで色々できるのですが、
公式にあるExamplesの使い方がよくわからなかったのでメモします。
また、LED出力など、コンピュータの計算結果を出力する方法
の記事は豊富にあるのですが、
コンピュータに対して実世界の情報を入力して計算させる方法
の記事があまりなかったので1つの例としてまとめます。
##pigpioライブラリインストール
$ sudo apt install pigpio
##ソースコード
#include <stdio.h>
#include <pigpio.h>
void interruptDisplay( int gpio, int level, uint32_t tick)
{
static int c = 1;
printf("Interrupt #%d level %d at %u\n", c, level, tick);
c++;
}
int main(int argc, char *argv[])
{
int ret;
unsigned int gpio;
if (gpioInitialise()<0) return 1;
/* Set GPIO modes */
gpioSetMode(4, PI_INPUT);
gpioSetPullUpDown(4, PI_PUD_UP);
printf("GPIO4 is level %d\n", gpioRead(4));
ret = gpioSetISRFunc(4, FALLING_EDGE, 5000, interruptDisplay);
if(ret < 0) printf("error");
while (1)
{
time_sleep(60);
}
gpioTerminate();
}
##コンパイル
$ gcc -o interrupt.out interrupt.c -lpigpio -lpthread
以前にMakefileの書き方について記事を書いたので、せっかくなのでMakefileも作成。
https://qiita.com/nullpo24/items/716bad137f1264b776f5
Makefile
CC = gcc
LIBS = -lpigpio -lpthread
LDFLAGS = -L /usr/lib -L /usr/local/lib
interrupt.out : interrupt.o
.c.o:
$(CC) -c $< -o $@
.o.out:
$(CC) $< -o $@ $(LIBS)
clean:
rm -f *.out
rm -f *.o
コンパイル(Make)
$ make
##実行
$ sudo ./interrupt.out
#ソースの解説
###初期化と終了処理
pigpioライブラリは初期化と終了処理が必要です。
初期化:gpioInitialise()
終了処理:gpioTerminate()
###GPIO4番ピンを入力モードにする
gpioSetMode(4, PI_INPUT);
###GPIO4番ピンの電圧の引き上げ
gpioSetPullUpDown(4, PI_PUD_UP);
PI_PUD_UPで電圧レベルを1にする。すなわち3.3V。
###コールバック関数をセット
gpioSetISRFunc(4, FALLING_EDGE, 5000, interruptDisplay);
##割り込みのタイミング
FALLING_EDGEに設定しているので、エッジが落ちた時に割り込みが発生します。
##コールバック関数について
コールバック関数とは他の関数に引数として渡す関数のことです。
gpioSetISRFunc関数はISR(Interrupt Service Routine)に対し、
コールバック関数(interruptDisplay())を登録します。
そして、GPIOの割り込みが発生するとISRが働きコールバックされるようにしているようです。
また、Linuxではマウスやキーボードなどの優先順位が高い割り込みが発生すると、このISRが働きます。
gpioライブラリは他にもコールバックを実現する関数として
gpioSetAlertFunc
gpioSetTimerFunc
gpioSetSignalFunc
などが用意されています。
##終わりに
どんな複雑なプログラムでもほどけば1本のひも(スレッド)になると言われています。
しかし、イベント処理(状態の変化)を非同期で実装する場合は、
今回の例のように2本以上のひもが必要です。