元器件 · 控制器
Arduino Uno
Arduino Uno 是学习机器人最常用的单片机板:5V 逻辑电平、编程简单、不容易损坏。本文讲它能做什么,以及什么时候该选用它。
它是什么
Arduino Uno 是围绕 Microchip ATmega328P(8 位单片机)的小开发板。它把芯片引脚引到标好号的排针上,加了 USB 口供电和烧录,搞定了稳压、晶振、复位这些麻烦事,你只管写代码和接线。对无数机器人学习者,Uno 就是他们第一次让电机转、让传感器亮的方式。
它长盛不衰靠的不是性能——按今天的标准它又慢又缺内存——而是宽容。5 V 引脚扛得住新手的接线错误,社区几乎回答过所有能问的问题,而且几乎每个入门级传感器和驱动板出厂都带着假定目标是 Uno 的例程。
工作原理
你写的是一个 sketch(Arduino 官方对程序的叫法)——一个只有两个函数的 C++ 程序。上电时 setup() 跑一次,之后 loop() 一直循环。在这两个函数里,你通过引脚读输入、驱动输出:
- 数字脚读或写 HIGH/LOW(5 V / 0 V)信号——按键、LED、电机驱动的方向输入。
- PWM 脚(标
~的)靠高速开关模拟电压,用来定电机转速或 LED 亮度。 - 模拟输入量 0–5 V 电压,报 0–1023 的数,用来读电位器或模拟循迹传感器。
Uno 没有操作系统。你的代码是唯一在跑的东西,时序可预测——给真机器人闭控制环时这很值钱。
什么时候用它
学习时拿起 Uno,想要最多兼容教程和库时拿起它,机器人任务简单且实时时拿起它:读几个传感器、跑控制环、带两个电机。循迹、避障、小差速车正好在它的舒适区。
需要 Wi-Fi 或蓝牙时看别处(通常升级到 ESP32),重数学或相机视觉时看别处(树莓派),内存不够时也看别处。Uno 的 2 KB SRAM 比新手想象中满得快——长字符串和大数组是常见凶手。
常见坑
- **它是 5 V 板子。**很多新传感器是 3.3 V,会被 5 V 逻辑烧坏。接线前查手册。
- **别从板子取电带电机。**Uno 的稳压供不起电机电流;电机用独立电池加电机驱动。从 Uno 直接取电带电机是新手烧板——不,是复位板子的最常见方式。
- **
delay()阻塞一切。**在delay()里板子读不了传感器也没反应。想灵敏就用millis()计时。 - **注意内存。**板子莫名其妙发疯,多半是 SRAM 用完了。
引脚图:每个脚到底能干什么
十四个数字脚加六个模拟脚,但不能互换。其中六个有重要的第二职业。
| 引脚 | 兼职 | 对机器人的意义 |
|---|---|---|
| D0(RX) | 硬件串口 | **别用。**USB 烧录器占着 |
| D1(TX) | 硬件串口 | **别用。**同上 |
| D2、D3 | 外部中断 0 和 1 | 仅有的两个任意边沿唤醒脚——留给编码器 |
| D3、D5、D6、D9、D10、D11 | PWM(~) |
六个 analogWrite 脚,电机转速住这 |
| D10–D13 | SPI(SS、MOSI、MISO、SCK) | SD 卡或 nRF24 无线电要用 |
| D13 | 板载 LED | 挂了 LED 和电阻——输入弱,输出没事 |
| A0–A5 | 模拟输入,10 位 | 不够用时也能当数字脚 |
| A4、A5 | I²C(SDA、SCL) | 所有 I²C 设备共用——拿去当模拟输入就没总线了 |
其中两行决定了大多数机器人设计。D2 和 D3 是仅有的真中断脚,两个轮子编码器一占就没了。A4/A5 就是 I²C 总线,Uno 上接 MPU-6050 再加模拟传感器阵列,立刻抢脚。
这种脚荒是项目长大离开 Uno 的最常见原因——不是速度,不是内存。电机驱动(6 脚)、一对编码器(4 脚,其中 2 个要中断)、传感器阵列(6 个模拟),十四数字加六模拟转眼就没。
供电,以及三种作死方式
| 输入 | 电压 | 路径 | 说明 |
|---|---|---|---|
| USB | 5 V | 经自恢复保险丝 | 整板限 500 mA |
| DC 座 | 7–12 V | 经板载线性稳压 | 推荐供电 |
VIN 脚 |
7–12 V | 同一个稳压 | 和 DC 座一样,只是引出来 |
5V 脚 |
5 V | 直通电源轨 | 绕过稳压——毫无保护 |
稳压是线性的,输入和 5 V 的差值全变成热烧掉。12 V 输入、200 mA 时就是 (12 − 5) × 0.2 = 1.4 W 闷在小封装里,真烫手。有得选就喂 9 V 别喂 12 V。
三种值得点名的作死:
**从 5 V 脚取电带电机。**稳压供不起电机电流,电源轨被拉塌,板子复位,症状像软件崩溃。电机独立供电,只共地。
**5 V 脚喂没稳过的电源。**那只脚直通电源轨,超过约 5.5 V 直接灌进 ATmega328P。
**USB 和 DC 座同时供电。**板子能处理(有比较器选高的),但 DC 座上的电池充不进去,山寨板边际设计还可能倒灌。
引脚到底能供多少电
| 限制 | 值 | 含义 |
|---|---|---|
| 单脚 | 建议 20 mA,绝对最大 40 mA | 一个 LED 行,电机不行,继电器线圈不行 |
| 所有脚合计 | 200 mA | 八个 20 mA 的 LED 就满额了 |
| 5 V 脚(USB 供电) | 板子自用后剩约 450 mA | 一个舵机就能超 |
| 3.3 V 脚 | 50 mA | 来自 USB 芯片的稳压——非常有限 |
3.3 V 脚经常坑人。它不是通用电源轨,是 50 mA 的方便脚。ESP-01 发射时挂它上面立刻欠压。
2 KB 内存问题
Uno 有 32 KB 闪存装程序,2 KB SRAM给运行时变量。闪存很少是瓶颈,SRAM 永远是。
Serial.print 里的每个字符串启动时都会拷进 SRAM:
Serial.println("Calibration complete, entering drive mode"); // 43 bytes of SRAM, forever
二十条这样的消息就是 800 字节——总量的 40%。解法是 F(),字符串留在闪存,用时再读:
Serial.println(F("Calibration complete, entering drive mode")); // 0 bytes of SRAM
数组是另一头。float 四字节,200 个采样点的记录缓冲就是 800 字节,而且毫无警告——编译器开开心心报闪存用量,运行时 SRAM 一字不提。
**爆内存没有干净的报错。**栈往下长,堆往上长,两者相遇时变量会悄悄互相破坏。板子的行为变得莫名其妙:读数毫无道理、循环跳步、无缘无故复位。如果你加了一个功能之后 Uno 就开始不正常,第一件该怀疑的就是 SRAM。
// Drop this in and watch it while you develop.
int freeRam() {
extern int __heap_start, *__brkval;
int v;
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}
剩不到 200 字节就要出事。
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 电机一转就复位 | 电机电流走了板子 | 电机独立供电,只共地 |
| 上传失败:“not in sync” | D0/D1 上挂了东西或串口选错 | 拔掉串口脚上的东西 |
| 加了代码行为诡异 | SRAM 爆了 | 字符串套 F();查 freeRam() |
analogWrite 没反应 |
脚不是 PWM 脚 | 用 3、5、6、9、10 或 11 |
| Servo 库搞坏 9/10 的 PWM | Servo 接管了 Timer 1 |
换 PWM 脚,或舵机挂 PCA9685 |
| I²C 找不到设备 | A4/A5 被干别的了 | I²C 总线就是这两个脚,专用的 |
| 稳压烫手 | 输入接近 12 V | 降到 7–9 V |
| 3.3 V 设备欠压 | 那只脚限 50 mA | 单独 3.3 V 稳压 |
| 传感器读数离谱 | 3.3 V 传感器挂 5 V 逻辑 | 电平转换,或换 3.3 V 板子 |
Uno 还是别的?
| 板子 | 逻辑 | 选它的理由 |
|---|---|---|
| Uno | 5 V | 宽容、文档最多,芯片插座的可换 |
| Nano | 5 V | 同颗芯片,面包板友好,模拟输入8 路不是 6 路 |
| Mega 2560 | 5 V | 54 数字、16 模拟、6 中断、8 KB SRAM——脚荒的答案 |
| ESP32 | 3.3 V | Wi-Fi、蓝牙、双核,快得多 |
| Pro Micro | 5 V | 原生 USB——能装键盘鼠标 |
Nano 值得为机器人单独提一句:同颗 ATmega328P、同样的代码,多引出 A6 和 A7 两路模拟输入。8 通道反射阵列能不能装下就差这两路,所以循迹作品经常点名 Nano。
说句实在话:Uno 的价值在于上面的一切东西第一次就能跑通。每个库、每篇教程、每张接线图都以它为前提。学习阶段这比任何参数都值钱,而等你不再需要它时,让你觉得不够用的,几乎永远是引脚数。
探索关联图谱
用到它的搭建
包含 Arduino Uno 的项目、学习路线和模拟器。
- 项目做一只四自由度机械臂:PCA9685、舵机与运动学
- 项目做一只微型迷宫鼠:用洪水填充求解迷宫的机器人
- 项目做一台带 LSRB 路线记忆的线迷宫求解机器人
- 项目做一台循迹机器人:从模拟器到真实赛道
- 项目做一台知道自己抓空了的抓取搬运机器人
- 项目做一台笔式绘图机:两根能准确到位的步进轴
- 项目做一台能扫遍整个地面的房间覆盖机器人
- 项目做一台能看见标记并开过去的 ROS 2 机器人
- 项目做一台能自主行驶的 GPS 航点漫游车
- 项目做一台迷你相扑机器人:抓地、铲子与边缘感知
- 项目做一台通过蓝牙或 Wi-Fi 用手机控制的机器人小车
- 项目做一台避障机器人:感知、扫描与转向
- 项目用 MPU6050 和 PID 做一台自平衡机器人
- 学习路线机器人电子基础:一份学习路线图
对比
替代方案
问题
Arduino Uno 常见问题
什么是 Arduino Uno?
Arduino Uno 是一块围绕 ATmega328P 芯片设计的入门级单片机开发板。你可以用简短的 C++ 程序(Arduino 称之为 sketch)读取传感器,控制电机、LED 和其他电子器件。大多数人正是用这块板子学习机器人的。
Arduino Uno 在机器人中有什么用途?
在机器人中,Uno 充当机器人的大脑:它读取传感器、运行控制环,并通过 L298N 之类的电机驱动带动电机。它适合循迹小车、避障小车和小型漫游车这类任务简单、但要求时序可预测且实时的场合。
Arduino Uno 用的是哪款单片机?
Arduino Uno 采用 Microchip 的 ATmega328P,这是一款 8 位 AVR 单片机,主频 16 MHz,带 32 KB 闪存和 2 KB SRAM。开发板围绕这一颗芯片加上了 USB 接口、稳压器和排针。
Arduino 是用 C 还是 C++ 编程?
Arduino 程序用 C++ 编写,上面叠加了一层经过简化、对初学者友好的框架。你也可以直接写纯 C,因为 C 大体上是 C++ 的子集,但 Arduino 的标准函数和库都是 C++ 的。
Arduino 代码难学吗?
不难——Arduino 是入门硬件编程最平缓的途径之一。程序只由 setup() 和 loop() 两个函数构成,库生态庞大,还有成千上万的示例程序,所以初学者在一小时之内就能让 LED 闪烁起来,或者让电机转起来。
做机器人,Arduino 和树莓派哪个更好?
两者解决的是不同的问题。Arduino 是单片机,擅长以可预测的时序实时控制电机和传感器。树莓派是一台完整的 Linux 计算机,更适合视觉处理、繁重计算或 Wi-Fi 通信。许多高级机器人两者并用:树莓派负责思考,Arduino 负责执行。
Arduino Uno 为什么用得这么广泛?
因为它宽容,而且支持完善。它的 5 V 引脚经得起初学者常犯的接线错误,几乎每一款面向爱好者的传感器都附带 Uno 示例代码,社区也几乎回答过所有问题——所以你很少会被卡住太久。
能用 ChatGPT 或其他 AI 写 Arduino 代码吗?
可以——AI 助手能起草和调试 Arduino 程序,是很有用的学习辅助工具。但在信任 AI 生成的代码之前,一定要先在硬件上实际测试,因为一段看起来合理的程序仍然可能在引脚编号、时序或逻辑上出错。
延伸阅读