从零开始玩转树莓派5:40个引脚,到底怎么接才不翻车?
你有没有过这样的经历?买回一块崭新的树莓派5,兴致勃勃地插上电源,连好显示器,打开终端,准备大干一场。结果一到接传感器、连电机、点亮LED的时候——懵了。
线该接到哪个孔?BCM编号和物理引脚有什么区别?为什么I²C扫描不到设备?刚通电没两秒,树莓派直接重启……
别急,这些问题99%的新手都踩过坑。而罪魁祸首往往不是代码写错了,也不是硬件坏了,而是——你没搞懂那排40个小小的金属针脚,到底谁是谁。
今天我们就来一次讲透:树莓派5的40针GPIO排针,究竟该怎么用?哪些能碰,哪些要小心,哪些必须外接保护?
先看一眼这40个“小金针”长啥样
树莓派5延续了自树莓派B+以来的经典设计:2×20共40个引脚,间距2.54mm,标准杜邦线随便插,扩展板也能完美兼容。
但别被它的“熟悉感”骗了——虽然外形和前代差不多,内部功能却有不小升级。更重要的是,如果你混淆了两种编号方式,分分钟烧板子。
物理引脚 vs BCM编号:新手最容易栽的第一个坑
- 物理引脚号(Physical Pin):从左上角开始数,1、2、3……一直数到40,按位置顺序来。
- BCM GPIO编号:这是芯片内部真正的“身份证号”,比如GPIO17、GPIO21,程序里控制用的就是它。
🔥 关键提醒:物理引脚11 ≠ GPIO11!它是GPIO17!
举个例子:
- 你想控制一个LED,查资料说“用GPIO17”
- 你一看开发板上写着“17”的是第11根针
- OK,插上去——对了!
但如果你以为“GPIO11”就是第11根针,那就错了!物理引脚11是GPIO17,而GPIO11在物理引脚23上。
所以记住一句话:写代码时只认BCM编号,接线时对照物理位置。
电源与地线:别让外设把你“拖死”
先解决最基础的问题:怎么供电?
树莓派5提供了多个电源和接地引脚,分布在两侧,方便多设备共地连接。
| 引脚类型 | 对应物理引脚 | 输出电压 | 最大电流建议 |
|---|---|---|---|
| +3.3V | 引脚1、17 | 稳定3.3V | ≤50mA(总和) |
| +5V | 引脚2、4 | 来自USB-C输入 | ≤1A(取决于电源适配器) |
| GND | 引脚6、9、14、20、25、30、34、39 | 0V参考点 | —— |
⚠️ 血泪教训总结:
+5V不是无限供能池
虽然标称+5V,但它直接来自你的USB-C电源。如果外接步进电机、继电器阵列这类高功耗设备,很容易拉低系统电压,导致树莓派突然重启甚至损坏SD卡。永远不要用树莓派给大功率设备直接供电
比如5V风扇、舵机、电磁锁……这些都应该用外部电源独立供电,然后把它们的GND接到树莓派的地线上,实现“共地通信”。+3.3V带不动太多负载
所有GPIO模块加起来最好不要超过50mA。像BME280这种低功耗传感器没问题,但别想着靠它驱动一堆IC。
✅最佳实践:高功耗设备 → 外部电源;信号控制 → 树莓派GPIO;两地相连 → 接一根GND线。
GPIO通用引脚:你的数字世界开关
GPIO(General Purpose Input/Output),顾名思义,就是你可以自由定义用途的引脚。
它可以当输入读开关状态,也可以当输出控制LED亮灭、继电器通断。
它们有多“通用”?
- 支持输入/输出模式切换
- 可配置内部上拉或下拉电阻(省掉外部电阻)
- 部分支持PWM输出(模拟调光、调速)
- 多数可复用为I²C、SPI、UART等特殊功能
但要注意:所有GPIO都是3.3V逻辑电平,不能承受5V输入!
实战示例:用Python点亮一颗LED
import RPi.GPIO as GPIO import time # 使用BCM编号体系 GPIO.setmode(GPIO.BCM) LED_PIN = 17 # 对应物理引脚11 # 设置为输出模式 GPIO.setup(LED_PIN, GPIO.OUT) try: while True: GPIO.output(LED_PIN, GPIO.HIGH) # 开 time.sleep(1) GPIO.output(LED_PIN, GPIO.LOW) # 关 time.sleep(1) except KeyboardInterrupt: pass finally: GPIO.cleanup() # 必须加!否则下次可能报错📌 小贴士:
-GPIO.cleanup()不是可选项,是必选项。它会释放引脚资源,防止下次运行时报“Channel already in use”错误。
- 如果你是第一次使用GPIO,记得先安装库:pip install RPi.GPIO
I²C:两根线连遍天下传感器
想接温湿度传感器?OLED屏幕?RTC实时时钟?大概率要用到I²C。
它只需要两根线就能挂载多个设备,非常适合资源紧张的项目。
引脚对应关系
| 功能 | BCM编号 | 物理引脚 |
|---|---|---|
| SDA(数据) | GPIO2 | 引脚3 |
| SCL(时钟) | GPIO3 | 引脚5 |
这两根线上内置约1.8kΩ的上拉电阻,在短距离通信(<30cm)时通常够用。但如果走线较长或挂载设备较多,建议额外加上4.7kΩ上拉电阻到3.3V。
如何启用I²C?
首次使用需要开启接口:
sudo raspi-config nonint do_i2c 0然后可以重启,或者直接加载模块:
sudo modprobe i2c-dev扫描I²C设备:排查连接问题神器
from smbus2 import SMBus def scan_i2c(): bus = SMBus(1) # 使用I²C总线1 devices = [] for addr in range(0x03, 0x78): try: bus.write_byte(addr, 0) devices.append(hex(addr)) except OSError: continue return devices print("找到的I²C设备地址:", scan_i2c())💡 常见设备地址参考:
- BME280/BMP280:0x76或0x77
- SSD1306 OLED:0x3C或0x3D
- PCF8591 AD/DA模块:0x48
如果扫描不出任何设备,请检查:
- 是否启用了I²C?
- SDA/SCL是否接反?
- 设备是否供电正常?
- 地线是否共接?
SPI:高速传输首选,适合LCD、ADC
如果你要做高速数据采集,比如读取ADC芯片、驱动彩色TFT屏、写SD卡,那就要上SPI。
相比I²C,SPI速度快得多,理论可达62.5Mbps(实际常用1~10MHz),而且是全双工通信。
四根核心线说明
| 名称 | 方向 | BCM编号 | 物理引脚 | 作用 |
|---|---|---|---|---|
| MOSI | 主出从入 | GPIO10 | 19 | 主机发送数据 |
| MISO | 主入从出 | GPIO9 | 21 | 主机接收数据 |
| SCLK | 时钟输出 | GPIO11 | 23 | 同步时钟 |
| CE0 | 片选0 | GPIO8 | 24 | 选择第一个从设备 |
| CE1 | 片选1 | GPIO7 | 26 | 选择第二个从设备 |
树莓派默认有两个SPI控制器(spi0 和 spi1),我们一般用 spi0。
Python操作SPI设备(以ADS1115为例)
import spidev spi = spidev.SpiDev() spi.open(0, 0) # 总线0,设备0(CE0) spi.max_speed_hz = 1000000 # 设置1MHz速率 # 发送命令并读取响应(具体格式依芯片手册) response = spi.xfer([0x01, 0x80]) # 示例读取寄存器 print(f"返回数据: {response}") spi.close()📌 注意:
-spi.open(0, 0)中的第二个参数是CS片选编号,0代表CE0,1代表CE1。
- 某些设备要求手动控制片选,这时可以把CE接到普通GPIO,自己用GPIO.output()控制高低电平。
UART串口通信:和Arduino、GPS说悄悄话
UART是最古老的串行通信方式之一,但现在依然非常有用。
比如你想:
- 和Arduino交换数据
- 接GPS模块获取经纬度
- 连蓝牙模块(HC-05)
- 调试嵌入式设备日志
都会用到它。
默认串口引脚
| 功能 | BCM编号 | 物理引脚 |
|---|---|---|
| TXD(发送) | GPIO14 | 引脚8 |
| RXD(接收) | GPIO15 | 引脚10 |
⚠️ 注意:这个串口默认被用于系统控制台输出(serial console)。如果你要用它做用户通信,得先关闭控制台功能:
sudo raspi-config # 选择:Interface Options → Serial Port # 关闭登录shell,启用硬件串口改完后,你的串口设备才能正常收发数据。
Python串口通信示例
import serial ser = serial.Serial( port='/dev/ttyAMA0', # 树莓派主串口 baudrate=9600, timeout=1 ) try: while True: if ser.in_waiting > 0: data = ser.readline().decode('utf-8').strip() print("收到:", data) ser.write(b'Hello from Pi!\n') time.sleep(2) finally: ser.close()🔧 提示:
- 波特率必须和对方设备一致(常见9600、115200)
- 数据线交叉接:树莓派TX → 对方RX,树莓派RX ← 对方TX
- 电平匹配!3.3V ↔ 3.3V,不可直连5V设备,需加电平转换器(如MAX3232)
实际应用场景:做一个智能环境监测站
让我们把上面所有接口串起来,做个真实项目练手。
系统组成
| 模块 | 接口方式 | 功能 |
|---|---|---|
| BME280传感器 | I²C | 采集温度、湿度、气压 |
| OLED显示屏 | I²C | 实时显示数据 |
| DHT22(备用) | 单总线(GPIO) | 温湿度备份 |
| 风扇继电器 | GPIO + PWM | 高温自动启动散热 |
| LoRa模块 | SPI | 远程无线上传数据 |
| ESP32-WiFi模块 | UART | 本地网络上传云端 |
工作流程
- 上电初始化:启用I²C、SPI、UART接口
- 循环读取BME280数据
- 若温度 > 30°C,通过PWM控制继电器开启风扇
- 将数据显示在OLED屏上
- 同时通过LoRa发送至网关,或通过UART转发给ESP32上传云平台
你看,一个完整的物联网节点,不过就是把这些引脚合理利用起来而已。
新手常踩的5个大坑,帮你提前避雷
| 问题 | 原因 | 解决方案 |
|---|---|---|
| I²C找不到设备 | 未启用I²C / 接线反接 / 无上拉 | raspi-config启用;检查SDA/SCL;加4.7kΩ上拉 |
| 树莓派频繁重启 | 外设从+5V取电过多 | 外部电源供电,仅共地 |
| 串口乱码 | 波特率不一致或电平不匹配 | 统一波特率;使用3.3V↔5V转换器 |
| GPIO没反应 | 编号搞错(物理 vs BCM) | 明确使用BCM编号,对照引脚图确认 |
| 插拔设备时冒烟 | 带电插拔造成短路 | 断电操作!尤其是I²C设备 |
安全第一:别让你的热情烧了板子
最后送上三条铁律:
绝不接入5V信号到GPIO
树莓派SoC是3.3V CMOS工艺,5V输入极可能导致永久损坏。不确定就加电平转换模块。做好静电防护
冬天干燥,人体静电可达几千伏。操作前摸一下金属外壳放电,或佩戴防静电手环。规划电源路径
强弱电分离,大电流走外部电源,信号控制由树莓派负责,两者仅通过GND连接。
结语:40个引脚,是你通往嵌入式世界的钥匙
树莓派5性能强劲,2.4GHz四核处理器、8GB内存、PCIe接口……听起来很炫酷。但真正让它变得强大的,从来不是CPU多快,而是那40个暴露在外的引脚。
正是这些引脚,让你能触摸真实世界:感知温度、驱动电机、显示信息、构建网络。
掌握它们,你就不再只是个“跑程序的人”,而是成了一个能创造系统的工程师。
下次当你拿起杜邦线,别再犹豫该插哪一针。打开这篇文,对照着接,大胆去做你想做的项目吧。
毕竟,每一个伟大的创客作品,都是从点亮第一颗LED开始的。
💬 如果你在接线过程中遇到难题,欢迎留言交流。我们一起拆解问题,把每个“为什么不通”变成“原来是这样”。