🍓 第八章 当树莓派遇到 Arduino 开发板
📄 一句话概括

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 是"三样东西"的合称,不是单指那块蓝板子:

  1. 一块开源硬件(那块蓝色小板)
  2. 一套开发环境(Arduino IDE,写代码、编译、上传一条龙)
  3. 一个巨大的社区与库(几万个现成的库、几乎所有传感器都有现成代码)

它的来历: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 上,程序就是系统。

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 存点设置值
⚠️ 2KB 这个数字,请一定记住

树莓派的内存是 4 GB = 大约 400 万 KB。Arduino 是 2 KB。 所以——Uno 上跑不了 Python。 一个 Python 解释器本身就要几百 KB,塞不进去。 这件事 8-4 会正式讲(想用 Python 直接跑在板子上,得换 Nano ESP32/Nano RP2040 那类板子)。 现在只要记住:Uno 上的语言是 C++ 的一个简化版。

3.2 引脚地图:分三类看

第一类:数字脚,0 ~ 13

第二类:模拟脚,A0 ~ A5

第三类:电源脚

3.3 三种供电方式

  1. USB 线(最常用,也是本节到 8-5 都在用的方式)
  2. 圆孔电源(7~12V 的适配器,插那个黑色圆口)
  3. Vin 脚接外部电源
💡 树莓派能给 Arduino 供电吗

能,而且这是本章的标准接法:拿一根 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 步 · 看丝印(每个脚旁边都写着名字)

第 4 步 · 接上树莓派,看灯

这一步开始动电了,但只插一根 USB 线,零风险。

  1. 树莓派先开着机(不需要关机,USB 是支持热插拔的)
  2. 拿那根 USB 线,一头插 Arduino,一头插树莓派的 USB 口
  3. 看 Arduino 板上:电源指示灯(ON,通常是绿的)应该亮起
  4. 板载的那颗 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.03、1.06、1.09……每次都不一样。 这种"大概差不多"在控制现实世界时,有时候是可以接受的,有时候是要命的。 记住这个感觉——这就是本节最想让你理解的一件事,也是整章"为什么要两块板子配合"的根本原因。

七、常见误区

  1. "Arduino 是树莓派的廉价替代品" —— 不是替代关系,是分工关系。树莓派负责"想"(联网、算、存、显示),Arduino 负责"马上动手"(精确、实时、扛得住)。本章后面几节就是在教这两者怎么搭伙干活。

  2. "Arduino 上也能跑 Python" —— Uno 系列跑不了(只有 2KB 内存,装不下解释器)。想在 Arduino 板子上跑 Python,得换 Nano ESP32/Nano RP2040 Connect 那一类。这一点 8-4 会细讲。

  3. "树莓派的 GPIO 和 Arduino 的引脚可以随便互接" —— ⚠️ 电平不同:Arduino 是 5V,树莓派是 3.3V。把 Arduino 的 5V 输出直接接到树莓派引脚,可能烧掉树莓派。8-5 讲串口接线时会专门处理这件事。

  4. "Arduino 也能插显示器键盘当电脑用" —— 不能。它没有系统、没有显卡、没有 USB 主机功能(那个 USB 口是给自己被人上传程序用的,不是插外设的)。

  5. "插上电脑就能看到 /dev/ttyACM0" —— 不一定。兼容板常见 /dev/ttyUSB0;线不对连设备都不出现。先 ls 对比拔插前后,是最靠谱的一步。

  6. "USB 线随便拿一根就行" —— 有些线只供电不传数据(通常是充电线)。症状是:板子 ON 灯亮着,但电脑完全看不到设备。换一根线就好了——这个坑在新手身上出现的频率高得惊人。

  7. "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 电平能直接和大量老器件对话;便宜耐造,烧了不心疼。

相关笔记