介绍
经典旗舰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接口
经典旗舰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接口
| 参数 | 值 |
|---|---|
| CPU | BCM2711 四核 Cortex-A72 @ 1.8GHz |
| GPU | VideoCore VI @ 500MHz |
| RAM | 1GB/2GB/4GB/8GB LPDDR4-3200 |
| USB | 2×USB 3.0 + 2×USB 2.0 |
| GPIO | 40Pin标准树莓派排针 |
| 存储 | MicroSD卡槽 |
| 尺寸 | 85×56mm |
| 电源 | 5V/3A (USB-C) |
| 网络 | 千兆以太网 + 双频802.11ac WiFi 5 + BT 5.0 |
| 视频输出 | 双micro-HDMI 4Kp60 |
# 树莓派 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` 组。
暂无参考文献