1. 这句“老话”到底哪里过期了
“树莓派跑系统,Arduino 跑裸机”——这句话在过去十年里几乎是嵌入式入门圈的口头禅。我刚接触硬件那会儿,也是被这句话直接“分流”的:想玩 Linux 就往树莓派那边走,想点灯、读传感器、控电机就买块 Arduino。简单粗暴,但确实好用。
问题是,这句话的隐含前提是:树莓派只能跑完整操作系统,Arduino 只能跑裸机循环。而这个前提,在最近几年已经被两边同时打破了。
先说 Arduino 这边。Arduino 官方从 UNO R4 开始,把 Renesas 的 RA4M1 这颗 Cortex-M4 芯片塞了进去,主频拉到 48MHz,内存和 Flash 都翻了好几倍。更关键的是,官方在 R4 上引入了Arduino 的 FreeRTOS 支持,你可以直接在 Arduino IDE 里创建任务、用信号量、跑多线程调度。虽然它还是“裸机”范畴,但已经不是那个只能写setup()和loop()的单线程玩具了。再往上,Arduino 的 Portenta 系列、Nicla 系列,跑的是 Mbed OS 或者可以直接上 MicroPython,甚至能跑轻量级 Linux。你说它还是“裸机”吗?至少不完全是了。
再看树莓派这边。树莓派 Pico 系列用的是 RP2040 / RP2350 芯片,它根本不跑 Linux,官方推荐的就是 C/C++ SDK 或者 MicroPython,本质上就是一块高性能单片机。你拿 Pico 去点灯、读 ADC、控舵机,和用 Arduino 干这些事没有本质区别。更狠的是 RP2040 的 PIO(可编程 I/O)模块,能让你用软件模拟出各种硬件外设,这是传统 Arduino 完全做不到的。所以“树莓派”这三个字,现在已经不能直接等同于“跑 Linux 的板子”了。
所以,当有人再拿这句话来问你“选哪个”的时候,你其实应该反问一句:你说的是哪个树莓派?哪个 Arduino?型号不同,答案完全不一样。
这篇文章就是想把这件事彻底讲清楚。我会从芯片架构、运行时环境、实时性、开发体验、生态成本这几个维度,把“树莓派”和“Arduino”这两个词拆开来看,告诉你什么场景下该选哪一类板子,以及为什么“跑系统 vs 跑裸机”这个二分法已经不够用了。不管你是刚入门想买第一块板子,还是做项目做到一半发现选错了平台,这篇内容都能帮你重新理清思路。
2. 先把概念拆干净:树莓派和 Arduino 到底是什么
2.1 树莓派不是一块板,而是一个家族
很多人说“树莓派”的时候,脑子里想的其实是Raspberry Pi 4B 或者 5,那块信用卡大小、带 HDMI、USB、网口、能装桌面系统的板子。但这只是树莓派家族里的“旗舰款”。实际上,树莓派官方在售的产品线至少包括这几类:
- 旗舰级 Linux 板:Pi 4B、Pi 5、CM4、CM5。这些跑的是完整 Linux 发行版(Raspberry Pi OS),有 GPU、有内存管理单元、能跑 Docker、能开服务器。
- 微控制器级板:Pico、Pico W、Pico 2。这些用的是 RP2040 或 RP2350,不跑 Linux,跑的是裸机固件或 MicroPython。
- 计算模块:CM 系列,本质上是把旗舰板做成工业级插槽形态,还是跑 Linux。
所以当你听到“树莓派”三个字,第一件事是问:是 Pi 还是 Pico?这两个东西的定位差异,比“树莓派和 Arduino”之间的差异还要大。
2.2 Arduino 也不是一块板,而是一套开发框架
Arduino 这个词有两层含义。一层是硬件:UNO、Nano、Mega、Leonardo、Due、Zero、MKR 系列、Portenta、Nicla。另一层是软件框架:Arduino IDE、Arduino CLI、以及那套setup()/loop()的编程模型。
关键点在于:Arduino 框架可以跑在很多非 Arduino 官方的板子上。比如 ESP32、ESP8266、STM32 的很多开发板,都可以通过 Arduino Core 来用 Arduino 的 API 编程。反过来,Arduino 官方的某些板子(比如 Portenta H7)也可以跑 MicroPython 或者 Mbed OS,不一定非要用 Arduino 框架。
所以“Arduino”更像是一个开发体验的代名词:简单、直接、库多、上手快。它不等于“裸机”,也不等于“8 位单片机”。UNO R4 是 32 位 Cortex-M4,Portenta H7 是双核 Cortex-M7 + M4,性能比早期的树莓派 1 代还要强。
2.3 “跑系统”和“跑裸机”的界限已经模糊
传统上,我们把嵌入式系统分成两类:
- 裸机(Bare Metal):没有操作系统,程序直接跑在硬件上,一个主循环加中断。
- RTOS(实时操作系统):有任务调度、信号量、消息队列,但仍然是实时系统,不是通用操作系统。
- 通用操作系统(Linux):有进程管理、虚拟内存、文件系统、网络协议栈,但不保证硬实时。
现在的局面是:
- Arduino UNO R4 可以跑 FreeRTOS,算 RTOS 级别。
- 树莓派 Pico 可以跑 FreeRTOS 或者裸机,算裸机/RTOS 级别。
- 树莓派 Pi 5 跑 Linux,算通用操作系统级别。
- ESP32 可以跑 FreeRTOS,也可以跑 MicroPython,还可以跑轻量级 Linux(虽然不实用)。
所以“跑系统 vs 跑裸机”这个二分法,至少应该扩展成三档:裸机/RTOS、MicroPython/解释器、完整 Linux。选型的时候,你真正要问的是:我的项目需要哪一档的运行时环境?
3. 选型的五个核心维度
3.1 实时性:谁能在微秒级响应
实时性是我在选型时第一个考虑的因素。什么叫实时?不是“快”,而是“可预测”。你要求一个信号来了之后,在 10 微秒内必须做出响应,晚一点都不行,这叫硬实时。
Linux 不是硬实时系统。哪怕你打了 RT 补丁,调度延迟也在几十微秒到几百微秒之间波动。因为 Linux 要处理中断、内存管理、文件系统、网络协议栈,这些都会引入不可预测的延迟。你用树莓派 Pi 5 去控一个需要精确脉冲的步进电机,可能会发现偶尔丢步,原因就是 Linux 的调度抖动。
Arduino UNO R4 跑裸机或者 FreeRTOS,中断响应可以做到微秒级,而且是确定性的。你写一个外部中断服务函数,从引脚电平变化到代码执行,延迟基本是固定的。树莓派 Pico 的 RP2040 也有同样的特性,它的中断控制器和 PIO 模块可以做到非常精确的时序控制。
所以如果你的项目涉及精确脉冲生成、高速编码器读取、无刷电机换相、超声波测距这类对时序敏感的任务,裸机或 RTOS 平台是更稳妥的选择。Linux 板子适合做上层决策、图像处理、网络通信,但不适合直接干“硬活”。
3.2 计算能力:谁跑得动复杂算法
反过来,如果你要做图像识别、语音处理、神经网络推理、视频编码,那裸机平台就吃力了。Arduino UNO R4 的 48MHz Cortex-M4 没有 FPU 加速的神经网络库,跑个简单的分类模型都费劲。树莓派 Pi 5 的 Cortex-A76 四核 2.4GHz,加上 VideoCore VII GPU,可以实时跑 MobileNet 或者 YOLO 的轻量版本。
这里有个常见的误区:很多人觉得“我可以用 Arduino 采集数据,传给树莓派处理”。这个架构是对的,但你要考虑通信带宽和延迟。如果你用 I2C 连接,速率通常只有 100kHz 到 400kHz,传一张 320x240 的灰度图要几十毫秒。如果你用 SPI,可以到几 MHz 到几十 MHz,但仍然不如在本地处理来得快。所以如果数据量大,最好让 Linux 板子直接接摄像头(CSI 接口或者 USB),在本地做处理。
3.3 开发效率:谁让你更快出原型
Arduino 的强项是开发效率。你装好 IDE,选好板子,写几行代码就能点灯。库管理器的生态非常成熟,你想驱动一个 OLED 屏、一个温湿度传感器、一个舵机,基本都能找到现成的库,#include一下就能用。对于初学者或者需要快速验证想法的人来说,这个优势是巨大的。
树莓派 Pi 跑 Linux,开发效率取决于你的 Linux 熟练度。如果你熟悉 Python,那RPi.GPIO或者gpiozero库也能让你快速控制引脚。但如果你要处理系统配置、依赖安装、权限管理,就会比 Arduino 麻烦一些。而且 Linux 的启动时间通常是几十秒,Arduino 是上电即跑,这在某些场景下差异很大。
树莓派 Pico 则介于两者之间。你可以用 MicroPython 快速写代码,也可以用 C SDK 做底层优化。Pico 的 MicroPython 体验比 Pi 上的 Python 更接近硬件,因为没有操作系统层,machine模块直接操作寄存器。
3.4 功耗与成本:谁更适合量产
如果你做的是电池供电的便携设备,功耗是硬指标。Arduino UNO R4 在运行时的功耗大约是几十毫安,休眠可以做到微安级。树莓派 Pi 5 的功耗是几瓦级别,待机也要几百毫安,根本不适合电池长期供电。树莓派 Pico 的功耗在几十毫安级别,休眠可以做到微安级,和 Arduino 相当。
成本方面,Arduino UNO R4 官方价大约二十多美元,兼容板可以做到几美元。树莓派 Pi 5 起步价六十美元左右,加上电源、SD 卡、散热片,整套下来要上百美元。树莓派 Pico 只要几美元,和 Arduino Nano 差不多。
所以如果你要做量产产品,需要仔细算 BOM 成本。Linux 板子的硬件成本高,但软件成本可能低(因为可以用 Python 快速开发)。裸机板子的硬件成本低,但软件开发周期可能更长。这个权衡没有标准答案,取决于你的产量和团队能力。
3.5 生态与社区:谁让你少踩坑
Arduino 的社区是嵌入式领域最大的之一。你遇到问题,搜一下基本都能找到答案。库的更新频率也高,很多传感器厂商会官方提供 Arduino 库。树莓派的社区同样庞大,但更偏向 Linux 和 Python 方向。如果你做的是网络服务、媒体中心、家庭自动化,树莓派的教程更多。如果你做的是传感器驱动、电机控制、低层通信,Arduino 的教程更多。
这里有个经验:看你的问题属于哪个层面。如果是“怎么让这个传感器出数”,Arduino 社区更可能有好答案。如果是“怎么把这个数据传到云平台”,树莓派社区更可能有好答案。
4. 典型场景下的选型对照
4.1 场景一:温湿度采集与上报
这个场景很简单:读一个 DHT22 或者 SHT30 传感器,通过 Wi-Fi 上报到服务器。你可以用 ESP32 跑 Arduino 框架,也可以用树莓派 Pico W 跑 MicroPython,还可以用树莓派 Pi Zero 2 W 跑 Linux。
我的建议是:如果只是采集和上报,用 ESP32 或者 Pico W 就够了。它们功耗低、成本低、启动快,而且 Arduino 框架下有成熟的 Wi-Fi 和 MQTT 库。树莓派 Pi Zero 2 W 虽然也能做,但启动慢、功耗高,有点杀鸡用牛刀。
但如果你需要本地存储历史数据、跑一个 Web 界面、做数据可视化,那树莓派 Pi 就更合适。你可以在上面跑 InfluxDB + Grafana,直接出一个仪表盘。ESP32 做这个就非常吃力。
4.2 场景二:摄像头图像处理
如果你要做人脸识别、物体检测、二维码扫描,树莓派 Pi 是首选。它有 CSI 摄像头接口,可以接官方摄像头模块,Python 下有 OpenCV、Picamera2 等成熟库。Pi 5 的性能足够跑轻量级神经网络。
Arduino 这边,Portenta H7 加上 Vision Shield 可以做简单的图像处理,但性能和生态都不如树莓派。ESP32-CAM 可以拍照和传图,但做复杂处理不现实。
所以这个场景的结论很明确:Linux 板子胜出。但你要注意散热和电源,Pi 5 跑图像处理时功耗不低,需要好的散热方案。
4.3 场景三:多路电机控制
如果你要控制四轴飞行器、机械臂、多路步进电机,实时性是关键。Linux 板子的调度抖动会导致电机抖动或者丢步。这时候应该用树莓派 Pico 或者 Arduino 跑 RTOS,或者用专门的电机驱动板。
一个常见的架构是:Linux 板子做上层规划,单片机做底层执行。比如树莓派 Pi 计算路径,通过串口发给 Pico,Pico 负责生成精确的脉冲序列。这样既利用了 Linux 的计算能力,又保证了实时性。
4.4 场景四:低功耗电池设备
如果你要做无线传感器节点、可穿戴设备、遥控器,功耗是第一优先级。Arduino 的休眠模式可以做到微安级,配合定时器唤醒,一节纽扣电池能用几个月。树莓派 Pico 也有类似的低功耗模式。Linux 板子基本不考虑这个场景。
这里有个细节:ESP32 的深度睡眠模式可以做到几十微安,而且唤醒后能快速连接 Wi-Fi。如果你需要无线通信加低功耗,ESP32 是很好的选择。
4.5 场景五:网络服务器与家庭自动化
如果你要跑Home Assistant、MQTT Broker、NAS、Web 服务器,树莓派 Pi 是标准答案。Linux 生态下有 Docker、有各种服务端软件,配置起来很方便。Arduino 做这个不现实。
但如果你只是要控制几个继电器、读几个开关,然后接入 Home Assistant,那用 ESP32 跑 ESPHome 更简单。ESPHome 的配置是 YAML 格式,不需要写代码,而且功耗低、成本低。
5. 实操:如何快速判断该选哪块板子
5.1 问自己五个问题
我在选型的时候,会按顺序问自己五个问题:
- 需要硬实时吗?如果需要微秒级确定性响应,选裸机或 RTOS 平台(Arduino、Pico、ESP32)。
- 需要跑复杂算法吗?如果需要图像处理、神经网络、大数据分析,选 Linux 平台(树莓派 Pi)。
- 需要低功耗吗?如果是电池供电,选单片机平台,避开 Linux。
- 需要网络服务吗?如果要跑服务器、数据库、Web 界面,选 Linux 平台。
- 开发周期有多紧?如果时间紧、团队熟悉 Python,选树莓派;如果熟悉 C/C++,选 Arduino。
这五个问题问完,基本就能锁定平台类型。然后再根据具体需求选型号。
5.2 一个实用的决策表
| 需求维度 | 裸机/RTOS(Arduino、Pico) | MicroPython(Pico、ESP32) | Linux(树莓派 Pi) |
|---|---|---|---|
| 实时性 | 微秒级,确定性 | 毫秒级,有抖动 | 几十毫秒,不可预测 |
| 计算能力 | 低到中 | 中 | 高 |
| 功耗 | 微安到毫安 | 毫安到几十毫安 | 几百毫安到几瓦 |
| 启动时间 | 毫秒级 | 毫秒到秒级 | 几十秒 |
| 开发效率 | 中(C/C++) | 高(Python) | 高(Python/Linux) |
| 成本 | 低 | 低到中 | 中到高 |
| 网络能力 | 需外接模块 | 内置 Wi-Fi(部分) | 内置以太网/Wi-Fi |
| 适合场景 | 电机控制、传感器 | 快速原型、IoT | 图像处理、服务器 |
这个表不是绝对的,但可以帮你快速定位。
5.3 混合架构:成年人不做选择
很多时候,最好的方案是混合架构:一块 Linux 板子做上层,一块单片机做底层。比如:
- 树莓派 Pi 5 跑 OpenCV 做目标检测,通过串口把坐标发给 Pico。
- Pico 控制云台舵机,追踪目标。
- Pi 5 同时跑 Web 服务器,把视频流推给浏览器。
这种架构的优点是各取所长:Linux 负责计算和网络,单片机负责实时控制。缺点是增加了通信协议的设计和调试成本。你需要定义好串口协议,处理好错误重传和超时。
我在做这类项目时,通常会先用USB 串口做原型,因为插上就能用,不需要额外接线。等协议稳定了,再改成 UART 或者 SPI,降低成本。
6. 常见问题与避坑指南
6.1 树莓派 Pi 的 GPIO 到底能不能做实时控制
能,但有限制。树莓派 Pi 的 GPIO 是通过 Linux 的 sysfs 或者gpiod接口控制的,延迟在几十微秒到几百微秒之间。如果你只是点灯、读按钮,完全够用。但如果你要生成 1MHz 的方波,或者读取 100kHz 的编码器信号,就不行了。
解决办法是用PIO、PWM 外设或者外部单片机。树莓派 Pi 有硬件 PWM 和 SPI,可以生成精确波形。但如果你需要多个通道的复杂时序,还是交给 Pico 或者 Arduino 更省心。
6.2 Arduino UNO R4 的 FreeRTOS 怎么用
UNO R4 的 FreeRTOS 支持是通过 Arduino 的Arduino_FreeRTOS库或者官方的FreeRTOS库实现的。你可以在 Arduino IDE 的库管理器里搜索安装。基本用法是:
#include <Arduino_FreeRTOS.h> void TaskBlink(void *pvParameters) { pinMode(LED_BUILTIN, OUTPUT); while (1) { digitalWrite(LED_BUILTIN, HIGH); vTaskDelay(500 / portTICK_PERIOD_MS); digitalWrite(LED_BUILTIN, LOW); vTaskDelay(500 / portTICK_PERIOD_MS); } } void setup() { xTaskCreate(TaskBlink, "Blink", 128, NULL, 1, NULL); } void loop() { // 空循环,任务由调度器管理 }注意:UNO R4 的内存有限,任务栈不要开太大。每个任务 128 到 256 字通常够用。另外,FreeRTOS 的vTaskDelay是阻塞式的,不会浪费 CPU 时间。
6.3 树莓派 Pico 的 PIO 是什么,什么时候用
PIO 是 RP2040 独有的可编程 I/O 模块。你可以把它理解成一个小型的协处理器,专门用来处理引脚上的时序逻辑。比如你要驱动 WS2812 灯带,通常需要精确的 800kHz 信号,用 CPU 做会占用大量时间。用 PIO 的话,你写一段简单的汇编程序,PIO 就能自动生成波形,CPU 完全不用管。
PIO 的学习曲线比普通 GPIO 陡一些,但一旦掌握,能解决很多传统单片机做不到的事情。比如你可以用 PIO 模拟多个 UART、多个 SPI、甚至 VGA 输出。
6.4 选型时最容易犯的三个错误
第一个错误是过度设计。很多人一上来就选树莓派 Pi 5,结果发现只是点个灯,浪费了性能和功耗。我的建议是:从最简单的方案开始,如果不够用再升级。
第二个错误是忽视功耗。用树莓派 Pi 做电池设备,结果发现一天要充三次电。选型时一定要算功耗预算,电池容量除以平均电流,得出续航时间。
第三个错误是低估开发时间。Linux 平台的配置和调试时间往往比预期长。如果你不熟悉 Linux,可能会在驱动、权限、依赖上花很多时间。Arduino 虽然简单,但复杂项目的代码组织也需要经验。
6.5 常见问题速查表
| 问题 | 可能原因 | 解决办法 |
|---|---|---|
| 树莓派 Pi 控制电机抖动 | Linux 调度延迟 | 改用 Pico 或 Arduino 做底层控制 |
| Arduino 内存不足 | 全局变量太多 | 用F()宏存字符串到 Flash,减少动态分配 |
| Pico MicroPython 跑得慢 | 解释器开销 | 改用 C SDK 或者用@micropython.native装饰器 |
| ESP32 Wi-Fi 断连 | 电源不稳 | 加 100uF 电容,用稳定的 3.3V 电源 |
| 树莓派 Pi 启动慢 | 系统服务太多 | 用raspi-config关闭不需要的服务,或者用 Lite 系统 |
| Arduino 库冲突 | 多个库用了同一个定时器 | 检查库文档,换用不冲突的库或者手动配置定时器 |
7. 我个人的选型心得
做了这么多项目,我现在选板子的逻辑已经很简单了:先看实时性,再看计算量,最后看功耗和成本。
如果项目需要精确时序控制,我直接上 Pico 或者 ESP32,不犹豫。如果项目需要图像处理或者网络服务,我直接上树莓派 Pi。如果两者都需要,我就做混合架构,用串口把两边连起来。
还有一个经验:不要迷信“一块板子搞定所有事”。很多人想用树莓派 Pi 同时做实时控制和图像处理,结果发现两边都做不好。分开用两块板子,成本增加不多,但稳定性和开发效率提升很大。
最后说一个细节:买板子的时候多买一块备用。尤其是做项目做到关键阶段,板子烧了或者引脚坏了,有备用板能省很多时间。我一般会至少备两块同型号的板子,一块做开发,一块做测试。
这个领域变化很快,新的板子和框架不断出现。保持开放的心态,多尝试不同的平台,你会发现每个平台都有它独特的价值。