树莓派插针详解:从26针到40针,如何真正用好每一个引脚?
你有没有过这样的经历?
接上一个温湿度传感器,代码写得没问题,但i2cdetect就是扫不到设备;
点亮LED时闪烁异常,甚至导致树莓派重启——而罪魁祸首,很可能只是一根线接错了引脚。
在嵌入式开发中,硬件连接的“第一公里”往往决定了整个项目的成败。而对树莓派开发者来说,这“第一公里”的核心,就是那排看似简单的40针GPIO排针。
自2012年问世以来,树莓派从最初的26针扩展到了如今统一的40针布局。这一变化不仅仅是多出了14根物理引脚,更是一次关于扩展性、兼容性与系统设计哲学的进化。理解它,不只是为了查表找哪个是SDA,更是为了搞清楚:
- 为什么有些引脚能做PWM,有些却不能?
- 为什么启用UART要先关蓝牙?
- 如何避免烧板子?
今天,我们就来一次彻底拆解——不讲套话,不堆术语,带你真正“看懂”树莓派的每一根引脚。
从26针到40针:一场静默却深远的升级
最早的树莓派 Model B 只有26个引脚,对于当时主要用于教学和基础控制的场景已经足够。但随着社区生态的发展,用户开始接入更多外设:显示屏、电机驱动、音频模块……资源很快捉襟见肘。
于是,在2014年的Model B+上,树莓派基金会做出了一个重要决定:将GPIO排针扩展为40针(2×20)。这个改动看似简单,实则意义重大:
- 前26针完全兼容旧版,保证已有HAT(扩展板)可用;
- 新增的14针提供了额外电源、地线以及多个复用功能引脚;
- 形成了事实上的行业标准,后续所有主流型号(Pi 2/3/4/5、Zero系列)均沿用此布局。
这意味着:你现在买的任何一款HAT扩展板,只要符合规范,几乎都能插在从Pi 2到Pi 5的任意机型上正常工作。这种向后兼容性,在单板计算机领域极为罕见。
📌 小知识:虽然Pi 1 Model A+也用了40针,但它基于BCM2835芯片,部分功能受限;真正的“现代”40针时代是从B+开始的。
GPIO到底是什么?别再只当它是“开关”
我们常说“GPIO”,好像它就是一个可以点亮LED或读按钮的普通IO口。但实际上,每个GPIO引脚都是一个高度可配置的功能单元。
它不只是输入输出
在树莓派的SoC(如BCM2711)内部,每个GPIO引脚都连接到一个多功能控制器,支持多种“替代功能”(ALT modes)。你可以把它想象成一个多路开关:
| 引脚 | 功能模式 |
|---|---|
| ALT0 | UART / I²C / SPI 等专用协议 |
| ALT1~ALT5 | 其他外设或测试用途 |
| Input / Output | 普通数字IO |
比如 BCM18 这个引脚:
- 默认可以用作普通输出(控制LED)
- 切换到 ALT5 模式后,它可以变成PWM0 输出,用于精确调节亮度或驱动舵机
这就解释了为什么不是所有GPIO都能产生PWM信号——只有特定引脚才具备对应的ALT功能。
编号系统:BCM vs Board,千万别混
新手最容易踩的坑之一就是搞错引脚编号。树莓派有两种命名方式:
- BCM编号:按Broadcom芯片内部寄存器顺序排列(推荐!)
- Board编号:按物理位置从1开始数
举个例子:
- 物理第12号引脚 → 对应的是BCM18
- 如果你在代码里写GPIO.setup(12, ...),你以为操作的是BCM12?错!那是Board模式下的第12脚,实际对应的是BCM18
👉 所以务必在程序开头声明:
GPIO.setmode(GPIO.BCM) # 明确使用BCM编号否则你的“LED控制脚”可能意外占用了I²C时钟线,直接导致总线锁死。
40针布局全景图:哪些能用?哪些要小心?
下面这张表是你应该常备的“作战地图”。我们按功能分类,挑出最关键的部分:
| 类型 | 引脚示例 | 数量 | 注意事项 |
|---|---|---|---|
| GND(地) | 6, 9, 14, 20, 25, 30, 34, 39 | 9根 | 多点接地降低噪声,优先靠近高功耗设备 |
| 3.3V电源 | 1, 17 | 2根 | 最大输出约50mA,禁止驱动电机等大电流负载 |
| 5V电源 | 2, 4 | 2根 | 来自USB输入,电流取决于电源适配器(建议≥3A for Pi 4/5) |
| I²C | SDA: BCM2, SCL: BCM3 | 1组主接口 | 支持热插拔,需加4.7kΩ上拉电阻 |
| SPI0 | MOSI: BCM10, MISO: BCM9, SCLK: BCM11, CE0/1: BCM8/7 | 高速全双工 | 可挂多个从机,DMA支持提升性能 |
| UART | TXD: BCM14, RXD: BCM15 | 1组串口 | 默认被蓝牙占用,需通过dtoverlay释放 |
| PWM输出 | BCM12, BCM13, BCM18, BCM19 | 4个通道 | 仅部分引脚支持硬件PWM,精度更高 |
✅ 提示:完整的官方引脚图可通过命令行查看:
pinout(需要安装gpiozero)
关键通信接口实战指南
I²C:传感器党的生命线
I²C 是连接各类低速外设的主力,比如BME280(环境传感器)、SSD1306(OLED屏)、PCF8591(ADC扩展)等等。
常见问题:为什么i2cdetect看不到设备?
别急着换线,先排查这几个点:
- 是否启用了I²C接口?
bash sudo raspi-config nonint do_i2c 0 - 是否加载了内核模块?
bash lsmod | grep i2c_ - 是否有上拉电阻?
虽然树莓派内部可软件启用上拉,但长距离传输时仍建议外接4.7kΩ 上拉至3.3V。 - 地址对不对?
很多传感器有默认地址(如0x76或0x77),确认数据手册。
快速扫描工具:
i2cdetect -y 1 # 查看 bus 1 上的设备如果返回全是--,那就是没连上或者供电有问题。
SPI:高速外设的首选通道
如果你要用TFT屏幕、高速ADC、RF收发模块(如nRF24L01),那就绕不开SPI。
实战代码示例(读取MCP3008 ADC):
import spidev spi = spidev.SpiDev() spi.open(0, 0) # bus 0, device 0 (CE0) spi.max_speed_hz = 1_000_000 # 1MHz def read_channel(channel): cmd = [1, (8 + channel) << 4, 0] resp = spi.xfer2(cmd) adc_val = ((resp[1] & 3) << 8) + resp[2] return adc_val print("Channel 0:", read_channel(0)) spi.close()📌 注意:
-spi.open(0, 0)表示使用SPI0和片选CE0(即BCM8)
- 不要用Python做高频采样,延迟较大;实时性强的任务建议用C或DMA
UART:调试与通信的基石
树莓派有两个串口:
-ttyAMA0:主UART,对应BCM14/15
-ttyS0:辅助UART,功能有限
但在大多数Pi 3/4/5上,默认情况下,ttyAMA0被蓝牙模块占用了!
如何释放它供通用串口使用?
编辑/boot/firmware/config.txt(注意路径可能因系统版本不同):
# 禁用蓝牙串口映射 dtoverlay=disable-bt然后禁用串口登录终端:
sudo systemctl disable serial-getty@ttyAMA0.service重启后即可使用:
minicom -D /dev/ttyAMA0 -b 115200或者在Python中用pyserial读写。
电源设计:别让“小电流”拖垮整个系统
很多人忽略的一点是:树莓派本身不是电源适配器。
3.3V引脚能带什么?
- 最大输出约50mA
- 适合给:
- 小型传感器(如DHT11、光敏电阻)
- EEPROM芯片
- 逻辑电平转换模块
🚫绝对不能带:
- 继电器线圈
- 蜂鸣器(尤其有源)
- OLED屏(除非特别省电款)
一旦超载,可能导致电压跌落,轻则外设失灵,重则树莓派自动关机。
正确做法:外部供电 + 电平转换
对于5V设备(如Arduino、超声波模块HC-SR04),必须使用电平转换器(如TXB0108、MAX3032)进行双向转换。
⚠️ 千万不要直接把5V接到GPIO上!
BCM283x系列不支持5V耐受,哪怕短暂接入也可能永久损坏SoC。
HAT与设备树:让扩展板“自报家门”
你知道吗?一块合格的HAT(Hardware Attached on Top)不仅能插上去就用,还能让树莓派自己识别它是谁。
这是怎么做到的?
答案是:设备树覆盖(Device Tree Overlay) + EEPROM
HAT板载一个小型EEPROM,存储以下信息:
- 产品名称、制造商
- 所需的dtbo文件名
- GPIO使用情况
启动时,树莓派会自动读取这些信息,并动态加载相应的驱动配置。例如,某个音频HAT可能会自动启用I²S接口并设置音频路由。
这也是为什么官方强烈建议HAT遵循65mm × 56mm的机械尺寸标准,并保留4个安装孔位。
真实案例:做一个不会翻车的环境监测站
设想你要做一个空气质量监测系统,包含以下组件:
- BME280(I²C,测温湿压)
- SGP30(I²C,测CO₂/TVOC)
- SSD1306 OLED(SPI,显示数据)
- LoRa模块(UART,上传云端)
- 报警LED(GPIO控制)
引脚分配建议如下:
| 功能 | 引脚 | 备注 |
|---|---|---|
| BME280 & SGP30 | BCM2(SDA), BCM3(SCL) | 共用I²C总线,注意地址冲突 |
| OLED屏 | BCM10(MOSI), BCM9(MISO), BCM11(SCLK), BCM8(CE0) | 使用SPI0 |
| LoRa模块 | BCM14(TXD), BCM15(RXD) | 需关闭蓝牙 |
| 报警LED | BCM21 | 普通输出,加限流电阻 |
启动流程优化:
- 在
config.txt中添加:ini dtoverlay=disable-bt - 开机脚本中先检测I²C设备是否存在:
bash if i2cdetect -y 1 | grep -q "76"; then echo "BME280 detected" else echo "Sensor not found!" >&2 fi - 若通信失败,触发LED快闪报警(可用
gpiozero轻松实现)
这样即使部署在现场无人值守,也能通过灯光状态判断故障类型。
坑点与秘籍:老手才知道的经验
🔴 常见错误清单
| 错误 | 后果 | 解决方案 |
|---|---|---|
| 用5V信号直连GPIO | SoC损坏风险极高 | 加电平转换器 |
| 多个设备共用I²C无上拉 | 通信不稳定 | 每条总线加4.7kΩ上拉 |
忘记GPIO.cleanup() | 下次运行程序行为异常 | 务必放在finally块中 |
| 同时启用SPI和占用其引脚的GPIO | 冲突导致无法通信 | 提前规划功能复用 |
🟢 高效开发技巧
- 使用
raspi-gpio get查看当前所有引脚状态:bash raspi-gpio get - 用
gpiozero替代底层库,代码更简洁安全:python from gpiozero import LED led = LED(18) led.blink() # 一行搞定闪烁 - 用配置文件管理引脚映射,便于移植:
yaml sensors: bme280: i2c_address: 0x76 display: type: oled_spi cs_pin: 8 dc_pin: 25
写在最后:掌握引脚,才是真正入门
当你第一次成功点亮一个LED,也许会觉得GPIO不过如此。
但当你面对一个复杂的多设备系统,发现某个传感器突然“消失”,而排查三天才发现是因为PWM占用了I²C时钟脚时,你才会明白:
每一根引脚的背后,都有它的故事和代价。
从26针到40针,树莓派的演进不仅是硬件的进步,更是对开发者友好的持续打磨。而我们要做的,不是盲目接线,而是学会“阅读”这些引脚的语言——它们告诉我们哪里可以扩展,哪里必须规避,哪里藏着性能的秘密。
无论你是学生做毕业设计,还是工程师搭建工业网关,精准理解树莓派插针定义,都将是你最坚实的基础能力。
如果你正在动手接线,不妨停下来问自己一句:
我插的这根线,真的安全吗?它会不会正在悄悄损坏我的主板?
欢迎在评论区分享你的“踩坑”经历,我们一起避雷前行。