智能小车(零):Arduino编程
星期五, 10月 11, 2024 | 8分钟阅读 | 更新于 星期日, 12月 8, 2024
概要
Arduino是一种开源电子平台,硬件和软件简单易学,非常适合入门嵌入式系统开发的初学者。Arduino平台通过代码控制硬件设备,如LED灯、按钮、马达等,帮助用户轻松实现自己的创意。本文将带你了解Arduino的基本编程框架及常用代码语句,帮助新手快速入门Arduino开发。
安全须知
Arduino编程框架
Arduino编程使用的是简化的C++语言,代码文件被称为“草图(Sketch)”。每个Arduino程序都包含两个核心函数:setup()
和loop()
。这两个函数是Arduino编程的基本框架,负责程序的初始化和循环执行。
void setup() {
// 在这里初始化代码
}
void loop() {
// 在这里编写主循环代码
}
- setup()函数:setup()是Arduino程序启动时首先运行的代码块,里面的代码仅执行一次。这个函数通常用于配置引脚模式(输入或输出),初始化串口通讯等。例如,指定某个引脚为输出模式,用于点亮LED灯。
- loop()函数:loop()是Arduino程序的主循环。Arduino会不断重复执行这个函数中的代码,直到断电或重启设备。通常将需要连续执行的代码放在这里,比如反复检测按钮状态、控制电机转速等。
Arduino常用代码语句
1. 全局变量
在Arduino中,全局变量是声明在任意函数外部的变量,通常放在程序的最上方。全局变量可以在setup()
、loop()
及其它自定义函数中被访问和修改,适合用于在程序各处共享数据。
int ledPin = 10; // LED引脚定义为10
int ledState = LOW; // LED初始状态
2. 变量类型
Arduino支持多种变量类型,不同的类型适用于不同的数据范围和用途。常见的变量类型包括:
int
:整数,适合存储小范围的整数,范围为 -32768 到 32767。unsigned int
:无符号整数,范围为 0 到 65535。long
:较大的整数类型,范围为 -2,147,483,648 到 2,147,483,647。float
:浮点数类型,用于表示带小数的数值。char
:字符类型,用于存储单个字符。const
:常量类型,用于定义一个不可更改的固定值。常量在Arduino中经常用于定义引脚号或固定值,确保程序运行中该值不被修改。
示例
const int ledPin = 10; // 定义一个常量引脚编号为10
const float pi = 3.14; // 定义一个常量浮点数π的值
3. pinMode()
函数
pinMode()
用于设置指定引脚的工作模式:输出(OUTPUT)或输入(INPUT)。在使用引脚前需要设置其模式,确定其作为数据输出或数据输入。
语法
pinMode(pin, mode);
- pin:指定引脚号,可以是数字引脚(如2、3、4)或其他可编程引脚。
- mode:指定引脚模式,可选
OUTPUT
或INPUT
。
示例
pinMode(10, OUTPUT); // 将10号引脚设置为输出模式
pinMode(9, INPUT); // 将9号引脚设置为输入模式
OUTPUT
模式:用于向外部设备发送电信号。例如,控制LED灯的亮灭。INPUT
模式:用于接收外部设备的信号。例如,检测按钮是否被按下。
4. digitalWrite()
函数
digitalWrite()
用于将指定引脚设置为高电平(HIGH)或低电平(LOW)。高电平通常表示引脚输出5V,低电平表示引脚输出0V,用于控制设备的开关状态。
语法
digitalWrite(pin, value);
- pin:指定引脚号。
- value:指定要输出的值,
HIGH
(高电平,通常为5V)或LOW
(低电平,通常为0V)。
示例
digitalWrite(10, HIGH); // 将10号引脚设置为高电平(输出5V)
digitalWrite(10, LOW); // 将10号引脚设置为低电平(输出0V)
通过将10号引脚设为高电平,连接到该引脚的LED会亮起;设为低电平则会熄灭。
5. digitalRead()
函数
digitalRead()
用于读取数字引脚的状态,返回值为HIGH
(高电平)或LOW
(低电平)。常用于检测按钮等输入设备的状态。
语法
int buttonState = digitalRead(pin);
- pin:指定的数字引脚。
- 返回值:
HIGH
表示引脚处于高电平,LOW
表示引脚处于低电平。
示例
int buttonState = digitalRead(9); // 读取9号引脚的状态
6. Serial.begin()
和 Serial.print()
函数
Arduino通过串口通信与计算机进行数据交换。Serial.begin()
用于初始化串口通信,而Serial.print()
用于向串口输出数据(打印到串口监视器)。这些函数在调试时特别有用,可以查看传感器数据、变量值等信息。
Serial.begin()
语法
Serial.begin(baudRate);
- baudRate:指定波特率(传输速度),常用9600。
示例
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率为9600
}
Serial.print()
和 Serial.println()
语法
Serial.print(data)
:在串口监视器中打印数据,不换行。Serial.println(data)
:在串口监视器中打印数据并换行。
示例
void setup() {
Serial.begin(9600); // 初始化串口通信
}
void loop() {
int sensorValue = analogRead(A0); // 读取模拟引脚A0的数据
Serial.print("传感器值: ");
Serial.println(sensorValue); // 打印数据到串口监视器
delay(1000); // 每隔1秒更新一次数据
}
在这个示例中,Arduino每隔1秒读取一次传感器的值,并将其打印到串口监视器中。使用Serial.print()
和Serial.println()
可以查看变量值和状态,是调试Arduino程序的重要工具。
7. delay()
函数
delay()
函数会暂停程序执行指定的毫秒数。常用于设置LED闪烁的时间间隔或等待某个操作完成。
语法
delay(milliseconds);
- milliseconds:暂停的时间(以毫秒为单位)。
示例
delay(1000); // 暂停程序1秒
delay()
函数的使用可以帮助我们控制动作的间隔时间,例如LED闪烁频率。
8. analogRead()
函数
analogRead()
用于读取模拟引脚的电压值,返回一个0到1023的整数值。Arduino的模拟引脚可以读取连接传感器、可变电阻等设备产生的模拟电压信号。
语法
int sensorValue = analogRead(pin);
- pin:指定的模拟引脚(A0到A5)。
- 返回值:返回0到1023之间的整数值,代表读取到的电压值。0表示0V,1023表示最大电压(通常为5V)。
示例
int sensorPin = A0; // 定义传感器连接的模拟引脚为A0
int sensorValue = 0; // 用于存储读取到的值
void setup() {
Serial.begin(9600); // 初始化串口通讯
}
void loop() {
sensorValue = analogRead(sensorPin); // 读取传感器的模拟信号
Serial.print("传感器值: ");
Serial.println(sensorValue); // 打印读取值到串口监视器
delay(1000); // 每隔1秒读取一次
}
在这个示例中,analogRead()
从A0引脚读取模拟电压,将结果转换为0到1023之间的数值。
9. analogWrite()
函数
analogWrite()
用于向指定的引脚输出PWM信号(脉宽调制)。虽然Arduino没有直接的模拟输出功能,但通过PWM技术,可以模拟出一个接近于模拟输出的效果。analogWrite()
函数的输出范围是0到255,用于调节LED亮度、控制电机速度等场景。
语法
analogWrite(pin, value);
- pin:支持PWM的数字引脚(在Arduino Uno上通常是3, 5, 6, 9, 10, 和11)。
- value:输出的PWM值,范围为0到255。0表示无输出(0V),255表示最大输出(接近5V)。
示例
int ledPin = 9; // 连接LED的引脚,支持PWM功能
void setup() {
pinMode(ledPin, OUTPUT); // 将LED引脚设置为输出模式
}
void loop() {
for (int brightness = 0; brightness <= 255; brightness += 5) {
analogWrite(ledPin, brightness); // 逐渐增加亮度
delay(30);
}
for (int brightness = 255; brightness >= 0; brightness -= 5) {
analogWrite(ledPin, brightness); // 逐渐减少亮度
delay(30);
}
}
在这个示例中,analogWrite()
控制LED的亮度变化。通过逐渐改变PWM值,LED的亮度会从暗变亮,再从亮变暗,形成呼吸灯的效果。
IO资源分配
IO引脚 | 功能 | 配置 | 特殊函数库 | 函数 |
---|---|---|---|---|
2 | 左后轮电机逆时针旋转端口 | OUTPUT | SoftPWM.h | |
4 | 左后轮电机顺时针旋转端口 | OUTPUT | SoftPWM.h | |
5 | 风扇继电器控制端口 | OUTPUT | digitalWrite() | |
6 | 左侧循迹端口 | OUTPUT | ||
7 | 右后轮电机顺时针旋转端口 | OUTPUT | SoftPWM.h | SoftPWMSet() |
8 | 右后轮电机逆时针旋转端口 | OUTPUT | SoftPWM.h | |
9 | 前轮舵机控制端口 | OUTPUT | Servo.h | myservo.write() |
10 | 车辆板载LED灯接口 | OUTPUT | millis() | |
11 | 超声波模块声波发送端口 | OUTPUT | digitalWrite() | |
12 | 超声波模块声波接收端口 | INPUT | pulseIn() | |
13 | 蜂鸣器控制端口 | OUTPUT | digitalWrite() | |
15 | 左侧避障端口 | INPUT | analogRead() | |
16 | 右侧避障端口 | INPUT | analogRead() | |
17 | 右侧循迹端口 | OUTPUT | ||
A0 | 电压检测端口 | analogRead() | ||
串口接口 | Serial.available() | |||
Serial.read() |
硬件连接和配置
在进行Arduino编程前,需要正确设置硬件连接和Arduino IDE的相关配置,以确保程序能够顺利上传并运行。
1. 硬件连接
跳线帽设置:根据具体应用,将跳线帽设置为不同的工作模式。例如:
- 下载模式:将跳线帽设置为下载模式,以便可以将代码上传到Arduino。
- PS2手柄模式:如果需要通过PS2手柄控制小车,则需要将跳线帽调整到PS2手柄模式。
引脚连接:根据上文的IO资源分配表,将各个功能引脚连接到相应的外部设备。例如:
- 将LED连接到指定的
ledPin
引脚。 - 将超声波模块的触发引脚(发送端口)连接到指定的引脚,并连接接收端口。
- 将电机驱动模块的控制引脚连接到左后轮和右后轮对应的引脚。
- 将LED连接到指定的
2. Arduino IDE设置
在Arduino IDE中进行以下设置,以确保代码能够正确上传到Arduino板:
选择开发板:
- 打开Arduino IDE,点击菜单栏的“工具” -> “开发板”,选择Arduino Nano作为开发板。
选择处理器:
- 对于Arduino Nano,请选择ATmega328P或ATmega328P (Old Bootloader),根据您的板子型号选择正确的处理器。
串口选择:
- 将Arduino板通过USB线连接到计算机。再次点击“工具” -> “端口”,选择Arduino板对应的串口(例如COM3或其他可用端口)。选择正确的串口可以确保程序能够上传到Arduino。
3. 程序上传
完成以上配置后,点击“上传”按钮,将代码上传到Arduino板。上传完成后,Arduino板将按照编写的程序执行指定的功能。
注意:在上传过程中,如果出现“串口占用”或“板子选择错误”等提示,请检查串口是否被其他程序占用,并确认开发板型号和串口选择是否正确。
以上步骤完成后,您可以在Arduino板上观察到硬件的反应,例如LED闪烁、风扇控制、超声波测距等,实现您的Arduino项目。