智能小车(零):Arduino编程

星期五, 10月 11, 2024 | 8分钟阅读 | 更新于 星期日, 12月 8, 2024

YuanFeng Xie

概要

Arduino是一种开源电子平台,硬件和软件简单易学,非常适合入门嵌入式系统开发的初学者。Arduino平台通过代码控制硬件设备,如LED灯、按钮、马达等,帮助用户轻松实现自己的创意。本文将带你了解Arduino的基本编程框架及常用代码语句,帮助新手快速入门Arduino开发。

安全须知

    / [pdf]

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:指定引脚模式,可选OUTPUTINPUT

示例

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左后轮电机逆时针旋转端口OUTPUTSoftPWM.h
4左后轮电机顺时针旋转端口OUTPUTSoftPWM.h
5风扇继电器控制端口OUTPUTdigitalWrite()
6左侧循迹端口OUTPUT
7右后轮电机顺时针旋转端口OUTPUTSoftPWM.hSoftPWMSet()
8右后轮电机逆时针旋转端口OUTPUTSoftPWM.h
9前轮舵机控制端口OUTPUTServo.hmyservo.write()
10车辆板载LED灯接口OUTPUTmillis()
11超声波模块声波发送端口OUTPUTdigitalWrite()
12超声波模块声波接收端口INPUTpulseIn()
13蜂鸣器控制端口OUTPUTdigitalWrite()
15左侧避障端口INPUTanalogRead()
16右侧避障端口INPUTanalogRead()
17右侧循迹端口OUTPUT
A0电压检测端口analogRead()
串口接口Serial.available()
Serial.read()

硬件连接和配置

在进行Arduino编程前,需要正确设置硬件连接和Arduino IDE的相关配置,以确保程序能够顺利上传并运行。

1. 硬件连接

  • 跳线帽设置:根据具体应用,将跳线帽设置为不同的工作模式。例如:

    • 下载模式:将跳线帽设置为下载模式,以便可以将代码上传到Arduino。
    • PS2手柄模式:如果需要通过PS2手柄控制小车,则需要将跳线帽调整到PS2手柄模式。
  • 引脚连接:根据上文的IO资源分配表,将各个功能引脚连接到相应的外部设备。例如:

    • 将LED连接到指定的ledPin引脚。
    • 将超声波模块的触发引脚(发送端口)连接到指定的引脚,并连接接收端口。
    • 将电机驱动模块的控制引脚连接到左后轮和右后轮对应的引脚。

2. Arduino IDE设置

在Arduino IDE中进行以下设置,以确保代码能够正确上传到Arduino板:

  • 选择开发板

    • 打开Arduino IDE,点击菜单栏的“工具” -> “开发板”,选择Arduino Nano作为开发板。
  • 选择处理器

    • 对于Arduino Nano,请选择ATmega328PATmega328P (Old Bootloader),根据您的板子型号选择正确的处理器。
  • 串口选择

    • 将Arduino板通过USB线连接到计算机。再次点击“工具” -> “端口”,选择Arduino板对应的串口(例如COM3或其他可用端口)。选择正确的串口可以确保程序能够上传到Arduino。

3. 程序上传

  • 完成以上配置后,点击“上传”按钮,将代码上传到Arduino板。上传完成后,Arduino板将按照编写的程序执行指定的功能。

  • 注意:在上传过程中,如果出现“串口占用”或“板子选择错误”等提示,请检查串口是否被其他程序占用,并确认开发板型号和串口选择是否正确。

以上步骤完成后,您可以在Arduino板上观察到硬件的反应,例如LED闪烁、风扇控制、超声波测距等,实现您的Arduino项目。

© 2024 小谢同学的修行小屋

🌱 Powered by Hugo with theme Dream.

关于我

一名喜欢RUST的菜鸟程序员

教育背景(研二在读)

  • 2019.09 - 2023.06 天津大学 · 智能与计算学部 · 网络安全专业 · 全日制 · 本科
  • 2023.09 - 2026.06 天津大学 · 智能与计算学部 · 电子信息专业 · 全日制 · 硕士研究生
浏览器漏洞挖掘项目

V8引擎的模糊测试工具改进

时间:2021.09-2022.04

内容:聚焦于优化JavaScript引擎的测试方法。研究团队基于SOAT改进部署了V8引擎测试环境,并通过分析测例覆盖率和已知CVE,优化了测试流程。

成果:成功捕获了一个谷歌引擎的逻辑漏洞,获得了修复反馈

JS引擎WASM模块漏洞挖掘研究

时间:2023.11-2024.4

内容:阅读标准手动编写了WASM语法规则,调研了主流JS引擎的WASM支持情况,并基于V8构建了WASM二进制框架。

成果:语法规则、调研报告和二进制构建框架,成功捕获特性缺陷并得到修复

数据库缺陷研究项目

关系型数据库缺陷的实证研究

时间:2022.12-2023.11

内容:通过构建统一的数据库逻辑框架,系统收集并分析了大量数据库缺陷。对777个缺陷进行了深入分析,特别聚焦SQL数据类型问题,并据此改进了模糊测试方法。

成果:构建缺陷数据集, 开发SQLT测试框架

网络协议漏洞挖掘项目

基于 RFC的 SSL/TLS模糊测试

时间:2024.4 – today

内容:梳理TLS协议模糊测试的相关工作,关注基于状态机的网络协议模糊测试方法。复现历史漏洞,了解TLS报文结构,追溯相关漏洞代码。分析RFC文档,提取字段约束,构建状态转移范式,并据此完善了TLS协议的有限状态机模型。

成果:完成相关工作调研, 漏洞复现报告, 状态范式数据集