一 Arduino硬件开发平台简介
Arduino硬件是一块带有USB的I/O接口板(其中包括13条数字I/O引脚,6通道模拟输出,6通道模拟输入),并且具有类似于Java、C语言的集成开发环境。Arduino既可以扩展一些外接的电子元器件,例如开关、传感器、LED、直流马达、步进马达或其他输入、输出装置;Arduino也可以独立运行,成为一个可以跟交互软件沟通的接口装置,例如:Flash、Processing、Max/MSP、VVVV或其他互动软件。Arduino开发环境IDE全部开放源代码,可以供大家免费下载、利用,还可以开发出更多激发人们制作欲望的互动作品。
Arduino硬件平台的实物图和电路布局图如图1和图2所示。

图1 Arduino硬件平台实物图
图2 Arduino硬件平台电路布局图
1. 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。
2. 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。
二、.Arduino语言简介
1.程序总体架构(三个主要部分)
(1)声明变量及接口名称(例如int val;int ledPin=13;……)。
(2)void setup()初始化函数。置于程序的开头部分,每次Arduino加电或者复位,仅被执行一次。
(3)void loop()主循环函数。置于setup()函数之后,即初始化之后,loop()让你的程序循环往复、周而复始地被执行。
2.常用函数
(1)数字I/O类:
1) pinMode(pin,mode)数字IO口输入输出模式定义函数,将接口定义为输入或输出接口。
2) digitalWrite(pin,value)数字IO口输出电平定义函数,将数字接口值至高或低、开或关。
3) int digitalRead(pin)数字IO口读输入电平函数,读出数字接口的值,pin表示为0~13。
(2)模拟I/O类:
1) int analogRead(pin)模拟IO口读函数,从指定的模拟接口读取值。
2) analogWrite(pin,value)数字IO口PWM输出函数,给一个接口写入模拟值(输出PWM波)。
(3)扩展I/O类:
1) shiftOut(dataPin,clockPin,bitOrder,value) SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数字输出的寄存器,此函数通常使用在延伸数字输出。
2) unsigned long pulseIn(pin,value)脉冲长度记录函数,设定读取脚位状态的持续时间,返回时间参数(μs)。
3.时间函数
1) unsigned long millis()返回时间函数(单位ms),回传单片机开始执行到目前的毫秒数。该函数是指,当程序运行就开始计时并返回记录的时间参数。该参数溢出大概需要50天时间。
4.数学函数
1) min(x,y)求最小值,回传两数之间较小者。
2) max(x,y)求最大值,回传两数之间较大者。
5.随机数函数
1) randomSeed(seed)随机种子数设置函数,使得随机数发生器产生的随机数更加不可预测。
2) long random(max)随机数返回函数,返回数据大于等于0,小于max。
3) long random(min,max)随机数返回函数,返回数据大于等于min,小于max。
6.中断使能函数
1) interrupts()使能中断函数。放开中断功能。
2) noInterrupts()禁止中断函数。关闭中断功能。
7.串口收发函数
1) Serial.begin(speed)启用串口和定义波特率函数。设置每秒串行传输数据的速率(波特率),即指定Arduino与PC微机交换信息的速率,通常选用9600bps(比特/秒)。
2) Serial.print(data)串行端口数据输出函数。将输出结果显示于PC微机端的“串口通信窗口”里。例如,Serial.print(数据),默认为十进制数据,等效于Serial.print(数据,DEC)。
3) Serial.println(data)自动换行的串行端口输出数据函数。在以上函数基础上增加了回车和换行功能。
4) int Serial.read()串行端口数据输入函数。读串口并返回收到的一个字节数据。
三.Arduino开发实例中所用部分器件
1.LED简介
LED(Light Emitting Diode)是发光二极管的简称。这种半导体元件一般是作为指示灯、显示板,它不但能够高效率地直接将电能转化为光能,而且拥有最长达数万小时的使用寿命,同时具备不像传统灯泡易碎并省电等优点。图3为LED实物图,图4为LED内部结构。
图3 LED实物图片
图4 LED内部结构
LED还可分为普通单色LED(红、绿、黄、蓝、白)、高亮度LED、超高亮度LED、变色LED、闪烁LED、电压控制型LED、红外LED和负阻LED等。
LED特点:
◆工作电压低,工作电流很小;
◆适合于易变的环境,对环境无污染;
◆稳定性好,可靠性高,寿命长;
◆价格比较低廉,性价比高。
2.光敏电阻简介
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器。入射光强,电阻减小,入射光弱,电阻增大。光敏电阻器一般用于光照测量、光的控制和光电转换(将光的变化转换为电的变化)。图5给出了光敏电阻的实物图、结构图和电路符号。
图5光敏电阻
3.直流电机简介
利用直流电压和电流来驱动的旋转电机,称为直流电机。它是一种能够把直流电能转换为旋转机械能的电机(也叫马达,Motor)。如图6所示,为一款常用于玩具中的微型直流电机的实物图。
图6直流电机实物图
4.电位器简介
电位器(potentiometer)是一种最简单的模拟输入设备。它实际上就是一个可变电阻器。通过控制滑端所在的位置我们可以得到不同的电阻值或者电压值。如图7所示的用法,是从电位器的滑端提取信号,作为单片机或Arduino的模拟输入信号。图5为电位器的实物图和电路连接图。

图7电位器的实物图和接线图
四.实验内容
该实验共分为三个子项目,从项目一单键控制一只LED的亮灭开始熟悉Arduino硬件平台,然后进行项目二电位器手控LED亮度项目,项目三利用光敏电阻控制LED的亮灭为选做
【项目一】单键控制一只LED的亮灭
1.实验功能简介:
本实作使用按键来控制LED的亮或者灭。一般情况是直接把按键开关串联在LED的电路中来开关,这种应用情况比较单一。这次实验通过间接的方法来控制,按键接通后判断按键电路中的输出电压,如果电压大于4.88V,就使给LED电路输出高电平,反之就输出低电平。使用逻辑判断的方法来控制LED亮或者灭,此种控制方法应用范围较广。
连接方法如图8所示。按键开关SW的一端连接5V,另一端串联一个10k电阻到接地,中头连接D11号端子;LED阳极串联220Ω限流电阻后连接D9端子,阴极连接到地。如果手不按下开关,LED被点亮;而当开关被按下时,LED被熄灭。
2.实验电路原理图:
本项目的实验电路原理图如图所示。
电路原理图
3.电路实物连接图:
本项目的电路实物连接图如图8所示。
图8 实验实物图
4.实验程序清单:
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
}
}
【项目2】利用电位器手控LED亮度
1.实作项目简述:
在本制作中,我们将利用一只电位器来手动旋转,通过改变电位器的值来控制发光二极管的亮度。
通过旋转电位器的轴,就能改变电位器中头同地之间的电阻值,从而也就能改变从模拟输入端子上所读取的模拟量的电压值。在我们的实验中,读出的模拟量被用来确定发光二极管的亮度,以反映模拟量的变化。
2.实验电路原理图:
本项目的实验电路原理图如图9所示。
电位器上一共有三个管脚,两端分别连接到Arduino的5V电源和地之间,中头连接模拟输入的0号端子上。发光二极管则串联一只限流电阻之后,接到数字I/O的9号端子上。
图9 电路原理图
3电路实物连接图:
本实项目的电路实物连接图如图10所示。
图10实验实物图
4软件算法说明:
当电位器完全旋转到一头时,输入到模拟输入端子上的电压为0V,用analogRead()函数读出的值为0;当电位器完全旋转到另一头时,输入到模拟端子上的电压为5V,此时用analogRead()函数读出的值为1023(即为一个10位数值,210= 1024);当电位器旋转到中间的某个位置时,输入到模拟输入端子上的电压是0V到5V之间的某个值,而用analogRead()函数读出的则是介于0到1023之间的某个对应值。
驱动和改变LED的亮度,需要利用的函数为analogWrite(),而该函数所需参数为一个8位数值(28= 256),这就需要对从电位器读出的、10位宽的值进行转换,变换成8位数值。具体思路是,直接舍弃10位数值的低端2位即可;具体方法也简单,利用算式直接除以2即可。
5实验程序清单:
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);//插入一个延时
}
3.【项目三】利用光敏电阻控制LED的亮灭
1实作项目简述:
本制作的目标效果是,当光照正常的时候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(不同光照条件下触发电压也会不同,请根据实验环境进行调整)。
2实验电路原理图:
本项目的实验电路原理图如图11所示。
图11实作原理图
3电路实物连接图:
本实作的电路实物连接图如图12所示。
图12电路实物连接图
4实验程序清单:
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灭
}
}