4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry Pi3でpigpioライブラリを使って割り込みをする

Posted at

#pigpioライブラリを使って割り込み
pigpio library
http://abyz.me.uk/rpi/pigpio/cif.html

充実したライブラリで色々できるのですが、
公式にあるExamplesの使い方がよくわからなかったのでメモします。

また、LED出力など、コンピュータの計算結果を出力する方法
の記事は豊富にあるのですが、
コンピュータに対して実世界の情報を入力して計算させる方法
の記事があまりなかったので1つの例としてまとめます。

##pigpioライブラリインストール

$ sudo apt install pigpio

##配線図
GPIO4を使用します。
スクリーンショット 2019-04-27 14.33.30.png

##ソースコード

interrupt.c
#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に設定しているので、エッジが落ちた時に割り込みが発生します。
スクリーンショット 2019-04-27 15.06.09.png

##コールバック関数について
コールバック関数とは他の関数に引数として渡す関数のことです。

gpioSetISRFunc関数はISR(Interrupt Service Routine)に対し、
コールバック関数(interruptDisplay())を登録します。
そして、GPIOの割り込みが発生するとISRが働きコールバックされるようにしているようです。
スクリーンショット 2019-04-27 15.44.19.png

また、Linuxではマウスやキーボードなどの優先順位が高い割り込みが発生すると、このISRが働きます。

gpioライブラリは他にもコールバックを実現する関数として
gpioSetAlertFunc
gpioSetTimerFunc
gpioSetSignalFunc
などが用意されています。

##終わりに
どんな複雑なプログラムでもほどけば1本のひも(スレッド)になると言われています。
しかし、イベント処理(状態の変化)を非同期で実装する場合は、
今回の例のように2本以上のひもが必要です。

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?