文档
树莓派 4B GPIO 编程例程
Pi 4B 使用 BCM2711,GPIO 寄存器与 Pi 3B+ 基本一致,兼容 RPi.GPIO、wiringPi、pigpio 等库。
示例 1:Python RPi.GPIO — 按键控制 LED
#!/usr/bin/env python3
"""树莓派4B 按键控制LED — RPi.GPIO"""
import RPi.GPIO as GPIO
import time
LED_PIN = 17 # BCM 17 (Pin 11)
BTN_PIN = 27 # BCM 27 (Pin 13)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
led_state = False
try:
print("按下按键切换LED状态 (Ctrl+C 退出)")
while True:
if GPIO.input(BTN_PIN) == GPIO.LOW: # 按下(上拉,低有效)
led_state = not led_state
GPIO.output(LED_PIN, led_state)
print(f"LED → {'ON' if led_state else 'OFF'}")
time.sleep(0.3) # 消抖
time.sleep(0.01)
except KeyboardInterrupt:
print("\n退出")
finally:
GPIO.cleanup()
示例 2:Python pigpio — 硬件 PWM + 高精度波形
#!/usr/bin/env python3
"""树莓派4B PWM — pigpio(高精度,支持任意GPIO)"""
import pigpio
import time
LED = 18 # BCM 18 (Pin 12) 硬件PWM
pi = pigpio.pi()
if not pi.connected:
print("❌ pigpiod 守护进程未运行!请执行: sudo pigpiod")
exit(1)
try:
print("PWM 0~255 范围呼吸灯")
while True:
for duty in range(0, 256, 2):
pi.set_PWM_dutycycle(LED, duty)
time.sleep(0.01)
for duty in range(255, -1, -2):
pi.set_PWM_dutycycle(LED, duty)
time.sleep(0.01)
except KeyboardInterrupt:
print("\n退出")
finally:
pi.set_PWM_dutycycle(LED, 0)
pi.stop()
示例 3:C + wiringPi — GPIO 控制
/*
* 树莓派4B wiringPi GPIO 控制
* 安装: sudo apt install wiringpi
* 编译: gcc -o blink blink.c -lwiringPi
* 运行: ./blink
*/
#include <wiringPi.h>
#include <stdio.h>
#define LED_PIN 0 // wiringPi 0 = BCM 17 (Pin 11)
#define BTN_PIN 2 // wiringPi 2 = BCM 27 (Pin 13)
int main() {
wiringPiSetup(); // 使用 wiringPi 编号
pinMode(LED_PIN, OUTPUT);
pinMode(BTN_PIN, INPUT);
pullUpDnControl(BTN_PIN, PUD_UP);
printf("按下按键切换 LED (Ctrl+C 退出)\n");
int led_state = 0;
while (1) {
if (digitalRead(BTN_PIN) == LOW) {
led_state = !led_state;
digitalWrite(LED_PIN, led_state);
printf("LED → %s\n", led_state ? "ON" : "OFF");
delay(300); // 消抖
}
delay(10);
}
return 0;
}
示例 4:Python — UART 串口通信
#!/usr/bin/env python3
"""树莓派4B UART 收发 — /dev/serial0 (GPIO14=TXD, GPIO15=RXD)"""
import serial
import time
# 启用串口: sudo raspi-config → Interface → Serial → No(login shell) → Yes(enable)
ser = serial.Serial(
port='/dev/serial0',
baudrate=115200,
timeout=1
)
print("串口已打开:", ser.name)
# 发送
ser.write(b'Hello from Pi 4B!\r\n')
print("发送: Hello from Pi 4B!")
# 接收
time.sleep(0.1)
if ser.in_waiting:
rx = ser.readline()
print("接收:", rx.decode().strip())
ser.close()
示例 5:Python — DHT11 温湿度传感器
#!/usr/bin/env python3
"""树莓派4B DHT11 温湿度读取"""
import Adafruit_DHT
SENSOR = Adafruit_DHT.DHT11
PIN = 4 # BCM GPIO4 (Pin 7)
humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
if humidity is not None and temperature is not None:
print(f"温度: {temperature:.1f}°C 湿度: {humidity:.1f}%")
else:
print("❌ 读取失败,请检查接线或重试")
示例 6:Python — I²C OLED 显示屏 (SSD1306)
#!/usr/bin/env python3
"""树莓派4B SSD1306 OLED 128x64 I2C显示"""
import board
import busio
import adafruit_ssd1306
# I2C 初始化 (GPIO2=SDA, GPIO3=SCL)
i2c = busio.I2C(board.SCL, board.SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
# 清屏并显示文字
oled.fill(0)
oled.text("Raspberry Pi", 0, 0, 1)
oled.text("Model 4B", 0, 16, 1)
oled.text("Hello World!", 0, 32, 1)
oled.show()
print("OLED 显示成功")
⚠️ 编程注意事项
- RPi.GPIO 已停止维护:建议迁移到
gpiozero或pigpio。 - wiringPi 已弃用:原作者 Gordon 不再维护,Pi 4B 建议使用预编译 2.52+ 版本或换用 libgpiod。
- pigpio 精度最高:支持任意 GPIO 的软件 PWM(DMA 驱动),精度达 1μs,适合 WS2812 等时序严格的协议。
- 串口配置:
/dev/ttyAMA0为硬件串口(蓝牙默认占用),/dev/serial0是符号链接指向当前可用串口。 - 需要 root 权限时:GPIO 操作通常需要
sudo,或把用户加入gpio组。