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のアノード側とカソード側のどちら側に接続しても大丈夫です。
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の点滅が止まるのが分かりわかります。