当前位置:   article > 正文

《Arduino与LabVIEW开发实战》第1章 Arduino基础_arduino板接受labview发送的0-1023变化的数值来控制d9口led灯的亮度

arduino板接受labview发送的0-1023变化的数值来控制d9口led灯的亮度

第1章 Arduino基础

1.1 Arduino是什么

Arduino是什么?

根据维基百科,Arduino的定义如下:一种开源的单片机控制器,它使用Atmel AVR单片机,采用基于开放源代码的软硬件平台,构建开放源代码simple I/O接口板,并且具有使用类似Java,C语言的Processing/Wiring开发环境。

从维基百科对Arduino的定义中,我们可以知道Arduino不仅是一种基于Atmel AVR单片机的控制器,而且是一个开源系统,包含了硬件(Arduino控制板)、软件(Arduino IDE)以及开源社区。相比于Arduino硬件控制板,Arduino的软件及开源社区是Arduino的精髓所在。

自从2005年被推出以来,随着使用者和爱好者数量不断增加,Arduino控制器得到了快速发展。同时,Arduino设计团队不断推出各式各样、更加强大的Arduino控制器及Arduino扩展板,以满足不同使用者的应用需求。

截止到现在,Arduino开发团队已经推出的Arduino控制器有数十种之多,主要有Uno、Due、Leonardo、Mega 2560、Mega ADK、Micro、Mini、Nano、Ethernet、Esplora、ArduinoBT、Fio、Pro、LilyPad等。

除了Arduino官方设计和生产的Arduino控制器,还有很多Arduino兼容控制器。因为Arduino采用开源协议,任何人或公司均可以利用Arduino公布的文档来生产和销售Arduino控制器,唯一的要求是不能使用Arduino作为商标。

由于Arduino兼容控制器价格较低,受到国内外广大Arduino爱好者的欢迎,这从一定程度上降低了Arduino使用者的门槛和成本,进而让Arduino得到了极大推广。

目录

第1章 Arduino基础

1.1 Arduino是什么

1.1.1 Arduino控制器系列

1.1.2 Arduino Uno控制器

1.2 搭建Arduino开发平台

1.2.1 安装驱动

1.2.2 Arduino IDE的使用

1.2.3 第一个项目——Blink

1.2.4 Arduino程序框架

1.3 数字输入/输出

1.3.1 数字I/O的函数库

1.3.2 实验:百变流水灯

1.3.3 实验:“听话”的灯

1.4 模拟输入/输出

1.4.1 模拟I/O的函数库

1.4.2 实验:会呼吸的灯

1.4.3 实验:调光LED

1.5 串口通信

1.5.1 串口函数库的使用

1.5.2 实验:回音壁

1.5.3 实验:串口电压表

1.6 时间函数

1.6.1 时间函数库

1.6.2 实验:系统已运行时间


​​​​​​​

1.1.1 Arduino控制器系列

由于Uno为标准板,拥有Arduino所有的基本功能,所以使用最为广泛;Mega 2560拥有较多的输入/输出管脚,适用于需要较多管脚的大型项目或实验;Leonardo带有USB接口,适用于需要USB功能的应用;Mega ADK带有USB Host接口,可以连接Android手机;Due是Arduino第一款基于32位ARM Cortex-M3核心的控制板,拥有更快的速度和更大的存储容量。Arduino兼容控制板是Arduino控制板的重要组成部分,助推了Arduino开源硬件的发展,而且价格相对低廉,易于在购物网站购买。

基于以上原因,下面主要介绍Uno、Mega 2560、Leonardo、Mega ADK、Due和兼容控制器。开发者应根据自己的使用需要和项目的需求,选择合适型号的Arduino控制器或兼容控制器。

1.Arduino Uno

Arduino Uno是Arduino USB接口系列的最新型号,也是Arduino控制板使用最广泛的型号。

Uno的处理器核心是ATmega328,它包括14路数字输入/输出接口(其中6路可作为PWM输出),6路模拟输入,一个16MHz晶体振荡器,一个USB接口,一个电源插座,一个ICSP接口和一个复位按钮。Arduino Uno控制器如图1-1所示。

2.Arduino Mega2560

Arduino Mega2560也是采用USB接口的核心电路板,最大的特点就是具有多达54路数字输入/输出接口,特别适合需要大量I/O接口的设计。

Mega2560的处理器核心是ATmega2560,同时包含54路数字输入/输出接口(其中16路可作为PWM输出),16路模拟输入,4路UART接口,一个16MHz晶体振荡器,一个USB接口,一个电源插座,一个ICSP接口和一个复位按钮。Arduino Mega2560也兼容为Arduino Uno设计的扩展板。Arduino Mega2560控制器如图1-2所示。

3.Arduino Leonardo

Leonardo是Arduino家族的新成员,最大的特点是集成了USB驱动,可以模拟鼠标或键盘的功能,与Uno有同样的外观和接口,只是将方头USB换成了Micro USB。

Leonardo的处理器核心是ATmega32u4,拥有20路数字输入/输出接口(其中7路可作为PWM输出、12路可用于模拟输入),一个16MHz晶体振荡器,一个Micro USB接口,一个DC接口,一个ICSP接口和一个复位按钮。Arduino Leonardo控制器如图1-3所示。

4.Arduino Mega ADK

Arduino Mega ADK是采用USB接口的核心电路板,它与Mega2560最大的不同就是Mega ADK上多了用来与Android手机连接的一路USB主控制接口。

Mega ADK的处理器核心是ATmega2560,同时具有54路数字输入/输出接口(其中16路可作为PWM输出),16路模拟输入,4路UART接口,一个16MHz晶体振荡器,一个USB接口,一个电源插座,一个ICSP接口和一个复位按钮。Arduino Mega ADK控制器如图1-4所示。

5.Arduino Due

Arduino Due是第一块基于32位ARM核心的Arduino控制板,以满足需要更快速度和更大存储容量的Arduino控制板的应用需求。

Arduino Due的处理器核心是Atmel SAM3X8E,拥有54路数字输入/输出接口(其中12路可作为PWM输出),12路模拟输入,4路UART接口,一个USB OTG接口,两路DAC(数模转换),一个电源插座,一个JTAG接口,一个复位按键和一个擦写按键。Arduino Due控制器如图1-5所示。

Arduino Due与其他Arduino控制板的区别:1)使用32位ARM核心的处理器,比以往使用8位AVR核心的其他Arduino功能更加强大;2)84MHz的CPU时钟频率;3)96KB的SRAM;4)512KB的Flash;5)内部集成DMA控制器,极大地提高了运算速度。


注意 与其他Arduino有所区别,Arduino Due的工作电压为3.3V,I/O口可承载电压也为3.3V。如果使用过大的电压,比如5V加到一个I/O口,可能会损坏芯片。


6.Arduino兼容控制器

随着Arduino的不断发展,国内也出现了一大批制造Arduino兼容控制器的厂商,这也使得国内的爱好者能够以较为低廉的价格购买到Arduino兼容控制器及配件。而且在制造Arduino兼容控制器的时候,多数厂商也对Arduino原版控制器进行了合理优化和改进。

国内Arduino兼容控制器生产厂商主要有DFRobot、SeeedStudio(深圳矽递)、OpenJumper(成都智能盒子)、OCROBOT(杭州橡木桶科技)。它们生产的Arduino兼容控制器如图1-6~图1-9所示。

1.1.2 Arduino Uno控制器

Arduino Uno是Arduino的典型控制器,拥有Arduino所有的基本功能,使用最为广泛,而且本书的应用篇和项目篇都是基于Arduino Uno来设计的,所以接下来重点介绍Arduino Uno的硬件部分,其他型号Arduino控制板硬件介绍可以参考Arduino官方网站:www.arduino.cc。

截止到本书出版之际,Arduino Uno已经发布到第3版,最新版为Arduino Uno R3,其板载资源分布如图1-10所示。

1.控制器

❑处理器:ATmega328

❑工作电压:5V

❑输入电压:(推荐)7~12V

❑输入电压:(范围)6~20V

❑数字I/O接口:14路(其中6路作为PWM输出)

❑模拟输入接口:6路

❑I/O接口直流电流:40mA

❑3.3V接口直流电流:50mA

❑Flash Memory:32KB(ATmega328,其中0.5KB用于Bootloader)

❑SRAM:2KB(ATmega328)

❑EEPROM:1KB(ATmega328)

❑工作时钟:16MHz

2.电源

Arduino Uno可以通过3种方式供电,而且能自动选择供电方式。

❑外部直流电源通过电源插座供电。

❑电池连接电源连接器的GND和VIN引脚。

❑USB接口直接供电。

电源引脚说明:

❑VIN:当外部直流电源接入电源插座时,可以通过VIN向外部供电;也可以通过此引脚向Uno直接供电;VIN有电时将忽略从USB或者其他引脚接入的电源。

❑5V:通过稳压器或USB输出的5V电压,为Uno上的5V芯片供电。

❑3.3V:通过稳压器产生的3.3V电压,最大驱动电流50mA。

❑GND:电源负极。

3.存储器

ATmega328拥有片上32KB Flash,其中0.5KB用于Bootloader,同时还有2KB SRAM和1KB EEPROM。通常情况下,Arduino的存储空间即其主控芯片所集成的存储空间,也可以通过使用外设芯片的方式扩展Arduino的存储空间。

❑Flash:32KB。其中0.5KB分作BOOT区,用于储存引导程序,实现串口下载程序的功能,另外的31.5KB作为用户存储程序的空间,可以满足一般的应用设计。

❑SRAM:2KB。SRAM相当于计算机的内存,在CPU运算时,需要在其中开辟一定的存储空间。当Arduino断电或者复位后,其中的数据都会丢失。

❑EEPROM:1KB。EEPROM全称为电可擦写可编程只读存储器,是一种用户可更改的只读存储器,特点是Arduino断电或者复位后,其中的数据不会丢失。

4.输入/输出

❑14路数字输入/输出接口:工作电压为5V,每一路输出或输入的最大电流为40mA。每一路配置了20~50kΩ的内部上拉电阻(默认不连接)。除此之外,有些引脚有特定的功能,具体说明如下:

 ○串口信号RX(0号)和TX(1号):与内部ATmega16U2USB-to-TTL芯片相连,提供TTL电压水平的串口接收信号。

 ○外部中断(2号和3号):触发中断引脚,可设成上升沿、下降沿或同时触发。

 ○脉冲宽度调制PWM(3、5、6、9、10、11):提供6路8位PWM输出。

 ○SPI(10(SS),11(MOSI),12(MISO),13(SCK)):SPI通信接口。

 ○LED(13号):Arduino专门用于测试LED的保留接口,输出为高时点亮LED,反之,输出为低时熄灭LED。

❑6路模拟输入A0~A5:每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0~5V,可以通过AREF调整输入上限。除此之外,有些引脚有特定功能。

 ○TWI接口(SDA A4和SCL A5):支持通信接口(兼容I2C总线)。

❑AREF:模拟输入信号的参考电压。

❑Reset:信号为低时复位单片机芯片。

5.通信接口

❑串口:ATmega328内置的UART可以通过数字口0(RX)和1(TX)与外部实现串口通信;ATmega16U2可以通过访问数字口0和1实现USB上的虚拟串口。

❑TWI(兼容I2C)接口:A4(SDA)、A5(SCL),可用于TWI通信,兼容I2C通信。

❑SPI接口:10(SS)、11(MOSI)、12(MISO)、13(SCK),可用于SPI通信。

1.2 搭建Arduino开发平台

上一节讲解了Arduino控制器系列,其中重点介绍了Arduino Uno控制器的硬件资源,本节主要讲解驱动安装、Arduino IDE(集成开发环境)的使用,并且完成第一个项目——点亮Arduino上的LED。

要搭建Arduino开发平台,首先要从Arduino官网下载Arduino集成开发包,然后将其解压放置于C:\program files\路径下,并右击arduino.exe生成桌面快捷方式。Arduino集成开发环境下载地址:http://arduino.cc/en/Main/Software。

1.2.1 安装驱动

在将Arduino控制器第一次连接电脑时,系统会提示自动安装驱动程序,如果电脑联网则可能成功安装,否则需要人工引导安装驱动。此部分针对Windows系统,且第一次将Arduino控制器接入的情况。

使用USB线将Arduino连接至电脑的USB端口,电脑桌面右下角弹出正在安装驱动程序,一般情况下都不能成功安装驱动程序,如图1-11和图1-12所示。

这时打开设备管理器,可以看到有一个未成功安装的设备,右击选择更新驱动程序,目录选择Arduino IDE的drive目录,如图1-13和图1-14所示。

系统会弹出Windows安全窗口,单击“始终安装此驱动程序软件”,紧接着系统自动安装驱动程序,如图1-15所示。安装完成之后,即可在设备管理器中的端口下看到Arduino Uno设备,如图1-16和图1-17所示。

1.2.2 Arduino IDE的使用

运行Arduino IDE,弹出如图1-18所示的启动画面。过几秒之后,弹出Arduino IDE的主操作界面,并默认新建了一个以日期命名的程序文本,如图1-19所示。

在工具栏上,Arduino IDE提供了常用功能的快捷键。

❑校验(Verify):验证程序是否编写无误,如无误则编译该项目。

❑烧录(Upload):将编写的程序烧录到Arduino控制器上。

❑新建(New):新建一个项目。

❑打开(Open):打开一个项目。

❑保存(Save):保存当前项目。

❑串口监视器(Serial Monitor):用它可以查看串口发送和接收到的数据。

1.2.3 第一个项目——Blink

要想完成第一个项目,首先需要有一块Arduino控制板(此部分以Uno为例),使用USB线将Arduino控制板连接至电脑的USB端口,并成功完成驱动程序,然后打开Arduino IDE中的示例程序Blink。具体路径为"File"→"Examples"→"Basics"→"Blink",如图1-20所示。

示例Blink中的程序如代码清单1-1所示,此部分不做程序讲解,留在1.2.4小节讲解。

代码清单1-1:Blink程序代码

  1. int led = 13; // 定义数字口13作为LED灯的控制信号
  2. // 当Arduino重启之后,只执行一次
  3. void setup() {
  4. pinMode(led, OUTPUT); // 初始化引脚作为输出
  5. }
  6. // 此部分一直循环执行
  7. void loop() {
  8. digitalWrite(led, HIGH); // 点亮LED
  9. delay(1000); // 延时1秒
  10. digitalWrite(led, LOW); // 熄灭LED
  11. delay(1000); // 延时1秒
  12. }

然后在Arduino IDE中选择Arduino控制器的类型和Arduino控制器的串口号,控制器类型选择为Arduino Uno,具体路径为"Tools"→"Board"→"Arduino Uno",笔者的Arduino Uno在电脑上生成的串口号为COM5,所以选为COM5,如图1-21和图1-22所示。

最后点击编译按钮,编译无误,如图1-23所示。点击下载按钮,当下载完成(见图1-24)之后,我们就可以看到Arduino Uno控制板上的LED以1秒的速度在闪烁。到此,我们的第一项目——Blink就实现了,同样可以在其他型号的Arduino控制器上实现,只需要选择好相应的控制器类型即可。

1.2.4 Arduino程序框架

由以上的Blink示例程序,可以知道Arduino程序的基本框架由setup()和loop()两部分组成。

在Arduino控制器中程序运行时将首先执行setup()函数,然后执行loop()函数,并且不断循环执行loop()函数。每次Arduino上电或重启后,都会首先执行setup()函数,而且setup()函数只运行一次。setup()函数用于设置引脚的输入/输出类型、配置串口、引入类库文件、外围器件使用前的初始化等。loop()函数在程序运行过程中不断地循环,根据所编写的程序,完成指定的输入/输出功能。

在代码清单1-1中,首先在执行setup()函数的时候调用pinMode(led,OUTPUT)将LED灯的数字引脚D13设置为输出,然后进入loop()函数中,不断地循环执行digitalWrite(led,HIGH)、delay(1000)、digitalWrite(led,LOW)和delay(1000),依次实现点亮LED,延时1秒,熄灭LED,延时1秒,周而复始形成周期为两秒的闪烁灯。

1.3 数字输入/输出

1.3.1 数字I/O的函数库

Arduino数字I/O函数包括pinMode(pin,mode)、digitalWrite(pin,value)和digitalRead(pin,value),分别实现输入/输出设置、数字输出和数字输入的功能。

需要说明的是,数字I/O函数库的操作对象不仅仅是Arduino的数字I/O,还包括模拟输入的引脚。例如,在Arduino Uno控制器中,需要将模拟端口用作数字引脚,可以直接使用A0~A5,也可用D14~D19来指代模拟输入引脚A0~A5。

1.pinMode(pin,mode)

功能:将指定的引脚配置成输入或输出状态。

语法:pinMode(pin,mode)

参数:

pin:要设置模式的引脚。

mode:INPUT或OUTPUT。


注意 除了Arduino上的数字引脚外,模拟输入引脚也能用作数字引脚,如A0、A1。


2.digitalWrite(pin,value)

功能:从指定引脚写入HIGH或者LOW。

语法:digitalWrite(pin,value)

参数:

pin:引脚编号(如1,5,10,A0,A3)。

value:HIGH或LOW。

详细说明:

如果引脚被pinMode()配置为OUTPUT模式,其引脚上的电压将被设置为相应的值,HIGH为5V(3.3V控制板上为3.3V),LOW为0V。

如果引脚被pinMode()配置为INPUT模式,使用digitalWrite()写入HIGH值,将使能内部20kΩ上拉电阻,写入LOW将会禁用上拉。


注意 Arduino控制板上的数字13号引脚一般不用作数字输入,因为大部分的控制板上使用了一个LED与一个电阻连接到地。如果启动了内部的20kΩ上拉电阻,它的电压将在1.7V左右,而不是正常的5V,因为板载LED串联的电阻使电压降了下来,这意味着返回的值总是LOW。


3.digitalRead(pin)

功能:读取指定引脚的值,HIGH或LOW。

语法:digitalRead(pin)

参数:

pin:指定的引脚。

返回值:HIGH或LOW。


注意 如果引脚悬空,digitalRead()会返回HIGH或LOW(随机变化)。


1.3.2 实验:百变流水灯

1.实验目的

通过Arduino Uno的数字引脚D2~D7控制6个LED,按照我们的编程形成流水灯,学习pinMode(pin,mode)和digitalWrite(pin,value)的使用。

2.硬件连接

依次将6个LED的阳极(长管脚)通过220Ω的限流电阻接至Arduino Uno的D2~D7,阴极(短管脚)直接接至GND。硬件连接图如图1-25所示。

3.软件设计

通过数字输出digitalWrite(pin,value)对多个LED进行亮灭控制,从而形成流水灯,程序如代码清单1-2所示。

  1. 代码清单1-2:流水灯程序代码
  2. int lowestPin = 2; // 定义数字引脚2作为流水灯起始引脚
  3. int highestPin = 7; // 定义数字引脚7作为流水灯结束引脚
  4. void setup() {
  5. // 将数字引脚D2~D7初始化为输出
  6. for (int thisPin =lowestPin; thisPin <= highestPin; thisPin++) {
  7. pinMode(thisPin, OUTPUT); // 设置引脚为输出模式
  8. }
  9. }
  10. void loop() {
  11. // 由低到高依次点亮LED,延时1秒,熄灭LED
  12. for (int thisPin =lowestPin; thisPin <= highestPin; thisPin++) {
  13. digitalWrite(thisPin,HIGH);
  14. delay(1000);
  15. digitalWrite(thisPin,LOW);
  16. }
  17. // 由高到低依次点亮LED,延时1秒,熄灭LED
  18. for (int thisPin =highestPin; thisPin <= lowestPin; thisPin--) {
  19. digitalWrite(thisPin,HIGH);
  20. delay(1000);
  21. digitalWrite(thisPin,LOW);
  22. }
  23. }

1.3.3 实验:“听话”的灯

1.实验目的

通过Arduino Uno的数字引脚D2读取按键,实现对D13上LED的控制。学习pinMode(pin,mode)、digitalWrite(pin,value)和digitalRead(pin)的使用。

2.硬件连接

将按键的一端通过220Ω的下拉电阻接至GND,另一端直接接至+5V,Arduino Uno的D2接至按键接有下拉电阻[1]的一端,硬件连接图如图1-26所示。

3.软件设计

通过数字输出digitalWrite(pin,value)和数字输入digitalRead(pin),利用按键控制LED的亮灭,程序如代码清单1-3所示。

  1. 代码清单1-3:“听话”的灯程序代码
  2. int led = 13; // 定义数字引脚13作为LED的控制引脚
  3. int key = 2; // 定义数字引脚2作为按键的读取引脚
  4. int t = 0; // 定义状态变量,记录按键状态
  5. // 当Arduino重启之后,只执行一次
  6. void setup() {
  7. pinMode(led, OUTPUT); // 初始化引脚13作为输出
  8. pinMode(key, INPUT); // 初始化引脚2作为输入
  9. }
  10. // 此部分一直循环执行
  11. void loop() {
  12. t=digitalRead(key); // 读取按键状态
  13. if(t==1){ // 判断按键是否为闭合状态
  14. digitalWrite(led, HIGH); // 闭合状态,点亮LED
  15. }else
  16. digitalWrite(led, LOW); // 断开状态,熄灭LED
  17. }

[1]由于下拉电阻的一端接至地端,因而叫作下拉电阻,即将电路节点的电平向低方向(地)拉。下拉电阻的主要作用是在电路驱动器(此处为按键)断开时给线路(节点)以一个固定的低电平。

1.4 模拟输入/输出

1.4.1 模拟I/O的函数库

Arduino模拟I/O函数包括analogRead(pin)、analogWrite(pin,value)和analogReference(type),分别实现读取模拟量、PWM输出和设置参考电压的功能。

需要说明的是,模拟I/O函数库的操作对象仅仅为Arduino模拟输入引脚,如A0、A1等。同时,根据所选用的Arduino控制板不同,可用的模拟引脚数也不同。

1.analogRead(pin)

功能:从指定的模拟引脚读取数据值。

语法:analogRead(pin)

参数:

pin:模拟输入引脚(Uno:A0~A5,Mini、Nano:A0~A7,Mega:A0~A15)。

返回值:0~1023的整数值。

详细说明:

Arduino Uno拥有6路模拟输入:标号A0~A5,每一路具有10位的分辨率[1](即输入有1024个不同值),默认输入信号范围为0~5V,输入范围和最小分辨率可以通过analogReference(type)来设置。若参考电压为5V,则最小分辨率约为4.88mV。

在使用analogRead()前,不需要调用pinMode()来设置引脚为输入引脚。如果模拟输入引脚没有接入稳定的电压值,analogRead()返回值将由外界的干扰而决定,这个一般用来产生随机数。

2.analogWrite(pin,value)

功能:从指定的引脚输出模拟值(PWM)。

语法:analogWrite(pin,value)

参数:

pin:指定的引脚号。

value:0(完全关闭)~255(完全打开)。

详细说明:

在使用analogWrite()前,不需要调用pinMode()来设置引脚为输出引脚。

analogWrite()执行之后,指定引脚上将产生一个稳定的特殊占空比方波,PWM信号频率大约为490Hz,占空比为value/255,对应的电压值为value/255×5。

3.analogReference(type)

功能:配置模拟输入的参考电压(输入电压的最大值)。

语法:analogWrite(pin,value)

参数:

type:参考电压类型(DEFAULT、INTERNAL、INTERNAL1V1、INTERNAL2V56,或者EXTERNAL)。

参考电压类型的具体说明如下:

❑DEFAULT:默认5V(Arduino AVR控制器)或3.3V(Arduino Due控制器)为基准电压。

❑INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,在ATmega8上以2.56V为基准电压(Arduino Mega无此选项)。

❑INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)。

❑INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)。

❑EXTERNAL:以AREF引脚(0~5V)的电压作为基准电压。


注意 AREF引脚上的电压必须在0~5V,不得小于0V或超过5V。如果使用AREF引脚上的电压作为参考电压,在调用analogRead()前必须将参考电压的类型设置为EXTERNAL。在改变参考电压后,之前从analogRead()读取的数据可能不准确。


[1]分辨率是ADC的一个重要指标,一般以位数来说明,比如为N位,就是将参考电压分成2的N次方份,每一份即可以测量的最小变化量。以AVR单片机为核心的Arduino控制板ADC的位数为10位,如果参考电压为5V,则可分辨的最小电压是0.00488V,约0.005V。

1.4.2 实验:会呼吸的灯

1.实验目的

会呼吸的灯,简而言之就是亮度由暗逐渐变亮,由亮逐渐变暗的LED,视觉效果上像在呼吸一样。通过Arduino Uno带有PWM(~)功能的数字引脚3控制LED产生由暗逐渐变亮,由亮逐渐变暗的呼吸灯效果。

2.硬件连接

将LED的阴极接至GND,阳极接至Arduino Uno带有PWM(~)功能的数字引脚3。硬件连接图如图1-27所示。

3.软件设计

通过模拟输出analogWrite(pin,value)对LED的亮度进行控制,从而形成呼吸灯,程序如代码清单1-4所示。

  1. 代码清单1-4:会呼吸的灯程序代码
  2. int PWM_Pin = 3; // 定义数字引脚3作为LED亮度的控制引脚
  3. void setup() {
  4. pinMode(PWM_Pin, OUTPUT); // 将数字引脚3设置为输出状态
  5. }
  6. void loop() {
  7. // 将LED的亮度由熄灭逐渐调高至全亮
  8. for (int brightness = 0; brightness <= 255; brightness++) {
  9. analogWrite(PWM_Pin, brightness);
  10. delay(5);
  11. }
  12. // 将LED的亮度由全亮逐渐调低至熄灭
  13. for (int brightness = 255; brightness >= 0; brightness--) {
  14. analogWrite(PWM_Pin, brightness);
  15. delay(5);
  16. }
  17. // 中间间断500毫秒
  18. delay(500);
  19. }

1.4.3 实验:调光LED

1.实验目的

通过Arduino Uno的模拟引脚A0读取电位器的分压,实现对数字引脚D3上LED亮度的控制。学习analogWrite(pin,value)和analogRead(pin)的使用。

2.硬件连接

将LED的阴极串联220Ω的限流电阻接至GND,阳极(长管脚)接至Arduino Uno带有PWM(~)功能的数字引脚D3。将旋转电位器的两端接至+5V和GND,中间端接至模拟端口A0。硬件连接图如图1-28所示。

3.软件设计

通过模拟输入analogRead(pin)和模拟输出analogWrite(pin,value),利用电位器对LED的亮度进行控制,程序如代码清单1-5所示。

  1. 代码清单1-5:调光LED程序代码
  2. int sensorPin = A0; // 定义模拟引脚A0作为电位器的读取引脚
  3. int ledPin = 3; // 定义数字引脚3作为LED亮度的控制引脚
  4. int sensorValue = 0;
  5. void setup() {
  6. //将LED引脚设置为输出状态
  7. pinMode(ledPin, OUTPUT);
  8. }
  9. void loop() {
  10. sensorValue = analogRead(sensorPin); // 读取电位器的分压值的数字量(01023)
  11. analogWrite(ledPin,sensorValue/4);
  12. // 将电位器的分压值的数字量(01023)缩小4倍,转换为模拟输出量(0255),来调节LED的亮度
  13. }

1.5 串口通信

一条信息的各位数据逐位按顺序传送的通信方式称为串口通信。串口通信的特点是:数据位传送,即数据传送按位顺序进行,最少只需一根传输线即可完成,成本低但传送速度慢。

Arduino Uno控制板除了有14个数字接口和6个模拟接口外,还有1个更为常用的串口。在实际应用中,串口以只需要少量的几根线就能和其他串口设备通信的优势而被广泛应用。

所有的Arduino控制板至少都有一个串口,可以用于Arduino控制板与计算机或其他Arduino控制板等设备之间的通信。一般Arduino控制板上的数字引脚0(RX)和1(TX)都默认通过USB/串口转换芯片连接至板载的USB端口,通过USB线将其连接至计算机的USB端口,就可以实现Arduino控制板与计算机的串口通信。

Arduino Mega有三个额外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。

Arduino Leonardo控制板使用Serial 1通过0(RX)和1(TX)实现串口通信。Serial已预留给鼠标与键盘模拟库,以实现USB CDC通信。

若要使用Arduino Mega上的另外三个串口与个人电脑通信,你需要一个额外的USB转串口适配器,因为这三个串口没有连接到Mega上的USB转串口适配器。若要用它们来与外部的TTL串口设备进行通信,将TX引脚连接到串口设备的RX引脚,将RX引脚连接到串口设备的TX引脚,将GND连接到串口设备的GND。(不要将这些引脚直接连接到RS-232串口,RS-232串口的工作电压为±12V,可能会损坏Arduino控制板。)

1.5.1 串口函数库的使用

1.Serial.begin(speed)

功能:串口通信初始化。

语法:Serial.begin(speed)

参数:

speed:波特率。

详细说明:

将串行数据传输速率设置为位每秒(波特率)。常用的波特率有300、1200、2400、4800、9600、14400、19200、28800、38400、57600或115200。与计算机进行通信时,可以使用这些波特率,也可以指定其他波特率,需要说明的是,通信双方的波特率需要相同。

2.Serial.available()

功能:获取从串口读取有效的字节数(字符),这是已经传输并存储在串行接收缓冲区(最大能够存储64个字节)的数据。

语法:Serial.available()

返回值:可读取的字节数。

详细说明:

一般情况下,Serial.available()用于读取串口数据时,用来判断串口缓冲区中是否有数据,常用的有if(Serial.available())>0)和while(Serial.available()>0)两种。


注意 Arduino在使用串口时,会在SRAM中开辟一段大小为64B的空间,串口接收到的数据都会暂时存储在这个空间中,这个存储空间称为串口缓冲区。当调用Serial.read()语句时,Arduino便会从串口缓冲区取出一个字节的数据,同时将被读取的数据从缓冲区内删除。


3.Serial.read()

功能:从串口缓冲区内读取一个字节的数据。

语法:Serial.read()

返回值:传入的串口数据的第一个字节(如果没有可用的数据,则返回-1)。

详细说明:

读取传入串口的数据,调用一次只能读取一个字节的数据,而且会将被取的数据从缓冲区内删除。

4.Serial.write()

功能:写入二进制数据到串口。

语法:Serial.write(val)、Serial.write(str)或Serial.write(buf,len)

参数:

val:以单个字节形式发送的值。

str:以一串字节的形式发送的字符串。

buf:以一串字节的形式发送的数组。

len:数组的长度。

返回值:

输出的字节数,但是否使用这个数字是可选的。

详细说明:

发送的数据以一个字节或者一系列的字节为单位。如果写入的数字为字符,需使用print()命令进行代替。

5.Serial.print()和Serial.println()

功能:以人们可读的ASCII文本形式输出数据到串口。Serial.println()除了输出人们可识别的ASCII码文本之外,还输出回车符(ASCII 13,或'\r')及换行符(ASCII 10,或'\n')。

语法:

  1. Serial.print(val)或Serial.print(val,format)
  2. Serial.println(val)或Serial.println(val,format)

参数:

val:输出的内容,任何数据类型都可以。

format:指定基数(整数数据类型)或小数位数(浮点类型)。

详细说明:

此命令可以采取多种形式,每个数字的输出使用的是ASCII字符;浮点类型同样输出的是ASCII字符,默认保留到小数点后两位;bytes类型则输出单个字符;字符和字符串原样输出。只是Serial.print()输出数据不换行,Serial.println()输出数据自动换行。

例如:

❑Serial.print(78)输出为"78"

❑Serial.print(1.23456)输出为"1.23"

❑Serial.print("N")输出为"N"

❑Serial.print("Hello world.")输出为"Hello world."

另外,还可以定义输出为几进制(格式),可以是BIN(二进制或以2为基数),OCT(八进制或以8为基数),DEC(十进制或以10为基数),HEX(十六进制或以16为基数)。

例如:

❑Serial.print(78,BIN)输出为"1001110"

❑Serial.print(78,OCT)输出为"116"

❑Serial.print(78,DEC)输出为"78"

❑Serial.print(78,HEX)输出为"4E"

对于浮点类型数字,可以指定输出的小数位数。

例如:

❑Serial.println(1.23456,0)输出为"1"

❑Serial.println(1.23456,2)输出为"1.23"

❑erial.println(1.23456,4)输出为"1.2345"

6.Serial.end()

功能:停止串行通信,使RX和TX引脚用于普通的输入/输出。

语法:

Serial.end()

说明:

当停止串口通信之后,若需要重新启用串行通信,则用Serial.begin()实现串口的初始化。一般情况下,使用Arduino串口通信时,串口不再用作其他功能。

1.5.2 实验:回音壁

1.实验目的

本实验通过Arduino Uno来实现一个回音壁。在计算机上通过串口助手或者Arduino IDE自带的串口监控串口,向Arduino Uno发送一个字符,Arduino Uno就会立即返回我们发送的数据,形成回音壁的效果。

2.硬件连接

此实验仅需要利用USB线将Arduino控制板与计算机的USB端口连接起来即可。

3.程序设计

通过串口字节数函数Serial.available()来判断是否有串口数据,如有数据则通过串口读取函数Serial.read()读出串口数据,并调用Serial.write(val)将读取的数据发送出去,程序如代码清单1-6所示。

  1. 代码清单1-6:回音壁程序代码
  2. void setup() {
  3. // 初始化串口波特率为9600
  4. Serial.begin(9600);
  5. }
  6. void loop() {
  7. while(Serial.available()) // 判断串口缓冲区是否有数据
  8. {
  9. char c = Serial.read(); // 从串口缓冲区读取一个字节的数据
  10. Serial.write(c); // 将读取的数据通过串口发送
  11. }
  12. }

1.5.3 实验:串口电压表

1.实验目的

本实验通过Arduino Uno模拟输入端口采集电压值,通过串口发送至计算机。在计算机上通过串口助手或者Arduino IDE自带的串口监控串口,可以看到当前所测量的电压值。

2.硬件连接

硬件连接图如图1-29所示。采用电位器实现0~5V电压的调节。电位器两端引脚分别接至+5V和GND,中间引脚接至Arduino Uno控制板的模拟输入端口A0。

3.程序设计

通过模拟输入函数analogRead(pin)读取电位器的分压,并利用Serial.println(val)将分压值由串口发送出去,程序如代码清单1-7所示。

  1. 代码清单1-7:串口电压表程序代码
  2. int sensorValue=0; // 定义变量,用于存放模数转换数字量
  3. float float_sensorValue; // 定义变量,用于存放浮点类型电压值
  4. void setup() {
  5. Serial.begin(9600); // 定义串口波特率为9600
  6. }
  7. void loop() {
  8. sensorValue = analogRead(A0); // 读取A0端口电压值
  9. float_sensorValue=(float)sensorValue/1023*5.00; // 换算为浮点类型电压值
  10. Serial.println(float_sensorValue,2); // 保留两位小数发送数据
  11. delay(1000); // 一秒刷新一次
  12. }

1.6 时间函数

1.6.1 时间函数库

Arduino时间函数包括millis()、micros()、delay()和delayMicroseconds(),分别实现程序运行时间和延时的功能。在使用16MHz晶体振荡器的Arduino控制器上精度为4微秒;在使用8MHz晶体振荡器的Arduino控制器上精度为8微秒。

1.程序运行的时间

使用运行时间函数,能获取Arduino通电后(或复位后)到现在的时间。

(1)millis()

返回系统运行时间,单位毫秒。

返回值是unsigned long类型,大概50天会溢出一次。

(2)micros()

返回系统运行时间,单位微秒。

返回值是unsigned long类型,大约70分钟会溢出一次。

2.延时函数

使用延时函数会暂停程序,满足程序执行的延时需要,例如等待数据返回,可以通过参数设定延时时间。

(1)delay()

延时单位毫秒。

参数数据类型为unsigned long类型。

(2)delayMicroseconds()

延时单位微秒。

参数数据类型为unsigned int类型。

1.6.2 实验:系统已运行时间

1.实验目的

本实验利用时间函数实现延时和获取系统运行时间,并通过串口将程序运行时间发送至计算机。在计算计上通过串口助手或者Arduino IDE自带的串口监控串口,可以看到系统已运行时间。

2.硬件连接

此实验仅需要利用USB电线将Arduino控制板与计算机的USB端口连接即可。

3.程序设计

程序如代码清单1-8所示,程序将系统运行时间输出到串口,可以通过串口监视器观察到程序运行时间。

  1. 代码清单1-8:系统运行时间程序代码
  2. unsigned long time1;
  3. unsigned long time2;
  4. void setup(){
  5. Serial.begin(9600);
  6. }
  7. void loop(){
  8. time1 = millis();
  9. time2 = micros();
  10. // 输出系统运行时间
  11. Serial.print(time1=);
  12. Serial.println(“ms”);
  13. Serial.print(time2=);
  14. Serial.println(“us”);
  15. // 等待1
  16. delay(1000);
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/67646
推荐阅读
相关标签
  

闽ICP备14008679号