Arduino Uno 入门到精通 – wiki词典


Arduino Uno 入门到精通:从点亮LED到构建智能系统

Arduino Uno,作为开源硬件平台的标志性产品,以其友好的编程环境、丰富的资料和广泛的应用场景,成为无数创客、工程师和学生踏入嵌入式世界的第一站。本文将带您从零开始,逐步深入,最终掌握利用Arduino Uno构建复杂智能系统的技能。

第一部分:Arduino Uno 初识与入门(点亮你的第一个LED)

1.1 什么是 Arduino Uno?

Arduino Uno 是一款基于 ATmega328P 微控制器板的开源物理计算平台。它拥有一系列数字和模拟输入/输出引脚,可以连接各种传感器、执行器和其他扩展板。其核心优势在于:
* 简单易用:Arduino IDE 提供简洁的编程界面和C++简化版本——Wiring语言。
* 成本低廉:相较于其他开发板,Arduino Uno 价格亲民。
* 社区支持:拥有庞大活跃的全球社区,提供海量教程、库和项目案例。
* 跨平台:IDE 兼容 Windows、macOS 和 Linux。

1.2 准备工作

在开始之前,您需要准备以下物品:
* Arduino Uno 开发板:核心。
* USB A/B 数据线:用于连接电脑供电和上传程序。
* 面包板:用于快速搭建电路,无需焊接。
* 跳线(杜邦线):连接元器件。
* LED(发光二极管):第一个项目必备。
* 220欧姆电阻:用于限制LED电流,保护LED和Arduino。
* 安装 Arduino IDE:从 Arduino 官网 下载并安装。

1.3 你的第一个程序:点亮板载LED

安装好 Arduino IDE 后,让我们来编写第一个程序:点亮 Arduino Uno 板载的LED(通常连接到数字引脚13)。

  1. 连接 Arduino Uno:用USB线将Arduino Uno连接到电脑。
  2. 打开 Arduino IDE
  3. 选择开发板和端口
    • 点击 工具(Tools) -> 开发板(Board) -> 选择 Arduino Uno
    • 点击 工具(Tools) -> 端口(Port) -> 选择 Arduino Uno 对应的COM端口(Windows下可能显示为COMx,macOS下可能为/dev/cu.usbserial-xxx)。
  4. 载入示例程序:点击 文件(File) -> 示例(Examples) -> 01.Basics -> Blink
  5. 理解代码
    “`cpp
    // the setup function runs once when you press reset or power the board
    void setup() {
    // initialize digital pin LED_BUILTIN as an output.
    pinMode(LED_BUILTIN, OUTPUT);
    }

    // the loop function runs over and over again forever
    void loop() {
    digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
    delay(1000); // wait for a second
    digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
    delay(1000); // wait for a second
    }
    ``
    *
    setup()函数:程序启动时只执行一次,用于初始化引脚模式、串口通信等。
    *
    loop()函数:setup()执行完后,loop()函数会无限循环执行,是程序的主体。
    *
    pinMode(LED_BUILTIN, OUTPUT):将LED_BUILTIN(板载LED,通常是13号引脚)设置为输出模式。
    *
    digitalWrite(LED_BUILTIN, HIGH):将LED_BUILTIN引脚输出高电平(5V),点亮LED。
    *
    delay(1000):暂停1000毫秒(1秒)。
    *
    digitalWrite(LED_BUILTIN, LOW):将LED_BUILTIN` 引脚输出低电平(0V),熄灭LED。
    6. 编译与上传:点击IDE左上角的“√”按钮(验证/编译)检查代码错误,然后点击“→”按钮(上传)将程序上传到Arduino Uno。

成功上传后,您将看到Arduino Uno上的板载LED以每秒一次的频率闪烁。恭喜,您已成功迈出第一步!

第二部分:核心概念与扩展(与世界交互)

2.1 数字与模拟I/O

  • 数字引脚 (Digital Pins):Arduino Uno 有14个数字引脚(0-13),可以设置为输入或输出。输出时,只能是HIGH(5V)或LOW(0V);输入时,只能读取HIGH或LOW状态。常用于控制LED、继电器、读取按钮状态等。
  • 模拟引脚 (Analog Pins):Arduino Uno 有6个模拟输入引脚(A0-A5),可以读取0-5V之间的连续电压值,并将其转换为0-1023的数字值。常用于连接光敏电阻、温度传感器、电位器等。
  • PWM (Pulse Width Modulation):脉冲宽度调制,数字引脚中带有“~”符号的(3, 5, 6, 9, 10, 11)支持PWM输出。通过快速切换高低电平的占空比,模拟出0-5V之间的“模拟电压”,用于控制LED亮度、舵机角度等。函数为 analogWrite(pin, value)value 范围是0-255。

2.2 串行通信 (Serial Communication)

串行通信是Arduino与电脑或其他设备交换数据的重要方式。
* Serial.begin(baud_rate):在 setup() 中初始化串口通信,baud_rate(波特率)通常设置为9600或115200。
* Serial.print() / Serial.println():向电脑发送数据。println() 会在末尾添加换行符。
* Serial.available():检查串口缓冲区是否有接收到的数据。
* Serial.read():读取串口缓冲区中的一个字节。

示例:串口监视器
“`cpp
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率为9600
}

void loop() {
Serial.print(“Hello, Arduino! Time: “);
Serial.println(millis()); // 打印程序运行时间(毫秒)
delay(1000);
}
“`
上传后,打开 Arduino IDE 右上角的“串口监视器”(Serial Monitor),选择正确的波特率,即可看到输出。

2.3 常用传感器与执行器

  • 按钮:连接数字引脚,通过 digitalRead() 读取其按下/释放状态。需要一个上拉或下拉电阻。
  • 电位器:连接模拟引脚,通过 analogRead() 读取其转动角度。
  • 光敏电阻 (LDR):连接模拟引脚,通过 analogRead() 读取环境光强度。
  • 温度传感器 (如 LM35/DS18B20):模拟引脚或单总线数字引脚。
  • 蜂鸣器:连接数字引脚,通过 tone() 函数播放音调。
  • 舵机 (Servo Motor):连接PWM引脚,通过 Servo.h 库控制角度。
  • LCD1602/OLED显示屏:通过I2C或SPI通信显示文本信息。
  • DHT11/DHT22 温湿度传感器:数字引脚,需特定库。

2.4 库的使用 (Libraries)

Arduino 生态系统拥有庞大的库支持,这些库封装了复杂的底层操作,让我们可以更方便地使用各种模块。
* 安装库项目(Sketch) -> 加载库(Include Library) -> 管理库(Manage Libraries...)。在库管理器中搜索并安装所需的库。
* 示例:使用 Servo 库控制舵机。
“`cpp
#include // 包含Servo库

Servo myServo;  // 创建一个Servo对象
int pos = 0;    // 舵机角度变量

void setup() {
  myServo.attach(9); // 将舵机连接到数字引脚9
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // 角度从0到180
    myServo.write(pos);                 // 设置舵机角度
    delay(15);
  }
  for (pos = 180; pos >= 0; pos -= 1) { // 角度从180到0
    myServo.write(pos);                 // 设置舵机角度
    delay(15);
  }
}
```

第三部分:进阶与精通(构建复杂系统)

3.1 中断 (Interrupts)

中断允许 Arduino 对外部事件(如按钮按下、传感器数据变化)快速响应,而不必在 loop() 函数中不断地轮询。
* 外部中断:Arduino Uno 通常支持数字引脚2和3作为外部中断。
* 定时器中断:基于定时器实现周期性任务。

示例:外部中断
“`cpp
const byte buttonPin = 2; // 按钮连接到数字引脚2
volatile bool buttonPressed = false; // 使用volatile修饰,因为在中断中修改

void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP); // 设置按钮引脚为带上拉电阻的输入
attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING); // 注册中断
}

void loop() {
if (buttonPressed) {
Serial.println(“Button was pressed!”);
buttonPressed = false; // 重置标志位
}
// 其他主要任务可以在这里执行
delay(100);
}

void handleButtonPress() {
buttonPressed = true;
}
``
当按钮从高电平变为低电平(
FALLING边沿触发)时,handleButtonPress` 函数会立即执行。

3.2 多任务处理与有限状态机

Arduino 的 loop() 函数是顺序执行的,当任务增多时,delay() 会阻塞整个程序。
* 无阻塞延时:使用 millis() 函数代替 delay() 实现非阻塞延时。
“`cpp
unsigned long previousMillis = 0;
const long interval = 1000; // 1秒

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    // 执行周期性任务
    Serial.println("One second passed!");
  }
  // 其他任务
}
```
  • 有限状态机 (FSM):将复杂系统分解为多个离散状态,根据输入和当前状态进行状态转换和执行相应动作,是管理复杂逻辑的有效方法。

3.3 通信协议:I2C与SPI

  • I2C (Inter-Integrated Circuit):两线制串行总线(SDA数据线、SCL时钟线),支持多主多从,常用于连接传感器(如MPU6050、BMP180、LCD1602)。Arduino Uno 使用 A4 (SDA) 和 A5 (SCL)。
  • SPI (Serial Peripheral Interface):四线制串行总线(MOSI、MISO、SCK、SS),速度比I2C快,常用于连接SD卡模块、OLED显示屏、WIFI模块(ESP8266)。

3.4 扩展与联网

  • ESP8266/ESP32:集成WiFi功能的微控制器,可以通过串口与Arduino Uno通信,让Arduino项目连接互联网,实现物联网(IoT)功能。
  • 蓝牙模块 (HC-05/HC-06):实现Arduino与手机或其他蓝牙设备的无线通信。
  • 以太网扩展板 (Ethernet Shield):将Arduino直接连接到局域网。
  • SD卡模块:用于数据存储和日志记录。
  • 继电器模块:控制高电压/大电流设备。
  • 电机驱动模块 (L298N):控制直流电机或步进电机。

3.5 供电与功耗

  • USB 供电:通过电脑USB端口或USB充电器(5V)。
  • DC Jack 供电:7-12V 直流电源适配器。
  • Vin 引脚供电:直接提供稳压后的5V电源。
  • 功耗管理:对于电池供电项目,需要考虑降低功耗。可以采用深度睡眠模式、关闭不用的外设等方法。

第四部分:项目实践与创造

掌握了以上知识后,您可以尝试构建以下进阶项目,巩固所学:

  1. 智能家居环境监测系统

    • 传感器:DHT11/DHT22(温湿度),光敏电阻(光照),MQ系列(气体)。
    • 显示:LCD1602或OLED显示屏。
    • 通信:ESP8266/ESP32 WiFi模块,将数据上传到云平台(如ThingSpeak、Blynk)。
    • 执行器:根据温湿度自动控制风扇或加热器(通过继电器)。
  2. 桌面机器人/机械臂

    • 执行器:多个舵机(通过Servo库),或步进电机(通过电机驱动模块)。
    • 输入:摇杆模块、按钮或手势识别传感器(如APDS-9960)。
    • 控制:编写复杂的运动序列和姿态控制代码。
  3. 小型自动化种植系统

    • 传感器:土壤湿度传感器、温湿度传感器。
    • 执行器:小型水泵(通过继电器)、LED植物生长灯(通过继电器)。
    • 逻辑:根据土壤湿度自动浇水,根据光照和时间控制植物灯。
  4. 简易游戏机/音乐播放器

    • 输入:按键、摇杆。
    • 显示:OLED显示屏。
    • 输出:蜂鸣器或小型扬声器(配合DFPlayer Mini等模块)。
    • 逻辑:实现小游戏(如贪吃蛇、俄罗斯方块)或简单的音乐播放。

总结与展望

从点亮第一个LED开始,到掌握数字/模拟I/O、串口通信、中断、多任务处理,再到熟练运用各种传感器、执行器和通信协议,您已经从 Arduino Uno 的“入门”阶段迈向了“精通”。

Arduino Uno 不仅是一个开发板,更是一个开放创新的平台。它的魅力在于其无限的扩展性和社区支持。不要害怕尝试新想法,勇于面对挑战。通过不断实践、学习和分享,您将能够利用 Arduino Uno 创造出更多令人惊叹的智能项目,真正实现“万物互联”的梦想。

继续探索,持续创新!祝您在 Arduino 的世界中玩得开心,收获满满!


滚动至顶部