4、Arduino#
Arduino IDE和驱动的安装#
当我们拿到开发板时,首先我们要安装Arduino IDE和驱动,相关文件我们可以在官网上找到,以下链接是包含各种系统、各种版本的Arduino IDE和驱动任你选择。
https://www.arduino.cc/en/Main/OldSoftwareReleases#1.5.x
下面我们介绍下Arduino-1.5.6 版本IDE在Windows系统的安装方法。
下载下来的文件是一个arduino-1.5.6-r2-windows.zip的压缩文件夹,解压出来到硬盘。
双击Arduino-1.5.6 .exe文件
然后
然后
等待安装完成.点击close,安装完成。
1.5.6版本安装后的样子。
接下来是开发板驱动的安装,这次我们安装的是Keyes UNO R3开发板的驱动,Keyes 2560 R3开发板安装驱动方法和这个类似,驱动文件可以用同一个文件。
不同的系统,安装驱动的方法也有一些细小的区别,下面我们介绍在WIN 7系统安装驱动的方法。
第一次Keyes UNO R3开发板连接电脑时,点击计算机--属性--设备管理器,显示如下图。
点击 Unknown device 安装驱动,如下图。
进入下图,选择
找到Arduino安装位置的drivers文件夹
点击“Next”,今天下图选择,开始安装驱动


安装驱动完成,出现下图点击Close。
这样驱动就装好了。点击计算机--属性--设备管理器,我们可看见如下图。
Arduino IDE的使用方法#
Keyes UNO R3开发板的USB驱动安装成功之后,我们可以在Windows设备管理器中找到相应的串口。
下面示范第一个程序的烧写,串口监视器中显示“Hello World!”。
测试代码为:
int val;
int ledpin=13;
void setup()
{
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
}
void loop()
{
val=Serial.read();
if(val=='R')
{
digitalWrite(ledpin,HIGH);
delay(500);
digitalWrite(ledpin,LOW);
delay(500);
Serial.println("Hello World!");
}
}
我们打开Arduino 的软件,编写一段程序让Keyes UNO R3开发板接受到我们发的指令就显示“Hello World!”字符串;我们再借用一下Keyes UNO R3 开发板上的 D13的指示灯,让Keyes UNO R3开发板接受到指令时指示灯闪烁一下,再显示“Hello World!”。
打开Arduino 的软件,设置板,如下。
设置COM端口,如下
点击
编译程序,检查程序是否错误;点击
上传程序;Keyes
UNO R3 开发板设置OK后右下脚显示如下图,和设备管理器中显示一致。
那么恭喜你,你的第一个程序已经成功了!!!
实验课程#
实验一 LED 闪烁实验#
实验说明
实验器材
开发板*1
USB线*1
LED*1
220Ω 电阻*1
面包板*1
面包板连接线若干
接线图
测试代码
int led = 2; //定义数字口2
void setup()
{
pinMode(led, OUTPUT); //设置led为输出
}
void loop()
{
digitalWrite(led, HIGH); //开启led
delay(1000); //延迟1秒
digitalWrite(led, LOW); //关闭led
delay(1000);//延迟1秒
}
测试结果
下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为1秒。
实验二 呼吸灯实验#
实验说明
上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。
实验器材
开发板*1
USB线*1
LED*1
220Ω 电阻*1
面包板*1
面包板连接线若干
接线图
测试代码
int ledPin = 3; // 定义数字口3
void setup()
{
pinMode(ledPin, OUTPUT);// 将ledPin设置为输出
}
void loop()
{
for (int a=0; a<=255;a++)// 设置使LED逐渐变亮
{
analogWrite(ledPin,a); //开启led,调节亮度,范围是0-255,在255时led最亮
delay(10); // 延迟0.01S
}
for (int a=255; a>=0;a--) // 设置使LED逐渐变暗
{
analogWrite(ledPin,a); //开启led,调节亮度,范围是0-255,在255时led最亮
delay(10); // 延迟0.01秒
}
delay(1000);// 延迟1秒
}
测试结果
下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。
实验三 广告灯实验#
实验说明
在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。
实验器材
开发板*1
USB线*1
LED*5
220Ω 电阻*5
面包板*1
面包板连接线若干
接线图
测试代码
int BASE = 2 ; //第一个 LED 接的 I/O 口
int NUM = 5; //LED 的总数
void setup()
{
for (int i = BASE; i < BASE + NUM; i ++)
{
pinMode(i, OUTPUT); //设定数字I/O口为输出
}
}
void loop()
{
for (int i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, HIGH); //设定数字I/O口输出为"高",即逐渐开灯
delay(200); //延迟
}
for (int i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, LOW); //设定数字I/O口输出为"低",即逐渐关灯
delay(200); //延迟
}
}
测试结果
下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。
实验四 交通灯实验#
实验说明
实验器材
红色LED*1
黄色LED*1
绿色LED*1
220Ω电阻*3
面包板*1
面包板连接线若干
接线图
测试代码
int redled =10; //定义数字10 接口
int yellowled =7; //定义数字7 接口
int greenled =4; //定义数字4 接口
void setup()
{
pinMode(redled, OUTPUT);//定义红色小灯接口为输出接口
pinMode(yellowled, OUTPUT); //定义黄色小灯接口为输出接口
pinMode(greenled, OUTPUT); //定义绿色小灯接口为输出接口
}
void loop()
{
digitalWrite(greenled, HIGH);////点亮 绿灯
delay(5000);//延时5秒
digitalWrite(greenled, LOW); //熄灭 绿灯
for(int i=0;i<3;i++)//闪烁交替三次,黄灯闪烁效果
{
delay(500);//延时0.5 秒
digitalWrite(yellowled, HIGH);//点亮 黄灯
delay(500);//延时0.5 秒
digitalWrite(yellowled, LOW);//熄灭 黄灯
}
delay(500);//延时0.5 秒
digitalWrite(redled, HIGH);//点亮 红灯
delay(5000);//延时5 秒
digitalWrite(redled, LOW);//熄灭 红灯
}
测试结果
按照接线图接好线,上传完程序,上电后,我们就可以看到我们自己设计控制的交通灯了。实验效果为绿灯亮5秒,绿灯熄灭,黄灯循环闪烁3次,红灯亮5秒,依次循环。
实验五 按键控制LED实验#
实验说明
I/O 口的意思即为INPUT 接口和OUTPUT接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O口的输出功能,这个实验我们来尝试一下使用Arduino的I/O口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。
实验器材
开发板 *1
USB线*1
LED*1
轻触按键*1
220Ω 电阻*1
10KΩ 电阻*1
面包板*1
面包板连接线若干
接线图
测试代码
int ledPin = 11; //定义数字口11
int inputPin = 3; //定义数字口3
void setup()
{
pinMode(ledPin, OUTPUT); //将ledPin设置为输出
pinMode(inputPin, INPUT); //将inputPin设置为输入
}
void loop()
{
int val = digitalRead(inputPin);
//设置数字变量val,读取到数字口3的数值,并赋值给 val
if (val == LOW) //当val为低电平时,LED变暗
{
digitalWrite(ledPin, LOW); // LED变暗
}
else
{
digitalWrite(ledPin, HIGH); // LED亮起
}
}
测试结果
下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。
实验六 抢答器实验#
实验说明
完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以将上面的按键控制小灯的实验扩展成4个按键对应3个小灯,占用7个数字I/O接口。为方便接线,我们把3个小灯用一个RGB灯代替。RGB灯可通过 R、 G、B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。
本实验中我们利用4个按键控制3个PWM口,控制RGB模块发光颜色从而达到抢答器的效果。RGB灯接口说明如下图。
实验器材
开发板*1
USB线*1
RGB灯*1
轻触按键*4
10KΩ 电阻*4
330Ω 电阻*1
面包板*1
面包板连接线若干
杜邦线若干
接线图
测试代码
int redled=9; // 红色LED引脚(PWM)
int greenled=10; // 绿色LED引脚(PWM)
int blueled=11; // 蓝色LED引脚(PWM)
int redpin=5; // 红色按钮引脚(输入)
int greenpin=4; // 绿色按钮引脚(输入)
int bluepin=3; // 蓝色按钮引脚(输入)
int restpin=2; // 复位按钮引脚(输入)
int red; // 存储红色按钮状态
int green; // 存储绿色按钮状态
int blue; // 存储蓝色按钮状态
void setup()
{
pinMode(redled,OUTPUT); // 设置红色LED为输出
pinMode(greenled,OUTPUT); // 设置绿色LED为输出
pinMode(blueled,OUTPUT); // 设置蓝色LED为输出
pinMode(redpin,INPUT); // 设置红色按钮为输入
pinMode(greenpin,INPUT); // 设置绿色按钮为输入
pinMode(bluepin,INPUT); // 设置蓝色按钮为输入
}
void loop()
{
red=digitalRead(redpin); // 读取红色按钮状态
green=digitalRead(greenpin); // 读取绿色按钮状态
blue=digitalRead(bluepin); // 读取蓝色按钮状态
if(red==LOW) RED_YES(); // 红色按钮按下时执行
if(green==LOW) GREEN_YES(); // 绿色按钮按下时执行
if(blue==LOW) BLUE_YES(); // 蓝色按钮按下时执行
}
void RED_YES()
{
while(digitalRead(restpin)==1) // 当复位按钮未按下时保持
{
color(255, 0, 0); // 显示纯红色(R=255,G=0,B=0)
}
clear_led(); // 退出后清除LED显示
}
void GREEN_YES()
{
while(digitalRead(restpin)==1) // 当复位按钮未按下时保持
{
color(0, 255, 0); // 显示纯绿色(R=0,G=255,B=0)
}
clear_led(); // 退出后清除LED显示
}
void BLUE_YES()
{
while(digitalRead(restpin)==1) // 当复位按钮未按下时保持
{
color(0, 0, 255); // 显示纯蓝色(R=0,G=0,B=255)
}
clear_led(); // 退出后清除LED显示
}
void clear_led()
{
color(0, 0, 0); // 关闭所有LED(R=0,G=0,B=0)
}
void color(unsigned char red, unsigned char green, unsigned char blue)
{
analogWrite(redled, red); // 设置红色LED亮度(PWM)
analogWrite(greenled,green); // 设置绿色LED亮度(PWM)
analogWrite(blueled, blue); // 设置蓝色LED亮度(PWM)
}
测试结果
下载完程序,上电后,一个简单的抢答器就做好了,我们根据RGB灯显示的颜色判断是谁抢答成功。在复位后。RGB灯关闭。
实验七 电位器调控灯光亮度实验#
实验说明
在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。
实验器材
开发板*1
USB线*1
LED*1
220Ω 电阻*1
可调电位器*1
面包板*1
面包板连接线若干
接线图
测试代码
int ledpin=11;//定义数字接口11(PWM 输出)
void setup()
{
pinMode(ledpin,OUTPUT);//定义数字接口11 为输出
Serial.begin(9600);//设置波特率为9600
}
void loop()
{
int val=analogRead(0);//读取模拟口A0口的值
val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255
Serial.println(val);//显示val 变量
analogWrite(ledpin,val);// 打开LED 并设置亮度
delay(100);//延时0.1 秒
}
测试结果
下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。
实验八 有源蜂鸣器实验#
实验说明
蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。
实验器材
开发板*1
USB线*1
有源蜂鸣器*1
面包板*1
面包板连接线若干
接线图
测试代码
int buzzer = 2; //定义数字口2
void setup()
{
pinMode(buzzer, OUTPUT); //设置buzzer为输出
}
void loop()
{
digitalWrite(buzzer, HIGH); //开启buzzer
delay(1000); //延迟1S
digitalWrite(buzzer, LOW); //关闭buzzer
delay(1000);//延迟1S
}
测试结果
下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。
实验九 无源蜂鸣器实验#
实验说明
蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。
实验器材
开发板 *1
USB线*1
无源蜂鸣器*1
面包板*1
正标线若干
接线图
测试代码
code 1:
int buzzer=3; //定义数字口3
void setup()
{
pinMode(buzzer,OUTPUT);//将buzzer设置为输出
}
void loop()
{
unsigned char i,j;//定义变量i,j
while(1)
{
for(i=0;i<80;i++)// 输出一个频率的声音
{
digitalWrite(buzzer,HIGH);
delay(1);//延迟1ms
digitalWrite(buzzer,LOW);
delay(1);//延迟1ms
}
for(i=0;i<100;i++)// 输出另一个频率的声音
{
digitalWrite(buzzer,HIGH);
delay(2);//延迟2ms
digitalWrite(buzzer,LOW);
delay(2);//延迟2ms
}
}
}
code 2:
#define D0 -1
#define D1 262
#define D2 293
#define D3 329
#define D4 349
#define D5 392
#define D6 440
#define D7 494
#define M1 523
#define M2 586
#define M3 658
#define M4 697
#define M5 783
#define M6 879
#define M7 987
#define H1 1045
#define H2 1171
#define H3 1316
#define H4 1393
#define H5 1563
#define H6 1755
#define H7 1971
//列出全部D调的频率
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//列出所有节拍
int tune[]= //根据简谱列出各频率
{
M3,M3,M4,M5,
M5,M4,M3,M2,
M1,M1,M2,M3,
M3,M2,M2,
M3,M3,M4,M5,
M5,M4,M3,M2,
M1,M1,M2,M3,
M2,M1,M1,
M2,M2,M3,M1,
M2,M3,M4,M3,M1,
M2,M3,M4,M3,M2,
M1,M2,D5,D0,
M3,M3,M4,M5,
M5,M4,M3,M4,M2,
M1,M1,M2,M3,
M2,M1,M1
};
float durt[]= //根据简谱列出各节拍
{
1,1,1,1,
1,1,1,1,
1,1,1,1,
1+0.5,0.5,1+1,
1,1,1,1,
1,1,1,1,
1,1,1,1,
1+0.5,0.5,1+1,
1,1,1,1,
1,0.5,0.5,1,1,
1,0.5,0.5,1,1,
1,1,1,1,
1,1,1,1,
1,1,1,0.5,0.5,
1,1,1,1,
1+0.5,0.5,1+1,
};
int length;
int tonepin=3; //得用3号接口
void setup()
{
pinMode(tonepin,OUTPUT);
length=sizeof(tune)/sizeof(tune[0]); //计算长度
}
void loop()
{
for(int x=0;x<length;x++)
{
tone(tonepin,tune[x]);
delay(500*durt[x]);//这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
noTone(tonepin);
}
delay(2000);
}
测试结果
实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。
实验十 74HC595实验#
实验说明
74HC595 简单说来就是具有8 位移位寄存器和一个存储器,以及三态输出功能。这里我们用它来控制8 个LED 小灯。我们为什么要用74HC595来控制小灯呢?一定会有朋友会问这个问题,我想问的是我们要是单纯的用Arduino 控制8个小灯的话要占用多少个I/O 呢?答案是8 个,但是我们的Arduino 168有几个I/O 口呢?加上模拟接口也就20 个吧,这8个小灯占用了太多的资源了,我们用74HC595 的目的就是减少I/O口的使用数量。用74HC595 以后我们可以用3 个数字I/O 口控制8 个LED小灯岂不美哉。
实验器材
开发板 *1
USB线*1
74HC595 DIP*1
红色LED*8
220Ω 电阻*8
面包板*1
面包板连接线若干
接线图
测试代码
int data = 2;//74HC595的2脚 数据输入引脚SI
int clock = 5;//74hc595的4脚 时钟线 SCK
int latch = 4;//74hc595的5脚 输出存储器锁存线RCK
int ledState = 0;
const int ON = HIGH;
const int OFF = LOW;
void setup()
{
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}
void loop()
{
for(int i = 0; i < 256; i++)
{
updateLEDs(i);
delay(500);
}
}
void updateLEDs(int value)
{
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, ~value);//串行数据输出,高位在先
digitalWrite(latch, HIGH);//锁存
}
测试结果
下载完程序大家就可以看到8 个小灯闪烁的美妙场景了。实验现象是看到八位LED显示八位二进制数,循环自加1。
实验十一 红外遥控器实验#
实验说明
红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调.
实验中我们用一个红外遥控和一个红外接收头控制6个LED灯的亮和灭。实验前,我们要对红外遥控进行解码。
实验器材
开发板*1
USB线*1
红外遥控*1
红外接收 VS1838B*1
红色LED*6
220Ω 电阻*6
面包板*1
面包板连接线若干
接线图
红外解码接线
红外控灯实验接线
测试代码
红外解码
#include <IRremote.h> // 红外遥控库头文件
int RECV_PIN = 11; // 红外接收器连接引脚11
IRrecv irrecv(RECV_PIN); // 创建红外接收对象
decode_results results; // 存储解码结果的结构体
void setup()
{
Serial.begin(9600); // 初始化串口通信(9600bps)
irrecv.enableIRIn(); // 启动红外接收器
}
void loop()
{
if (irrecv.decode(&results))
{ // 检查是否收到红外信号
Serial.println(results.value, HEX); // 以16进制格式输出红外编码
irrecv.resume(); // 准备接收下一个信号
}
}
红外控灯实验
#include <IRremote.h> // 红外遥控库
int RECV_PIN = 11; // 红外接收器信号引脚
int LED1 = 2; // LED1控制引脚
int LED2 = 3; // LED2控制引脚
int LED3 = 4; // LED3控制引脚
int LED4 = 5; // LED4控制引脚
int LED5 = 6; // LED5控制引脚
int LED6 = 7; // LED6控制引脚
// 定义各LED开关的红外编码(16进制)
long on1 = 0x00FF6897; // LED1开启编码
long off1 = 0x00FF9867; // LED1关闭编码
long on2 = 0x00FFB04F; // LED2开启编码
long off2 = 0x00FF30CF; // LED2关闭编码
long on3 = 0x00FF18E7; // LED3开启编码
long off3 = 0x00FF7A85; // LED3关闭编码
long on4 = 0x00FF10EF; // LED4开启编码
long off4 = 0x00FF38C7; // LED4关闭编码
long on5 = 0x00FF5AA5; // LED5开启编码
long off5 = 0x00FF42BD; // LED5关闭编码
long on6 = 0x00FF4AB5; // LED6开启编码
long off6 = 0x00FF52AD; // LED6关闭编码
IRrecv irrecv(RECV_PIN); // 创建红外接收对象
decode_results results; // 存储解码结果
void setup()
{
pinMode(RECV_PIN, INPUT); // 设置红外接收引脚为输入
pinMode(LED1, OUTPUT); // 设置LED1为输出
pinMode(LED2, OUTPUT); // 设置LED2为输出
pinMode(LED3, OUTPUT); // 设置LED3为输出
pinMode(LED4, OUTPUT); // 设置LED4为输出
pinMode(LED5, OUTPUT); // 设置LED5为输出
pinMode(LED6, OUTPUT); // 设置LED6为输出
irrecv.enableIRIn(); // 启动红外接收
}
int on = 0; // LED状态标志位
unsigned long last = millis(); // 记录最后接收时间
void loop()
{
if (irrecv.decode(&results)) // 检查是否收到红外信号
{
// 防抖处理:两次接收间隔需大于250ms
if (millis() - last > 250) // 防止信号重复触发
{
on = !on; // 切换状态标志
}
// 根据红外编码控制LED状态
if (results.value == on1 ) // 匹配LED1开启编码
digitalWrite(LED1, HIGH); // 点亮LED1
if (results.value == off1 ) // 匹配LED1关闭编码
digitalWrite(LED1, LOW); // 熄灭LED1
if (results.value == on2 ) // LED2控制
digitalWrite(LED2, HIGH);
if (results.value == off2 )
digitalWrite(LED2, LOW);
if (results.value == on3 ) // LED3控制
digitalWrite(LED3, HIGH);
if (results.value == off3 )
digitalWrite(LED3, LOW);
if (results.value == on4 ) // LED4控制
digitalWrite(LED4, HIGH);
if (results.value == off4 )
digitalWrite(LED4, LOW);
if (results.value == on5 ) // LED5控制
digitalWrite(LED5, HIGH);
if (results.value == off5 )
digitalWrite(LED5, LOW);
if (results.value == on6 ) // LED6控制
digitalWrite(LED6, HIGH);
if (results.value == off6 )
digitalWrite(LED6, LOW);
last = millis(); // 更新最后接收时间
irrecv.resume(); // 准备接收下个信号
}
}
注意:在上传程序前,要把IRremote 文件夹放到编译器安装目录下的Arduinolibraries里。不然编译不过。例如我的:C:Program FilesArduinolibraries
测试结果
按照接线图接好线,上传好代码,上电后,红外解码时,红外遥控对准红外接收头按下按键,即可在Arduino IDE的串口监视器中看到对应的编码,详细编码如下图。
红外控灯实验时,我们将遥控器对准红外接收头,按下1 2 3 4 5 6 7 8 9 * 0#共12个按键就可控制6个LED灯的亮与灭。