Arduino与LabVIEW开发实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-22 02:15:24

点击下载

作者:沈金鑫

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Arduino与LabVIEW开发实战

Arduino与LabVIEW开发实战试读:

前言

Arduino是开源硬件的典型代表。Arduino控制器板卡、简单易用的Arduino IDE,以及Arduino简单易懂的语言,淡化了单片机底层硬件的知识,极大地简化了单片机的软硬件设计,让很多不懂单片机等底层硬件的科技爱好者也可以进行电子制作。同时社区论坛中很多爱好者制作的参考示例可供参考使用,而且社区论坛和参考示例也在不断地增加。

LabVIEW是图形化编程软件的代表,采用图形化编程语言进行软件设计,具有表达形象、易于阅读、便于理解的优点。只需要选择合适的控件并合理布局,很轻松地就可以构建出一个漂亮的仪器仪表界面;框图编程部分采用直观的连线方式实现函数之间的数据传递。同时拥有大量的操作面板控件和不同功能的函数库,可供大家调用。

Arduino和LabVIEW将复杂烦琐的单片机设计和软件设计变得简单化,更加亲民、易于接受和学习;同时Arduino控制器需要简单易用的上位机软件,实现较为复杂的运算与显示功能;LabVIEW软件需要性价比高的下位机,负责采集数据和输出执行的任务;如果将两者结合起来组成上下位机系统,各司其职,分工协作,即可实现两者的功能互补。本书讨论的主要内容正是如何使用Arduino控制器和LabVIEW软件,并将两者有机结合起来,做出基于Arduino控制器与LabVIEW软件的实际应用和项目。

目标读者

本书适合大中专院校的仪器仪表类、电子类、通信类、计算机类等专业学生阅读,还适合Arduino学习者、LabVIEW学习者以及渴望利用Arduino与LabVIEW实现自己想法的创客们。

关于本书

我在南京理工大学攻读硕士学位时,跟随导师采用LabVIEW软件来完成科研课题,发现很多课题之中都有数据采集需求,而且对采样速率和采样精度的要求不高,但却需要花费几万元去购买NI公司的数据采集卡,这极大地限制了在对成本敏感的项目中使用LabVIEW软件。此后,我就开始自己采用单片机搭配高性能的A/D芯片制作简易的数据采集设备,以满足低速、低成本的数据采集任务,并成功地应用于很多项目中。

后来,在网上遇到了南京嵌入之梦电子设计工作室的丁齐老师和郑岩峰、戴晓天、金小飞等人,一起联合成立了南京创客空间。在创客空间的活动中,发现很多人都使用Arduino来做原型开发,深入学习了Arduino之后觉得如获至宝,可以将Arduino与LabVIEW结合起来制作出很多有趣的玩意儿。这时候,还发现了NI公司提供了LabVIEW Interface for Arduino工具包,试用之后觉得模拟采样库比较实用,可将Arduino控制器用作数据采集板卡,如果使用高精度的基准源,则采集精度将会更高,同时说明NI公司很看好Arduino及开源硬件的发展前景。

本书中的Arduino程序代码和LabVIEW程序都可以从我的新浪博客(blog.sina.com/shenjinxin2008)和个人博客(www.shenjinxin.org)上下载,并可获得技术支持服务。

本书的内容及阅读建议

全书按照由易到难的顺序编写,同时各章节相对独立,全书共分为6章,分别为Arduino基础、LabVIEW基础、如何连接Arduino与LabVIEW、基础实验篇、应用进阶篇和实战项目篇。

第1章 Arduino基础:讲述了Arduino的分类、如何搭建Arduino开发平台、数字输入/输出、模拟输入/输出、串口通信和时间函数,并穿插以实际操作的实验,以加深理解。

第2章 LabVIEW基础:讲述了虚拟仪器的组成、LabVIEW基础知识、数据结构、程序结构、常用的波形图表和波形图、基本的文件I/O操作、信号分析与处理、典型的设计模式,同时通过示例说明每部分的使用方法。

第3章 如何连接Arduino与LabVIEW:讲述了如何实现Arduino与LabVIEW的连接,包括LabVIEW Interface for Arduino方式、串口控制方式、无线串口方式和Ethernet方式4个部分,其中无线串口方式介绍了Bluetooth、APC220和ZigBee。在前三个方式中,Arduino控制器都是通过串口与LabVIEW进行通信的,而在Ethernet方式中则是通过Ethernet模块和网络与LabVIEW进行通信的。

第4章 基础实验篇:讲述了利用LabVIEW Interface for Arduino工具包,实现对Arduino控制器及外部设备的控制,其中将Arduino控制器用作数据采集卡,扩展了LabVIEW廉价采集卡的选用范围。

第5章 应用进阶篇:讲述了7个Arduino与LabVIEW的应用,包括多路数据采集、热电偶高温监测、多路温度数字测量、温湿度测量、超声波测距、红外测距和小量程电子称重系统,涉及传感器及器件的选用与编程方法,并给出了Arduino控制器的代码清单和LabVIEW程序框图。

第6章 实战项目篇:讲述了4个综合性的项目,包括无线遥控智能小车、个人小型气象站、智能农业监测系统和基于网络的远程智能家居系统,深入地讲解了系统的构成、硬件连接、软件设计和故障排除方法。

如果您是艺术家、设计师等读者,不了解Arduino和LabVIEW,建议您从第1章开始按部就班地阅读到最后一章,并做好每一个实验,这可能会花费您大量时间和精力,但是这有助于您尽快上手Arduino和LabVIEW,同时您需要注意本书提示部分的内容。

如果您是Arduino玩家,建议您跳过第1章直接阅读第2章,学会使用LabVIEW软件之后,接着阅读第3章,在实现了Arduino与LabVIEW的连接之后,再去阅读后面的基础实验篇、应用进阶篇和实战项目篇,最终做出属于自己的Arduino与LabVIEW的作品。

如果您是LabVIEW程序员,建议您从第1章开始阅读,熟悉Arduino控制器并完成每一个Arduino实验之后,跳过第2章直接阅读第3章,实现了Arduino与LabVIEW的连接之后,再去阅读后面的基础实验篇、应用进阶篇和实战项目篇,最终做出属于自己的Arduino与LabVIEW的作品。

如果您是Arduino与LabVIEW的玩家,您可以阅读本书的任意章节,并可以根据本书的介绍来复现书中的应用和项目,由于拥有较好的功底,您最终可以做出属于自己的Arduino与LabVIEW的作品。

致谢

首先,感谢本书的策划编辑张国强先生,他对Arduino的关注促使了本书的出版,并在写作过程中提出了非常宝贵的建议与意见。

其次,感谢我的妻子冯倩女士对我的支持与鼓励,冯倩女士对本书的校对和修改也做了很多的工作。同时,在本书的编写中,南京理工大学的陆旭峰、袁涛、杜超、王荣振,南京创客空间的郑岩峰、金小飞、江玉明、陈大庆、戴晓天、邓豪等人也参与了本书的校对和修改,感谢他们。

另外,感谢成都智能盒子有限公司的陈吕洲先生和杭州橡木桶科技有限公司的郝弘毅先生为我提供Arduino兼容控制器。本书的Arduino程序代码在OPENJUMPER的Zduino Uno和OCROBOT的Mango II兼容控制器上验证通过。

最后,感谢东南大学的匡荛教授和奥松机器人的于欣龙为我作了推荐序,感谢每一位阅读本书的读者。

由于作者经验和时间有限,本书也是对Arduino与LabVIEW的一种探索,书中难免存在错误和不足之处,恳请各位专家和读者不吝赐教。联系邮箱:shenjinxin2008@126.com。沈金鑫2013年10月于南京理工大学第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.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)

❑工作时钟:16MHz2.电源

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调整输入上限。除此之外,有些引脚有特定功能。2

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

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

❑Reset:信号为低时复位单片机芯片。5.通信接口

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

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

❑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程序代码int led = 13; // 定义数字口13作为LED灯的控制信号// 当Arduino重启之后,只执行一次void setup() { pinMode(led, OUTPUT); // 初始化引脚作为输出}// 此部分一直循环执行void loop() { digitalWrite(led, HIGH); // 点亮LED delay(1000); // 延时1秒 digitalWrite(led, LOW); // 熄灭LED delay(1000); // 延时1秒}

然后在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-2:流水灯程序代码int lowestPin = 2; // 定义数字引脚2作为流水灯起始引脚int highestPin = 7; // 定义数字引脚7作为流水灯结束引脚void setup() { // 将数字引脚D2~D7初始化为输出 for (int thisPin =lowestPin; thisPin <= highestPin; thisPin++) { pinMode(thisPin, OUTPUT); // 设置引脚为输出模式 }}void loop() { // 由低到高依次点亮LED,延时1秒,熄灭LED for (int thisPin =lowestPin; thisPin <= highestPin; thisPin++) { digitalWrite(thisPin,HIGH); delay(1000); digitalWrite(thisPin,LOW); }// 由高到低依次点亮LED,延时1秒,熄灭LED for (int thisPin =highestPin; thisPin <= lowestPin; thisPin--) { digitalWrite(thisPin,HIGH); delay(1000); digitalWrite(thisPin,LOW); }}1.3.3 实验:“听话”的灯1.实验目的

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

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

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

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

[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-4:会呼吸的灯程序代码int PWM_Pin = 3; // 定义数字引脚3作为LED亮度的控制引脚void setup() { pinMode(PWM_Pin, OUTPUT); // 将数字引脚3设置为输出状态}void loop() { // 将LED的亮度由熄灭逐渐调高至全亮 for (int brightness = 0; brightness <= 255; brightness++) { analogWrite(PWM_Pin, brightness); delay(5); } // 将LED的亮度由全亮逐渐调低至熄灭 for (int brightness = 255; brightness >= 0; brightness--) { analogWrite(PWM_Pin, brightness); delay(5); } // 中间间断500毫秒 delay(500);}1.4.3 实验:调光LED1.实验目的

通过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-5:调光LED程序代码int sensorPin = A0; // 定义模拟引脚A0作为电位器的读取引脚int ledPin = 3; // 定义数字引脚3作为LED亮度的控制引脚int sensorValue = 0; void setup() { //将LED引脚设置为输出状态 pinMode(ledPin, OUTPUT); }void loop() { sensorValue = analogRead(sensorPin); // 读取电位器的分压值的数字量(0~1023) analogWrite(ledPin,sensorValue/4); // 将电位器的分压值的数字量(0~1023)缩小4倍,                         转换为模拟输出量(0~255),来调节LED的亮度}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')。

语法:Serial.print(val)或Serial.print(val,format)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-6:回音壁程序代码void setup() { // 初始化串口波特率为9600 Serial.begin(9600);}void loop() { while(Serial.available()) // 判断串口缓冲区是否有数据 { char c = Serial.read(); // 从串口缓冲区读取一个字节的数据 Serial.write(c); // 将读取的数据通过串口发送 }}

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载