LoginSignup
4
3

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