Arduino基础与进阶

内容包括Arduino详细介绍,开发环境搭建,第三方库加载方法(以定时器TimerOne为例),通信教程,汽车模块BDU电池检测实例,知识产权保护等。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!

目录:

一、概述

1、关于Arduino

2、Arduino简介

3、Arduino内部结构

二、Arduino编程

1、Arduino开发环境

2、Arduino语言概述

3、Arduino基本函数

1)I/O操作函数   2)模拟I/O操作函数   3)高级I/O   4)shiftOut(dataPin,clockPin,bitOrder,val)   5)pulseIn(pin,state,timeout)

6)时间函数   7)中断函数   8)串口收发函数   9)等比映射函数   10)函数使用查询

4、Arduino内存优化

1)串口监视输出用   2)将常量存入Flash   3)全局变量与局部变量   4)尽量使用占用内存少的数据类型

5、第三方库 

1)通过“库管理器”   2)通过“.zip库”   3)设置库位置   4)加载库的学习

三、Arduino通信教程

1、SPI通信

2、红外通信 

3、WiFi通信

4、蓝牙通信

四、Arduino实验

1、接收串口数据并显示

2、实战库仑计(电池电量计)

1)项目简介   2)硬件连接   3)资料下载   4)加载到Arduino

五、Arduino知识产权保护

1、在Arduino IDE上生成.hex文件

2、将Hex烧录进Arduino板子

六、Arduino定时器

1、定时器介绍

2、定时器的使用

1)硬件连接   2)库文件下载   3)代码


一、概述

1、关于Arduino

①当我们学习做一些东西时,会发现基础的单片机编程较为复杂。需要直接操作寄存器、处理中断、定时器等,所需时间也长。在这种情况下Arduino应运而生,它是将单片机的使用与控制高度封装后产生的一个平台。注意:它是一个平台,不是指某一种单片机。

②Arduino的官方编辑器,没有代码提示功能,很多时候会因为大小写的错误导致调用函数无效。最糟糕的是没有代码跳转功能,不能设置断点,调试困难。只要修改项目,就得编译一堆库,编译时间长,效率低下。做个项目手都敲的累。

③第三方开发工具的下载与使用移步:Visual Studio 2022开发Arduino详述

④中文社区:https://www.arduino.cn/

⑤在线模拟网站:https://wokwi.com/

⑥Arduino开发板上标识的输出端口号与其AVR单片机自身端口号不一定一致。

2、Arduino简介

Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。以下介绍几个较典型的开发板。

1) Arduino Uno

Uno的处理器核心是ATmega328,同时具有14路数字输入/输出口(其中6路可作为PWM输出)、6路模拟输入、一个16MHz晶体振荡器、一个USB接口、一个电源插座、一个ICSP header和一个复位按钮。

硬件端口描述,如上图。

DIGITAL-PWM~:普通数字口,~PWM输出口;

POWER:电源;

ANALOG IN:模拟输入口,可配置为数字口。

2)Arduino Mega 2560

Arduino Mega 2560是采用USB接口的核心电路板,具有54路数字输入/输出,适合需要大量I/O接口的设计。处理器核心是ATmega 2560,同时具有54路数字输入∕输出口(其中16路可作为
PWM输出)、16路模拟输入、4路UART接口、一个16MHz晶体振荡器、一个USB接口、一个电源插座、一个ICSP header和一个复位按钮。Arduino Mega 2560也能兼容为Arduino Uno设计的扩展板。

3)Arduino Nano

Arduino Nano是Arduino USB接口的微型版本,其处理器核心是Atmega 168(Nano2.x)和Atmega 328(Nano3.0),同时具有14路数字输入∕输出口(其中6路可作为PWM输出)、8路模拟输入、一个16MHz晶体振荡器、一个Mini-B USB接口、一个ICSP header和一个复位按钮。

4)Arduino Leonardo

Arduino Leonardo是基于ATmega32U4的一个微控制器板。它有20个数字输入/输出引脚(其中7个可用于PWM输出、12个可用于模拟输入)、一个16 MHz的晶体振荡器、一个Micro USB接口、一个DC接口、一个ICSP接口以及一个复位按钮。

5)Arduino扩展板

较典型的是Proto Shield原型扩展板、GPRS Shield扩展板、Arduino Ethernet W5100 R3 Shield网络扩展板、WizFi210扩展板、Arduino L298N电机驱动扩展板、Arduino传感器扩展板等。

3、Arduino内部结构

Arduino平台的基础就是AVR指令集的单片机,因此认清Arduino之前需要了解什么是单片机。移步“单片机、PLC、PLD”专栏,不再赘述。

二、Arduino编程

1、Arduino开发环境

Arduino集成开发环境(IDE)是一个在计算机里运行的软件,可以上传不同的程序,而Arduino的编程语言也是由Processing语言改编而来的。Arduino没有程序跳转功能、单步执行等,不好调试,推荐使用第三方工具,比如Visual Micro。

几点注意:

①每次打开串口监视器,相当于对开发板做一次软复位。

②Arduino文件名不能有空格。 

2、Arduino语言概述

基本同C语言,移步“编程类”专栏,不再赘述。

3、Arduino基本函数

1)I/O操作函数

① pinMode(pin,mode),将制定的针脚配置成输出或输入,模拟I/O无需定义。注意:模拟输入口也能当作数字口使用。

② digitalWrite(pin,value),给一个数字针脚写入HIGH或者LOW。注意:数字13号针脚难以作为数字输入使用,因为大部分的控制板上使用了一颗LED和一个电阻与其连接。

③ int digitalRead(pin),读取指定针脚的值,HIGH或LOW。

---------------------------------

2)模拟I/O操作函数

① analogReference(type),设定用于模拟输入的基准电压(输入范围的最大值)。

② analongRead(),从指定的模拟引脚读取数值。

③ analogWrite(),从一个针脚输出模拟值(脉冲宽度调整,Pulse Width Modulation,PWM),让LED以不同的亮度点亮或驱动电机以不同速度旋转。

---------------------------------

3)高级I/O

① tone(),在一个针脚上产生一个特定频率的方波(50%占空比)。

注意:如果要在多个针脚是产生不同的音调,则要在对下一个针脚使用tone()函数前,先使用noTone()函数。

② noTone()

③ ShiftOut(),将数据的一个字节一位一位地移出。

④ shiftIn(),将数据的一个字节一位一位地移入。

⑤ pulseIn(),读取一个针脚的脉冲(HIGH或LOW)。

---------------------------------

4)shiftOut(dataPin,clockPin,bitOrder,val)

shiftOut函数能够将数据通过串行的方式在引脚上进行输出,相当于一般意义上的同步串行通信。

---------------------------------

5)pulseIn(pin,state,timeout)
pulseIn函数用于读取引脚脉冲的时间长度,而脉冲可以是HIGH或LOW。

---------------------------------

6)时间函数

① Millis(),返回Arduino开发板运行当前程序开始的毫秒数。

② micros(),返回Arduino开发板从运行当前程序开始的微秒数,这个数字将在约70分钟后溢出(归零)。

③ delay(),程序设定的暂停时间(单位毫秒)。

④ delayMicroseconds(),使程序暂停指定的一段时间(单位ms)。

---------------------------------

7)中断函数

① 外部中断函数

attachInterrupt(interrupt,function,mode),当发生外部中断时,调用一个指定的函数。

注意:中断函数中,delay()不会生效,millis()的数值不会持续增加。当中断发生时,串口收到的数据可能会遗失。在中断函数里面使用到的全局变量应该声明为volatile变量。

detachInterrupt(interrupt),关闭给定的中断。

② 中断使能函数

interrupts(中断),重新启用中断(使用noInterrupts()命令后将被禁用)。

noInterrupts(),禁止中断。

---------------------------------

8)串口收发函数

① Serial.begin(speed),将串行数据传输速率设置为bit/s(波特)。

② int Serial.available(),从串口读取有效的字节数(字符)。

③ int Serial.read(),读取传入的串口的数据,read()继承自Stream类。

④ Serial.flush(),等待超出的串行数据完成传输(在1.0及以上的版本中,flush()语句的功能不再是丢弃所有进入缓存器的串行数据)。

⑤ Serial.print(data),以ASCII文本形式打印数据到串口输出。

⑥ Serial.println(data),打印数据到串行端口,输出人们可识别的ASCII码文本并回车(ASCII13,或"\r")及换行(ASCII10,或"\n")

---------------------------------

9)等比映射函数

map()可以用来将某一数值从一个区间等比映射到一个新的区间。

map (x, in_min, in_max, out_min, out_max)

---------------------------------

10)函数使用查询

全部Arduino函数参见http://www.arduino.cc,或者http://www.taichi-maker.com之Arduino开发之Arduino编程。

4、Arduino内存优化

1)串口监视输出用

Serial.println("Test");  //Test存入SRAM
Serial.println(F("Test"));  //Test存入Flash

---------------------------------

2)将常量存入Flash

const int a=125;  //125存入SRAM
const int PROGMEM a=125;  //125存入Flash

---------------------------------

3)全局变量与局部变量

局部变量共享SRAM,全局变量独享SRAM。尽量多使用局部变量代替全局变量。

---------------------------------

4)尽量使用占用内存少的数据类型

bool a;  //1个位
byte a  //1个字节
int a;  //2个字节

5、第三方库

1)通过“库管理器”

---------------------------------

2)通过“.zip库”

---------------------------------

3)设置库位置

---------------------------------

4)加载库的学习

我们可以通过示例查看代码。

 也可以在库安装目录内查看。

.md文件详细描述了当前库文件的内容。若用Windows自带词本打开,不好阅读。

推荐Notepad++,文字不至于连成一串。 

三、Arduino通讯教程

1、SPI通信

2、红外通信

3、WiFi通信

4、蓝牙通信

相关例程移步:https://download.csdn.net/download/liht_1634/86814659

四、Arduino实验

1、接收串口数据并显示

​​void setup()  // setup函数只运行一次
{
  Serial.begin(9600);
  Serial.println("Input Data:");
}

int RecieveData; //int型数据将显示ascii码,改为char即可
void loop()  // loop函数会一直循环运行
{
  if(Serial.available()>0)
  {
    RecieveData = Serial.read();
    Serial.println(RecieveData);
    delay(10);
  }
}

缓冲器中有“2”和“3”,返回值的数量:2,先读取第1个返回值“2”。

 缓冲器中只有“3”,返回值的数量:1,读取第2个返回值“3”。

空缓冲器返回“-1”。

2、实战库仑计(电池电量计)

1)项目简介

本项目用于汽车模块BDU电池检测,检量电池包(详述移步:新能源汽车的充电)电压、电流和功率,0.3%电流和电压精度。并由Linduino One(DC2026C)发送给上位机。在ADI官网搜索“LTC2949”可获取有关资料。

LTC2949_Overview P2

---------------------------------

2)硬件连接

LTC2949芯片的isoSPI与LTC6820(DC1941D)连接,

LTC2949_cn P71

由LTC6820(DC1941D)转为4线SPI,再与Linduino One(DC2026C)通信。由Linduino One(DC2026C)与电脑通信。

---------------------------------

3)资料下载

ADI官网搜素“Linduino”,如下图。

资料可以在相关链接中下载,特别留意“sketchbook”为代码,其中没有LTC2949代码库。含有LTC2949库移步:LTC2949 library

Linduino One(DC2026C)与LTC6820(DC1941D)硬件资料:硬件资料下载

DC2732A(LTC2949HLXE)原理图下载:DC2732A(LTC2949HLXE)原理图

正确加载后如下图所示。

---------------------------------

4)加载到Arduino

(1)硬件设置

可知与Arduino Uno兼容,在IDE中需选择“Arduino Uno”。

(2)代码导入

五、Arduino知识产权保护

产品设计公司使用Arduino开发了一些产品,卖给客户,遇到产品需要升级的时候又不想提供源代码,既要保护知识产权又要烧录程序,提供如下解决方案。

1、在Arduino IDE上生成.hex文件

1)首先,使用“Arduino IDE”软件打开源文件,即.ino文件。

2)跳转到Sketch > Export compiled Binary。

3)等文件编译转换完成后,跳转至Sketch > Show Sketch Folder。

4)此时弹出窗口的文件夹中应该有两种文件:.ino和.hex文件,选取生成的.hex文件。

2、将Hex烧录进Arduino板子

把上一步骤生成的.hex文件导入 “Arduloader” 软件进行烧录,步骤如下图所示。
“Arduloader”是一款.hex文件烧录工具,支持所有hex格式程序烧录,选择要烧录的hex文件,所使用的COM串口,选择硬件型号,Upload烧录即可。

六、Arduino定时器

1、定时器介绍

UNO和NANO都使用的是ATmega328芯片,这款芯片有3个定时器,Timer0、Timer1、Timer2,其中Timer0和Timer2都是8位寄存器(256)、Timer1是16位寄存器(65536),意味着更高的分辨率。

mege2560使用的是ATmege2560芯片,这款芯片有6个定时器,在328的基础上,增加了Timer3、Timer4、Timer5。这三个定时器都是16位寄存器,如下图。

定时器位数封装函数mega2560引脚对应
Timer08bitdelay() , millis() 和 micros()等4,13
Timer116bitUNO的servo库11,12
Timer28bittone()等9,10
Timer316bit2,3,5
Timer416bit6,7,8
Timer516bitmega2560的servo库46,45,44

2、定时器的使用

1)硬件连接

本处我们使用A0口输出,接LED指示灯。LED+接A0口,LED-接GND,如下图所示。

---------------------------------

2)库文件下载

可以到网上下载TimerOne, TimerThree等库文件,TimerOne.h就对应为timer1定时器。

TimerOne.h的下载链接:TimerOne-1.1.0.zip,下载不了移步:Arduino之TimerOne定时器库

---------------------------------

3)代码

#include<TimerOne.h>
#define LedState digitalRead(A0)  //读出引脚A0的状态

int count=1; //记录定时次数
void setup() 
{
  pinMode(A0,OUTPUT);  //定义模拟口A0为数字输出口
  Timer1.initialize(10000);  //设置中断速度10mS
  Timer1.attachInterrupt(LedFlash);  //关联中断函数
  interrupts(); //开启中断
}

void LedFlash()
{
  count++;
  
  if(count>=100)
  {
    count=1;
    digitalWrite(A0,!LedState); //10mS*100=1S,LedState改变一次
  }
}

void loop() 
{
  
}

路,还得一个人走,任谁也帮不了谁。远方再远,慢慢走,总会到…… 觉得不错,动动发财的小手点个赞哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上电路设计

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值