Arduino Uno 是一块没有操作系统的电脑板——它和树莓派最大的区别不是"谁更强",而是分工不同:树莓派是"能同时干很多事的小电脑",Arduino 是"只专心干一件事、但干得又快又稳的执行者"。
上一章(第七章)结尾留了个遗憾:树莓派没有 ADC,想读个连续电压还得外接芯片。本节请来的这位伙伴,天生带 6 路 ADC、6 路 PWM。 而且早在 1-1 就埋过一个三方对照(树莓派 / Arduino / Pico),判据是【有没有操作系统】——本节把这个判据展开讲透。 这一章的结构是这样一条线:8-1 认板子 → 8-2 在树莓派上装开发环境 → 8-3 用 IDE 写第一个程序 → 8-4 让 Python 也能指挥它 → 8-5 讲透两者之间的"通话线路"。 也就是说:本章最重要的不是学会 Arduino,而是学会"两块板子怎么配合"。
一、Arduino 是什么:一个酒吧的名字,最后变成了一块板子的名字
Arduino 是"三样东西"的合称,不是单指那块蓝板子:
- 一块开源硬件(那块蓝色小板)
- 一套开发环境(Arduino IDE,写代码、编译、上传一条龙)
- 一个巨大的社区与库(几万个现成的库、几乎所有传感器都有现成代码)
它的来历:2005 年,意大利伊夫雷亚(Ivrea)的一所设计学院里,几位老师想让学生不用学电子工程也能做出会动的作品。他们做了一块便宜、简单、插上就能用的板子。
名字的来历:当地有家酒吧叫 Bar di Re Arduino(纪念一千年前那位意大利国王 Arduino d'Ivrea),几位创始人常在那儿碰头,就把项目叫了这个名字。
Arduino 的电路图、板子设计文件都是公开的。所以全世界有很多厂商做"兼容板",价格只要原厂的几分之一。
好处:便宜、坏了自己换。
代价:兼容板的 USB 转串口芯片常换成 CH340,在电脑上看到的名字会和原厂板不一样(原厂是 /dev/ttyACM0,CH340 板是 /dev/ttyUSB0)——这件事 8-5 会正式用到,先记住有这回事。
二、它和树莓派到底差在哪:一句话分水岭
判据只有一条:有没有操作系统。
| 🍓 树莓派 | 🔵 Arduino Uno | |
|---|---|---|
| 有没有操作系统 | 有(一整套 Linux) | 没有 |
| 通电后发生什么 | 先花 20~40 秒启动 Linux,再登录 | 两秒内就开始跑你写的那段代码 |
| 能同时干几件事 | 很多(浏览器、SSH、服务器一起跑) | 严格一件:跑你写的 loop() |
| 关机 | 必须走关机流程(否则伤卡) | 直接拔电,它不会坏 |
| 中间挂掉会怎样 | 可能整台机器要重启 | 只是这一段代码停了 |
| "代码"写在哪 | SD 卡(硬盘) | 芯片里的 Flash(断电不丢) |
| 运行时的记忆体 | GB 级内存 | 只有 2KB |
| 逻辑电平 | 3.3V | 5V |
| 有没有 ADC(读模拟电压) | 没有(第七章讲过) | 有,6 路 10 位 |
| 时间精度 | 毫秒级(还在抖) | 微秒级 |
这张表很重要,它解释了一个反复出现的疑问:树莓派明明强那么多,为什么还要 Arduino?
因为它们擅长的根本不是同一件事。
2.1 setup() 与 loop() 就是"没有操作系统"的直接证据
每一个 Arduino 程序(叫 sketch,直译"草图")都长这样:
void setup() {
// 这里的东西,通电后只跑一次
}
void loop() {
// 这里的东西,一遍跑完,立刻从头再来
}
看明白了吗——
- 树莓派上你写程序,是在操作系统里插一个任务,系统会分时间片给你;
- Arduino 上你写程序,你的
loop()就是这台机器唯一的秩序。没有别的程序跟你抢,没有调度器打断你。
树莓派上,程序活在系统里;Arduino 上,程序就是系统。
2.2 那 Arduino 凭什么还没被淘汰:四条理由
① 实时性,而且是"能保证"的实时性
树莓派跑着 Linux,要不断在几百个任务之间切换。所以你写"等 1 毫秒再做下一件事",实际可能是 1.08 毫秒、1.3 毫秒——而且你不确定是多久。
Arduino 只有一个任务,delayMicroseconds(100) 就是接近准的 100 微秒。
要控制步进电机、要生成精确的方波、要在 5 微秒内响应一个信号——只能靠它。
② 5V 电平,直接和大量器件说话
树莓派是 3.3V,很多老传感器、老模块、老舵机都按 5V 设计,接树莓派要么不稳、要么要加转换。
③ 它有 ADC——正是第七章缺的那样
6 路 10 位 ADC(A0~A5),接个电位器、光敏电阻、热敏电阻,直接就能读。第七章为了读一个模拟电压,得去买一颗 MCP3008 外接芯片。这块板子天生就有。
④ 便宜、耐造、坏了不心疼
几十块钱一块。接错线烧了,重买一块继续。而树莓派烧了,那是几百块的整台电脑。
三、这块蓝色板子上有什么
3.1 核心:一颗 ATmega328P
| 项目 | 数值 | 什么概念 |
|---|---|---|
| 芯片 | ATmega328P | 8 位 AVR 架构,2010 年代的经典 |
| 主频 | 16 MHz | 树莓派 5 是 2.4 GHz |
| 程序空间(Flash) | 32 KB | 你的代码+库都塞这里面 |
| 运行时内存(SRAM) | 2 KB | ⚠️ 树莓派是 4 GB |
| 断电不丢的小仓库(EEPROM) | 1 KB | 存点设置值 |
树莓派的内存是 4 GB = 大约 400 万 KB。Arduino 是 2 KB。 所以——Uno 上跑不了 Python。 一个 Python 解释器本身就要几百 KB,塞不进去。 这件事 8-4 会正式讲(想用 Python 直接跑在板子上,得换 Nano ESP32/Nano RP2040 那类板子)。 现在只要记住:Uno 上的语言是 C++ 的一个简化版。
3.2 引脚地图:分三类看
第一类:数字脚,0 ~ 13
- 每个脚只有两种状态:高(5V)/低(0V)
- ⚠️ 0 号和 1 号脚是串口收发口,不要接别的东西——8-5 要拿它跟树莓派通话,接了别的会打架
- 13 号脚上接了板载那颗小 LED(旁边丝印写着 L)——所有教程第一个例子都是点它,因为不用接线
- 数字脚里带
~符号的(3、5、6、9、10、11)支持 PWM,也就是第七章学的"用极快开关模拟半亮"
第二类:模拟脚,A0 ~ A5
- 用来读连续变化的电压(0~5V),返回 0~1023(10 位)
- 这些脚也能当普通数字脚用(当数字脚时编号是 14~19)
第三类:电源脚
5V:输出稳定 5V(板子由 USB 供电时,这就是 USB 的 5V)3.3V:⚠️ 输出能力很弱(约 50mA),只能给传感器供电,别拿它带电机GND:地,所有电路的公共参考点Vin:外部电源输入(7~12V)RESET:复位
3.3 三种供电方式
- USB 线(最常用,也是本节到 8-5 都在用的方式)
- 圆孔电源(7~12V 的适配器,插那个黑色圆口)
Vin脚接外部电源
能,而且这是本章的标准接法:拿一根 USB 线,从树莓派的 USB 口接到 Arduino 上。 一块 Uno 大约耗 50mA 左右,对树莓派的 USB 口来说完全没问题。 ⚠️ 但如果 Arduino 上还接了舵机、电机、灯带这类吃电大户,就不能再从树莓派偷电了——那些要单独供电,地和树莓派连在一起即可。
四、型号:Uno R3 与后来的新产品线
Uno 是意大利语里"一"的意思——第一款正式版,也是最长寿的一款。
| Uno R3(2011 起) | Uno R4 Minima(2023 起) | Uno R4 WiFi | |
|---|---|---|---|
| 主芯片 | ATmega328P | 瑞萨 RA4M1(32 位 ARM Cortex-M4) | 同上 + 板载 ESP32-S3 |
| 主频 | 16 MHz | 48 MHz | 48 MHz |
| 程序空间 | 32 KB | 256 KB | 256 KB |
| 内存 | 2 KB | 32 KB | 32 KB |
| USB 口 | Type-B(大方口) | Type-C | Type-C |
| 无线 | 无 | 无 | Wi-Fi + 蓝牙 |
| 板载小屏 | 无 | 无 | 12×8 LED 矩阵 |
| 逻辑电平 | 5V | 5V | 5V |
2026 年买哪块? 如果你是跟着教程学:买 R3(或兼容的 R3)。
理由很实在:网上 2011 年以来的几乎所有教程、视频、书本,都默认你手上是 R3——引脚图、库、例子全按它写。R4 虽然强得多,但少数老库在它上面会编译不过(尤其是那些直接操作 AVR 计时器的老库)。
什么时候该上 R4:需要更强的算力(浮点运算、音频)、需要 Wi-Fi 直连、需要 USB 原生 HID(做个键盘/手柄)。
便宜的兼容板(克隆板)通常把 USB 转串口芯片换成 CH340。
后果:在树莓派上看到的设备名不一样——
- 原厂 Uno:/dev/ttyACM0
- CH340 兼容板:/dev/ttyUSB0
这不是故障,只是名字不同。 8-5 会教你如何自己确认(拔插一次看多了谁)。 另外:有些 USB 线只有供电、不传数据(充电线),插上之后电脑/树莓派完全看不到设备。这也是新手最常怀疑"板子坏了"的原因之一。
五、动手 Demo:不通电,先把板子认一遍
本节不动电、不接线、不写代码——先用眼睛和手把这块板子认清楚。这是最便宜的一课:认错引脚要付出的代价远高于认清楚。
第 1 步 · 找三样标记
把板子拿在手里,找这三处:
| 找什么 | 在哪 | 长什么样 |
|---|---|---|
UNO 字样 |
板子正面上方 | 大写的 "UNO",旁边可能有 ARDUINO |
| USB 口 | 板子上方一侧 | R3 是大方口(Type-B);R4 是 Type-C |
| 板载 LED | 13 号脚旁边 | 一颗很小的贴片 LED,旁边丝印 L |
第 2 步 · 数引脚
板子两侧有黑色塑料排针(一排小孔/小针)。数一数:
上方(靠 USB 那头):10 个孔 ← 数字脚那一片
下方:8 个孔
右侧(靠电源口那头):8 个孔 ← 模拟脚 + 电源脚
左侧靠近 USB 还有一排 6 个针(ICSP),那是给专用烧录器用的,新手不要动。
第 3 步 · 看丝印(每个脚旁边都写着名字)
- 数字脚区域能看到
0 1 2 3 ... 13,其中3 5 6 9 10 11旁边有~符号 - 模拟脚区域能看到
A0 A1 A2 A3 A4 A5 - 电源区域能看到
5V 3V3 GND Vin GND有好几个,它们全通着,接哪个都行
第 4 步 · 接上树莓派,看灯
这一步开始动电了,但只插一根 USB 线,零风险。
- 树莓派先开着机(不需要关机,USB 是支持热插拔的)
- 拿那根 USB 线,一头插 Arduino,一头插树莓派的 USB 口
- 看 Arduino 板上:电源指示灯(
ON,通常是绿的)应该亮起 - 板载的那颗
L灯:新板子出厂自带 Blink 程序,它应该在一秒一闪地眨
看到什么算成功:
树莓派端(先别急着敲,8-5 才用到,这里只是确认"认到了")
$ ls /dev/ttyACM* /dev/ttyUSB*
/dev/ttyACM0 ← 出现这个,说明板子被认到了
读结果:
| 现象 | 说明什么 |
|---|---|
ON 灯亮 |
供电正常 ✅ |
L 灯一秒一闪 |
板子出厂程序还在,芯片是好的 ✅ |
ls /dev/ttyACM* 出现设备 |
树莓派认到了它 ✅ |
ON 灯不亮 |
USB 线可能是充电线(不传数据),或插了坏口 |
L 灯常亮不闪 |
不是故障——说明有人已经往里面传过程序了(传过程序就覆盖出厂 Blink) |
刚才 ls 看到的名字(ttyACM0 还是 ttyUSB0),请记在便签上。8-3 上传程序、8-4 用 Python 指挥它、8-5 建串口通信,都要填这个端口名。
名字是会变的(换 USB 口、同时插两块板),所以"先 ls 确认"这个动作要养成习惯。
六、30 秒实验:亲手量一量"Linux 的 1 毫秒有多不靠谱"
这个实验不用 Arduino,只要树莓派。它的目的是让你亲眼看见"为什么需要单片机"。
在树莓派上跑:
import time
t0 = time.perf_counter()
for _ in range(1000):
time.sleep(0.001) # 说好睡 1 毫秒
used = time.perf_counter() - t0
print(f"说好一共 1.000 秒,实际用了 {used:.3f} 秒")
print(f"平均每次偏差 {(used - 1.0) * 1000 / 1000:.3f} 毫秒")
你会看到类似:
说好一共 1.000 秒,实际用了 1.06 秒
平均每次偏差 0.06 毫秒
读结果:
- 树莓派做不到"精确睡 1 毫秒"——它每次都睡多了。因为 Linux 要不断在几百个任务之间切换调度,你的程序永远排在别人后面。
- 每次多 60 微秒看着不多,但如果这是控制舵机(要求脉冲宽度精确到微秒),累积误差足以让舵机抖个不停。
- Arduino 上没有这个问题:它只有一个任务,
delayMicroseconds(100)就是接近准的 100 微秒。
连跑五遍这个脚本,你会看到 1.03、1.06、1.09……每次都不一样。 这种"大概差不多"在控制现实世界时,有时候是可以接受的,有时候是要命的。 记住这个感觉——这就是本节最想让你理解的一件事,也是整章"为什么要两块板子配合"的根本原因。
七、常见误区
-
"Arduino 是树莓派的廉价替代品" —— 不是替代关系,是分工关系。树莓派负责"想"(联网、算、存、显示),Arduino 负责"马上动手"(精确、实时、扛得住)。本章后面几节就是在教这两者怎么搭伙干活。
-
"Arduino 上也能跑 Python" —— Uno 系列跑不了(只有 2KB 内存,装不下解释器)。想在 Arduino 板子上跑 Python,得换 Nano ESP32/Nano RP2040 Connect 那一类。这一点 8-4 会细讲。
-
"树莓派的 GPIO 和 Arduino 的引脚可以随便互接" —— ⚠️ 电平不同:Arduino 是 5V,树莓派是 3.3V。把 Arduino 的 5V 输出直接接到树莓派引脚,可能烧掉树莓派。8-5 讲串口接线时会专门处理这件事。
-
"Arduino 也能插显示器键盘当电脑用" —— 不能。它没有系统、没有显卡、没有 USB 主机功能(那个 USB 口是给自己被人上传程序用的,不是插外设的)。
-
"插上电脑就能看到
/dev/ttyACM0" —— 不一定。兼容板常见/dev/ttyUSB0;线不对连设备都不出现。先ls对比拔插前后,是最靠谱的一步。 -
"USB 线随便拿一根就行" —— 有些线只供电不传数据(通常是充电线)。症状是:板子
ON灯亮着,但电脑完全看不到设备。换一根线就好了——这个坑在新手身上出现的频率高得惊人。 -
"32KB 程序空间太少了,肯定不够用" —— 写"点亮灯、读传感器、控电机"这类代码,32KB 完全够用(经典的 Blink 编译完只有 900 多字节)。真正吃空间的是图形界面、网络协议栈、浮点数学库——而那些本来就是树莓派该干的活。
自测三问(点开对答案)
1. 树莓派和 Arduino 最根本的区别是哪一条?这一条又带来了哪些直接后果? **参考答案**:**有没有操作系统**。带来的直接后果:① 通电后 Arduino 立刻开始跑你的代码,树莓派要等几十秒启动;② 树莓派能同时干很多事,Arduino 严格只干一件(`loop()` 就是它的全部秩序);③ 树莓派要正常关机,Arduino 直接拔电;④ 树莓派的时间不准(被调度打断),Arduino 是微秒级准的;⑤ 树莓派要 SD 卡装系统,Arduino 的代码在芯片 Flash 里、断电不丢。 2. Arduino Uno 的内存有多大?这个数字排除了哪种用法? **参考答案**:**2KB**(树莓派是 4GB 级别,差约 400 万倍)。它排除了"在 Uno 上跑 Python"这种用法——**解释器本身就装不下**。所以 Uno 的程序语言是 C++ 的简化版;想在 Arduino 板子上跑 Python,要选 Nano ESP32/Nano RP2040 那类。 3. 为什么树莓派这么强,还需要 Arduino?至少说出两条理由。 **参考答案**:① **实时性**——树莓派被 Linux 调度打断,时间不确定(第四节实验实测每次 sleep 都多 60 微秒左右,而且每次不同);单片机只有一个任务,微秒级可控。② **有 ADC**——树莓派没有,读连续电压得外接芯片;Arduino 天生 6 路。另外还有:5V 电平能直接和大量老器件对话;便宜耐造,烧了不心疼。- ☐ 下一节(8-2 在树莓派建立 Arduino 开发环境)
相关笔记
- 认识树莓派的 GPIO 引脚 —— 上一章起点:对照读,看两块板子的引脚设计思路差在哪
- 模拟输入 —— 本节最直接的呼应:那里为了读模拟电压要外接 MCP3008,而 Arduino 天生带 6 路 ADC
- 认识树莓派 —— 三方对照的出处(树莓派/Arduino/Pico),判据就是【有没有操作系统】
- 树莓派的硬件规格 —— 树莓派那边的规格表,对照本节的 Arduino 规格表看
- 🍓 树莓派 · 索引 —— 全课路线图