Arduino 开发入门:电路搭建与 C++ 编程
引言
Arduino 是一款开源电子原型平台,由简易的硬件(各类开发板)和软件(Arduino IDE)组成。它让没有电子背景的创作者也能快速搭建互动装置。本教程从零开始,带你完成环境搭建、基础电路连接,并逐步学习 Arduino 风格的 C++ 编程,让你在动手实践中掌握控制 LED、读取传感器、驱动舵机等核心技能。
准备工作:硬件与软件
所需硬件
- 一块 Arduino 开发板(推荐 Arduino Uno R3,或兼容板)
- USB 数据线(A 口转 B 口,用于连接电脑与 Uno)
- 面包板(830 孔或 400 孔均可)
- 跳线(公对公、公对母若干)
- LED(5mm,任意颜色)x 3
- 220Ω 电阻 x 3
- 10kΩ 电阻 x 1
- 轻触按钮 x 1
- 电位器(10kΩ)x 1
- 小型舵机(如 SG90)x 1
- 可选:万用表(用于检测电路)
软件安装
- 访问 Arduino 官网 下载对应操作系统的 IDE(集成开发环境)。
- 安装后打开 IDE,用 USB 线连接 Arduino 板。
- 在「工具」菜单中选择正确的开发板(如“Arduino Uno”)和对应的端口(Windows 下为 COMxx,Mac 下为 /dev/cu.usbmodemxxx)。
- 可打开「文件」→「示例」→「01.Basics」→「Blink」测试连接是否正常。
基础电路知识
面包板结构
面包板两侧有横向电源轨(通常标有红色+和蓝色-),中间为垂直连接的插孔列,每列内部 5 个孔互通。元件引脚插入同一列即实现电气连接。
数字信号与模拟信号
- 数字 I/O:只能输出高电平(5V/3.3V)或低电平(0V),或读取这两种状态。
- 模拟输入:可读取 0~5V 范围内的连续电压值,通过板载 ADC 转换为 0~1023 的数字。
- PWM 输出:部分数字引脚(标有“~”)可输出模拟电压效果,用于调光或控制舵机。
限流电阻的必要性
LED 正常工作电压约为 2V,电流通常为 20mA。直接连接 5V 会因电流过大烧毁 LED。使用 220Ω 电阻可将电流限制在约 (5V-2V)/220Ω ≈ 13.6mA,安全且明亮。任何时候都不要省略 LED 的限流电阻。
第一个程序:闪烁的 LED
电路搭建
- 将 LED 长脚(正极,阳极)插入面包板,并通过 220Ω 电阻连接到 Arduino 的 13 号数字引脚。
- 将 LED 短脚(负极,阴极)直接连接到 GND。 或者直接使用 Arduino 板上自带连接在 13 号引脚的 LED(部分开发板已内置),无需外接电路即可测试。
代码编写
// Blink - 经典入门程序
void setup() {
pinMode(13, OUTPUT); // 设置13号引脚为输出模式
}
void loop() {
digitalWrite(13, HIGH); // 点亮LED
delay(1000); // 等待1秒
digitalWrite(13, LOW); // 熄灭LED
delay(1000); // 等待1秒
}
setup():程序开始时运行一次,用于初始化设置。loop():反复循环执行,实现持续交互。pinMode(pin, mode):配置引脚模式,OUTPUT为输出。digitalWrite(pin, val):设置数字引脚电平,HIGH= 5V,LOW= 0V。delay(ms):暂停程序指定毫秒。
点击上传按钮,观察 LED 以 1 秒间隔闪烁。
数字输入:按钮控制 LED
电路
- 按钮跨接在面包板中间凹槽,同一侧的两个引脚分别连接 Arduino 的 2 号引脚和 GND。
- 将 2 号引脚通过 10kΩ 电阻连接到 5V(上拉电阻),确保未按下按钮时引脚读到高电平。
- 按下按钮时引脚直接接地,读到低电平。
也可启用 Arduino 内部上拉电阻:
pinMode(2, INPUT_PULLUP); // 内部上拉,无需外接电阻
此时按钮只需连接 2 号引脚和 GND,未按下时读到 HIGH,按下时读到 LOW。
代码
const int buttonPin = 2;
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) { // 按下(低电平)
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
digitalRead() 返回引脚状态(HIGH 或 LOW)。使用条件判断即可实现按下点灯、松开熄灯。
模拟输入:电位器控制 LED 亮度
电路
- 电位器左右两脚分别接 5V 和 GND,中间引脚接到 Arduino 的 A0(模拟输入)。
- 将 LED 通过 220Ω 电阻接在 9 号引脚(标记有“~”,支持 PWM 输出)。
代码
const int potPin = A0;
const int ledPin = 9;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // 启动串口通信,用于调试
}
void loop() {
int sensorValue = analogRead(potPin); // 0~1023
int brightness = map(sensorValue, 0, 1023, 0, 255); // 映射到PWM范围
analogWrite(ledPin, brightness);
Serial.print("传感器值:");
Serial.println(sensorValue);
delay(100);
}
analogRead(pin)返回 0~1023 的整数值。map(value, fromLow, fromHigh, toLow, toHigh)将数值按比例映射,非常适合将 ADC 值转换为 PWM 值(0~255)。analogWrite(pin, value)对 PWM 引脚输出占空比可调的方波,实现亮度控制。
打开串口监视器(右上角放大镜图标,设置波特率 9600)可观察电位器旋转时对应数值变化。
传感器拓展:光控灯
电路
使用光敏电阻(LDR)和 10kΩ 固定电阻构成分压电路,测量环境光强度。将分压点接模拟引脚 A1,LDR 一端接 5V,另一端接 A1 和 10kΩ 电阻到 GND。LED 接 11 号 PWM 引脚。
代码
const int ldrPin = A1;
const int ledPin = 11;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int lightLevel = analogRead(ldrPin);
Serial.println(lightLevel);
// 环境越暗,光敏电阻阻值越大,分压值越低,LED 越亮
int brightness = map(lightLevel, 30, 900, 255, 0); // 根据实际范围调整
brightness = constrain(brightness, 0, 255);
analogWrite(ledPin, brightness);
delay(50);
}
constrain(x, a, b) 将数值限制在 a 和 b 之间,防止越界。
执行器控制:舵机
电路
舵机一般有三根线:棕色/黑色为 GND,红色为 5V,橙色/白色为信号线。将信号线接到 9 号引脚(PWM 引脚)。电源可直接取自 Arduino 5V(小功率舵机),若需大扭力建议外接电源共地。
使用 Servo 库
Arduino 内置 Servo 库方便控制。点击「项目」→「加载库」→「管理库」,搜索 Servo 并安装(通常已内置)。
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(9); // 信号线接9号引脚
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
Servo.attach(pin)将舵机对象绑定到引脚。write(angle)设置目标角度(0~180°),库会自动生成所需 PWM 信号。
串行通信基础
发送与接收
Serial.begin(baud)初始化串口,常用 9600。Serial.print()和Serial.println()发送数据到电脑。- Arduino 板载 USB 转串口芯片,与 IDE 的串口监视器通信。
示例:串口控制 LED
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
char command = Serial.read();
if (command == '1') {
digitalWrite(13, HIGH);
Serial.println("LED ON");
} else if (command == '0') {
digitalWrite(13, LOW);
Serial.println("LED OFF");
}
}
}
在串口监视器输入 1 或 0 并发送,控制 LED 亮灭。
避免常见错误
- 忘记限流电阻:LED 必须串联电阻,否则烧坏引脚或 LED。
- 未设置引脚模式:使用
pinMode()前读写可能导致异常。 - 短路:5V 与 GND 直接连接会造成短路,损坏开发板。搭建电路前先断开 USB。
- 变量类型错误:
analogRead返回 0~1023,若存入byte类型会溢出。 - 延迟阻塞:
delay()期间 Arduino 无法响应其他事件,后期可学习使用millis()实现非阻塞。
延伸学习建议
- 尝试组合多个传感器与执行器,制作温控风扇、自动浇花系统。
- 学习使用
if、while、for等控制语句增强程序逻辑。 - 阅读 Arduino 官方文档和示例,探索 EEPROM、中断、定时器。
- 逐步过渡到纯 C++ 面向对象编程,将功能封装为类。
通过动手搭建和编程,你已掌握 Arduino 开发的核心框架。继续实践,把创意变成现实!