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就是浪费,一个自动驾驶小车用树莓派就是找死。选型的关键是搞清楚你的需求:实时性要求多高?算力需求多大?通信距离多远?把这些想清楚了,选型自然就简单了。