1、项目全景与硬件基础:自动化测试系统架构、树莓派/香橙派GPIO引脚图、UART串口通信原理、电平转换逻辑
各位同学,欢迎来到《Python GPIO与UART串口硬件自动化控制项目实战》的第一章。
做硬件自动化测试,说白了就是让机器替人干活。你想想看,一个产品要测几百个上下电循环、几千条串口指令,靠人工按按钮、看日志,不现实。我早年在一个消费电子厂做过产线测试,那时候还是工人拿示波器点焊盘,一天下来眼睛都花了。后来我们用树莓派搭了一套自动化脚本,把测试时间从半小时压缩到三分钟——嗯,这就是咱们这门课要干的事。
1.1 自动化测试系统架构概览
一个典型的硬件自动化测试系统,通常包含三层结构。我习惯把它画成下面这张图,方便理解。
这张图里,执行层是咱们的核心战场。树莓派或香橙派跑着Python脚本,通过GPIO控制电源通断、通过UART收发数据。我个人的习惯是,把执行层和被测层之间的连接做成可插拔的端子排,方便换测不同产品。
关键点:自动化测试不是让代码跑起来就行,而是要稳定、可重复。我曾经见过一个项目,GPIO没加电平转换直接怼到3.3V的MCU上,烧了三块板子才找到原因。所以,硬件基础必须扎实。
1.2 树莓派与香橙派GPIO引脚图
做GPIO控制,第一件事就是看引脚图。树莓派和香橙派的引脚定义不完全一样,但核心逻辑相通。我整理了一个对比表,方便你快速对照。
| 功能 | 树莓派 4B (BCM编号) | 香橙派 Zero 2 (WiringOP编号) | 备注 |
|---|---|---|---|
| 物理引脚 3 | GPIO 2 (SDA) | GPIO 12 | I2C数据线 |
| 物理引脚 5 | GPIO 3 (SCL) | GPIO 11 | I2C时钟线 |
| 物理引脚 8 | GPIO 14 (TXD) | GPIO 6 | UART发送 |
| 物理引脚 10 | GPIO 15 (RXD) | GPIO 7 | UART接收 |
| 物理引脚 11 | GPIO 17 | GPIO 1 | 通用IO |
| 物理引脚 12 | GPIO 18 | GPIO 2 | PWM可用 |
| 物理引脚 13 | GPIO 27 | GPIO 3 | 通用IO |
| 物理引脚 16 | GPIO 23 | GPIO 4 | 通用IO |
你可能会问,为什么同一个物理引脚,不同板子的编号不一样?说白了,这是芯片厂商的GPIO控制器设计不同。树莓派用BCM(Broadcom)编号,香橙派用WiringOP编号。我建议你写代码时统一用物理引脚号,这样换板子时改动最小。
个人经验:拿到新板子,第一件事不是写代码,而是用万用表量一下引脚电压。我曾经遇到过一块香橙派的GPIO输出高电平只有2.8V,差点以为是坏了,后来发现是板子供电不足。先测硬件,再调软件,能省一半的调试时间。
1.3 UART串口通信原理
UART,全称是Universal Asynchronous Receiver/Transmitter。说白了,就是一根线发、一根线收,不需要时钟线,靠约定好的波特率来同步。
它的工作流程其实很简单:
- 空闲状态:TX线保持高电平。
- 起始位:TX线拉低一个位时间,告诉对方“我要开始发了”。
- 数据位:通常5到8位,低位在前。比如发0x55(二进制01010101),线路上就是10101010(注意顺序)。
- 校验位(可选):奇校验或偶校验,用来检错。
- 停止位:TX线拉高1位或2位,表示这一帧结束。
我刚开始做串口调试时,总搞不清为什么发0x55收到的是0xAA。后来才意识到,UART是低位先发,示波器上看到的波形顺序和字节顺序是反的。嗯,这个坑我踩过,你们记住就行。
注意事项:UART通信双方必须设置相同的波特率、数据位、停止位和校验方式。哪怕波特率只差1%,长时间通信也会丢数据。我建议用115200或9600,这两个最常用,也最稳定。
1.4 电平转换逻辑
这是硬件自动化里最容易出问题的地方。树莓派和香橙派的GPIO/UART都是3.3V逻辑电平,但很多被测设备是5V的,比如老款的Arduino、某些工业传感器。直接连接,轻则通信异常,重则烧毁引脚。
电平转换的常见方案,我列了个表:
| 方案 | 原理 | 适用场景 | 成本 |
|---|---|---|---|
| 电阻分压 | 用两个电阻(如1kΩ+2kΩ)将5V分压到3.3V | 单向信号,低速(<100kHz) | 极低 |
| MOSFET双向电平转换 | 用N沟道MOSFET(如BSS138)实现双向转换 | 双向信号,I2C/UART通用 | 低 |
| 专用电平转换芯片 | 如TXS0108E、PCA9306 | 多通道、高速、高可靠性 | 中等 |
| 光耦隔离 | 用光耦(如6N137)实现电气隔离 | 强干扰环境、需要隔离的场景 | 较高 |
我个人最常用的是MOSFET方案,一个BSS138加两个10kΩ上拉电阻,就能搞定一路双向电平转换。电路简单,成本不到五毛钱,而且支持到几MHz的速率,UART完全够用。
避坑指南:我曾经在一个项目中,用电阻分压给UART做电平转换。结果波特率一上115200,数据就开始乱码。后来换成MOSFET方案,问题立刻解决。为什么?电阻分压的驱动能力弱,高速时波形畸变严重。所以,UART通信我建议至少用MOSFET方案,别省那几毛钱。