跳转至

Arduino

Arduino 是全球最流行的开源电子原型平台,以其==简单易用==的硬件和软件,让初学者和专业开发者都能快速实现创意。它是嵌入式开发的最佳入门选择。


一、Arduino 是什么?

Arduino 是一个基于==易用硬件和软件==的开源电子平台。它包含:

  • 硬件:基于 AVR / ARM / ESP 等微控制器的开发板
  • 软件:Arduino IDE(集成开发环境)+ Arduino 语言(基于 C/C++)
  • 生态:海量开源库、扩展板(Shield)、社区教程
graph TB
    A[Arduino 平台] --> B[硬件]
    A --> C[软件]
    A --> D[生态]
    B --> B1[开发板<br>UNO / Mega / Nano]
    B --> B2[扩展板 Shield<br>电机 / WiFi / 显示]
    C --> C1[Arduino IDE]
    C --> C2[Arduino 语言<br>基于 C/C++]
    D --> D1[开源库 10000+]
    D --> D2[社区教程]
    D --> D3[PlatformIO 支持]

为什么选择 Arduino?

  • 入门门槛低:不需要深入了解寄存器,几行代码就能控制硬件
  • 跨平台:同一套 API 可运行在 AVR、ARM、ESP32 等不同芯片上
  • 生态丰富:几乎所有常见传感器和模块都有现成的库

二、常见开发板对比

开发板 主控芯片 工作电压 数字 IO 模拟输入 Flash SRAM 时钟 特点
UNO R3 ATmega328P 5V 14 6 32KB 2KB 16MHz 最经典,新手首选
UNO R4 WiFi RA4M1 (ARM) 5V 14 6 256KB 32KB 48MHz 内置 WiFi + BLE
Mega 2560 ATmega2560 5V 54 16 256KB 8KB 16MHz 引脚多,适合大型项目
Nano ATmega328P 5V 14 8 32KB 2KB 16MHz 小巧,适合嵌入产品
Nano 33 BLE nRF52840 3.3V 14 8 1MB 256KB 64MHz BLE + 9轴 IMU
Leonardo ATmega32U4 5V 20 12 32KB 2.5KB 16MHz 内置 USB HID
Due SAM3X8E (ARM) 3.3V 54 12 512KB 96KB 84MHz 32位 ARM,高性能

电压注意

  • 5V 板子(UNO、Mega、Nano):IO 口输出 5V,可直接驱动大多数模块
  • 3.3V 板子(Due、Nano 33):IO 口输出 3.3V,连接 5V 模块需要==电平转换==
  • 混用电压可能烧毁芯片

三、Arduino UNO R3 核心架构

以最经典的 UNO R3 为例:

graph TB
    subgraph "ATmega328P"
        CPU[AVR CPU<br>8 位 RISC<br>16MHz]
        FLASH[Flash 32KB<br>程序存储]
        SRAM[SRAM 2KB<br>运行内存]
        EEPROM[EEPROM 1KB<br>掉电保存]
        GPIO_M[GPIO 模块]
        TIMER_M[3 个定时器<br>Timer0/1/2]
        ADC_M[ADC 10 位<br>6 通道]
        UART_M[UART 串口]
        SPI_M[SPI 主/从]
        I2C_M[I2C TWI]
    end

    CPU --> FLASH
    CPU --> SRAM
    CPU --> EEPROM
    CPU --> GPIO_M
    CPU --> TIMER_M
    CPU --> ADC_M
    CPU --> UART_M
    CPU --> SPI_M
    CPU --> I2C_M

    GPIO_M --> PIN[数字引脚 D0-D13<br>模拟引脚 A0-A5]
    UART_M --> USB[USB-B 接口<br>CH340/ATmega16U2]

存储器区别

存储器 大小 用途 掉电保持
Flash 32KB 存储程序代码(Sketch)
SRAM 2KB 运行时变量
EEPROM 1KB 用户数据(设置、校准值)

四、开发环境搭建

  1. 访问 arduino.cc 下载 Arduino IDE 2.x
  2. 安装后打开,进入 File → Preferences
  3. 连接开发板,选择 Tools → Board → Arduino UNO
  4. 选择 Tools → Port → COMx(Windows)或 /dev/ttyUSBx(Linux)
  5. 点击 Upload(→ 箭头)上传程序

国内加速

在 Preferences 的 Additional Boards Manager URLs 中添加:

https://arduino.me/packages/esp32.json

  1. 安装 VS Code
  2. 在扩展商店搜索 PlatformIO IDE 并安装
  3. 创建新项目:PIO Home → New Project → 选择 Board
  4. 编辑 src/main.cpp,使用标准 Arduino API
  5. 点击底部 按钮编译上传
; platformio.ini 配置示例
[env:uno]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 115200

PlatformIO 优势

  • 自动管理库依赖和工具链
  • 支持代码补全、跳转定义
  • 统一管理多种开发板(AVR、ESP32、STM32)

五、编程模型

Arduino 程序(称为 Sketch)由两个核心函数组成:

void setup() {
    // 初始化代码,上电后只执行一次
    // 配置引脚模式、初始化串口、初始化库等
}

void loop() {
    // 主循环,setup() 之后不断重复执行
    // 读取传感器、控制输出、处理逻辑等
}
graph LR
    A[上电/复位] --> B[setup]
    B --> C[loop]
    C --> C

实际执行原理

Arduino 框架在底层的 main() 函数中这样调用:

int main() {
    init();         // 硬件初始化(定时器、ADC 等)
    setup();        // 用户初始化
    for (;;) {
        loop();     // 用户主循环
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

第一个程序:闪烁 LED

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);   // 设置内置 LED 引脚为输出模式
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH); // 点亮 LED
    delay(1000);                     // 等待 1 秒
    digitalWrite(LED_BUILTIN, LOW);  // 熄灭 LED
    delay(1000);                     // 等待 1 秒
}

LED_BUILTIN

LED_BUILTIN 是 Arduino 预定义的宏,指向板载 LED 的引脚号。UNO 上是 D13。


六、Arduino 语言速查

Arduino 语言本质是 C/C++,额外提供了一套简洁的 API:

数字 IO

函数 功能 示例
pinMode(pin, mode) 设置引脚模式 pinMode(13, OUTPUT)
digitalWrite(pin, val) 数字输出 digitalWrite(13, HIGH)
digitalRead(pin) 数字输入 int val = digitalRead(2)

模拟 IO

函数 功能 示例
analogRead(pin) 模拟输入(0~1023) int val = analogRead(A0)
analogWrite(pin, val) PWM 输出(0~255) analogWrite(9, 128)
analogReference(type) 设置参考电压 analogReference(INTERNAL)

时间函数

函数 功能 示例
delay(ms) 毫秒延时 delay(1000)
delayMicroseconds(us) 微秒延时 delayMicroseconds(100)
millis() 系统运行毫秒数 unsigned long t = millis()
micros() 系统运行微秒数 unsigned long t = micros()

串口通信

函数 功能 示例
Serial.begin(baud) 初始化串口 Serial.begin(115200)
Serial.print(data) 发送数据 Serial.print("Hello")
Serial.println(data) 发送数据 + 换行 Serial.println(val)
Serial.available() 可读字节数 if (Serial.available())
Serial.read() 读取一字节 char c = Serial.read()

七、内容导航

章节 核心内容 学习要点
GPIO 数字输入输出、模拟输入、PWM 输出 引脚模式、上下拉电阻、ADC 原理、PWM 频率
通信协议 Serial、SPI、I2C、软件串口 各协议原理与接线、常用函数、多设备通信
中断与定时器 外部中断、定时器中断、看门狗 中断优先级、去抖、定时器配置、WDT
常用传感器与执行器 DHT11、超声波、舵机、OLED、步进电机 传感器驱动编写、库的使用、接线图
库管理与进阶 库安装与管理、自定义库、EEPROM、低功耗 库结构、EEPROM 读写、Sleep 模式

Arduino 和 STM32 怎么选?

  • 快速原型验证教学入门小型项目 → 选 Arduino
  • 产品级开发高性能需求复杂外设控制 → 选 STM32
  • 需要 WiFi/BLE → 选 ESP32(可用 Arduino 框架编程)
  • 实际上,Arduino 框架也可以运行在 STM32 和 ESP32 上,三者并不矛盾!