ハードウェア環境: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の基本概念
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 Options → I2C → Enable → Yes
Interface Options → SPI → Enable → Yes
または、端末から直接/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)
ラズパイのGPIOは3.3Vロジックであり、5V機器に直接接続してはいけません!
| シナリオ | 対処法 |
|---|---|
| 5Vセンサー出力 → ラズパイ入力 | レベル変換モジュール(例:TXS0108E)または抵抗分圧を利用 |
| ラズパイ出力 → 5V機器入力 | 一部の5V機器は3.3VをHIGHと認識できます(例:WS2812B) |
| 3.3Vセンサー → ラズパイ | 直接接続可能 |
抵抗による分圧(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ピンの合計電流 | 電源に依存 |
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 で実測し作成されています
