ARDUINO入门及其简单实验7例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARDUINO入门及其简单实验(7例) (1)
1. Arduino硬件开发平台简介 (1)
1.1 Arduino的主要特色 (2)
1.2 Arduino的硬件接口功能描述 (3)
1.3 Arduino的技术性能参数 (3)
1.4 电路原理图 (4)
2. Arduino软件开发平台简介 (5)
2.1 菜单栏 (5)
2.2 工具栏 (6)
2.3 Arduino 语言简介 (6)
3. Arduino开发实例中所用部分器件 (8)
1. LED简介 (8)
2. 光敏电阻简介 (9)
3. 直流电机简介 (9)
4. 电位器简介 (10)
4. Arduino平台应用开发实例 (10)
4.1【实作项目一】利用LED作光敏电阻采样实验 (10)
4.2【实作项目二】利用PWM信号控制LED亮度 (12)
4.3【实作项目三】单键控制一只LED的亮灭 (15)
4.4【实作项目四】利用PWM控制直流电机转速 (17)
4.5【实作项目五】利用电位器手控LED亮度 (19)
4.6【实作项目六】控制LED明暗交替 (21)
4.7【实作项目七】利用光敏电阻控制LED的亮灭 (23)
ARDUINO入门及其简单实验(7例)
1. Arduino硬件开发平台简介
Arduino硬件是一块带有USB的I/O接口板(其中包括13条数字I/O引脚,6通道模拟输出,6通道模拟输入),并且具有类似于Java、C语言的集成开发环境。

Arduino 既可以扩展一些外接的电子元器件,例如开关、传感器、LED、直流马达、步进马达或其他输入、输出装置;Arduino也可以独立运行,成为一个可以跟交互软件沟通的接口装置,例如:Flash、Processing、Max/MSP、VVVV或其他互动软件。

Arduino 开发环境IDE全部开放源代码,可以供大家免费下载、利用,还可以开发出更多激发人们制作欲望的互动作品。

如图1和图2所示,分别为Arduino硬件平台的实物图和电路布局图。

图1 两款Arduino硬件平台实物图
图2 Arduino硬件平台电路布局图
1.1 Arduino的主要特色
●开放源代码的电路图设计,程序开发环境软件也免费下载,许多现成的成功制作
案例也都开放,可依需求自主修改、任意裁剪。

●使用流行的高性价比的单片机(ATmega8、ATmega168或ATmega328)。

●可以采用USB接口供电,不需外接电源。

也可以使用外部接入DC 9V电源适配
器供电。

●Arduino支持ISP在线烧写或者升级,可以自行将新的“bootloader(自举程序)”
固件烧入单片机芯片。

有了新版bootloader之后,可以通过串口或者USB/RS232线更新固件。

●依据官方免费提供的电路板图和电路原理图(即为Eagle格式PCB和SCH电路
图),可以自主修改或者简化Arduino电路,以独立仿制或者改制Arduino开发板。

可以方便地外接各种传感器、各式各样的人机接口器件。

例如,红外线、超音波、热敏电阻、光敏电阻、伺服马达等功能器件。

●应用方面,利用Arduino可以突破以往只能使用鼠标、键盘、CCD等输入装置的
互动内容,可以更简单地达成单人或多人游戏互动。

●支持多种互动程序,如:Flash、Processing、Max/Msp、VVVV等。

1.2 Arduino的硬件接口功能描述
1.数字输入/输出(Digital I/O)端子0~13(共14个数字输入/输出口DIO)。

2.模数转换(ADC)输入端子0~5(共6个,可做模拟输入口AI)。

3.脉宽调制(PWM)输出(Pin11,Pin10,Pin9,Pin6,Pin5,Pin3)共6个,可做模拟输出口AO。

4.支持USB接头传输数据及供电(可以免用外接电源)。

5.支援串口通信TX/RX端子。

6.支持在线串行烧写(ICSP)功能。

接线端子为6芯的排针。

7.支持外部模数转换(ADC)的电压基准(AREF)端子输入。

8.输入电压:USB接口提供,无须外部供电。

也可由7V~12V DC外部供电。

9.可以向外提供电源电压:DC5V输出。

10.智能核心器件采用的是型号为ATmega328的高性能单片机。

11.Arduino物理尺寸:宽70mm×高54mm。

1.3 Arduino的技术性能参数
1.核心器件:AVR系列的ATmega328(运行速度可达20MIPS);
2.数字信号I/O接口端子:14(其中6个可做模拟输出接口端子);
3.模拟信号输入接口端子:6个;
4.数字I/O端子直流驱动电流(最大值):40mA;
5.程序存储器Flash容量:32KB(其中2KB用于固化自举程序bootloader);
6.数据存储器SRAM容量:1KB;
7.永久数据存储器EEPROM容量:512B;
8.时钟频率:16MHz;
9.工作电压:+5V;
10.外部输入电源电压(推荐值):+7V~+12V;
11.外部输入电源电压(极限值):+6V≤Vin≤+20V。

1.4 电路原理图
最经典的一款Arduino的电路原理图如图3所示。

其电路中的核心芯片为一片ATmega328单片机。

图 3 Arduino电路原理图
从图中可以看出,除了核心器件单片机之外,还包含一片FT232(构成USB/UART 的通信转换接口)、一片MC33269稳压器(构成稳压电源电路)、一片LM358和一只MOS晶体管2955(共同构成两路电源输入的自动切换电路)。

对于初学者来说,不需要了解电路板细节,也不需要搞懂单片机,只要记住3个排针插口的局部和用途,即可快速上手实战!
2. Arduino软件开发平台简介
如图4所示,为Arduino(以V1.0版本为例)软件开发平台的工作界面。

图4 Arduino(V1.0)软件平台
2.1 菜单栏
(1)File:文件
下拉菜单包括的命令有:new新建、open打开、sketchbook程序薄、exampels 示例、close关闭、save保存、print打印、quit退出。

(2)Edit:编辑
下拉菜单包括的命令有:Cut剪切、Copy复制、Copy for Forum、Paste粘贴、Select All全选等。

(3)Sketch:程序
(4)Tools:工具
(5)Help:帮助
以上命令的功能及用法跟中文说明大体一致,并附有快捷键使用方法。

2.2 工具栏
:校验工具按钮。

实际功能为编译。

:上传工具按钮。

实际功能是把编译成功的机器码程序文件,加载(烧写)到单片机芯片内部的程序存储器中。

:新建项目文件工具按钮。

:打开现有项目文件工具按钮。

:保存当前项目文件工具按钮。

:打开串并口窗口按钮。

2.3 Arduino 语言简介
1. 程序总体架构(三个主要部分)
①声明变量及接口名称(例如int val;int ledPin = 13;……)。

②void setup()初始化函数。

置于程序的开头部分,每次Arduino加电或者复位,仅被执行一次。

③void loop()主循环函数。

置于setup()函数之后,即初始化之后,loop()让你的程序循环往复、周而复始地被执行。

2. 常用函数
①数字I/O类:
●pinMode(pin,mode) 数字IO口输入输出模式定义函数,将接口定义为输入
或输出接口。

●digitalWrite(pin,value) 数字IO口输出电平定义函数,将数字接口值至高
或低、开或关。

●int digitalRead(pin) 数字IO口读输入电平函数,读出数字接口的值,pin
表示为0~13。

②模拟I/O类:
●int analogRead(pin) 模拟IO口读函数,从指定的模拟接口读取值。

●analogWrite(pin,value) 数字IO口PWM输出函数,给一个接口写入模拟
值(输出PWM波)。

③扩展I/O类:
●shiftOut(dataPin,clockPin,bitOrder,value) SPI外部IO扩展函数,通常使用
带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数字输出的寄存器,此函数通常使用在延伸数字输出。

●unsigned long pulseIn(pin,value) 脉冲长度记录函数,设定读取脚位状态的
持续时间,返回时间参数(μs)。

3. 时间函数
●unsigned long millis() 返回时间函数(单位ms),回传单片机开始执行到
目前的毫秒数。

该函数是指,当程序运行就开始计时并返回记录的时间参数。

该参数溢出大概需要50天时间。

4. 数学函数
●min(x,y) 求最小值,回传两数之间较小者。

●max(x,y) 求最大值,回传两数之间较大者。

5. 随机数函数
●randomSeed(seed) 随机种子数设置函数,使得随机数发生器产生的随机数
更加不可预测。

●long random(max) 随机数返回函数,返回数据大于等于0,小于max。

●long random(min,max) 随机数返回函数,返回数据大于等于min,小于
max。

6. 中断使能函数
●interrupts() 使能中断函数。

放开中断功能。

●noInterrupts() 禁止中断函数。

关闭中断功能。

7. 串口收发函数
●Serial.begin(speed) 启用串口和定义波特率函数。

设置每秒串行传输数据
的速率(波特率),即指定Arduino与PC微机交换信息的速率,通常选用9600bps (比特/秒)。

●Serial.print(data) 串行端口数据输出函数。

将输出结果显示于PC微机端的
“串口通信窗口”里。

例如,Serial.print(数据),默认为十进制数据,等效于Serial.print(数据,DEC)。

●Serial.println(data) 自动换行的串行端口输出数据函数。

在以上函数基础上
增加了回车和换行功能。

●int Serial.read() 串行端口数据输入函数。

读串口并返回收到的一个字节数
据。

3. Arduino开发实例中所用部分器件
首先对于本文后面制作实例中所用到的主要器件进行简介。

1. LED简介
LED(Light Emitting Diode)是发光二极管的简称。

这种半导体元件一般是作为指示灯、显示板,它不但能够高效率地直接将电能转化为光能,而且拥有最长达数万小时的使用寿命,同时具备不像传统灯泡易碎并省电等优点。

图1为LED实物图,图2为LED内部结构。

图1 LED实物图片
图2 LED内部结构
LED还可分为普通单色LED(红、绿、黄、蓝、白)、高亮度LED、超高亮度LED、变色LED、闪烁LED、电压控制型LED、红外LED和负阻LED等。

LED特点:
◆工作电压低,工作电流很小;
◆适合于易变的环境,对环境无污染;
◆稳定性好,可靠性高,寿命长;
◆价格比较低廉,性价比高。

2. 光敏电阻简介
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器。

入射光强,电阻减小,入射光弱,电阻增大。

光敏电阻器一般用于光照测量、光的控制和光电转换(将光的变化转换为电的变化)。

图3给出了光敏电阻的实物图、结构图和电路符号。

图3 光敏电阻
3. 直流电机简介
利用直流电压和电流来驱动的旋转电机,称为直流电机。

它是一种能够把直流电能转换为旋转机械能的电机(也叫马达,Motor)。

如图4所示,为一款常用于玩具中的微型直流电机的实物图。

图4 直流电机实物图
4. 电位器简介
电位器(potentiometer)是一种最简单的模拟输入设备。

它实际上就是一个可变电阻器。

通过控制滑端所在的位置我们可以得到不同的电阻值或者电压值。

如图5所示的用法,是从电位器的滑端提取信号,作为单片机或Arduino的模拟输入信号。

图5为电位器的实物图和电路连接图。

图5 电位器的实物图和接线图
4. Arduino平台应用开发实例
以下针对基础薄弱的初学者或电子制作爱好者,规划设计了几个容易仿制、方便取材、简单易行、一学就会、一会就做、一做就成的实用制作项目,以便达到培养学习兴趣、激发动手欲望的功效。

4.1【实作项目一】利用LED作光敏电阻采样实验
★实作项目简述:
在本实作中,将Arduino的USB接口与PC连接起来,将一只普通LED连接到Arduino的一个模拟输入端上,观察对应的环境光的不同变化,即Arduino中模拟量采集。

硬件上需要选用6个具有ADC功能的模拟I/O端子之一,硬件上需要选用analogRead()功能函数,来读取端子上的模拟量电压值,每读一次需要延迟1000ms 的时间。

★实验电路框图:
本实作的系统框图如图6所示。

通过程序设计,让Arduino每1000ms进行一次A/D转换,并将结果显示于PC 计算机端的“串口通信窗口”里。

图6 实验系统框图
★实验电路原理图:
本实作的实验电路图如图7所示。

将Arduino的0号模拟口接至LED的阳极,LED阴极与接地端连接,USB口连接至PC计算机的一个USB口,用于传送采样数据。

图7 电路原理图
★电路实物连接图:
本实作的实物连接图如图8所示。

图8 实物连接图
★实验程序清单:
int recvpin=0; // 为模拟端子0命名
int wait=1000; // 定义一个延时常数
int val =0; // 定义一个变量
void setup() // 初始化函数
{
Serial.begin(9600); // 设置和启用串口USRT
}
void loop() // 主循环函数
{
val=analogRead(recvpin); // 读取模拟端子,存于变量中
Serial.println("DETECT:"); // 串口输出给PC一个字符串
Serial.println(val); // 串口输出给PC变量的内容
delay(wait); // 等待一个预定的延迟时段
}
4.2【实作项目二】利用PWM信号控制LED亮度
★实作原理简介:
本实作中我们将用模拟输出来调节发光二极管(LED)亮度。

由于LED的亮度与施加的电压有关,因此可以通过控制电压来达到调节亮度的目的。

具体这里采用的方法是,产生和输出一个PWM信号给LED。

为了消除PWM信号中的脉动成分,以避免闪烁现象,在此还设置了一个阻容(RC)低通滤波器,其原理非常简单,只需要一个电阻和一个电容。

图9 经过低通滤波驱动LED
由于Arduino的微控制器只能产生高电压(5V)或者低电压(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模仿模拟电压。

在Arduino数字I/O端子9、10和11上,我们可以通过analogWrite()函数来产生模拟输出。

该函数有两个参数,其中第一个参数是要产生模拟信号的端子(9、10或者11);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是0到255。

脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。

不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化0.0196V(5/255 = 0.0196)。

★实验电路原理图:
本实作的实验电路原理图如图10所示。

从图中可见,LED连接的是D11端子。

图10 电路原理图
★电路实物连接图:
本实作的电路实物图如图11所示。

图11 实验实物图
★实验程序清单:
int ledPin = 11; //设定控制LED的数字I/O脚
int potPin = 0;
byte bright_table[] = { 30, 30, 30, 40, 50, 60, 70, 80, 90, 100,110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 250, 240, 230, 220, 210, 200, 190, 180, 170, 160, 150, 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40, 30, 30, 30 };
int MAX = 50;
int count = 0;
int val = 0; //定义val变量的初始值
void setup()
{
analogWrite(ledPin, bright_table[count]);
//把bright_table[count]中的值写入到ledPin中
count ++;
if (count > MAX)
{
count = 0;
}
val = analogRead(potPin); //从传感器读取值
val = val /4;
delay(val);
}
该实作通过调用analogWrite()函数,在数字I/O端口的11号端子上模仿输出一个模拟电压给LED,每产生一次输出后都设置了相应的延时。

在此实验中,我们可以观察到发光二极管逐渐变亮后再逐渐变暗的效果。

4.3【实作项目三】单键控制一只LED的亮灭
★实验功能简介:
本实作使用按键来控制LED的亮或者灭。

一般情况是直接把按键开关串联在LED的电路中来开关,这种应用情况比较单一。

这次实验通过间接的方法来控制,按键接通后判断按键电路中的输出电压,如果电压大于4.88V,就使给LED电路输出高电平,反之就输出低电平。

使用逻辑判断的方法来控制LED亮或者灭,此种控制方法应用范围较广。

连接方法如图12所示。

按键开关SW的一端连接5V,另一端串联一个10k电阻到接地,中头连接D11号端子;LED阳极串联220Ω限流电阻后连接D9端子,阴极连接到地。

如果手不按下开关,LED被点亮;而当开关被按下时,LED被熄灭。

★实验电路原理图:
本实作的实验电路原理图如图12所示。

图12 电路原理图★电路实物连接图:
本实作的电路实物连接图如图13所示。

图13 实验实物图★实验程序清单:
int ledPin = 9;
int switchPin = 11;
int value = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
}
void loop() {
value = digitalRead(switchPin);
if (HIGH == value)
{
digitalWrite(ledPin, LOW); //熄灭LED
}
else
{
digitalWrite(ledPin, HIGH); //点亮LED
}
}
4.4【实作项目四】利用PWM控制直流电机转速
★实作项目简述:
在本实作中,利用Arduino的一个模拟输出端子,连接功率驱动电路,然后驱动一只直流电机。

通过改变施加到电机上的模拟电压,来控制电机的转速,自动按周期性三角波规律变化:从慢到快,从快到慢,从慢到快,从快到慢,……
★实验电路原理图:
本实作的实验电路原理图如图14所示。

将Arduino的9号模拟端子连接驱动电路。

驱动电路由一只小功率三极管组成,基极串联一只限流电阻,集电极串联一只微型直流电机到5V,与电机并联的二极管用来实现续流作用,避免感性负载上的感应电压击穿三极管。

图14 电路原理图
★电路实物连接图:
本实作的电路实物连接图如图15所示。

图15 实验实物图
★实验程序清单:
int ledPin = 9; //设定9号端子接电机
void setup()
{
}
void loop()
{
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=10)
{
//从0逐渐增加到255
analogWrite(ledPin, fadeV alue);
delay(30); //每步延时30ms
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=10)
{
analogWrite(ledPin, fadeV alue);
delay(30); //每步延时30ms
}
}
4.5【实作项目五】利用电位器手控LED亮度
★实作项目简述:
在本制作中,我们将利用一只电位器来手动旋转,通过改变电位器的值来控制发光二极管的亮度。

通过旋转电位器的轴,就能改变电位器中头同地之间的电阻值,从而也就能改变从模拟输入端子上所读取的模拟量的电压值。

在我们的实验中,读出的模拟量被用来确定发光二极管的亮度,以反映模拟量的变化。

★实验电路原理图:
本实作的实验电路原理图如图16所示。

电位器上一共有三个管脚,两端分别连接到Arduino的5V电源和地之间,中头连接模拟输入的0号端子上。

发光二极管则串联一只限流电阻之后,接到数字I/O的9号端子上。

图16 电路原理图
★电路实物连接图:
本实作的电路实物连接图如图17所示。

图17 实验实物图
★软件算法说明:
当电位器完全旋转到一头时,输入到模拟输入端子上的电压为0V,用analogRead()函数读出的值为0;当电位器完全旋转到另一头时,输入到模拟端子上的电压为5V,此时用analogRead()函数读出的值为1023(即为一个10位数值,210 = 1024);当电位器旋转到中间的某个位置时,输入到模拟输入端子上的电压是0V到5V之间的某个值,而用analogRead()函数读出的则是介于0到1023之间的某个对应值。

驱动和改变LED的亮度,需要利用的函数为analogWrite(),而该函数所需参数为一个8位数值(28= 256),这就需要对从电位器读出的、10位宽的值进行转换,变换成8位数值。

具体思路是,直接舍弃10位数值的低端2位即可;具体方法也简单,利用算式直接除以2即可。

★实验程序清单:
int sensorPin=A0; //定义一个模拟量输入端子
int ledpin=9 ; //选择一个模拟量输出端子(连接LED)
int sensorValue=0; //定义一个存储所测数据的变量
void setup() //设置环境
{
}
void loop() //主循环
{
sensorValue=analogRead(sensorpin); //读取电位器,得10位数据
analogWrite(ledpin,sensorValue/4); //把10位值转换为8位值,送出
delay(100); //插入一个延时
}
4.6【实作项目六】控制LED明暗交替
★实作项目简述:
其工作电压一般为1.5~2.0V,工作电流一般为10~20mA,反向击穿电压为5V。

控制板逻辑电路供电为5V。

根据以上参数假设LED工作电压选用1.7V,工作电流选用15mA,限流电阻=(总电压-LED电压)/电流,所以限流电阻=(5-1.7)/0.015=220Ω。

笔者使用的平台为WIN7 32位操作系统,如果大家使用的是其他平台,按照对应的下载就可以。

arduino.exe是程序的启动文件,driver目录是控制板USB芯片驱动,USB接上控制板后如果要寻找驱动,把目录指定到这里就可以。

本次实验所用到的器材为一个电路板,一个LED,一个220Ω的电阻,几根导线,本次实验的连接方法如18图,LED两个针脚有一长一短,短的是连接GND,长的是连接正极。

在LED的长引脚前,需要添加一个220Ω的限流电阻。

连接数字5号接口。

通过面包板把个个电子器件连接好以后,接上USB线,设置好控制板型号、端口号。

★实验电路原理图:
本实作的实验电路原理图如图18所示。

图18 电路原理图
★电路实物连接图:
本实作的电路实物连接图如图19所示。

图19 实物连接图
★实验程序清单:
int ledPin=5; //设定控制LED的数字输出端子void setup() //初始化函数
{
pinMode(ledPin,OUTPUT); //设定数字端子的模式为输出
}
void loop() //主循环函数
{
digitalWrite(ledPin,HIGH); //设定5端为5V,以点亮LED
delay(2000); //插入延时时间,2000 = 2秒
digitalWrite(ledPin,LOW); //设定5端为0V,以熄灭LED
delay(2000); //插入延时时间,2000 = 2秒
}
4.7【实作项目七】利用光敏电阻控制LED的亮灭
★实作项目简述:
本制作的目标效果是,当光照正常的时候LED灯是灭的,当周围变暗时LED灯被点亮。

因为光敏电阻受不同光照影响变化很大,所以本次实验的参数是在60W三基色节能灯照射下验证的(无日光照射)。

同样亮度的日光下,光敏电阻的阻值会比日光灯下低不少,说明和不同波段光的波长有关系。

实验前先测量一下当前环境下光敏电阻的亮阻值与暗阻值。

✓测出来的亮阻值,为9.1kΩ。

✓测出来的暗阻值,为32.4kΩ。

根据测出来的亮阻9.1kΩ和暗阻32.4Ω,来选定分压电阻为10kΩ。

因为当有遮挡物时,阻值会变大。

假设亮阻为10kΩ(对于光敏电阻来说,与测量出来的9.1kΩ差别不大,计算起来更加方便了),就选分压电阻的阻值为10kΩ。

模拟输入电子所测量到的触发电压为10kΩ分压电阻的对地电压,在5V电源供电下,亮到暗转换的触发电压为5×10 / (10+10) = 2.5V。

当光线越暗,光敏电阻的阻值也就越大,分压电阻两端的电压也就越小。

所以触发条件就为≤2.5V(不同光照条件下触发电压也会不同,
请根据实验环境进行调整)。

★实验电路原理图:
本实作的实验电路原理图如图20所示。

图20 实作原理图
★电路实物连接图:
本实作的电路实物连接图如图21所示。

图21 电路实物连接图
★实验程序清单:
int photocellPin = 2; //定义端子2,为电压读取端口
int ledPin = 12; //定义端子12,为LED电压输出端口int val = 0; //定义一个变量val,并且起始值为0 void setup()
{
pinMode(ledPin, OUTPUT); //令ledPin端子为输出模式
}
Void loop()
{
val = analogRead(photocellPin); //从传感器读取值
if(val<=512) //与门限值比较(512对应2.5V)
// 想让传感器敏感些时,把该值调高些,反之则把该值调低些{
digitalWrite(ledPin, HIGH);
//当val小于512(2.5V)时,LED亮}
else
{
digitalWrite(ledPin, LOW);
//当val大于512(2.5V)时,LED灭}
}。

相关文档
最新文档