元器件 · 控制器

Arduino Uno

Arduino Uno 是学习机器人最常用的单片机板:5V 逻辑电平、编程简单、不容易损坏。本文讲它能做什么,以及什么时候该选用它。

它是什么

Arduino Uno 是围绕 Microchip ATmega328P(8 位单片机)的小开发板。它把芯片引脚引到标好号的排针上,加了 USB 口供电和烧录,搞定了稳压、晶振、复位这些麻烦事,你只管写代码和接线。对无数机器人学习者,Uno 就是他们第一次让电机转、让传感器亮的方式。

它长盛不衰靠的不是性能——按今天的标准它又慢又缺内存——而是宽容。5 V 引脚扛得住新手的接线错误,社区几乎回答过所有能问的问题,而且几乎每个入门级传感器和驱动板出厂都带着假定目标是 Uno 的例程。

Arduino Uno 开发板标注图:左边是 USB-B 口和 DC 电源座,中间是 ATmega328P 单片机,顶边是 D0 到 D13 数字 IO 排针,底边是电源和 A0 到 A5 模拟输入排针。
Arduino Uno 一览:左边 USB 和 DC 供电,ATmega328P 负责思考,顶边数字 IO,底边电源加模拟输入。 下载 SVG

工作原理

你写的是一个 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 的项目、学习路线和模拟器。

对比

替代方案

问题

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 生成的代码之前,一定要先在硬件上实际测试,因为一段看起来合理的程序仍然可能在引脚编号、时序或逻辑上出错。

延伸阅读

参考资料