Raspberry Piは、手軽に電子工作やプログラミングを学ぶのに適したコンピュータです。
Raspberry Piのメリット、GPIOの基本的な説明、そして有名なLチカ(LEDを点滅させる)プロジェクトの例題を紹介します。
Raspberry Piのメリット
- パソコンと比較したメリット
- コストが低い:Raspberry Piは非常に安価(モデルによって数千円)で入手でき、予算の少ないプロジェクトでも導入が可能です。
- 小型で省電力:Raspberry Piは小さく、モバイルバッテリーなどでも動作可能で、手軽に持ち運んで使用できます。
- GPIOピンが使える:一般的なパソコンにはないGPIO(汎用入出力ピン)が搭載されており、電子回路やセンサーと直接接続できるため、ハードウェア制御が可能です。
- マイコン(例えばArduino)と比較したメリット
- 完全なOSを動作させられる:Raspberry PiにはLinuxベースのOS(Raspberry Pi OS)が動作し、PythonやCなどのプログラミング環境を提供します。マイコン(Arduinoなど)は単一のプログラムしか実行できませんが、Raspberry Piは複数のタスクを同時に実行できます。
- 豊富なライブラリとソフトウェアサポート:Raspberry Piは、PCと同様に豊富なソフトウェアリソースやライブラリが利用でき、例えばインターネットに接続してデータをやり取りしたり、カメラやディスプレイを扱ったりすることが簡単にできます。
GPIOとは?
GPIO(General Purpose Input/Output)は、Raspberry Piのハードウェアと外部デバイス(LED、スイッチ、センサーなど)をつなぐためのピンです。これらのピンはプログラムで制御でき、信号を出力してLEDを点灯させたり、センサーから入力を受け取ったりできます。
GPIOピンには、次のような用途に応じた種類があります
GPIOピンの主な機能
- デジタル入出力: 基本的に、GPIOピンはHIGH(1)またはLOW(0)を出力したり、外部からの信号を受け取ることができます。これがデジタル入出力(I/O)の基本機能です。
- I2C: I2C(Inter-Integrated Circuit)は、複数のデバイスを2本のワイヤで接続するためのプロトコルです。センサーやLCDディスプレイなどがこのプロトコルを使用します。
- SPI: SPI(Serial Peripheral Interface)は、高速でデータをやり取りする通信プロトコルです。SDカードやアナログ-デジタル変換器などのデバイスに使用されます。
- UART: UART(Universal Asynchronous Receiver/Transmitter)は、シリアル通信に使用されます。通常、シリアルデバイスとの通信に使用されます。
- 電源ピン: 5Vや3.3Vを供給するピンがあり、外部デバイスに電力を供給します。
- GND: 回路のグラウンドとして機能します。
Raspberry Pi 5には、40ピンのGPIOヘッダーがあり、これらのピンは様々な機能を持っています。
GPIOピン番号と機能の表
ピン番号 | BCMピン番号 | ピン名 | 機能 |
---|---|---|---|
1 | - | 3.3V | 電源(3.3V) |
2 | - | 5V | 電源(5V) |
3 | GPIO 2 | SDA1 | I2Cデータ通信ピン(SDA) |
4 | - | 5V | 電源(5V) |
5 | GPIO 3 | SCL1 | I2Cクロックピン(SCL) |
6 | - | GND | グラウンド |
7 | GPIO 4 | GPIO 4 | 汎用入出力(デジタルI/O) |
8 | GPIO 14 | TXD | UART送信ピン |
9 | - | GND | グラウンド |
10 | GPIO 15 | RXD | UART受信ピン |
11 | GPIO 17 | GPIO 17 | 汎用入出力(デジタルI/O) |
12 | GPIO 18 | GPIO 18 | PWM出力対応ピン |
13 | GPIO 27 | GPIO 27 | 汎用入出力(デジタルI/O) |
14 | - | GND | グラウンド |
15 | GPIO 22 | GPIO 22 | 汎用入出力(デジタルI/O) |
16 | GPIO 23 | GPIO 23 | 汎用入出力(デジタルI/O) |
17 | - | 3.3V | 電源(3.3V) |
18 | GPIO 24 | GPIO 24 | 汎用入出力(デジタルI/O) |
19 | GPIO 10 | SPI0_MOSI | SPI送信ピン(MOSI) |
20 | - | GND | グラウンド |
21 | GPIO 9 | SPI0_MISO | SPI受信ピン(MISO) |
22 | GPIO 25 | GPIO 25 | 汎用入出力(デジタルI/O) |
23 | GPIO 11 | SPI0_SCLK | SPIクロックピン(SCLK) |
24 | GPIO 8 | SPI0_CE0_N | SPIチップセレクト0 |
25 | - | GND | グラウンド |
26 | GPIO 7 | SPI0_CE1_N | SPIチップセレクト1 |
27 | GPIO 0 | ID_SD | ID EEPROM(I2Cデータ) |
28 | GPIO 1 | ID_SC | ID EEPROM(I2Cクロック) |
29 | GPIO 5 | GPIO 5 | 汎用入出力(デジタルI/O) |
30 | - | GND | グラウンド |
31 | GPIO 6 | GPIO 6 | 汎用入出力(デジタルI/O) |
32 | GPIO 12 | GPIO 12 | PWM出力対応ピン |
33 | GPIO 13 | GPIO 13 | PWM出力対応ピン |
34 | - | GND | グラウンド |
35 | GPIO 19 | GPIO 19 | PWM出力対応ピン、SPI1_MOSI対応 |
36 | GPIO 16 | GPIO 16 | 汎用入出力(デジタルI/O) |
37 | GPIO 26 | GPIO 26 | 汎用入出力(デジタルI/O) |
38 | GPIO 20 | GPIO 20 | PWM出力対応ピン、SPI1_MISO対応 |
39 | - | GND | グラウンド |
40 | GPIO 21 | GPIO 21 | PWM出力対応ピン、SPI1_SCLK対応 |
各ピンの詳細な説明
- 電源ピン(3.3V、5V):これらのピンは、外部デバイスに電力を供給するためのピンです。注意点として、5VピンはRaspberry Piの電源に直接接続されており、出力制御はできません。
- GNDピン:グラウンド(GND)は、回路の基準電位です。外部デバイスとRaspberry Piを接続する際には、GNDピンを共有する必要があります。
- I2Cピン:I2Cバス(SDA: データ、SCL: クロック)は、センサーや他のデバイスとデータをやり取りするために使用します。複数のデバイスを同じバスに接続できるのが特徴です。
- SPIピン:SPIは、より高速なデータ通信を行うためのプロトコルです。MOSI(送信)、MISO(受信)、SCLK(クロック)、CE(チップセレクト)を使用して、複数のSPIデバイスと通信が可能です。
- UARTピン:シリアル通信のためのピンです。TX(送信)とRX(受信)で、例えばシリアルデバイスやコンピュータとのデータ通信が行えます。
- PWMピン:PWM(パルス幅変調)は、デジタル信号を使ってアナログ信号を模倣する方法です。例えば、モーターの速度を制御したり、LEDの明るさを変えたりするのに使います。
- 汎用入出力(GPIO)ピン:これらのピンは、外部デバイスとの基本的な入出力に使用します。デジタル信号のON/OFFをプログラムで制御することが可能です。
Lチカ
Raspberry Pi 5では、RPi.GPIO
ライブラリが利用できなくなったため、代わりにgpiozero
ライブラリを使用することが推奨されています。
gpiozero
はシンプルなインターフェースを提供し、Raspberry PiのGPIOピンを使った電子工作を簡単に行えるライブラリです。
以下に、gpiozero
を使ったLチカ(LED点滅)のプログラムを書き換えた例を紹介します。
必要なもの
- Raspberry Pi本体
- LED(1つ)
- 抵抗(330Ω)
- ブレッドボードとジャンパーワイヤー
配線
- LEDの長い脚(プラス側)をGPIO 17ピンに接続します。
- LEDの短い脚(マイナス側)を抵抗を通してGNDに接続します。
gpiozero
を使ったLチカのPythonコード
from gpiozero import LED
from time import sleep
# GPIO 17番ピンに接続したLEDを定義
led = LED(17)
# LEDを点滅させる
while True:
led.on() # LEDをON
sleep(1) # 1秒間待機
led.off() # LEDをOFF
sleep(1) # 1秒間待機
解説
from gpiozero import LED
:gpiozero
ライブラリからLEDクラスをインポートします。led = LED(17)
: GPIO 17ピンに接続されたLEDを制御するためのオブジェクトを作成します。led.on()
: LEDを点灯させます。led.off()
: LEDを消灯させます。sleep(1)
: LEDが点灯または消灯している間、1秒間待機します。
コンソール上でCtrl+Cキーを入力すると、プログラムが停止します。
PWM
PWM(Pulse Width Modulation、パルス幅変調)は、デジタル信号を使ってアナログ的な出力を制御する手法です。
例えば、LEDの輝度やモーターの速度などを調整できます。
PWMでは、信号の「オン」と「オフ」の比率(デューティサイクル)を変化させることで、出力の強弱を制御します。
PWMを使ったLEDの明るさ制御
Raspberry Piでは、GPIOピンを使ってPWM信号を生成し、LEDの明るさを滑らかに変えることができます。gpiozero
ライブラリには、PWMをサポートするPWMLED
クラスが用意されています。
PWMの仕組み
PWM信号は、一定の周期の中で「オン」と「オフ」を繰り返す信号です。デューティサイクル(オンの時間の割合)を変更することで、LEDの輝度を変えることができます。たとえば、
- 100%デューティサイクル: 常にオン → 最大輝度
- 50%デューティサイクル: 半分の時間オン → 半分の輝度
- 0%デューティサイクル: 常にオフ → 消灯
PWMを使ったLED制御のPythonコード
from gpiozero import PWMLED
from time import sleep
# GPIO 17番ピンに接続したPWM対応のLEDを定義
led = PWMLED(17)
# LEDの輝度を変化させる
while True:
for brightness in range(0, 101, 1): # 0%から100%まで輝度を上げる
led.value = brightness / 100 # デューティサイクルを0から1に変換
sleep(0.01) # 10ms待機(輝度の変化をなめらかに)
for brightness in range(100, -1, -1): # 100%から0%まで輝度を下げる
led.value = brightness / 100 # デューティサイクルを0から1に変換
sleep(0.01) # 10ms待機
解説
from gpiozero import PWMLED
:gpiozero
ライブラリからPWM制御に対応したPWMLED
クラスをインポートします。led = PWMLED(17)
: GPIO 17ピンに接続されたPWM対応のLEDオブジェクトを作成します。led.value
: デューティサイクルを0.0(消灯)から1.0(最大輝度)の間で設定します。例えば、led.value = 0.5
はLEDの輝度を50%に設定します。range(0, 101, 1)
とrange(100, -1, -1)
: これらのループは、LEDの輝度を徐々に上げたり下げたりするためのものです。デューティサイクルを段階的に変化させて、LEDの明るさを調整します。
問題1
GPIO 17ピンに接続されたLEDを、1秒間点灯させた後、1秒間消灯させる動作を5回繰り返してください。
解答例はこちらをクリック
from gpiozero import LED
from time import sleep
# GPIO 17番ピンに接続したLEDを定義
led = LED(17)
# 5回LEDを点滅させる
for _ in range(5):
led.on() # LEDを点灯
sleep(1) # 1秒待機
led.off() # LEDを消灯
sleep(1) # 1秒待機
問題2
PWMを使用して、LEDの明るさを徐々に変化させるプログラムを作成してください。
GPIO 17ピンに接続されたLEDを使用し、2秒かけてLEDの輝度を0%から100%に上げ、その後2秒かけて100%から0%に下げることを繰り返してください。
解答例はこちらをクリック
from gpiozero import PWMLED
from time import sleep
# GPIO 17番ピンに接続したPWM対応のLEDを定義
led = PWMLED(17)
while True:
# 2秒かけて明るくする(0%から100%)
for brightness in range(0, 101): # 0から100まで
led.value = brightness / 100 # 輝度を0.0から1.0に変換
sleep(0.02) # 20ms待機(100回×0.02秒 = 2秒)
# 2秒かけて暗くする(100%から0%)
for brightness in range(100, -1, -1): # 100から0まで
led.value = brightness / 100 # 輝度を0.0から1.0に変換
sleep(0.02) # 20ms待機(100回×0.02秒 = 2秒)
次回はこちら