智能小车(一):Arduino介绍

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

YuanFeng Xie

历史回顾

概要

Arduino 是一个非常受欢迎的开源电子平台,特别适合想要学习嵌入式系统和单片机开发的初学者。它拥有丰富的硬件资源和一个简单易用的编程环境,使得很多复杂的项目变得易于实现。本篇博客将带领大家通过Arduino Nano开发板点亮LED灯,体验Arduino平台的简单与强大。

安全须知

    / [pdf]

Arduino Nano开发板

Arduino 是一个基于易用硬件和软件的开源平台。它包括一系列的硬件开发板(如Arduino Nano、Arduino Uno等)和一个集成开发环境(IDE),用于编写和上传代码到开发板。通过Arduino平台,您可以实现对传感器、显示器、马达等各种外设的控制,创建各种电子项目。

Arduino Nano 是一种小型的Arduino开发板,功能丰富且便携。它基于ATmega328微控制器,拥有14个数字输入/输出引脚、8个模拟输入引脚,并通过USB接口连接电脑。Arduino Nano的大小仅为45x18mm,非常适合空间有限的项目。

编程IDE: Arduino

Arduino IDE(集成开发环境)是一种用来编写、编译和上传代码的免费软件。它支持多种Arduino开发板,包括Arduino Nano。Arduino IDE使用一种基于C++的语言,简化了复杂的嵌入式编程,初学者也能快速上手。

点亮LED小灯

代码展示

const int LedPin = 10;              //Led引脚定义
int LedState = LOW;                 //Led初始状态
unsigned long PreviousMillis = 0;   //当前时间状态
const long Interval = 500;          //Led状态改变的时间

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

void Led(void){
  unsigned long currentMillis = millis();   //获取当前时间
  if (currentMillis - PreviousMillis >= Interval){  //检查时间间隔是否达到
    PreviousMillis = currentMillis;        //更新最后一次改变的时间
    LedState = !LedState;                  //改变Led状态
    digitalWrite(LedPin, LedState);        //将新的状态输出到Led引脚
  }
}

void loop() {
  Led();   //在循环中反复调用Led函数,实现Led的闪烁
}

代码详解

  • LedPin定义:const int LedPin = 10;,这行代码将Arduino Nano的第10号引脚设置为LED灯的控制引脚。你可以将LED的一端连接到这个引脚,另一端连接到GND(接地)。
  • 状态变量:int LedState = LOW; 定义了一个变量 LedState 来存储LED灯的当前状态。LOW 代表关闭,HIGH 代表打开。
  • 计时功能:我们使用millis()函数获取自Arduino运行以来的时间(以毫秒为单位),并通过比较当前时间与之前记录的时间,来实现每隔500毫秒(0.5秒)切换LED灯的状态。
  • 定时控制:if (currentMillis - PreviousMillis >= Interval) 这行代码负责检查是否已经经过了500毫秒。若满足条件,则改变LED的状态(亮或灭)。
  • digitalWrite()函数:digitalWrite(LedPin, LedState); 是用于控制LED灯的关键函数,通过它,我们将状态输出到指定引脚,使LED亮起或熄灭。

代码运行

  • 硬件连接:连接开发板与电脑,跳线连接设置为下载模式
  • 上传代码:打开Arduino IDE,将上述代码复制到编辑器中,选择正确的开发板类型和端口,然后点击“上传”按钮,代码将被上传到Arduino Nano。
  • 观察效果:上传完成后,LED灯将会每隔0.5秒闪烁一次,成功完成您的第一个Arduino项目!

问题

  • setup()函数和loop()函数作为arduino驱动代码的固定函数,有什么作用?

输入量读取

代码展示

int LeftObstacleAvoidancePin = 15;  //左侧避障引脚
int RightObstacleAvoidancePin = 16; //右侧避障引脚
int RightTracingPin = 17;           //右侧循迹引脚
int LeftTracingPin = 6;             //左侧循迹引脚
int LeftObstacleAvoidance;          //左侧避障
int RightObstacleAvoidance;         //右侧避障
int LeftTracing;                    //左侧寻迹
int RightTracing;                   //右侧寻迹
void setup() {
  pinMode(LeftTracingPin, INPUT);    // 左侧循迹传感器设置为输入模式
  pinMode(RightTracingPin, INPUT);   // 右侧循迹传感器设置为输入模式
  pinMode(LeftObstacleAvoidancePin, INPUT);  // 左侧避障传感器设置为输入模式
  pinMode(RightObstacleAvoidancePin, INPUT); // 右侧避障传感器设置为输入模式
  Serial.begin(9600); // 初始化串口通讯,波特率为9600,用于输出数据
}

void loop() {
  LeftTracing = digitalRead(LeftTracingPin);  //获得左侧循迹数据
  RightTracing = digitalRead(RightTracingPin);//获得右侧循迹数据
  LeftObstacleAvoidance = analogRead(LeftObstacleAvoidancePin);   //读取左侧避障数据
  RightObstacleAvoidance = analogRead(RightObstacleAvoidancePin); //读取右侧避障数据
  Serial.print("左侧循迹:");
  Serial.print(LeftTracing);
  Serial.print("右侧循迹");
  Serial.print(RightTracing);
  Serial.print("左侧避障");
  Serial.print(LeftObstacleAvoidance);
  Serial.print("右侧避障");
  Serial.println(RightObstacleAvoidance);
}

代码详解

  • 引脚定义
    • LeftObstacleAvoidancePinRightObstacleAvoidancePin:分别用于连接左、右避障传感器,这些传感器会返回模拟信号,表示与障碍物的距离。
    • RightTracingPinLeftTracingPin:分别用于连接左右循迹传感器,返回的是数字量,表示是否检测到黑线(1或0)。
  • 设置输入模式:在 setup() 函数中,使用 pinMode() 函数将每个引脚设置为输入模式,以便Arduino能够从传感器读取数据。
  • 读取传感器数据,在 loop() 函数中,读取传感器数据:
    • digitalRead() 用于读取循迹传感器的数字信号,返回0或1,表示传感器检测到的状态。
    • analogRead() 用于读取避障传感器的模拟信号,返回0到1023之间的值,表示距离传感器检测到的距离。
  • 输出数据到串口监视器:通过 Serial.print()Serial.println() 函数,将传感器的状态输出到串口监视器,便于调试和查看数据

代码运行

  • 硬件连接:连接开发板与电脑,跳线连接设置为下载模式
  • 上传代码:打开Arduino IDE,将上述代码复制到编辑器中,选择正确的开发板类型和端口,然后点击“上传”按钮,代码将被上传到Arduino Nano。
  • 观察效果:上传完成后,串口查看器可以查看到循迹传感器和避障传感器的信号数值。

总结

通过这篇博客,我们介绍了Arduino平台的基础知识,重点介绍了Arduino Nano开发板和Arduino IDE编程环境,并展示了如何通过一段简单的代码控制LED灯的亮灭。如果您是刚接触单片机开发的初学者,希望这次小实验能点燃您对嵌入式开发的兴趣!

© 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协议的有限状态机模型。

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