3、嵌入式硬件选型:STM32与ESP32对比、树莓派与Jetson Nano选型、传感器与执行器接口
做ROS嵌入式系统这么多年,我见过太多项目在硬件选型上栽跟头。说白了,选错芯片就像穿错鞋——跑得越快,摔得越惨。今天咱们就聊聊STM32和ESP32怎么选,树莓派和Jetson Nano谁更合适,以及传感器执行器接口那些坑。
3.1 STM32 vs ESP32:实时控制与无线通信的博弈
这两个芯片我用了快十年。STM32是MCU界的"老黄牛",ESP32则是"多面手"。怎么选?看你的实时性要求。
核心结论:需要硬实时控制(电机、舵机、传感器采样)选STM32;需要无线通信(WiFi/蓝牙)且实时性要求不高选ESP32。
3.1.1 STM32:硬实时控制的王者
STM32的强项在于它的硬件外设和中断响应。我记得有个项目要做四轴无人机飞控,采样频率要8kHz,中断延迟必须控制在1微秒以内。ESP32根本扛不住,STM32的F4系列轻松搞定。
我个人习惯用STM32做底层实时控制,原因有三:
- 定时器精度高:16位/32位定时器,PWM分辨率可达纳秒级
- 中断响应快:从中断触发到进入ISR,典型值12个时钟周期
- DMA通道多:F4系列有16个DMA流,数据搬运不占CPU
避坑指南:我曾经在STM32F103上跑FreeRTOS+ROS串口通信,结果发现串口中断优先级设错了,导致电机控制周期抖动。后来把所有实时任务的中断优先级提到最高,才解决问题。记住:中断优先级分配比代码逻辑更重要。
3.1.2 ESP32:无线通信的性价比之王
ESP32的优势在于它集成了WiFi和蓝牙,而且价格只要20块钱。我做过一个室内巡检机器人,需要把传感器数据通过WiFi传到ROS Master。用STM32+ESP8266的方案,光调试AT指令就花了两周。后来换成ESP32,直接用ESP-IDF的WiFi API,一天搞定。
ESP32的典型应用场景:
- 需要WiFi/蓝牙通信的传感器节点
- 低功耗物联网设备
- 原型验证阶段的快速开发
注意:ESP32的ADC精度是个坑。它的12位ADC实际有效位数只有9-10位,而且非线性严重。我做过一个电池电压监测项目,用ESP32的ADC测电压,误差能到5%。后来外挂了一个ADS1115才解决。如果你需要高精度模拟量采集,老老实实用STM32+外部ADC。
3.1.3 选型对比表
| 对比项 | STM32F4 | ESP32 |
|---|---|---|
| 主频 | 168-240MHz | 240MHz |
| SRAM | 192KB-1MB | 520KB |
| 中断延迟 | ~12时钟周期 | ~50时钟周期 |
| 无线通信 | 需外挂 | 内置WiFi/BT |
| ADC精度 | 12位(有效11位) | 12位(有效9-10位) |
| 价格 | 15-50元 | 15-25元 |
| 典型场景 | 电机控制、传感器采集 | 无线传感器、IoT节点 |
3.2 树莓派 vs Jetson Nano:算力与功耗的取舍
这两个板子我都用来做过ROS机器人。树莓派是"轻骑兵",Jetson Nano是"重装坦克"。选哪个?看你的算法复杂度。
3.2.1 树莓派4B:轻量级ROS节点的首选
树莓派4B跑ROS Melodic/Noetic完全够用。我做过一个差速轮式机器人,用树莓派跑导航栈(move_base+gmapping),CPU占用率在60%左右,还算流畅。但如果你要跑视觉SLAM或者深度学习推理,树莓派就力不从心了。
树莓派的优势:
- 生态丰富:社区资源多,遇到问题一搜就有答案
- 功耗低:5V/3A供电,电池供电也能跑2-3小时
- GPIO好用:直接控制舵机、传感器,适合原型验证
我的经验:树莓派跑ROS时,建议把swap分区关掉。SD卡的读写速度太慢,一旦触发swap,整个系统就卡死了。我有个项目就是没关swap,结果机器人走到一半突然"死机",差点撞墙。后来换成USB3.0的SSD启动,问题解决。
3.2.2 Jetson Nano:边缘AI计算的利器
Jetson Nano有128个CUDA核心,跑YOLOv4-tiny能到30FPS。我做过一个视觉抓取机器人,用Jetson Nano跑目标检测+姿态估计,再通过ROS把抓取坐标发给机械臂。说实话,树莓派根本干不了这活。
Jetson Nano的典型应用:
- 视觉SLAM(ORB-SLAM3、VINS-Fusion)
- 目标检测(YOLO、SSD)
- 语义分割(DeepLab、UNet)
- 多传感器融合(激光雷达+摄像头+IMU)
注意散热:Jetson Nano满载功耗能到15W,散热片烫得能煎鸡蛋。我有个项目没装风扇,跑了半小时就降频了,推理速度从30FPS掉到5FPS。后来加了个5V风扇,温度控制在65度以下。记住:Jetson Nano必须主动散热。
3.2.3 选型建议
| 场景 | 推荐平台 | 理由 |
|---|---|---|
| 基础导航、传感器采集 | 树莓派4B | 够用、省电、便宜 |
| 视觉SLAM、目标检测 | Jetson Nano | GPU加速、算力充足 |
| 多传感器融合 | Jetson Nano | 需要同时处理多路数据 |
| 原型验证、教学 | 树莓派4B | 社区资源多、上手快 |
| 产品级部署 | Jetson Nano | 稳定性、算力余量 |
3.3 传感器与执行器接口:通信协议的选择
接口选型这块,我踩过的坑比走过的路还多。你想想看,一个机器人上可能有激光雷达、IMU、电机、舵机、摄像头……每个设备都有自己的通信协议,怎么把它们整合到一起?
3.3.1 I2C:短距离传感器总线
I2C适合板内传感器通信,比如IMU、温度传感器、距离传感器。它的优点是只需要两根线(SDA+SCL),可以挂多个设备。但缺点也很明显:距离短(一般不超过1米)、速度慢(标准模式100kHz)。
我常用的I2C传感器:
- MPU6050(六轴IMU)
- VL53L0X(激光测距)
- BME280(温湿度气压)
避坑指南:我曾经在一条I2C总线上挂了5个传感器,结果发现通信老是出错。查了半天,原来是总线电容太大,信号上升沿变缓了。后来把上拉电阻从4.7kΩ换成2.2kΩ,问题解决。记住:I2C总线上的设备越多,上拉电阻就要越小。
3.3.2 SPI:高速数据采集
SPI的速度比I2C快得多,典型速率10-50MHz。适合需要高速数据采集的场景,比如ADC、SD卡、显示屏。但SPI需要4根线(MOSI、MISO、SCLK、CS),而且每个设备需要一个独立的片选引脚。
SPI的典型应用:
- 高速ADC(如ADS1256,30kSPS)
- SD卡存储(ROS bag记录)
- OLED/LCD显示屏
3.3.3 UART:远距离通信
UART是ROS嵌入式系统中最常用的接口。为什么?因为ROS的串口通信就是基于UART的。它的优点是距离远(RS232能到15米,RS485能到1200米),而且硬件简单。
UART的典型应用:
- ROS串口通信(rosserial、serial)
- GPS模块(NMEA协议)
- 激光雷达(如RPLIDAR A1)
重要提示:做ROS串口通信时,一定要加校验。我有个项目没加校验,结果偶尔出现数据错位,机器人突然"抽风"。后来加了CRC16校验,问题再没出现过。记住:串口通信不可靠,必须加校验。
3.3.4 执行器接口:PWM与CAN
执行器控制这块,PWM和CAN是两大主流。
PWM控制:适合舵机和直流电机。频率一般50Hz(舵机)到20kHz(电机)。STM32的定时器可以输出多路PWM,而且精度很高。
CAN总线:适合多电机协同控制。我做过一个四轮独立驱动的机器人,四个电机通过CAN总线通信,每个电机都有独立的ID。CAN总线的优点是实时性好、抗干扰能力强、距离远(40米@1Mbps)。
注意:PWM信号在长距离传输时容易衰减。我有个项目把舵机放在2米外,PWM信号到了舵机那里已经变形了。后来加了电平转换芯片(如SN74LVC1G17),问题解决。记住:PWM信号超过1米就要加驱动。
3.3.5 接口选型总结
| 接口 | 速度 | 距离 | 设备数 | 典型应用 |
|---|---|---|---|---|
| I2C | 100kHz-3.4MHz | <1米 | 多设备 | IMU、温度传感器 |
| SPI | 10-50MHz | <1米 | 少设备 | ADC、SD卡 |
| UART | 115200-921600bps | 15米(RS232) | 点对点 | ROS串口、GPS |
| CAN | 125k-1Mbps | 40米@1Mbps | 多设备 | 电机控制、传感器网络 |
| PWM | 50Hz-20kHz | <1米 | 多通道 | 舵机、直流电机 |
嗯,硬件选型这块就聊这么多。说白了,没有最好的芯片,只有最合适的方案。你想想看,一个扫地机器人用Jetson Nano就是浪费,一个自动驾驶小车用树莓派就是找死。选型的关键是搞清楚你的需求:实时性要求多高?算力需求多大?通信距离多远?把这些想清楚了,选型自然就简单了。