树莓派 4 Model B (Raspberry Pi 4B)

元器件
开发板
库存 120

介绍

经典旗舰SBC,BCM2711四核Cortex-A72 1.8GHz、1GB/2GB/4GB/8GB LPDDR4 RAM、双micro-HDMI 4Kp60、千兆以太网、双频WiFi 5/BT 5.0、USB 3.0×2+USB 2.0×2、40Pin GPIO、CSI/DSI接口

规格参数

参数
CPUBCM2711 四核 Cortex-A72 @ 1.8GHz
GPUVideoCore VI @ 500MHz
RAM1GB/2GB/4GB/8GB LPDDR4-3200
USB2×USB 3.0 + 2×USB 2.0
GPIO40Pin标准树莓派排针
存储MicroSD卡槽
尺寸85×56mm
电源5V/3A (USB-C)
网络千兆以太网 + 双频802.11ac WiFi 5 + BT 5.0
视频输出双micro-HDMI 4Kp60

代码例程

树莓派 4B GPIO 编程例程 — Python + C + WiringPi.md
# 树莓派 4B GPIO 编程例程

Pi 4B 使用 BCM2711,GPIO 寄存器与 Pi 3B+ 基本一致,兼容 RPi.GPIO、wiringPi、pigpio 等库。

---

## 示例 1:Python RPi.GPIO — 按键控制 LED

```python
#!/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 + 高精度波形

```python
#!/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 控制

```c
/*
 * 树莓派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 串口通信

```python
#!/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 温湿度传感器

```python
#!/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)

```python
#!/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 显示成功")
```

---

## ⚠️ 编程注意事项

1. **RPi.GPIO 已停止维护**:建议迁移到 `gpiozero` 或 `pigpio`。
2. **wiringPi 已弃用**:原作者 Gordon 不再维护,Pi 4B 建议使用预编译 2.52+ 版本或换用 libgpiod。
3. **pigpio 精度最高**:支持任意 GPIO 的软件 PWM(DMA 驱动),精度达 1μs,适合 WS2812 等时序严格的协议。
4. **串口配置**:`/dev/ttyAMA0` 为硬件串口(蓝牙默认占用),`/dev/serial0` 是符号链接指向当前可用串口。
5. **需要 root 权限时**:GPIO 操作通常需要 `sudo`,或把用户加入 `gpio` 组。

参考资料

暂无参考文献