公司动态

树莓派3 GPIO实战详解:40-Pin引脚图、避坑指南与CM4迁移路径

📅 2026/8/27 3:09:19
树莓派3 GPIO实战详解:40-Pin引脚图、避坑指南与CM4迁移路径
手头这块 Raspberry Pi 3B 我已经用了快六年中途换过更贵的板子但真正让我一直留在桌面上跑东西的反而是这块“老家伙”。很多朋友第一眼看到 Raspberry Pi 3 的处理器参数都会摇头四核 A53 1.4GHz放在今天连手机零头都比不上。但你有没有想过树莓派系列里真正值钱的不是算力而是那块 40-Pin GPIO 引脚图背后的一整套外设生态。尤其是当所有人都在追 Compute Module 4、树莓派 5 的时候Raspberry Pi 3 依然是学习 GPIO、做原型验证、搭低功耗常驻服务最顺手的平台。这篇文章我想用实际经验告诉你Raspberry Pi 3 到底适合做什么、不适合做什么40 个引脚怎么读才不会翻车我在 GPIO 项目里踩过哪些坑以及如果将来要迁到 Compute Module 4你的代码里有哪些东西可以原封不动带走。1. 为什么现在还在聊 Raspberry Pi 3性能边界与场景定位1.1 先把三代家族分清3B、3B、3A 差在哪很多新手拿着“Raspberry Pi 3”这个名称就去买回来才发现后缀不一样引脚图和系统兼容性倒是一致但外设和网络性能差距不小。我简单列个对比方便你对号入座。型号CPU内存网络供电建议备注Raspberry Pi 3BBCM2837 四核 A53 1.2GHz1GB LPDDR22.4GHz Wi-Fi 蓝牙 4.15V/2.5A早期版本存在电源管理芯片发热问题Raspberry Pi 3BBCM2837B0 四核 A53 1.4GHz1GB LPDDR2双频 Wi-Fi 蓝牙 4.2 千兆以太网实际走 USB 2.0 通道5V/2.5A散热改善明显推荐优先选Raspberry Pi 3ABCM2837B0 四核 A53 1.4GHz512MB LPDDR2双频 Wi-Fi 蓝牙 4.25V/2A尺寸小省了一个 USB 口适合嵌入式场景这里有个容易忽略的细节3B 虽然写了“千兆以太网”但实际跑起来只能到 300Mbps 左右因为网卡挂在 USB 2.0 总线上。如果你把它当路由器或者做高速文件传输别指望满速千兆。同理USB 口也都是 USB 2.0外接硬盘时实测大文件读写也就 30-40MB/s 上下。1.2 相比 Compute Module 4树莓派 3 到底输在哪、赢在哪最近“raspberry pi compute module 4”这个关键词热度很高我也把一块 CM4 放到工业底板里跑过小半年。从纯性能看CM4 的 BCM2711 四核 A72 1.5GHz 比树莓派 3 强了不止一个档次内存可选到 8GB还能接 PCIe、双 HDMI、多路摄像头。但如果你是做 GPIO 小项目恕我直言CM4 的优势你大概率用不上。CM4 没有板载无线模块除了特定的 WiFi 版本没有标准 USB 口没有 3.5mm 音频口它是一块贴在底板上的核心板。这意味着你至少要多花一两百块买底板底板的 40-Pin GPIO 引脚排序虽然和树莓派 3 一致但电源、串口、RTC、SATA 这些扩展完全依赖底板设计。相比之下Raspberry Pi 3 插一张 SD 卡就能开工GPIO 直接裸露在板上哪个更适合入门不用我多说。我的判断是纯做 GPIO 控制、桌面小工具、家庭自动化节点Raspberry Pi 3 是性价比天花板。真正需要同时扛起数据库、容器、视频推流这类负载时再考虑 CM4 也不迟。1.3 Raspberry Pi 3 不适合做什么先把预期摆正说句大实话树莓派 3 的内存只有 1GB跑一个 Chromium 浏览器都能卡到你怀疑人生。我做过几轮压测这些场景基本属于“能跑但别抱希望”当桌面电脑主力机别想了网页开多几个标签就吃满内存。跑 Docker 全家桶一个 Portainer 加三四个轻量容器勉强可以但编译镜像时会发热严重。做实时视频编码软编码 1080p 会掉帧更别想 4K。跑大型语言模型或本地推理除非量化到极低精度否则内存直接爆。适合它的反而是那些“小、稳、持续”的任务温湿度采集、GPIO 控制、MQTT 网关、Pi-hole 广告过滤、轻量 NAS 备份、串口协议转换。把 3 当成一个永远不关机的“外设大脑”而不是“小电脑”你会舒服很多。2. 从开箱到系统落地一张 SD 卡里的隐藏学问2.1 系统镜像选型Desktop 还是 Lite拿到 Raspberry Pi 3 的第一步是装系统。我很不建议在树莓派 3 上装完整版 Raspberry Pi OS Desktop那个图形界面会吃掉大量内存开机后剩给应用的内存连 300MB 都没有。我个人的选择是做 GPIO 项目、当服务器用Raspberry Pi OS Lite无桌面装完系统内存占用不到 200MB。偶尔要接显示器操作装 Lite 一个轻量窗口管理器或者干脆用 VNC 连到另一台电脑上的桌面环境。给孩子玩或者纯粹学习 Linux可以装 Desktop但要接受卡顿。用 Raspberry Pi Imager 烧录时我强烈建议你在右上角提前设置好 SSH、Wi-Fi 和用户名密码。这个功能很多人忽略结果烧完卡发现没显示器没键盘又得重新插卡配置。2.2 无显示器部署的细节SSH 文件、Wi-Fi 配置与 hostname这里我分享一个最朴素也最可靠的“无头启动”流程。烧好系统后SD 卡在电脑上会显示两个分区其中bootfs分区在 Windows/macOS 下都能直接访问。先在bootfs分区根目录新建一个空文件名字就叫ssh没有扩展名系统启动后会自动打开 SSH 服务。然后新建userconf.txt文件格式是这样pi:$6$N7eL9... # 这里放的是加密后的密码密码不是明文最简单的方法是直接用 Raspberry Pi Imager 的图形界面设置用户名密码它会帮你生成好这个文件。如果你手动操作可以用openssl passwd -6生成哈希后填入。Wi-Fi 配置则是在bootfs分区里新建或编辑wpa_supplicant.confcountryCN ctrl_interfaceDIR/var/run/wpa_supplicant GROUPnetdev update_config1 network{ ssid你的无线名字 psk你的无线密码 key_mgmtWPA-PSK }注意country字段别乱填填错可能导致某些国家码信道上连不上。启动后先别急着用路由器查 IP直接登录路由器后台看 DHCP 客户端列表最省事。如果你用的是 3B它还支持蓝牙串口调试极端情况下可以rfcomm连进去但这属于保命手段平时没必要折腾。2.3 供电和散热最多人忽略的隐性故障源Raspberry Pi 3 这代对供电特别敏感尤其是 3B满载时瞬时电流能到 1.2A 以上如果充电头虚标会出现典型的“电压不足”现象系统反复重启、USB 外设随机断开、GPIO 输出电平不稳定。我踩过一次很深的坑用手机充电头供电跑一个用 GPIO 控制继电器的脚本正常运行没毛病一开继电器就重启查了三天代码最后发现是继电器线圈吸合瞬间把 5V 拉低。后来我换成正经的 5V/3A 电源并在接线端并了一个 470uF 电容才解决。散热方面树莓派 3 的 BCM2837 芯片虽然功耗不算高但长期满载跑编译或视频软解时温度能冲到 85℃ 触发降频。我的做法是加一个铝制散热片加小风扇温度稳定在 50℃ 以下。注意风扇不要直接接 GPIO 的 3.3V否则转速上不去还会干扰信号接到 5V 引脚上用三极管或 MOSFET 做温控开关更好。# 查看温度最简单的一行命令 vcgencmd measure_temp # 查看当前频率和是否降频 vcgencmd get_throttledget_throttled输出如果是0x50000说明出现过欠压或降频数字串中每一位都代表不同事件这个命令是排查供电问题最快的手段。3. 40-Pin GPIO 引脚图全解别再把引脚当摆设3.1 引脚编号三套系统物理引脚、BCM 编号、WiringPi 编号很多人看 GPIO 引脚图翻车不是看不懂而是被三套编号搞晕了。物理引脚Physical/Board就是板上 1 到 40 的位置永远不变。BCM 编号Broadcom 芯片内部的 GPIO 编号Python 和大多数库默认用这个。WiringPi 编号早期很多 C 语言教程用现在已经不推荐了但老项目里还常见。我的建议只有一个统一用 BCM 编号。原因很简单RPi.GPIO、gpiozero、libgpiod这些库的主流用法都是 BCM。WiringPi 项目 2019 年后基本停更在新系统上甚至装不进去别为这点小便宜给自己挖坑。3.2 完整的 40-Pin 引脚速查表下面这张表是我每次接外设都会对着看的对应树莓派 3B/3B/3A 全部 40-Pin 头。左边是奇数引脚右边是偶数引脚。奇数引脚功能/BCM编号偶数引脚功能/BCM编号13.3V 电源25V 电源3GPIO2I2C1 SDA45V 电源5GPIO3I2C1 SCL6GND7GPIO4GPCLK08GPIO14UART TXD9GND10GPIO15UART RXD11GPIO1712GPIO18PCM_CLK / PWM013GPIO2714GND15GPIO2216GPIO23173.3V 电源18GPIO2419GPIO10SPI MOSI20GND21GPIO9SPI MISO22GPIO2523GPIO11SPI SCLK24GPIO8SPI CE025GND26GPIO7SPI CE127GPIO0ID_SDEEPROM28GPIO1ID_SCEEPROM29GPIO530GND31GPIO632GPIO12PWM033GPIO13PWM134GND35GPIO19PCM_FS36GPIO1637GPIO2638GPIO20PCM_DIN39GND40GPIO21PCM_DOUT这里必须提醒三点第一GPIO0 和 GPIO1 默认被板载 EEPROM 占用用来识别 HAT 扩展板普通场景不要拿它们做输入输出。第二I2C1 的 SDA/SCL 在板上有 1.8kΩ 上拉电阻如果你再叠加一个带强上拉的传感器模块总线上拉过强会导致信号边沿变缓严重的会直接通信失败。第三除了标记为 5V 和 3.3V 的电源引脚其余 GPIO 都是 3.3V 逻辑电平绝对不能直接接 5V 信号否则长期使用会烧毁处理器。3.3 电气特性和电流限制为什么不能直接带电机树莓派 3 的 GPIO 不是“万能输出口”。每个 GPIO 引脚的最大输出电流大约 16mA所有 GPIO 的总电流限制在 50mA 左右。这是什么概念一个普通红色 LED 工作电流 10-20mA刚好在范围内但一个 5V 继电器线圈可能需要 70mA 以上一个直流电机动辄几百毫安直接接上去轻则重启重则烧引脚。所以接 LED 一定要串联限流电阻我常用 330Ω 或 470Ω把电流控制在 8-10mA 左右亮度够也不会伤害引脚。驱动继电器、电机、电磁锁这类大功率负载必须用光耦隔离或 ULN2803/ULN2003 驱动板或者用 MOSFET 模块转接。以我自己的项目为例控制 220V 设备时我用的方案是GPIO 输出到光耦光耦驱动继电器继电器再控制交流负载全程隔离主控板零风险。3.4 实战用 Python 点亮第一个 LED理论说再多不如直接跑一次。我用的是RPi.GPIO库树莓派 OS 默认自带没有的话先装sudo apt update sudo apt install python3-rpi.gpio接线方式GPIO18物理引脚 12接 LED 阳极LED 阴极串联一个 330Ω 电阻电阻另一头接 GND物理引脚 6。import RPi.GPIO as GPIO import time LED_PIN 18 GPIO.setmode(GPIO.BCM) 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.setmode(GPIO.BCM)表示后面用的编号是 BCM 编号不是物理引脚。如果你用GPIO.setmode(GPIO.BOARD)那引脚 12 对应的就成了物理 12 号引脚也就是 GPIO18两个都能亮但混用就会乱。我个人建议一个项目里从头到尾只用 BCM 编号。顺带推荐一个更现代的库gpiozero代码可读性更强from gpiozero import LED from time import sleep led LED(18) while True: led.on() sleep(1) led.off() sleep(1)gpiozero还内置了按钮、距离传感器、电机驱动、LED 矩阵等很多抽象类适合不想记底层细节的开发者。我自己做快速原型时经常用它跑生产级脚本时反而回到RPi.GPIO因为底层控制更直接。3.5 用pinout命令直接在终端看引脚图如果你不想背表格树莓派系统里自带一个命令pinout它会打印出当前板子的 ASCII 引脚图包含物理引脚、BCM 编号、I2C/SPI/UART/PWM 功能还会显示板子型号和 HAT 识别信息。这个命令在很多教程里都没提过但对调试外设接线来说效率极高。接到一块没贴标签的扩展板时我基本全靠它。4. 当我用树莓派 3 做 GPIO 项目时踩过的坑4.1 引脚编号搞混灯不亮不是硬件坏了我第一次接 I2C 温湿度传感器i2cdetect -y 1怎么都扫不到设备。检查了接线、供电、地址全都没问题。最后发现我把传感器接在了物理引脚 3 和 5 上但代码和检测命令里用的都是另外一组引脚。这里有个容易混淆的点树莓派系统里i2c-1这个总线对应的就是物理引脚 3SDA和 5SCL即 BCM GPIO2 和 GPIO3。但你如果用杜邦线接反了 SDA 与 SCL扫描结果一样是空的。我的排查办法是直接看引脚图然后写一段最简测试代码把两根线分别对调再试。硬件排错不丢人排错本身就是学习过程。4.2 板载上拉电阻和模块上拉打架前面提过树莓派的 I2C 已经有板载上拉很多现成的传感器模块为了兼容 Arduino 也会自带 4.7kΩ 上拉。两个上拉并联后阻值变小总线信号上升沿变慢短距离可能没事但杜邦线一长或者设备一多就会出现“时灵时不灵”。我的经验是同类模块接入数量多时优先选择不带板载上拉的纯传感器模块如果模块已经带强上拉可以用i2cdetect先扫描确认再通过dtoverlay里的参数调整 I2C 总线速度把 100kHz 降到 10kHz 往往能救回来。当然最稳妥的办法还是用 I2C 电平转换/中继模块比如 TCA9548A 这类多路复用器但那是后话。4.3 继电器吸合瞬间导致系统重启这个坑我在前面提过但值得单独再讲一遍。继电器线圈是感性负载断电瞬间会产生反向电动势哪怕只有 5V也可能通过电源线反灌进树莓派。我的解决方案分两步第一步继电器模块的 VCC 和 GND 不要从树莓派 5V 引脚取电改从独立电源取电树莓派只接信号线和共地。第二步如果必须共用电源那么在继电器电源端并联一个 1N4007 二极管方向要反着接阴极接正极用来吸收反向电动势。这个二极管我常备一包凡是涉及感性和电机负载的项目必用。4.4 PWM 的软硬件差异灯和舵机不是一回事树莓派 3 的 GPIO 上PWM 有两种实现方式。一个是RPi.GPIO的软件 PWM它由 CPU 模拟产生频率不高且会占用处理器时间用来控制 LED 亮度、电机转速没问题另一个是硬件 PWM树莓派 3 只有 GPIO12、GPIO13、GPIO18、GPIO19 这 4 个引脚支持由芯片内部硬件产生波形更精准用来控制舵机角度更合适。我写过一个小项目用 GPIO18 做软件 PWM 控制 LED 呼吸灯又用 GPIO12 硬件 PWM 控制舵机两者互不干扰。但如果你试图在任意 GPIO 上用RPi.GPIO输出高频 PWM 给舵机实测可能会出现抖动因为软件 PWM 的低优先级会受系统负载影响。需要更稳定、更高精度的 PWM 输出时推荐用pigpio库。sudo apt install pigpio sudo systemctl enable pigpiod sudo systemctl start pigpiod然后通过库接口控制import pigpio pi pigpio.pi() pi.set_mode(18, pigpio.OUTPUT) pi.set_PWM_frequency(18, 50) # 50Hz适合舵机 pi.set_PWM_dutycycle(18, 128) # 占空比 50%4.5 3.3V 逻辑和 5V 外设的“门不当户不对”很多 Arduino 传感器模块是 5V 逻辑直接接到树莓派 GPIO 会有两个问题树莓派 3.3V 引脚输出驱动不了 5V 电平的模块模块 5V 输出反过来会把树莓派 pin 打坏。处理方式很简单5V 供电模块的信号输出接一个电阻分压网络降到 3.3V或者直接用双向电平转换模块。我在面包板上常备一块 8 路 I2C 双向电平转换板几乎各类传感器都能接。5. 性能压榨与系统瘦身让树莓派 3 跑得更稳5.1 必改的系统配置Raspberry Pi 3 的内存只有 1GB装完 Lite 系统后可用内存大约 900MB。通过/boot/config.txt和raspi-config做几个简单调整能明显提升稳定性gpu_mem16GPU 显存改成 16MB无桌面场景够用内存全部留给 CPU。disable_splash1开机关掉彩虹屏和 logo启动速度更快。dtparamaudiooff不用板载 3.5mm 音频口时关掉省一点 CPU。dtoverlaydisable-bt不用蓝牙时禁用释放串口并省电。dtoverlaydisable-wifi用有线网络时可以关掉 Wi-Fi。改完保存重启。free -h会明显看到可用内存多了一两百 MB。别小看这点内存跑 MQTT 加 InfluxDB 加 Grafana 三个容器时这 200MB 可能就是压垮系统的最后一根稻草。5.2 存储与 SD 卡寿命写放大是隐形杀手树莓派 3 从 SD 卡启动SD 卡的随机读写性能本来就弱如果频繁写日志还会加速写磨损。我见过不少朋友的树莓派用几个月就卡死查到最后都是 SD 卡坏块。这里有几个实用手段第一买 SD 卡时认准 Class 10 / U1 以上最好是 A1 或 A2 标识随机 IOPS 会好很多。第二把频繁写入的目录迁到内存文件系统比如/tmp和/var/log修改/etc/fstab添加一行tmpfs /var/log tmpfs defaults,noatime,nosuid,size32m 0 0第三有条件就外接 USB 移动硬盘把 Docker 数据目录或数据库目录放到硬盘上。3B 支持从 USB 启动但注意 USB 硬盘供电问题最好用带独立电源的硬盘盒。5.3 实测案例一个低负载常驻监控节点我用树莓派 3B 搭过一个温湿度采集节点常年放在阳台角落已经稳定运行一年多。整个系统的结构很简单DHT22 温湿度传感器接 GPIO4。Python 脚本每 10 秒读一次数据写入本地 SQLite。每分钟通过 MQTT 上报到家里的主服务器。每天凌晨用rrdtool生成趋势图通过 Nginx 提供网页查看。系统内存长期占用 40% 左右CPU 空闲率超过 95%温度稳定在 45℃ 左右。这类低负载任务对树莓派 3 来说简直是在“杀鸡用牛刀”但它最大的好处就是稳定、便宜、坏了不心疼。相比之下用 CM4 做同样的事情虽然性能冗余更大但成本和功耗都上去了有点浪费。6. 从树莓派 3 迁移到 Compute Module 4 的现实路径6.1 什么情况下值得迁移既然“raspberry pi compute module 4”是最近的热门搜索词我聊聊自己的迁移判断。如果你手里的树莓派 3 出现了这些症状可以考虑升级内存长期 80% 以上经常触发 OOM Killer。想跑多个 Docker 容器但 CPU 跟不上。需要同时接入多路摄像头、高速串口或 PCIe 设备。要把项目做成产品原型需要更稳定的 eMMC 存储。反过来只是控制几个 GPIO、跑个定时任务就完全没必要折腾。6.2 迁移时 GPIO 代码需要改什么好消息是CM4 的处理器虽然换成了 BCM2711但 GPIO 头依然是 40-PinBCM 编号完全一致。你之前在树莓派 3 上写的RPi.GPIO、gpiozero、pigpio代码绝大多数不需要修改就能直接跑在 CM4 的 IO 板上。真正要注意的是这些细微差异CM4 核心板本身没有 40-Pin 头必须配底板底板的引脚映射能做到和树莓派 3 一致但不是每个底板都严格照搬买之前一定要看底板原理图。CM4 的 5V 电源输入范围更宽但总功耗更高选电源时建议留出 2.5A 以上余量。CM4 的 eMMC 版本启动更快但系统镜像要用rpiboot工具写不能直接拿读卡器写 SD 卡。部分 GPIO 在底板上可能被复用为 HDMI、PCIe、USB 等信号具体以底板规格为准。6.3 我的建议先保留 GPIO 代码抽象层迁移最省力的做法是在树莓派 3 阶段就把 GPIO 操作封装成独立的模块。比如写一个devices.py把 LED、传感器、继电器都定义成类主逻辑通过类方法调用。这样换平台时只需要改底层驱动文件的引用上层业务代码完全不动。我自己的迁移顺序通常这样先在电脑上把系统镜像刷好并进行基本配置再用一个能打印 GPIO 状态的最小测试程序验证底板引脚映射最后才跑完整业务逻辑。经验是迁移过程中 90% 的问题出在底板的引脚定义和电源稳定性上真正需要改代码的情况反而很少。这正好解释了为什么这些年 Raspberry Pi 3 积累的 GPIO 项目在 CM4 时代依然有价值生态兼容才是它最大的护城河。玩树莓派这么多年我最深的感受是不要被“性能不够”劝退也别被“最新最强”带跑偏。Raspberry Pi 3 的 GPIO 引脚图、外设库、发行版和支持文档已经构成了一个足够庞大且稳定的知识网络。你花在这个平台上的每一分调试精力未来迁移到任何其他单板电脑上都不会白费。希望这篇基于实战的梳理能让你少走几趟我走过的弯路。