環境

・Raspberry Pi 4 Model B 4GB

・Ubuntu Server 20.04.2 LTS 64bit版

準備

GPIO(General Purpose Input/Output)について

Raspberry Piに上向きについているピンのことで、Raspberry Pi 4は、40本のピンがついています。

このピンに配線することで、電子部品の操作を行ったり、センサーの値を取得することができます。

GPIOのピンは、全て同じ機能をもっているわけではなく、

ピン毎に機能が決まっているので、配線する際には注意が必要です。

使用するパーツについて

今回は、下記の4つのパーツを使用します。ブレッドボードだけは、個別に購入したものを使っていますが、

それ以外については、Amazonで購入したスターターキットに、入っていたものを利用しています。

Amazonで「Raspberry Pi スターターキット」と検索すると、いろいろと出てきます。

また、下記のパーツは、ほとんどのスターターキットに入っているかと思います。

ブレッドボード 1個
ジャンパワイヤ(オス-メス) 2個
赤色LED 1個
抵抗(100Ω) 1個

 

それぞれ、簡単に説明します。

1. ブレッドボード

電子回路の試作ができる基板です。たくさんの穴があいており、そこに電子部品をさすことで

電子回路を作ることができます。穴にさすだけでよいため、はんだ付けなどする必要がありません。

今回は、下記のものを使っていますが、ブレッドボードならどれでも大丈夫かと思います。

2. ジャンパワイヤ(オス-メス)

ブレッドボードに差し込むことで使える配線になります。

種類として、先端がとがっているオスと、へこんでいるメスがあります。

ブレッドボードの穴に対して使うのがオス、GPIOのピンに使うのがメスです。

今回は、下記の画像のようにブレッドボードとGPIOのピンをつなぐため、オス-メスのものを使います。

3. 赤色LED

LED(Light Emitting Diode)は、電圧を加えると発光する電子部品です。

こちらもほとんどのスターターキットにはっていると思います。

下記のような形状をしていて、プラスとマイナスがあるので、つなぐときは注意が必要です。

プラスをアノード、マイナスをカソードともいうそうです。

また、見分け方としては、下記の画像を見るとわかるのですが、

足が長い方がプラス(アノード)、短い方がマイナス(カソード)となります。

他には、少しわかりにくいですが、よく見るとマイナス(カソード)側のLEDが欠けているのがわかります。

(LEDを上から見ると、マイナス側の円が少し欠けています。)

4.  抵抗器(100Ω)

今回使うLEDのような電子部品には、適切な量以上の電気を流すと壊れてしまう可能性があるため、

適切な電圧(定格電圧)と電流(定格電流)が決まっています。

そこで、電子部品に適切な量の電気が流れるように調整するための部品が、

この抵抗器(抵抗)という電子部品になります。

抵抗値には色々ありますが、今回は抵抗値100Ωのものを使います。

また、抵抗器は書いてある線の色で抵抗値を判断できます。

袋などから出して、わからなくなっても、調べれば大丈夫です。

 

抵抗の値の決め方について

まず、LEDはかける電圧が、ある値よりも低いと発光せず、その値より高いと発光します。

その値が製品毎に決まっており、順電圧(Vf)と呼びます。

今回使うLEDの順電圧(Vf)の値は、忘れてしまったのですが、

一般的な赤色LEDの場合、2Vほどのようなので、その値を使います。

それとは別に、動作するのに適切な電流の値も決まっており、順電流(If)と呼びます。

 

 抵抗器の値は、LEDに適切な量(順電流)の電流が流れるように計算して決めていきます。

ただ、注意しなくてはならないのは、

Raspberry PiのGPIO1本のピンに流して良い電流の値が16mAと決まっています。

そのため、LEDの順電流が16mAを超える場合は、この制限を考慮して抵抗値を設定する必要があります。

また、だからといって、機器による変動などがある中で、

ぴったり16mAを流すのは避けたいため、今回はLEDに10mA(0.01A)を流す想定で値を決めます。

 

では、実際に計算をしてきます。

抵抗値については、オームの法則を用いて、下記の式で決めることができます。

抵抗値(Ω)= 抵抗にかかる電圧(V) ÷ 流したい電流の値(A)

そして、

抵抗にかかる電圧(V) = 電源電圧(V) – LEDの順電圧(V)

となるため、

抵抗値(Ω)(3.3 – 2) ÷ 0.01 130

よって、設置したい抵抗器の値は、130Ωとなります。

持っている場合は、130Ωでよいのですが、手持ちで130Ωの抵抗値がなかったため、

値の近い100Ωで代用することにしました。

念のため、流れる電流値を計算すると、下記のようになり、16mAは超えないので大丈夫そうです。

流れる電流の値(A) = 1.3 ÷ 100 = 0.013

 

 

手順

配線

電気を流して、動作を確認する

配線が完了したら、電気を流してみます。

まずは、下記のgpioコマンドを実行し、指定したいピン番号などを確認します。

$ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+

上記のコマンドの結果で、ピン番号が指定方法によって、変わることが確認できます。

今回は、中央の列に書いてある物理的なPIN番号における7番PINから電気を流したいので、

GPIOの番号(BCM列)なら4、Wiring Piの番号(wPi列)なら7であることがわかります。

また、対象のPINのModeがIN(入力)になっていることも上記のコマンドから確認できます。

次に、下記のコマンドを実行し、指定したGPIOポートのモードをOUT(出力)に変更します。

オプションで、どの指定方法を使うかを決めることができます。

# -1オプションをつけると、物理的なPIN番号で指定できる
$ gpio -1 mode 7 out

# -gオプションをつけると、GPIOの番号で指定可能できる
$ gpio -g mode 4 out

# オプションをつけないと、Wiring Piの番号で指定できる
$ gpio mode 7 out

次に、下記のコマンドを実行し、指定したGPIOポートに1を設定します。

(GPIO番号で指定してますが、他の方法でも大丈夫です。)

$ gpio -g write 4 1

上記のコマンド実行後、LEDが点灯すれば、成功です。

点灯しない場合は、配線しているピンがあっているか、LEDの向きが正しいかなどを確認します。

成功した場合は、下記のコマンドを実行し、電気を流すのをやめます。

(GPIO番号で指定してますが、他の方法でも大丈夫です。)

$ gpio -g write 4 0

プログラムでLチカをする

配線も成功し、LEDが光ることが確認できたので、PythonのプログラムでLEDを点滅させていきます。

まずは、PythonでWiring Piを使えるようにするために、Pythonのパッケージ管理を行うpip3をいれていきます。

下記のコマンドを実行します。

$ sudo apt install python3-pip

完了したら、次はpip3を使って、Wiring Piのライブラリをいれていきます。

$ sudo pip3 install wiringpi

これで、プログラムでWiring Piを使う準備ができたので、

下記のプログラムを作成します。

blink.py

import wiringpi
import time, sys

# GPIO番号(BCM)を変数に代入
LED_PORT = 4

# GPIO番号(BCM)で指定できるように初期化
wiringpi.wiringPiSetupGpio()

# 指定したピンにモード(出力)を設定
wiringpi.pinMode(LED_PORT, wiringpi.OUTPUT)
try:
    while True:
        # 指定したピンを点灯(HIGHを設定)
        wiringpi.digitalWrite(LED_PORT, wiringpi.HIGH)
        # 0.3秒待つ
        time.sleep(0.3)

        # 指定したピンを消灯(LOWを設定)
        wiringpi.digitalWrite(LED_PORT, wiringpi.LOW)
        # 0.3秒待つ
        time.sleep(0.3)

except KeyboardInterrupt:
    pass

プログラムが作成できたら、下記のコマンドで実行します。

$ sudo python3 blink.py

LEDがチカチカと点滅したら、成功です。

macでssh接続して動かしている場合は、Control+c で停止します。