树莓派5引脚定义通俗解释:BCM与物理编号到底怎么选?
你有没有过这样的经历?手握树莓派5,插好线、写完代码,按下运行——结果LED不亮、电机不动。检查千遍,最后发现:引脚接错了。
更离谱的是,明明查了资料说“用18号引脚控制PWM”,可你接的是物理第18脚(Pin 18),程序却毫无反应。而旁边那个标着“12”的引脚,反而能正常输出PWM信号。
这背后的原因,正是树莓派最让新手头疼的问题之一:同一个引脚,为什么有两种编号?BCM和物理编号到底有什么区别?我又该用哪一个?
别急,今天我们不讲术语堆砌的官方文档,也不照搬数据手册。咱们就从一块板子、一根杜邦线开始,把这个问题彻底讲清楚。
一个引脚,两种名字:就像人有学名和小名
想象一下,你在学校里有两个名字:
- 学名:张伟(对应芯片内部的正式编号)
- 小名:老三(因为你在家里排行第三)
老师点名时喊“张伟”是对的,家人叫你“老三”也没错——但如果你听混了,别人喊“老三”你站起来答“到”,结果发现人家是在叫隔壁班李家的老三……那就尴尬了。
树莓派的GPIO引脚就是这样。
每个可用的信号引脚都有两个“名字”:
- BCM编号:Broadcom SoC里的真实通道号,是它的“学名”
- 物理编号(BOARD):在电路板上从1到40顺序排列的位置号,是它的“小名”
它们指向同一个硬件引脚,但命名逻辑完全不同。
✅ 比如你看到开发板上的第12个物理引脚(Pin 12),它的真实身份是 BCM18 —— 它既是“老十二”,也是“张十八”。
所以问题来了:编程的时候,你是按“学名”叫,还是按“小名”喊?
答案取决于你的习惯、项目需求,以及使用的库。
BCM编号:给“懂行的人”准备的专业语言
什么是BCM?
BCM 是Broadcom SOC Channel的缩写,意思是博通公司设计的片上系统(SoC)中 GPIO 通道的原始编号。
树莓派5用的是博通的 BCM2712 芯片,所有GPIO功能都由这个芯片原生支持。每个可以编程的IO口,在芯片内部都有一个唯一的数字代号,比如 GPIO18、GPIO21……这些就是所谓的“BCM编号”。
你可以把它理解为:这是硬件工程师写数据手册时用的名字。
为什么专业开发者偏爱BCM?
因为 BCM 编号直接关联到芯片的功能特性。某些高级功能只能在特定的 BCM 引脚上启用:
| 功能 | 只能在哪些 BCM 引脚使用 |
|---|---|
| 硬件 PWM 输出 | BCM12, BCM13, BCM18, BCM19 |
| I²C 总线(SDA/SCL) | BCM2/BCM3(默认I2C1) |
| SPI 主设备 | BCM9/10/11/8/7(MISO/MOSI/SCLK/CE) |
比如你想用硬件级PWM来驱动伺服电机或调光LED,就必须选择支持硬件PWM的引脚(如 BCM18)。如果你只看物理位置乱接,很可能选到了不支持PWM的引脚,软件模拟虽然可行,但精度差、占CPU资源。
此外,现在很多现代Python库(如gpiozero和pigpio)默认使用 BCM 模式,开源社区的示例代码也大多基于 BCM 编号编写。如果你想复用别人的项目,统一使用 BCM 会省去大量转换成本。
实战代码示例(RPi.GPIO + BCM)
import RPi.GPIO as GPIO # 设置使用 BCM 编号模式 ← 关键一步! GPIO.setmode(GPIO.BCM) # 配置 BCM18 为输出模式(支持硬件PWM) GPIO.setup(18, GPIO.OUT) # 输出高电平,点亮连接在此引脚的LED GPIO.output(18, GPIO.HIGH) # 清理释放资源 GPIO.cleanup()📌 注意:只要写了GPIO.setmode(GPIO.BCM),后面所有的引脚操作都必须使用 BCM 数字,不能再用物理编号!
物理编号(BOARD):新手友好型“地图导航”
什么是物理编号?
物理编号就是按照你在树莓派主板上看得到的顺序,从左到右、从上到下,给每一个金属针脚依次编号,从 1 到 40。
这种编号方式完全不关心芯片内部结构,只关心“你在哪”。
就像你在电影院看电影,座位号是“第5排第8座”一样,不管这排椅子是谁生产的,只要按图索骥就能找到位置。
为什么适合初学者?
因为它直观、不怕忘。
你不需要记住“BCM18 是哪个位置”,只需要低头看看开发板上的丝印文字:
- 第一排左边第一个是 Pin 1
- 右边那个是 Pin 2
- 下一排左边是 Pin 3,右边是 Pin 4
- ……一直到最底下是 Pin 39 和 Pin 40
很多树莓派主板还会用颜色或标记突出电源引脚(3.3V、5V、GND),配合面包板接线非常方便。
更重要的是,像 Pin 1(3.3V)、Pin 6(GND)、Pin 12(PWM输出)这样的关键引脚,在历代树莓派中基本保持一致。这意味着你一旦熟悉了某个布局,升级换代后也能快速上手。
实战代码示例(RPi.GPIO + BOARD)
import RPi.GPIO as GPIO # 改用物理编号模式 GPIO.setmode(GPIO.BOARD) # 配置物理第12号引脚为输出(其实就是 BCM18) GPIO.setup(12, GPIO.OUT) # 点亮LED GPIO.output(12, True) # 释放资源 GPIO.cleanup()✅ 这段代码和前面的功能完全一样,只是换了个“叫法”。只要你记得“第12个孔”要接LED,就能顺利运行。
对比总结:一张表看懂该用谁
| 对比维度 | BCM 编号 | 物理编号(BOARD) |
|---|---|---|
| 命名依据 | 芯片内部GPIO通道编号 | 板子上的物理位置 |
| 是否跨代一致 | ❌ 不同型号可能变化 | ✅ 多数保持兼容 |
| 是否支持高级功能 | ✅ 明确标注(如PWM、I2C) | ⚠️ 需查映射表才知道 |
| 学习难度 | 中等,需查阅文档 | 低,肉眼可见 |
| 社区通用性 | 高,主流库默认使用 | 较少用于开源项目 |
| 推荐人群 | 进阶用户、产品开发 | 初学者、教学演示 |
💡 小贴士:物理 Pin 12 = BCM18,而且它是少数几个支持硬件PWM的引脚之一。这也是为什么很多教程推荐用它来控制舵机或RGB LED。
常见踩坑现场 & 解决方案
❌ 错误1:混淆编号,接错线
现象:
代码里写的是GPIO.setup(17, ...),你以为接的是靠近电源的那个“17号孔”,结果发现物理 Pin 17 其实是3.3V电源输出脚!
后果:轻则外设烧毁,重则树莓派罢工。
🔍 真相:
- 物理 Pin 17 → 3.3V 电源(固定功能,不可编程)
- BCM17 → 是一个普通GPIO,位于物理 Pin 11 上
👉 所以你写的setup(17)如果用了 BCM 模式,其实是操作 Pin 11;如果用了 BOARD 模式,则是操作 Pin 17(电源脚),根本不是同一个东西!
✅ 正确做法:
- 使用命令行工具查看当前引脚状态:bash pinout
安装方法:bash sudo apt install python3-rpi.gpio pip3 install gpiozero
运行后会输出彩色引脚图,清晰显示每个位置对应的 BCM 编号和功能。
或者用 Python 查看:
from gpiozero import Device from gpiozero.tools import pinout pinout()❌ 错误2:忘记设置编号模式
现象:
程序报错RuntimeWarning: No channel has been set up yet或直接崩溃。
原因:
没有在开头调用GPIO.setmode(GPIO.BCM)或GPIO.setmode(GPIO.BOARD)。
✅ 正确姿势:
永远把设置模式放在程序第一句(除了导入库之外):
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # 必须先设模式!否则后续所有setup()操作都会失败。
❌ 错误3:在一个程序里混用两种编号
现象:
前半段用 BCM 控制灯,后半段用 BOARD 控制蜂鸣器,结果其中一个不工作。
原因:
一旦设置了setmode(),整个程序就必须统一使用该模式。不能一会儿叫“张伟”,一会儿又叫“老三”。
✅ 解决办法:
整个项目坚持一种风格。建议团队协作时在 README 中明确声明:
📝 本项目采用 BCM 编号,请所有贡献者遵循此规范。
最佳实践建议
🟢 给初学者的建议:先用物理编号练手
- 搭建简单电路时(如点亮LED、读取按钮),用物理编号+面包板最不容易出错。
- 结合开发板丝印和接线图,建立空间感知。
- 推荐工具:打印一份 Pinout.xyz 的图表贴在桌上。
🔵 给进阶用户的建议:转向 BCM 编程
- 当你需要使用 I2C、SPI、PWM、编码器输入等功能时,必须依赖 BCM 编号才能精准定位。
- 更容易阅读和复用开源项目代码(90%以上基于 BCM)。
- 便于自动化测试和部署。
🛠 提效工具推荐
命令行查看引脚信息
bash raspi-gpio get
显示所有40个引脚的当前配置、电压状态和功能模式。图形化引脚查询工具
- 访问 https://pinout.xyz (响应式网页,手机也能看)
- 安装gpiozero后运行pinout命令,终端输出带颜色的表格代码中加入安全检查
python if GPIO.getmode() is None: GPIO.setmode(GPIO.BCM)
写在最后:理解本质,才能自由切换
BCM 和 物理编号 并非对立关系,而是不同视角下的同一套系统。
- BCM 是底层视角:关注“我能做什么”——功能决定位置。
- 物理是用户视角:关注“我在哪里”——位置决定操作。
真正厉害的开发者,不是死记硬背某种编号,而是知道:
“我现在要用PWM,得找支持ALT功能的BCM引脚;然后根据它的物理位置去接线。”
这才是嵌入式开发的核心能力——在抽象与实物之间自如穿梭。
下次当你拿起杜邦线时,不妨先问自己一句:
我现在是要叫它的“真名”,还是认它的“门牌号”?
想清楚这一点,你就已经超越了80%的新手。
如果你正在做树莓派项目,欢迎在评论区分享你是用 BCM 还是 BOARD?有没有因为编号搞错过引脚?我们一起避坑成长 👇