-
一 .开始您的Arduino之旅(Windows版)
此文档介绍如何用arduino连接到电脑下载您的第一个例程。
步骤:
1、获得一个Arduino主控板和USB数据线
2、下载Arduino集成开发环境
3、连接主控板
4、安装驱动
5、启动arduino应用程序
6、打开blink示例程序
7、选择板卡
8、选择串口号
9、下载程序
1、获得一个Arduino主控板和USB数据线
在本教程中,我们假定使用Arduino Uno ,Arduino Duemilanove,Nano,或者Diecimila.
同样,你需要一条标准的USB线(一边A头,一边B头):例如那种连接到USB打印机的USB线。如果你用的是Arduino Nano,你需要miniUSB线(一边A头一边mini-B头)。
2、下载Arduino开发环境
在下载页中获取最近版本的软件。
当下载完成后,解压下载文件,确保解压到正确的目录下,然后双击打开文件夹,里面包含一些文件夹和子文件夹。
3、连接主控板
Arduino Uno, Mega, Duemilanove and Arduino Nano 通过USB数据线或者外接电源供电便可以自动给主芯片分配供电。当Arduino 主板通过USB线连接电脑供电后,标PWR旁边的LED指示灯将点亮。
4、安装驱动
最新版的Arduino UNO、Arduino MEGA、Arduino Leonardo等控制器及各厂家的兼容控制器,在MAC OS和Linux系统下,均是不要驱动程序的,你只需直接插上,即可使用。但在Windows系统中,你需要为Arduino安装驱动配置文件,才可正常驱动Arduino,具体方法如下:
1)插上你的arduino,此时电脑右下角会显示
因为找不到驱动,过一会儿会提示
2)在“我的电脑”点右键 属性,进入设备管理器,会看到如下的设备
3)双击该设备,并选择“更新驱动程序”
4)选择第二项
5)输入你的驱动地址
驱动在你的arduino安装文件夹中,如下
Arduino UNO、Arduino 2560、ADK、Leonardo等驱动地址:
arduinodrivers
Arduino Duemilanove驱动地址:
驱动地址为:arduinodriversFTDI USB Drivers
6)安装过程中会出现如下提示,选择始终安装此驱动
7)系统会提示你已经成功安装驱动
8)在设备管理器中,你可以看到arduino的COM口了
如果你无法正常安装驱动,可以参考:
windows8下驱动安装方法:
http://www.arduino.cn/thread-2235-1-1.html
arduino驱动安装失败的解决方法 http://www.arduino.cn/thread-2485-1-1.html
5、启动arduino应用程序
双击Arduino应用程序,(如果加载的arduino软件是你不喜欢的语言,你可以在“preferences”对话框进行修改)
6、打开blink示例程序
打开灯闪烁例程:文件 > 示例 > Basics > Blink
7、选择板卡
你需要进入 工具 > 板卡 目录下选择你的arduino相应的板卡。
如果是Arduino duemilanove主板(主芯片为ATmega328),选择Arduino Duemilanove w/ ATmega328。
8、选择串口端号
从 工具>串口 目录下选择arduino主板的串口端号,这可能是COM3或者更高(COM1和COM2通常是用来分配给硬件串行端口)。
9、下载程序
此时,在IDE里,点击“下载”下载按钮,等待几十秒,你可以看到RX和TX的指示灯闪烁,如果下载成功,IDE下状态栏提示“Done uploading”
在下载成功几秒钟后,你可以发现13号引脚连接的LED指示灯开始闪烁,这时候恭喜你,你已经开始了Arduino之旅。
你可能想要浏览的Arduino文件:
Arduino语言参考
http://creativecommons.org/licenses/by-sa/3.0/
在面包板上接插元件固然方便,但你需要有一定的电子知识来搭建各种电路。而使用传感器扩展板,你只需要用通过连接线,把各种接插到扩展板上即可。使用传感器扩展板,你可以更快速的搭建出你自己的项目。
传感器扩展板如图所示,它是最常用的Arduino外围硬件之一。
在扩展板上,数字引脚和模拟输入引脚边有红黑两排排针,以“+”、“-”号标示。“+”表示VCC,“-”表示GND。在一些厂家的扩展板上,VCC和GND可能也会以“V”、“G”标示。
通常我们习惯用红色代表电源(VCC),黑色代表地(GND),其他颜色代表信号(signal)。传感器与扩展板间的连接线也是这样。
在使用其他模块时,你只需要对应颜色,把模块插到相应的引脚,便可使用了。
概述
OJ按键模块采用手感舒适的轻触按键,当按下按键,直接将按键的两极导通连接,而按键两极直接引出连接Arduino的信号线与负极,所以按下按键就表示信号线与负极导通。在实验中,我们利用按下按键触发点亮LED灯,当松开按键时,灯熄灭。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板 × 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
按键模块 × 1 ;
食人鱼LED模块 × 1 ;
主要知识点:
pinMode(Button, STATE) 配置引脚输入输出状态,只有当配置了过后才能正常操作IO,默认为输入INPUT状态。
STATE可以为INPUT;OUTPUT;INPUT_PULLUP;
INPUT—设置该引脚为输入状态;
OUTPUT—设置该引脚为输出状态;
PULLUP—设置该引脚为输入上拉状态
digitalRead(Button) 读取该引脚的状态值。带有返回值。
返回值有0和1;
为0表明读到的是低电平,范围为-0.5V~1.5V将被认为是读到的低电平。
为1 表明读到的是高电平,范围为3V~5.5V被认为读到了高电平。
digitalWrite(LEDpin,VAL) 设置引脚输出高或者低电平
VAL可以为HIGH;LOW;
HIGH—设置引脚输出高电平
LOW—设置引脚输出低电平
接线示意图:
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:按下按键,LED灯点亮。松开按键,LED灯熄灭。
*/
int Button = 2;
int LEDpin = 13;
void setup() {
pinMode(Button, INPUT_PULLUP); //由于在默认状态时IO口读到的是一个不稳定的电平值,加上拉使之默认接高电平。
pinMode(LEDpin, OUTPUT); //设置13号IO口为输出状态
}
void loop() {
int ButtonState = digitalRead(Button); //设置变量存储读到的状态值
if(ButtonState==0)
{
digitalWrite(LEDpin,HIGH); //判断,如果读到的状态为0,表明按键已经按下,这时候点亮LED
}
else
{
digitalWrite(LEDpin,LOW); // 否则说明按键没有按,熄灭LED
}
}
在实际操作中,可能会出现一个问题,就是按下按键时会出现抖动,抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。
此处,我们用软件对其进行延时处理消除抖动。
if(ButtonState==0)
{
delay(10);
if(ButtonState==0) {
digitalWrite(LEDpin,HIGH);
}
}
示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:按下按键,LED灯点亮。松开按键,LED灯熄灭。
*/
int Button = 2;
int LEDpin = 13;
void setup() {
pinMode(Button, INPUT_PULLUP); //由于在默认状态时IO口读到的是一个不稳定的电平值,加上拉使之默认接高电平。
pinMode(LEDpin, OUTPUT); //设置13号IO口为输出状态
}
void loop() {
int ButtonState = digitalRead(Button); //设置变量存储读到的状态值
if(ButtonState==0)
{
delay(10);
if(ButtonState==0) //延时消抖处理
{
digitalWrite(LEDpin,HIGH); //判断,如果读到的状态为0,表明按键已经按下,这时候点亮LED
}
}
else
{
digitalWrite(LEDpin,LOW); // 否则说明按键没有按,熄灭LED
}
}
接线实物图:
当什么时候需要设置IO为上拉状态?
答:一般情况下,IO口不接任何电平,用digitalRead()去读它的状态时,读到的是一个不确定的值,不一定是0也不一定是1。这时候观察硬件是否有接一个上拉电阻(提供一个稳定的高电平),如果没有接的话便可以通过软件设置IO口内部加上上拉,也就是 这里的pinMode(Button, INPUT_PULLUP)。
消除抖动是否还有其他方法?
答:另外一种消抖方式为硬件消抖,常用的硬件消抖方式有利用电容的放电延时,采用并联电容法,也可以实现硬件消抖。
概述
实验采用OJ模拟声音传感器,驻极体检测声音大小,并经过放大电路输出模拟量。所以,检测声音的大小就与输出的模拟量成正比。实验中,我们采用模拟声音传感器循环检测外部音量,当超过一定值后,点亮LED,延时一段时间后,熄灭LED。这样模拟夜间楼道声控灯工作。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
声音传感器模块 × 1 ;
食人鱼LED模块 × 1 ;
主要知识点:
analogRead(PIN) 读取模拟输入值。
这里的PIN只能是对应A0—A5 这种带ADC功能的引脚,数字引脚0—13则不能使用该函数。
读取到的值是则是一个0~5V的电压值,而这里的模拟输入精度为10位,也就是2的10次方为1024,将0—5V伏对应映射到0—1023,所以analogRead(PIN)的返回值为0—1023中的一个值。通过这个值也可以换算为读取到的电压值。
实验连接图
食人鱼LED对应连接13号IO口。
声音传感器对应连接A0口。
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:模拟声控灯开关状态,当音量超过设定值后,点亮LED,延时一段时间后熄灭
*/
int LEDpin = 13; //定义LED灯控制引脚
void setup() {
pinMode(LEDpin,OUTPUT);
}
void loop() {
int Soundvalue = analogRead(A0); //读取输入模拟值
if(Soundvalue>20)
{
digitalWrite(LEDpin,HIGH); //当模拟值大于设定值后,点亮LED
for(int i=0;i<20;i++){
delay(1000); //延时20s
}
}
else{
digitalWrite(LEDpin,LOW); //关闭LED
}
}
连线实物图:
下载程序后,对声音传感器发出声响,LED灯便会自动打开,过20秒后,LED灯自动熄灭。
概述
实验中采用OJ直滑电位器模块,直接位置滑动输出模拟值,结合arduino传感器扩展板,可以轻松做出您的互动作品。本实验实现与RGB led互动,当滑动直滑电位器时,RGBled对应发出炫彩的灯光。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
直滑电位器模块 × 1 ;
RGB LED模块 × 1 ;
主要知识点:
三原色的介绍 人眼对红、绿、蓝最为敏感,人的眼睛像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样,绝大多数单色光也可以分解成红、绿、蓝三种色光,这是色度学的最基本的原理,也称三原色原理。这里的RGB LED实质是对应3中颜色红绿蓝的LED,当我们以不同亮度配比三种颜色时,整体显示出来光线变得幻彩美丽。
analogWrite(PIN,VALUE) 输出PWM波形,也就是利用PWM技术改变输出不同的平均电压值,这里就可以调节灯光的亮暗程度。
这里输出的PWM默认频率为490HZ的一个方波。
PIN 只能为带有PWM输出的IO口,在UNO中只有 3 ,5, 6,9, 10, 11 这6个数字IO口带有PWM功能。
VALUE PWM输出的值0—255
连线示意图:
直滑电位器对应接A0口
RGBled对应接3、5、6数字IO口
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:直滑电位器与灯光互动实验,当从0位开始滑动电位器时,依次红光、绿光、
蓝光、白光慢慢由亮变暗
*/
#define R 3
#define G 5
#define B 6 //定义RGB数字连接IO口
void setup()
{
pinMode(R,OUTPUT);
pinMode(G,OUTPUT);
pinMode(B,OUTPUT); //将连接LED灯的数字IO口置为输出状态
}
void loop()
{
int value=analogRead(A0); //定义一个参数存储A0口读到的模拟值,范围在0~1023
if(value>=0 && value<256)
{
analogWrite(R,value); //如果电位器输出值在0~256,则用PWM点亮RGB中的红色,同时熄灭绿色和蓝色
analogWrite(G,255);
analogWrite(B,255); //由于RGBled模块是共阳极,所以PWM输出最高时,LED亮度就最低
}
else if(value>=256 && value<512)
{
analogWrite(G,value-256); //调节绿光变化
analogWrite(R,255);
analogWrite(B,255);
}
else if(value>=512 && value<768)
{
analogWrite(B,value-512); //调节蓝光变化
analogWrite(R,255);
analogWrite(G,255);
}
else
{
analogWrite(R,value-768);
analogWrite(G,value-768);
analogWrite(B,value-768); //三光合成白光,同时进行亮度调节
}
}
接线实物图:
注意事项:由于RGBled模块是共阳极,它们的正极共同连接到VCC,当对于连接 R G B的IO口,需输出低电平时才会点亮该颜色的LED,若输出高电平则使LED熄灭。利用PWM调节IO口输出状态可以调灯亮度。
概述
本实验我们利用按键模块、蜂鸣器模块、食人鱼LED模块制作3路数字抢答器。
设计任务
抢答器同时供3名选手获3个代表队比赛,分别用三个按键表示。
板载复位开关,由主持人控制。
当主持人启动“开始”键后,抢答开始。
选手在主持人启动开始后抢答,当警报响起表示抢答完毕。
抢答完毕后,主持人由三种食人鱼LED显示的状态决出谁抢到该答题权。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
3p杜邦线 × 6 ;
食人鱼LED × 3 ;
蜂鸣器模块 × 1 ;
按键模块 × 3 ;
接线示意图:
Key1~key3分别对应接2、3、4号IO口位置。
蜂鸣器模块对应接5号IO口位置。
粉红、绿色、红色食人鱼LED分别对应接在6、7、8号IO口位置。
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:复位主控板,抢答器处于初始状态,当3个选手按下按键抢答后,蜂鸣
器发出警报声音,随后观察3个LED的状态,如果是1号按键先按下则点亮粉红
色灯。2号按键先按下点亮绿灯,3号按键先按下点亮红灯。3个LED指示谁抢
到该题回答权。
*/
int key1=2;
int key2=3;
int key3=4; //定义按键输入数字口
int Buzzerpin = 5; //定义蜂鸣器输出数字口
int pinkLED = 6;
int greenLED=7;
int redLED = 8; //定义三个LED输出IO口,指示抢答的结果
void Alarm() //蜂鸣器发出声音
{
for(int i=0;i<100;i++){
digitalWrite(Buzzerpin,HIGH); //发声音
delay(2);
digitalWrite(Buzzerpin,LOW); //不发声音
delay(2); //修改延时时间,改变发声频率
}
}
void setup()
{
pinMode(Buzzerpin,OUTPUT); //蜂鸣器输出口置为输出
pinMode(pinkLED,OUTPUT);
pinMode(greenLED,OUTPUT);
pinMode(redLED,OUTPUT); //LED输出口置为输出状态
pinMode(key1,INPUT_PULLUP);
pinMode(key2,INPUT_PULLUP);
pinMode(key3,INPUT_PULLUP); //三个按键置为输入并且上拉状态
digitalWrite(pinkLED,LOW);
digitalWrite(greenLED,LOW);
digitalWrite(redLED,LOW);
}
void loop()
{
int i ,j ,k;
i=digitalRead(key1);
j=digitalRead(key2);
k=digitalRead(key3); //定义3个参数,分别存储3个按键的状态
if(i==1 && j==1 &&k==1) //状态为1表示按键未按下
return;
if(i==0) //如果1号按键按下,蜂鸣器发出声音,同时点亮粉红灯
{
if(i==0)
{
delay(10);
Alarm();
digitalWrite(pinkLED,HIGH);
digitalWrite(greenLED,LOW);
digitalWrite(redLED,LOW);
delay(100); //延时一段时间
}
}
if(j==0) //如果2号按键按下,蜂鸣器发出声音,同时点亮绿灯
{
if(j==0)
{
delay(10);
Alarm();
digitalWrite(pinkLED,LOW);
digitalWrite(redLED,LOW);
digitalWrite(greenLED,HIGH);
delay(100);
}
}
if(k==0) //如果3号按键按下,蜂鸣器发出声音,同时点亮红灯
{
if(k==0)
{
delay(10);
Alarm();
digitalWrite(pinkLED,LOW);
digitalWrite(greenLED,LOW);
digitalWrite(redLED,HIGH);
delay(100);
}
}
else //其他状态,直接返回
{
return;
}
delay(500); //延时500毫秒,避免下一次触发影响本次结果
}
接线实物图:
实验结束后,初学者可以发挥自己的想象,根据实际要求按照该思路增加抢答路数,同时也可以在此基础上改进程序及硬件连接,让您自己的多路数字抢答器更加完美。
概述
超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=340m/s× t / 2 。这就是所谓的时间差测距法。本实验利用超声波测得的距离从串口中显示。
元器件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
1p杜邦线 × 4 ;
超声波传感器 × 1;
知识要点:
pulseIn() 用于检测引脚输出的高低电平的脉冲宽度。
pulseIn(pin, value)
pulseIn(pin, value, timeout)
Pin—需要读取脉冲的引脚
Value—需要读取的脉冲类型,HIGH或LOW
Timeout—超时时间,单位微秒,数据类型为无符号长整型。
使用方法及时序图:
1、使用Arduino采用数字引脚给SR04的Trig引脚至少10μs的高电平信号,触发SR04模块测距功能;
2、触发后,模块会自动发送8个40KHz的超声波脉冲,并自动检测是否有信号返回。这步会由模块内部自动完成。
3、如有信号返回,Echo引脚会输出高电平,高电平持续的时间就是超声波从发射到返回的时间。此时,我们能使用pulseIn()函数获取到测距的结果,并计算出距被测物的实际距离。
SR04与Arduino接线示意图:
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:利用SR04超声波传感器进行测距,并用串口显示测出的距离值
*/
// 设定SR04连接的Arduino引脚
const int TrigPin = 2;
const int EchoPin = 3;
float distance;
void setup()
{ // 初始化串口通信及连接SR04的引脚
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
pinMode(EchoPin, INPUT);
Serial.println(“Ultrasonic sensor:”);
}
void loop()
{
// 产生一个10us的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH) / 58.00;
Serial.print(distance);
Serial.print(“cm”);
Serial.println();
delay(1000);
}
连线实物图:
下载完程序后,打开串口监视器,并将超声波传感器对向需要测量的物体,即可看到当前超声波传感器距物体的距离,如下图:
概述
红外遥控系统主要分为调制、发射和接收三部分。红外接收模块中的一体化红外接收头,内部集成了红外接收电路,包括红外检测二极管,放大器,限幅器,带通滤波电容,积分电路,比较器等。能够将接收到的调制波进行解调。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板 × 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
38K红外接收模块 × 1;
红外遥控器 × 1;
要使用遥控器控制Arduino,首先我们得知道遥控器各按键对应的编码,不同的遥控器,不同的按键,不同的协议,都对应的不同的编码。
连线示意图:
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:获取遥控器各按键的编码值
*/
#include <IRremote.h>
int RECV_PIN = 11; // 红外一体化接收头连接到Arduino 11号引脚
IRrecv irrecv(RECV_PIN);
decode_results results; // 用于存储编码结果的对象
void setup()
{
Serial.begin(9600); // 初始化串口通信
irrecv.enableIRIn(); // 初始化红外解码
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // 接收下一个编码
}
}
打开串口监视器,对着红外接收模块按下按键
遥控器的每个按键都对应了不同的编码,不同的遥控器使用的编码也不相同。
出现“FFFFFFFF”编码,是因为我使用的是NEC协议的遥控器,当按住某按键不放时,其会发送一个重复编码“FFFFFFFF”。而其他协议的遥控器,则会重复发送对应的编码。
你可以在以下网址找到常见品牌遥控器的编码
http://lirc.sourceforge.net/remotes/
遥控器参考编码值:
FFA25D |
|
FFE21D |
FF22DD |
FF02FD |
FFC23D |
FFE01F |
FFA857 |
FF906F |
FF6897 |
FF9867 |
FFB04F |
FF30CF |
FF18E7 |
FF7A85 |
FF10EF |
FF38C7 |
FF5AA5 |
FF42BD |
FF4AB5 |
FF52AD |
红外遥控实验利用遥控器的ON OFF按键实现对LED的开通和关断(在已知两种按键编码制的基础上,否则先确定按键编码)。
接线示意图:
红外接收模块对应连接11号IO,LED模块对应连接13号IO。
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:红外遥控器控制LED灯开关
*/
#include <IRremote.h>
int RECV_PIN = 11; // 红外一体化接收头连接到Arduino 11号引脚
int LEDpin = 13; //定义LED输出引脚
IRrecv irrecv(RECV_PIN);
decode_results results; // 用于存储编码结果的对象
void setup()
{
pinMode(LEDpin,OUTPUT);
irrecv.enableIRIn(); // 初始化红外解码
}
void loop() {
if (irrecv.decode(&results))
{
Serial.println( results.value);
if( results.value == 0xFFA25D) //若接收到按键ON按下的指令,打开LED
{
digitalWrite(LEDpin,HIGH);
}
else if(results.value == 0xFFE21D) //接收到OFF按键按下的命令,关闭LED
{
digitalWrite(LEDpin,LOW);
}
irrecv.resume(); // 接收下一个编码
}
}
连线实物图
观察现象:遥控器对准红外接收模块,按下ON键时LED点亮。按下OFF键时LED熄灭。
概述
本实验利用模拟旋转电位器来控制舵机角度定位,旋钮电位器转动一圈输出模拟值转化为9g舵机对应180°范围内的角度值。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
10K旋钮电位器模块 × 1 ;
9G微型舵机 × 1 ;
知识要点:
servo类下成员函数
attach() 连接舵机
write() 角度控制
writeMicroseconds() 输入一个值单位为us,来控制舵机转动到相应角度,输入值为1000时舵机轴转动到逆时针最大位置。输入值为2000时舵机轴转动到顺时针最大位置。为1500时舵机轴在中间位置。
read() 读上一次舵机转动角度
attached() 连接舵机接口引脚
detach() 断开舵机连接
接线示意图:
模拟电位器接A0
舵机接对应9号IO口
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:旋转电位器则舵机转动,当电位器转动一圈是,舵机则相应的转动最大的180度,
实现实时控制舵机的转动。
*/
#include <Servo.h> //包含舵机库
Servo myservo; //创建一个舵机控制类
int pos = 0; //定义一个变量存储舵机转动角度
void setup()
{
myservo.attach(9); //连接舵机到9号数字口
}
void loop()
{
int value=analogRead(A0); //读取A0口输入的模拟值
pos=map(value,0,1023,0,180); //将读到的模拟值0~1023映射为0°~180°
myservo.write(pos); //舵机转动到相应角度
delay(100); //延时一段时间让舵机转动到对应位置
}
接线实物图:
观察现象:当拧动旋钮电位器时,舵机的舵盘发生相应的角度转动。
概述
人体红外传感器基本原理是检测人或者动物发出的红外线并用经过菲泥尔滤光片增强后聚集到红外感应源上,将感应的红外信号转化为电信号。本实验利用人体红外传感器检测人或者动物运动发出的红外线,发出警报。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板 × 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
人体红外传感器 × 1 ;
蜂鸣器模块 × 1 ;
知识要点:
无源蜂鸣器与有源蜂鸣器的区别:有源蜂鸣器内部有提供一定频率的震荡,所以当通电时就会发出声响。而无源蜂鸣器则没有震荡,若通电的数字信号频率一直保持不变则无源蜂鸣器不会发出声音。从而用arduino驱动无源蜂鸣器,可以通过修改频率让蜂鸣器唱歌发出美妙动听的音乐。
人体红外原理:人体都有恒定的体温,一般在37度,所以会发出特定波长10UM左右的红外线,被动式红外探头就是靠探测人体发射的10UM左右的红外线而进行工作的。人体发射的10UM左右的红外线通过菲泥尔滤光片增强后聚集到红外感应源上。红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。
连线示意图:
蜂鸣器模块对应接3号数字IO口。
人体红外传感器对应接2号数字IO口,注意传感器3个引脚顺序分别为GND OUT VCC(取下白色透镜便可看到定义引脚的丝印),利用杜邦线分别连接至arduino的 – 2 + 相应引脚上,切勿接反。
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:利用人体红外模块检测一定范围内的动物运动状态,如果检测到有输出则发出
警报。
*/
int Sensor_pin = 2;
int Buzzerpin = 3;
void Alarm() //蜂鸣器发出警报
{
for(int i=0;i<100;i++){
digitalWrite(Buzzerpin,HIGH); //发声音
delay(2);
digitalWrite(Buzzerpin,LOW); //不发声音
delay(2); //修改延时时间,改变发声频率
}
}
void setup()
{
pinMode(Sensor_pin,INPUT); //设置人体红外接口为输入状态
pinMode(Buzzerpin,OUTPUT); //设置蜂鸣器接口为输出状态
}
void loop()
{
int val=digitalRead(Sensor_pin); //定义参数存储人体红外传感器读到的状态
if(val == 1) //如果检测到有动物运动(在检测范围内),蜂鸣器发出警报
{
Alarm();
}
else
{
return;
}
delay(100); //延时100毫秒
}
接线实物图:
注意事项:因为人体红外检测有一定角度,安装时注意安装位置避免误触发,同时人体红外模块可以调节其电位器来调节检测灵敏度,应按照实际情况进行调节。
概述
本实验利用避障传感器代替开关,遇到一次障碍物发光方式改变一次。初始状态下灯光不亮,在传感器前挡住一次,表明打开LED灯光,进入慢闪状态,然后陆续的挡住避障传感器,灯光的闪烁变得急促。这样还可以模拟自行车灯进行调节灯光。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板 × 1;
USB数据线 × 1 ;
3p杜邦线 × 2 ;
避障传感器× 1;
食人鱼LED × 1;
知识要点:
外部中断:是用来监视外部事件的发生,当标定好的外部事件有触发时,立即放下正在运行的程序,相应外部中断,执行中断函数。(例如钓鱼的时候,当发现浮漂再动时,立即放下手中其他事情,拉起鱼竿)。
UNO的中断引脚为2 和3 分别对应 外部中断0和1.
attachInterrupt(interrupt, function, mode)
interrupt 中断编号。
Function 中断函数名。中断触发后,即会运行的函数名称
mode 中断模式。包含LOW ,CHANGE,RISING,FALLING
LOW:低电平触发
CHANGE:电平跳变触发
RISING:上升沿触发,电平有低到高
FALLING:下降沿触发,电平有高到底
接线示意图:
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:避障传感器与灯光互动,当首次挡住避障传感器后LED灯慢闪,第二次挡住时,
LED灯闪烁速度变快,第三次,LED灯闪烁速度更加变快,第四次挡住时,LED灯熄灭
回到初始状态。
*/
int LEDpin=13; //定义LED输出引脚
int time = 0; //外部中断次数
void setup() {
pinMode(LEDpin, OUTPUT);
attachInterrupt(0,flash, LOW); //外部中断0,即2号IO口为中断接口,中断子函数为flash ,低电平触发中断
}
void loop() {
switch(time){
case 0 :
digitalWrite(LEDpin,LOW); //默认输出低电平,熄灭LED
break;
case 1 :
digitalWrite(LEDpin,HIGH);
delay(1000);
digitalWrite(LEDpin,LOW); //第一次中断,LED延时1秒闪烁
delay(1000);
break;
case 2 :
digitalWrite(LEDpin,HIGH); //第二次中断,延时500ms
delay(500);
digitalWrite(LEDpin,LOW);
delay(500);
break;
case 3 :
digitalWrite(LEDpin,HIGH); //第三次中断,延时100ms
delay(100);
digitalWrite(LEDpin,LOW);
delay(100);
break;
default:break;
}
}
void flash() //中断服务函数
{
time++;
if(time==4)
time=0;
} //每次进入中断后,time次数加1,当加到4的时候,回到初始状态
接线实物图:
利用避障传感器返回的数据触发外部中断,每当中断一次,time次数增加一次。在loop()循环中,依靠识别time的数字来决定是第几次闪灯模式,这样便实现了避障传感器触发闪灯的功能。
概述
在此实验中,当触摸到触摸模块时模块输出高电平,松开输出低电平。利用OJ触摸模块,触发使蜂鸣器输出对应的音色。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板 × 1;
USB数据线 × 1 ;
3p杜邦线 × 8 ;
触摸模块 × 7
蜂鸣器模块 × 1
知识要点:
tone() 产生不同频率相同占空比(50%)的波形。
tone(pin, frequency)
tone(pin, frequency, duration)
pin: 需要输出方波的引脚
frequency: 输出的频率,unsigned int 型
duration: 频率持续的时间,单位毫秒。如果没有该参数,Arduino 将持续发出设定的音调,直到你改变发声频率或者使用noTone()函数停止发声。
接线示意图:
7个触摸模块分别接2~8对应IO口,蜂鸣器模块对应接10号IO口。
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:蜂鸣器+触摸模块 制作简易电子琴
奈何col
*/
#include “pitches.h”
void setup() {
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT); //将2~8号IO口置为输入状态,以读取触摸模块反馈的值。
}
void loop() {
if(digitalRead(2)){
tone(10, NOTE_C5, 10);
}
if(digitalRead(3)){
tone(10, NOTE_D5, 10);
}
if(digitalRead(4)){
tone(10, NOTE_E5, 10);
}
if(digitalRead(5)){
tone(10, NOTE_F5, 10);
}
if(digitalRead(6)){
tone(10, NOTE_G5, 10);
}
if(digitalRead(7)){
tone(10, NOTE_A5, 10);
}
if(digitalRead(8)){
tone(10, NOTE_B5, 10); //触摸到触摸模块时发出相应的音调。
}
}
贴上例程后,程序还不能编译,因为缺少了一个头文件”pitches.h”,”pitches.h”里存储了我们所需音调的频率。我们需要在IED里新建这个头文件。
输入文件名pitches.h ,然后点击OK。
在新建的pitches.h里面键入代码
/*************************************************
* Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
接线实物图:
点击编译下载,连接好蜂鸣器后,便实现电子琴的制作。
概述
本实验利用光敏传感器、声音传感器、LM35线性温度传感器组成了环境监测的基本因素,实现了对环境光,噪音,以及温度的检测,让您可以在家中掌握自己身处的环境情况。
元件清单:
Zduino UNO × 1;
OJ传感器扩展板× 1;
USB数据线 × 1 ;
3p杜邦线 × 3 ;
LM35线性温度传感器 × 1;
模拟声音传感器 × 1;
模拟光敏传感器 × 1;
连线示意图:
l
Arduino示例程序:
/*
www.openjumper.cn
日期:2013.5.18
IDE 版本:1.0.1
功能:采集环境中的声音,光线,温度数据,并在一定时间内刷新数据,串口显示。
*/
int temPin = A4; //设置模拟口4为LM35的信号输入端口
int soundPin = A2;
int lightPin = A1;
int a[10];
float temperature = 0; //设置temperature为浮点变量
long val=0; //设置val为长整数变量
int soundvalue,lightvalue;
float readtemp() //读取温度
{
val=analogRead(temPin);//温度传感器LM35接到模拟PIN4上;val变量为从LM35信号口读取到的数值
temperature = (val*0.0048828125*100); //把读取到的val转换为温度数值,系数一:0.00488125=5/1024,0~5V对应模拟口读数1~1024,系数二:100=1000/10,1000是毫伏与伏的转换;10是每10毫伏对应一度温升。
return temperature; //返回温度值
}
int readsound() //读取最大噪音值
{
int sound_max=0;
for(int i=0;i<10;i++)
{
a[i] = analogRead(soundPin);
sound_max=max(sound_max,a[i]);
}
return sound_max;
}
int readlight() //采样10次光线值,返回其平均值
{
int light_sum,light_average;
int light_max = 0;
int light_min=1024;
for(int i=0;i<10;i++)
{
a[i] = analogRead(lightPin);
light_sum=light_sum + a[i];
light_max=max(light_max,a[i]);
light_min=min(light_min,a[i]);
}
light_average = (light_max + light_min)/2;
return light_average;
}
void setup()
{
Serial.begin(9600);//设置波特率
Serial.println(“Smart Environment monitor begin….”);
}
void loop()
{
float tempvalue = 0;
tempvalue = readtemp();
soundvalue = readsound();
lightvalue = analogRead(lightPin);
Serial.print(“now the temperature is “) ;
Serial.println(tempvalue);
Serial.print(“the soundvalue is “) ;
Serial.println(soundvalue);
Serial.print(“the lightvalue is “) ;
Serial.println(lightvalue);
Serial.println(); //串口分别显示读取的温度、声音、光敏值
delay(1000); //1秒刷新一次
}
打开串口,观察显示数据:
接线实物图: