Raspberry Piで電子工作(1) Lチカ

ラズパイとWiringPiを用いて電子制御をするにあって、第一歩となるLチカを学ぶ。
Lチカとは、プログラミングでLEDを点灯/点滅させるという制御の基本のことである。(制御のハローワールドともいえる)

準備

プログラムを書く前に、電子制御に使用するものを紹介しよう。

ブレッドボード

ブレッドボードとは、表面に空いている穴に部品を差し込むことによって、電子回路を製作を製作できる便利なものである。はんだ付けをしなくてもよいため、部品の取り換えが簡単にできるという特徴がある。下の図のように内部的につながっており、直列接続がしやすくなっている。真ん中には隙間ができており、ICやボタンなどのサイズが大きいものが挿しやすくなっている。また、赤色のラインは電源、青色のラインはGNDとして使うことが慣習となっている。

例えば、下の左の図の回路を組みたいときは、右の図のように接続する。

ジャンパーワイヤー

ブレッドボードの穴同士を接続させたり、ラズパイのピンとブレッドボードにを接続させたりするためには、ジャンパーワイヤーが必要である。今回は、両側の先端にピンがあるオス-オス型と片方にピンヘッダーが接続できるようになっているオス-メス型の2種類を使用する。
オス-オス型はブレッドボード上の接続に、オス-メス型はラズパイとブレッドボードの接続に使用する。

WiringPiを用いたピン制御

ラズパイからピン制御をするためには、ピン番号を指定する必要がある。Raspberry Pi2では、以下の表のようになっている。様々な番号が割り当てられているが、WiringPiの場合は、wPiの列の番号を使用する。
BCM wPi Name Physical Physical Name wPi BCM
3.3V 1 ・ ・ 2 5V
2 8 SDA.1 3 ・ ・ 4 5V
3 9 SCL.1 5 ・ ・ 6 GND
4 7 GPIO.7 7 ・ ・ 8 TxD 15 14
GND 9 ・ ・ 10 RxD 16 15
17 0 GPIO.0 11 ・ ・ 12 GPIO.1 1 18
27 2 GPIO.2 13 ・ ・ 14 GND
22 3 GPIO.3 15 ・ ・ 16 GPIO.4 4 23
3.3V 17 ・ ・ 18 GPIO.5 5 24
10 12 MOSI 19 ・ ・ 20 GND
9 13 MISO 21 ・ ・ 22 GPIO.6 6 25
11 14 SCLK 23 ・ ・ 24 CE0 10 8
GND 25 ・ ・ 26 CE1 11 7
0 30 SDA.0 27 ・ ・ 28 SCL.0 31 1
5 21 GPIO.21 29 ・ ・ 30 GND
6 22 GPIO.22 31 ・ ・ 32 GPIO.26 26 12
13 23 GPIO.23 33 ・ ・ 34 GND
19 24 GPIO.24 35 ・ ・ 36 GPIO.27 27 16
26 25 GPIO.25 37 ・ ・ 38 GPIO.28 28 20
GND 39 ・ ・ 40 GPIO.29 29 21

今回の回路

今回は、以下のようにLEDと220Ωの抵抗を直列につないだシンプルな回路を使用する。
LEDに電流が流れすぎなように抵抗を挟んでいる。

LEDを点灯するプログラム

まずは、LEDがずっと点灯しっぱなしのプログラムを作ってみた。
#include <wiringPi.h> // WringPiを使用するために必要

int main(void) {
    wiringPiSetup(); // WringPiを初期化する
    pinMode(29, OUTPUT); // 29ピンを出力として使用する
    while(1) {
        digitalWrite(29, HIGH); // 29ピンにHIGH信号を送る
    }
    return 0;
}

プログラムの説明

コンパイルおよび実行方法

コンパイルはTerminalで以下のように行う。
gcc LED.c -lwiringPi -o led

あらかじめソースファイルがあるディレクトリまで移動させておくこと。
WringPiを使用する場合は、-lwiringPiと書くことに注意する。
また、-oオプションを使用して出力されるファイル名を指定することができる。
何も指定しないと、a.outというファイルができる。

実行は、ファイル名がledだった場合、
./ledとする。 無限ループのため、プログラムはCtrl+Cを押して手動で終了する必要がある。

LEDを点滅させるプログラム

今度は、LEDを点滅させるプログラムに書き換える
#include <wiringPi.h>
#define PIN 29 // ピン番号を変えやすくするため、マクロを使用

int main(void) {
    wiringPiSetup();
    pinMode(PIN, OUTPUT);
    while(1) {
        digitalWrite(PIN, HIGH);
        delay(500); // 500ms処理を停止
        digitalWrite(PIN, LOW);
        delay(500);
    }
    return 0;
}

プログラムの説明

先ほどのプログラムに消灯処理を加えたものである。ただし、続けて実行すると、処理が速すぎてLEDが点灯しているのか消灯しているのかがわからないため、delay()という関数を用いて500ms処理を遅らせている。こうすることで、500msごとにLEDが点灯/消灯の動作を繰り返すことになる。


トップページに戻る