ラズベリー・パイ GPIO 入門から実践まで

ハードウェア環境:Raspberry Pi 4 Model B Rev 1.5 · Debian 12 Bookworm · カーネル 6.12.25
テスト日時:2026年4月
作成者:zeruns (https://blog.zeruns.com/)
本文はAIによって作成されました(Hermes Agent + DeepSeek V4 Flash)。参考用です。


目次

  1. GPIOの基本概念
  2. 環境準備とツール
  3. GPIO入出力(Shell方式)
  4. GPIO入出力(Python方式)
  5. I2C通信
  6. SPI通信
  7. 総合実例
  8. 注意事項とトラブルシューティング

1. GPIOの基本概念

1.1 GPIOとは

GPIO(General Purpose Input/Output:汎用入出力)は、マイクロプロセッサ上のプログラマブルなピン群です。ソフトウェア制御により、各ピンを以下のいずれかのモードに設定できます:

  • 出力モード:高電圧(3.3V)または低電圧(0V)を出力します。LED、リレー、ブザーなどを制御するのに使用します
  • 入力モード:外部の電圧状態(HIGH/LOW)を読み取ります。ボタンやセンサー信号の読み取りに使用します
  • 代替機能(Alternative Function):I2C、SPI、UART、PWM などの専用通信プロトコル用に使用できます

1.2 Raspberry Pi 4Bのピン配列

Raspberry Pi 4Bは40ピンの拡張用ヘッダを採用しており、ピン番号には次の3種類の方式があります:

番号方式 説明 代表的ライブラリ
物理ピン番号(Board) 1~40までの番号。左上のピンが1 RPi.GPIO setmode(GPIO.BOARD)
BCM番号(Broadcom) SoC上のGPIO番号(例:GPIO17) RPi.GPIO setmode(GPIO.BCM)、libgpiod
wiringPi番号 wiringPi独自の番号体系(非推奨) wiringPiライブラリ

40ピン ピン機能表

                    ┌─────────────────────────────┐
                    │  🥝 Raspberry Pi 4B 40ピン図   │
  3.3V  (01) ──●  ●── (02)  5V                    │
 GPIO2  (03) ──●  ●── (04)  5V                    │
 GPIO3  (05) ──●  ●── (06)  GND                   │
 GPIO4  (07) ──●  ●── (08)  GPIO14 (UART TX)      │
   GND  (09) ──●  ●── (10)  GPIO15 (UART RX)      │
GPIO17  (11) ──●  ●── (12)  GPIO18 (PWM0)         │
GPIO27  (13) ──●  ●── (14)  GND                   │
GPIO22  (15) ──●  ●── (16)  GPIO23                │
  3.3V  (17) ──●  ●── (18)  GPIO24                │
GPIO10 (19) ──●  ●── (20)  GND  (SPI_MOSI)        │
 GPIO9 (21) ──●  ●── (22)  GPIO25 (SPI_MISO)      │
GPIO11 (23) ──●  ●── (24)  GPIO8  (SPI_SCLK)      │
   GND (25) ──●  ●── (26)  GPIO7  (SPI_CE0)       │
 GPIO0 (27) ──●  ●── (28)  GPIO1  (ID_SDA / I2C)  │
 GPIO5 (29) ──●  ●── (30)  GND                    │
 GPIO6 (31) ──●  ●── (32)  GPIO12 (PWM0)          │
GPIO13 (33) ──●  ●── (34)  GND                    │
GPIO19 (35) ──●  ●── (36)  GPIO16                 │
GPIO26 (37) ──●  ●── (38)  GPIO20                 │
   GND (39) ──●  ●── (40)  GPIO21                 │
                    └─────────────────────────────┘

Raspberry Pi 4B 主要ピン機能表

物理ピン BCM番号 機能 物理ピン BCM番号 機能
1 3.3V 2 5V
3 GPIO2 I2C1 SDA 4 5V
5 GPIO3 I2C1 SCL 6 GND
7 GPIO4 8 GPIO14 UART TX
9 GND 10 GPIO15 UART RX
11 GPIO17 12 GPIO18 PCM_CLK / PWM0
13 GPIO27 14 GND
15 GPIO22 16 GPIO23
17 3.3V 18 GPIO24
19 GPIO10 SPI0 MOSI 20 GND
21 GPIO9 SPI0 MISO 22 GPIO25
23 GPIO11 SPI0 SCLK 24 GPIO8 SPI0 CE0
25 GND 26 GPIO7 SPI0 CE1
27 GPIO0 ID_SDA (EEPROM) 28 GPIO1 ID_SCL (EEPROM)
29 GPIO5 30 GND
31 GPIO6 32 GPIO12 PWM0
33 GPIO13 PWM1 34 GND
35 GPIO19 PCM_FS / PWM1 36 GPIO16
37 GPIO26 38 GPIO20 PCM_DIN
39 GND 40 GPIO21 PCM_DOUT

1.3 重要な注意点

  • 論理レベル:Raspberry PiのGPIOは3.3V論理レベルのため、5V信号を直接接続できません
  • 電流制限:各GPIOピンの最大出力電流は約16mA、全ピン合計で50mAを超えないでください
  • デフォルト状態:多くのGPIOピンはデフォルトで入力モードです。一部には内部プルアップ/プルダウンが備わっています
  • 3.3Vピン(01/17):最大出力電流は約500mAです
  • 5Vピン(02/04):USB-C電源から直接供給され、電流は電源アダプタの性能に依存します

2. 環境準備とツール

2.1 既にインストールされたツール一覧

本チュートリアルはDebian 12 Bookworm環境でテストされています。以下のツールは予めインストール済みです:

ツール/ライブラリ バージョン 用途
libgpiod / gpioset / gpioget 1.6.3 ShellでのGPIO制御
python3-libgpiod 1.6.3 Python用libgpiodバインディング
RPi.GPIO 0.7.2 定番のPython GPIOライブラリ
smbus2 インストール済み Python I2C通信
spidev インストール済み Python SPI通信
pigpiod 1.79 GPIOデーモン(PWM/リモート制御対応)
i2c-tools 4.3 I2Cデバイススキャン用ツール

2.2 必要ツールのインストール

ツールがインストールされていない場合、以下のコマンドを実行します:

# 基本GPIOツール
sudo apt install gpiod libgpiod-dev python3-libgpiod

# I2C用ツール
sudo apt install i2c-tools

# Pythonライブラリ
pip install RPi.GPIO smbus2 spidev gpiozero

# pigpioデーモン(ハードウェアPWM用、推奨)
sudo apt install pigpio pigpiod
sudo systemctl enable pigpiod --now

2.3 I2C/SPIインターフェースの有効化

raspi-configを使用して有効化します:

sudo raspi-config

メニュー手順:
Interface OptionsI2CEnableYes
Interface OptionsSPIEnableYes

または、端末から直接/boot/firmware/config.txt(Debian 12)を編集します:

# 手動で追加
sudo tee -a /boot/firmware/config.txt <<EOF
dtparam=i2c_arm=on
dtparam=spi=on
EOF

# 再起動して有効化
sudo reboot

有効化成功の確認:

# I2Cを確認
ls /dev/i2c*
# 出力: /dev/i2c-20  /dev/i2c-21

# SPIを確認(有効化後)
ls /dev/spi*
# 出力: /dev/spidev0.0  /dev/spidev0.1

2.4 すべてのgpiochipを表示

$ gpioinfo
gpiochip0 - 58 lines:
        line   0:     "ID_SDA"       unused   input  active-high
        line   1:     "ID_SCL"       unused   input  active-high
        line   2:      "GPIO2"       unused   input  active-high
        ...

Raspberry Pi 4BのBCM2711チップは1つのgpiochip0を提供し、合計58個のGPIOがありますが、そのうちGPIO0~GPIO27のみが40ピンのヘッダー経由で外部に出力されています。


3. GPIOの入出力(Shell方式)

3.1 libgpiodツールキット

wiringPiに依存しない、現在主流のlibgpiodツールの使用を推奨します。

主なコマンド:

コマンド 機能
gpioinfo すべてのGPIOの状態を表示 gpioinfo
gpioset GPIOの出力レベルを設定 gpioset 0 17=1
gpioget GPIOの入力レベルを読み取り gpioget 0 17
gpiomon GPIOイベントを監視 gpiomon 0 17

書式の説明: gpioset <chip> <pi =<value>
chip は通常 0(gpiochip0)で、pin は BCM 番号を使用します。

3.2 出力:LED を点灯させる

LED のアノード(長い方の端子)を330Ωの抵抗を介して GPIO17(物理ピン 11)に接続し、カソード(短い方の端子)を GND(物理ピン 9)に接続してください。

# GPIO17 を出力ハイに設定 → LED 点灯
gpioset 0 17=1

# GPIO17 を出力ローに設定 → LED 消灯
gpioset 0 17=0

3.3 入力:ボタン状態の読み取り

ボタンの一端を GPIO18(物理ピン 12)、もう一方を GND(物理ピン 14)に接続します。

# GPIO18 の電圧を読み取り(外部プルアップまたは内部プルアップが必要)
gpioget 0 18
# 出力: 1 (押されていない、ハイレベル)
# 出力: 0 (押された、ローレベル)

3.4 すべてのピンの状態を確認

# 全てのピンを表示
gpioinfo

# 特定のピン(BCM 番号 17)を表示
gpioinfo | grep "GPIO17"
# 出力: line  17:      "GPIO17"       "myapp"   output  active-high

3.5 gpioset でプルアップ/プルダウンを設定

libgpiod バージョン 1.6 以降では、リクエスト時にバイアスを設定できます。

# GPIO17 を出力に設定、初期値はハイ、プルアップ付き
gpioset --bias=enable 0 17=1

4. GPIO入出力(Python を使用)

4.1 RPi.GPIO を使う(定番ライブラリ)

RPi.GPIO は最もよく使われる Python GPIO ライブラリで、シンプルで直感的です。

4.1.1 出力:LED を点滅

import RPi.GPIO as GPIO
import time

# BCM 番号方式を使用
GPIO.setmode(GPIO.BCM)

# GPIO17 を出力に設定
GPIO.setup(17, GPIO.OUT)

# LED を5回点滅
for _ in range(5):
    GPIO.output(17, GPIO.HIGH)  # 点灯
    time.sleep(0.5)
    GPIO.output(17, GPIO.LOW)   # 消灯
    time.sleep(0.5)

# リソースを解放
GPIO.cleanup()

4.1.2 入力:ボタンの読み取り

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

# GPIO18 を入力に設定、内部プルアップを有効化
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
        if GPIO.input(18) == GPIO.LOW:
            print("ボタンが押されました")
        else:
            print("ボタンが離されました")
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()

GPIO.PUD_UP = 内部プルアップ(デフォルトはハイ、押下でロー)
GPIO.PUD_DOWN = 内部プルダウン(デフォルトはロー、押下でハイ)

4.1.3 PWM出力:呼吸灯(ふんすいとう)

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)  # GPIO18 はハードウェア PWM 対応

pwm = GPIO.PWM(18, 1000)  # 周波数 1kHz
pwm.start(0)  # 初期デューティ比 0%

try:
    while True:
        # ゆっくり明るく
        for duty in range(0, 101, 5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.05)
        # ゆっくり暗く
        for duty in range(100, -1, -5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.05)
except KeyboardInterrupt:
    pwm.stop()
    GPIO.cleanup()

4.1.4 イベント検出:割り込みを使ったボタン読み取り

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def button_callback(channel):
    print(f"ボタンが押されました!(ピン {channel})")

# フォールエッジ(ハイ→ロー)で割り込み発生
GPIO.add_event_detect(18, GPIO.FALLING,
                      callback=button_callback,
                      bouncetime=200)

try:
    print("ボタンの押下を待っています...")
    time.sleep(60)
except KeyboardInterrupt:
    GPIO.cleanup()

4.2 gpiozero を使う(高レベルラッパー)

gpiozero はより高レベルなオブジェクト指向のラッパーを提供し、素早い開発に適しています。

# インストール
pip install gpiozero
from gpiozero import LED, Button, Buzzer
from signal import pause

# LED:自動点滅
led = LED(17)
led.blink()

# ボタン:押すとLED点灯
btn = Button(18, pull_up=True)

# 方法1:直接代入
btn.when_pressed = led.on
btn.when_released = led.off

# 方法2:カスタムコールバック
btn.when_pressed = lambda: print("押されました!")

# 常に実行状態を維持
pause()

gpiozero の主なコンポーネント:

コンポーネント クラス名 説明
LED LED(pin) LED の点灯・点滅・徐点(ふんすい)制御
ボタン Button(pin, pull_up=True) ボタン押下、長押し検出
ブザー Buzzer(pin) 有接点ブザーの制御
距離センサ DistanceSensor(echo, trigger) HC-SR04 超音波センサ
サーボモータ Servo(pin) サーボモーターの角度制御
モーター Motor(forward, backward) DCモーター制御

4.3 libgpiod の Python バインディング(低レベル操作)

import gpiod
import time

# gpiochip0 を開く
chip = gpiod.Chip('gpiochip0')

# GPIO17 を取得し、出力としてリクエスト
line = chip.get_line(17)
line.request(consumer='myapp', type=gpiod.LINE_REQ_DIR_OUT)

# ハイレベル出力
line.set_value(1)
time.sleep(1)

# ローレベル出力
line.set_value(0)

# リリース
line.release()

入力モードの場合:

import gpiod

chip = gpiod.Chip('gpiochip0')
line = chip.get_line(18)

# 入力としてリクエスト、内部プルアップ有効
line.request(consumer='myapp',
             type=gpiod.LINE_REQ_DIR_IN,
             flags=gpiod.LINE_REQ_FLAG_BIAS_PULL_UP)

value = line.get_value()  # 0 または 1
print(f"GPIO18 = {value}")

line.release()

5. I2C 通信

5.1 I2C の基本原理

I2C(Inter-Integrated Circuit)は、2本の信号線を使う直列通信バスです。

信号 ピン 機能
SCL GPIO3 (物理ピン 5) クロック線
SDA GPIO2 (物理ピン 3) データ線

特徴:

  • マスタースレーブ構成:Raspberry Pi がマスター、センサーなどがスレーブ
  • 7ビットアドレス:各スレーブに固有アドレス(例:0x44)
  • 複数デバイス接続可能:同じ I2C バスに複数のデバイス接続可
  • 通信速度:標準100kHz、高速400kHz

5.2 I2C バスの確認

# I2C バスの一覧表示
$ i2cdetect -l
i2c-20  i2c        bcm2711_i2c1                   I2C adapter
i2c-21  i2c        bcm2711_i2c0                   I2C adapter
  • i2c-20:物理ピン 3(SDA)/5(SCL) に対応 — メイン I2C バス
  • i2c-21:ID_EEPROM(ピン 27/28)に対応、通常外部デバイスは接続しない

5.3 I2C デバイスのスキャン

# i2c-20 上のデバイスをスキャン
$ i2cdetect -y 20
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- 44 -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

アドレス 0x44 にデバイスが存在 — これは SHT30 温湿度センサ(I2C アドレス 0x44)です。

スキャン結果がすべて --(未検出)の場合は、バス上にデバイスが接続されていません。

5.4 smbus2 を使って I2C を読み書き

smbus2 は Python で最もよく使われる I2C ライブラリです。

5.4.1 SHT30 温湿度センサの読み取り

import smbus2
import time

# SHT30 の I2C アドレス
SHT30_ADDR = 0x44

# I2C バス 20 を開く
bus = smbus2.SMBus(20)

# 測定コマンド送信:高精度モード
bus.write_i2c_block_data(SHT30_ADDR, 0x2C, [0x06])

time.sleep(0.015)  # 測定完了待ち(15ms)

# 6バイトデータを読み取り
data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)

# 温度と湿度を計算
temp_raw = ((data[0] << 8) | data[1])
temp = -45 + 175 * temp_raw / 65535.0

hum_raw = ((data[3] << 8) | data[4])
hum = 100 * hum_raw / 65535.0

print(f"温度: {temp:.2f}°C")
print(f"湿度: {hum:.2f}%")

5.4.2 関数としてラップ

import smbus2
import time

class SHT30:
    def __init__(self, bus_id=20, addr=0x44):
        self.bus = smbus2.SMBus(bus_id)
        self.addr = addr

    def read(self):
        """温湿度を読み取り、(温度°C, 湿度%) を返す"""
        self.bus.write_i2c_block_data(self.addr, 0x2C, [0x06])
        time.sleep(0.015)
        data = self.bus.read_i2c_block_data(self.addr, 0x00, 6)

        temp_raw = (data[0] << 8) | data[1]
        temp = -45 + 175 * temp_raw / 65535.0

        hum_raw = (data[3] << 8) | data[4]
        hum = 100 * hum_raw / 65535.0

        return round(temp, 2), round(hum, 2)

# 使用例
sensor = SHT30()
t, h = sensor.read()
print(f"{t}°C, {h}%RH")

5.4.3 一般的な I2C 読み書き操作

import smbus2

bus = smbus2.SMBus(20)
addr = 0x44  # デバイスの I2C アドレス

# レジスタに1バイト書き込み
bus.write_byte_data(addr, 0x2C, 0x06)

# 1バイト読み取り
value = bus.read_byte_data(addr, 0x00)

# 複数バイト読み取り
data = bus.read_i2c_block_data(addr, 0x00, 6)

# 複数バイト書き込み
bus.write_i2c_block_data(addr, 0x2C, [0x06])

# レジスタなしで1バイト書き込み
bus.write_byte(addr, 0x06)

# レジスタなしで1バイト読み取り
value = bus.read_byte(addr)

bus.close()

5.5 コマンドラインツール i2cget / i2cset の使用

# SHT30 のステータスレジスタを読み取り(1バイト)
$ i2cget -y 20 0x44 0x00
0x65

# 6バイトの生データを読み取り
$ i2cget -y 20 0x44 0x00 b 6

6. SPI 通信

6.1 SPI の基本原理

SPI(Serial Peripheral Interface)は、全二重同期シリアルバスで、4本の信号線を使用します。

信号 Raspberry Pi ピン 機能
MOSI GPIO10 (物理ピン 19) マスター出力、スレーブ入力
MISO GPIO9 (物理ピン 21) マスター入力、スレーブ出力
SCLK GPIO11 (物理ピン 23) クロック信号
CE0 GPIO8 (物理ピン 24) チップセレクト 0
CE1 GPIO7 (物理ピン 26) チップセレクト 1

特徴:

  • 全二重:送受信を同時に実行可能
  • マスタースレーブ:Raspberry Pi がマスター、複数のスレーブを接続可能(それぞれ個別の CE)
  • 高速:数十MHzまで可能
  • **デバイスアドレスなし

6.3.2 一般的なSPIデータの送受信

import spidev

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 500000
spi.mode = 0

# 送信および受信(全二重:0xFFを送信しつつ読み取り)
data_out = [0xFF, 0x00, 0x55]
data_in = spi.xfer2(data_out)  # 3バイト送信、3バイト受信
print(f"送信: {[hex(x) for x in data_out]}")
print(f"受信: {[hex(x) for x in data_in]}")

# 送信のみ(受信結果は無視)
spi.writebytes([0x01, 0x02, 0x03])

spi.close()

7. 総合的な実例

7.1 実例1:LEDブリンクライト+ボタン制御

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

LED_PIN = 17      # BCM 17
BTN_PIN = 18      # BCM 18

GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pwm = GPIO.PWM(LED_PIN, 500)
pwm.start(0)

running = True  # LEDの状態

try:
    while True:
        if GPIO.input(BTN_PIN) == GPIO.LOW:
            running = not running
            time.sleep(0.3)  # チャタリング除去

        if running:
            # ブリンクライト
            for duty in range(0, 101, 2):
                pwm.ChangeDutyCycle(duty)
                time.sleep(0.01)
            for duty in range(100, -1, -2):
                pwm.ChangeDutyCycle(duty)
                time.sleep(0.01)
        else:
            pwm.ChangeDutyCycle(0)

except KeyboardInterrupt:
    pwm.stop()
    GPIO.cleanup()

7.2 実例2:SHT30 温湿度読み取り+自動記録

import smbus2
import time
import csv
from datetime import datetime

class SHT30:
    def __init__(self, bus_id=20, addr=0x44):
        self.bus = smbus2.SMBus(bus_id)
        self.addr = addr

    def read(self):
        self.bus.write_i2c_block_data(self.addr, 0x2C, [0x06])
        time.sleep(0.015)
        data = self.bus.read_i2c_block_data(self.addr, 0x00, 6)
        t = -45 + 175 * ((data[0] << 8) | data[1]) / 65535.0
        h = 100 * ((data[3] << 8) | data[4]) / 65535.0
        return round(t, 2), round(h, 2)

sensor = SHT30()

# 読み取りテスト
t, h = sensor.read()
print(f"[{datetime.now()}] 温度: {t}°C, 湿度: {h}%")

# CSVファイルに継続記録(毎分1回)
with open('sensor_log.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['時刻', '温度(°C)', '湿度(%)'])
    for i in range(10):  # 10回記録
        t, h = sensor.read()
        now = datetime.now().strftime('%H:%M:%S')
        writer.writerow([now, t, h])
        print(f"[{now}] {t}°C, {h}%")
        time.sleep(60)

7.3 実例3:gpiozeroで一発完成

from gpiozero import LED, Button
from signal import pause
import time

led = LED(17)
btn = Button(18, pull_up=True)

# 押下時に点灯、解放時に消灯
btn.when_pressed = led.on
btn.when_released = led.off

# 2回クリックで点滅モードに切り替え
press_count = 0

def double_click():
    global press_count
    press_count += 1
    time.sleep(0.3)
    if press_count == 2:
        led.blink()
        print("ダブルクリック!LED点滅モード")
        press_count = 0

btn.when_pressed = double_click

pause()

8. 注意事項とトラブルシューティング

8.1 ロジックレベル変換(3.3V vs 5V)

:warning: ラズパイのGPIOは3.3Vロジックであり、5V機器に直接接続してはいけません!

シナリオ 対処法
5Vセンサー出力 → ラズパイ入力 レベル変換モジュール(例:TXS0108E)または抵抗分圧を利用
ラズパイ出力 → 5V機器入力 一部の5V機器は3.3VをHIGHと認識できます(例:WS2812B)
3.3Vセンサー → ラズパイ 直接接続可能 :white_check_mark:

抵抗による分圧(5V → 3.3V):

    5V ──┬── R1 (1.8kΩ) ──┬── ラズパイ GPIO
         │                │
        GND ── R2 (3.3kΩ) ─┘

8.2 プルアップ/プルダウン抵抗

  • 内部プルアップ:RPi.GPIOでは pull_up_down=GPIO.PUD_UP
  • 内部プルダウン:RPi.GPIOでは pull_up_down=GPIO.PUD_DOWN
  • libgpiod:gpiod.LINE_REQ_FLAG_BIAS_PULL_UP
  • 外部プルアップ:4.7kΩ ~ 10kΩの抵抗で3.3Vに接続

8.3 電流制限

項目 制限
単一GPIOの最大出力電流 16mA
全GPIOの合計出力電流 50mA
3.3Vピンの合計電流 ~500mA
5Vピンの合計電流 電源に依存

:light_bulb: LEDを直接駆動する場合は、必ず 220Ω ~ 330Ω の電流制限抵抗を直列に接続!

8.4 よくあるエラー

エラー 原因 解決策
RuntimeError: No access to /dev/mem 権限不足 sudo python3 script.py を使用
RuntimeError: Pin already in use 他のプログラムがピンを使用中 /sys/class/gpio/ を確認し、リリースまたは再起動
[Errno 13] Permission denied + I2C I2Cが有効でない、または権限不足 ユーザーを i2c グループに追加
Could not open /dev/spidev0.0 SPIが有効でない /boot/config.txt を確認
LEDが接続逆で点灯しない 極性が逆 LEDの長い足をGPIO、短い足をGNDに接続
ボタンが誤作動 チャタリング対策なし コードで bouncetime またはディレイによるチャタリング除去

8.5 権限設定

# 現在のユーザーをi2c、gpioグループに追加
sudo usermod -aG i2c,gpio $USER

# 再ログインして有効化
exec su - $USER

8.6 総合オンラインリファレンス


著者: zeruns
本チュートリアルは、ラズベリーパイ 4B + Debian 12 Bookworm で実測し作成されています