Raspberry Piで、今回はbcm2835 ライブラリ(Ver:1.44)を使ってスイッチの入力とLEDの点灯/消灯を行います。Raspberry PiのC言語用のライブラリとして他にWiringPiがありますが、bcm2835 ライブラリの方が、よりハード寄りのライブラリなので、面倒ですが細かい制御ができます。

bcm2835ライブラリのインストール

以下のコマンドを実行して、bcm2835ライブラリをインストールします。なお、bcm2835ライブラリの使用については「C library for Broadcom BCM 2835 as used in Raspberry Pi 」に示されています。

$ sudo wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.44.tar.gz
$ tar zxvf bcm2835-1.44.tar.gz
$ cd bcm2835-1.44/
$ sudo ./configure
$ sudo make
$ sudo make install

LEDとタクトスイッチの接続確認

次の回路図に従ってRaspberry PiにLEDとタクトスイッチを接続します。正しく接続されているか次の手順で確認します。

<LEDの電流制限抵抗について>
LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあります。
例えばIFが10mAで、VFが2.5Vで、電源電圧が5Vとすると、
 (電源電圧-順方向電圧)÷ 順方向電流 = 電流制限抵抗値
よって、
 (5V – 2.5V) ÷ 0.010A = 250Ω
250Ωは無いので240Ωか270Ωを使います。10mAは0.010Aというふうにアンペアに変換して計算します。

だいたい120Ω~680Ωのあたりになります。LEDは5mAくらいで使った方が目に優しいので470Ωとします。また、抵抗はLEDのアノード側とカソード側のどちら側に接続しても大丈夫です。

タクトスイッチとLEDの接続図

タクトスイッチ接続方法

GPIO25をLEDの出力に使っているので25を指定します。

$ echo "25" > /sys/class/gpio/export
$ echo "out" > /sys/class/gpio/gpio25/direction

LEDを点灯させます

$ echo "1" > /sys/class/gpio/gpio25/value

LEDを消灯させます

$ echo "0" > /sys/class/gpio/gpio25/value

GPIO25の制御が終わると、最後に開放します。

$ echo "25" > /sys/class/gpio/unexport

GPIO24からタクトスイッチの入力を行います

echo "24" > /sys/class/gpio/export
cat /sys/class/gpio/gpio24/value

bcm2835 ライブラリによるスイッチ入力とLEDの点滅プログラム

bcm2835 ライブラリを使用して、スイッチが押されてるとLEDの点滅を開始するプログラムを作りました。CTRL-Cキーを押すとプログラムが終了します。

LED点滅プログラム「blink_led.c」

#include <stdio.h>
#include <stdlib.h>
#include <bcm2835.h>
#include <signal.h>
 
// Rpi P1ヘッダの22ピン(GPIO 25)をPIN_INと定義する
#define PIN_IN RPI_GPIO_P1_18
// Rpi P1ヘッダの22ピン(GPIO 25)をPIN_OUTと定義する
#define PIN_OUT RPI_GPIO_P1_22
 
// 割り込みコールバック関数
void signal_callback_handler(int signum)
{
    printf("\ndetect key interrupt\n",signum);
    bcm2835_gpio_write(PIN_OUT, LOW);
    bcm2835_close();
    printf("Program exit\n");
    exit(0);
}
 
int main(int argc, char **argv)
{
    if (!bcm2835_init())
        return 1;
 
    bcm2835_gpio_fsel(PIN_OUT, BCM2835_GPIO_FSEL_OUTP);
 
    bcm2835_gpio_fsel(PIN_IN, BCM2835_GPIO_FSEL_INPT );
     // VCCまでプルアップする
    bcm2835_gpio_set_pud(PIN_IN, BCM2835_GPIO_PUD_UP);
 
    signal(SIGINT, signal_callback_handler);
    printf("press ^C to exit program ...\n");
 
    while( bcm2835_gpio_lev(PIN_IN) == 0);
    printf("Start Blink!\n");
 
    while (1)
    {
        bcm2835_gpio_write(PIN_OUT, HIGH);
        delay(500);    // 0.5秒待つ
        bcm2835_gpio_write(PIN_OUT, LOW);
        delay(500);    // 0.5秒待つ
    }
}

コンパイル・リンクは次のコマンドで実行します。

$ gcc blink_led.c -o blink_led -l rt -l bcm2835

出来上がったプログラムを次のコマンドで実行します。

$ sudo ./blink_led

タクトスイッチが押されて青色LEDが点滅している動画を次に示します。パソコンの画面も一緒に撮ったのですがちょっと見づらいです。CTRL-Cのキーが押されるとパソコンの画面に表示し、青色LEDの点滅が止まるのが分かりわかります。