资源描述
《创新实践》课程总结报告
报告名称:基于Arduino的遥控PPT播放系统设计
学 院: 信息工程与自动化学院
专 业: 物联网工程
学 号: 201310410149
学生姓名: 廖成武
指导教师: 江虹
日 期: 2016年6月17日
l 题目:基于Arduino的遥控PPT播放系统设计
l 内容:
一、绪论
1. Arduino简介
Arduino是目前较为流行的电子互动平台,基于单片机系统开发,具有使用简单、功能多样、价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。
Arduino是2005年1月由米兰交互设计学院的两位教师David Cuartielles和Massimo Banzi联合创建,是一块基于开放原始代码的Simple I/O平台,该平台由两部分组成:硬件(包括微处理器、电路板等)和软件(编程接口和语言)。平台的两部分都是开源的,如果需要,可以下载Arduino的图表、购买需要的所有独立部件、切割电路板并制作一个电路板。Arduino具有类似java、C语言的开发环境。可以快速使用Ardu ino语言与Flash或Processing等软件完成互动作品。Arduino能够使用开发完成的电子元件,如Switch、Sensors或其它控制器、LED、步进电机或其它输入/输出装置,同时,Arduino也可以成为独立与软件沟通的平台,如flash、Processing、Max/MSP或其它互动软件。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
Ardunio平台特点:
Arduino在开发之初,就明确了其应用环境,设计了开源开放的平台,便于对其进行二次开发。Arduino的主要功能特点如下:
1)开放源代码的电路图设计。程序开发接口免费下载,也可依需求自己修改。
2)使用低价格的微处理控制器(ATmega8或ATmega128)。可以采用USB接口供电,不需外接电源,也可以使用外部9VDC输入。
3)支持ISP线上烧入器,将Bootloader固件烧入芯片。Arduino控制器内带Bootloader程序,是系统上电后运行的第一段代码,就好比PC机BIOS中的程序,启动就进行自检,配置端口等等,当然,单片机是靠烧写熔丝位来设定上电从boot区启动的,使用这个程序就可以直接把从串口发来的程序存放到flash区中。所以,使用Arduino编译环境下载程序时,就先让单片机复位,启动Boodoader程序引导串口发过来的程序顺利写入flash区中,flash可以重复烧写,因此想更新软件非常方便。有了Bootloader之后,可以通过串口或者USB to RS232线更新固件。
4)可依据官方提供的PCB和SCH电路图,简化Arduino模组,完成独立运作的微处理控制。
5)可简单地与传感器,各式各样的电子元件连接,如红外线、超音波、热敏电阻、光敏电阻、伺服马达等。
6)支持多样的互动程序,如Flash,Max/MSP,VVVV,PureData,C,Processin等。使用低价格的微处理控制器。
7)应用方面,利用hrduino,突破以往只能使用鼠标、键盘、CCD等输入的装置的互动内容,可以更简单地达成单人或多人游戏互动。Ard uino的功能特点,使其得到了越来越广泛的应用。
2. 本次实践所选项目要完成的工作
1) 根据接线图连接好板子、红外接收模块、响应模块;
2)编辑代码,对原红外遥控代码做出相关系统功能的更改;
3)编译代码,将板子和电脑连接上,下载程序进板子;
4)使用红外遥控器进行遥控,调试相应功能;
5)调试之后对代码进行相应改进,最后完成系统;
6)理解整个系统的所有代码。
二、系统结构分析
1.硬件基本组成
控制器:ardunio开发板
输入、输出:红外遥控模块(VS1838B红外接收头、CARmp3遥控器、面包板、线、开发板)、响应模块(蜂鸣器、LED灯、电阻、PC)
VS1838B红外接收头:VS1838B内含高速高灵敏度PIN光电二极管和低功耗、高增益前置放大IC,采用环氧树脂封装外加外屏蔽抗干挠设计,该产品已经通过REACH和SGS认证属于环保产品,在红外遥控系统中作为接收器使用。
结构图:
原理图:
CARmp3遥控器:遥控器由红外接收及发射电路、信号调理电路、中央控制器8031.程序及数据存储器、键盘及状态指示电路组成
2. 硬件连线图或硬件结构框图
三、系统软件设计
1.基本功能
通过红外遥控模块和响应模块对鼠标和键盘进行控制,实现遥控器控制鼠标移动至一PPT文件处并点击它,进入WPS,再控制鼠标移动至播放按钮处,点击开始播放,PPT全屏后,再通过遥控器控制PPT的翻页,实现PPT的播放功能,同时串口监视器显示相应的按键信息(用户码、数据码、数据反码)。
由于系统的可靠性不是特别高,遥控器经常需要按好几次才能成功接收到信号,所以增加接收成功反馈功能,即只有在一次按键后系统成功运行后会有LED灯闪一下和蜂鸣器响一下。
2.模块设计
2.1红外遥控模块:(VS1838B红外接收头、CARmp3遥控器、面包板、线、开发板)
2.11实现原理
使用者每按下一个控制键,CPU从指定的存储单元中读取一系列的二进制数据,串行输出给信号保持电路,同时由调制电路将信号调制在一个特定的载波平率上,将调制信号经放大后,由红外线发射二极管进行发射,红外接收装置滤掉其他杂波只接受该特定载波频率上的信号并将其还原成脉冲码。此时开发板端由定时器提供一个时钟频率对脉冲进行检测、解码,这里就需要了解遥控器的编码方式以及数据格式,
编码方式:NEC协议
遥控器发出的二进制脉冲码载波频率是38kHz,采用脉冲宽度调制,每一位的时间为1.125ms或2.25ms ,逻辑1和逻辑0;一个消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平,之后就是信息码了.
数据格式:包括用户码、数据码和数据反码共占32位。数据反码可用于对数据的纠错。
根据编码原理,系统通过remote_decode(void)译码函数根据特定时间间隔的高低电平信号(9ms、4.5ms已在代码中标出)调用void pulse_deal()接收地址码和命令码脉冲函数进行解码;
而pulse_deal()函数先是调用logic_value()判断逻辑值0和1子函数得到脉冲的二进制值,再将二进制数存入之前定义好的变量中;
logic_value()函数则又是通过特定的高低电平时间间隔(560us、560us已在代码中标出)识别出逻辑0和1传给pulse_deal()函数。
系统通过以上三个函数将系统接收到的脉冲信号进行解码得到adrL_code 、adrH_code 、ir_code 三个变量分别为用户码、数据码、数据反码,再将变量传给响应模块,最终实现系统功能。
2.12、关键代码
void timer1_init(void)//定时器初始化函数
{
TCCR1A = 0X00;
TCCR1B = 0X05;//给定时器时钟源 //64us进行一次计数器累加
TCCR1C = 0X00;
TCNT1 = 0X00;
TIMSK1 = 0X00; //禁止定时器溢出中断
}
char logic_value()//判断逻辑值“0”和“1”子函数
{
TCNT1 = 0X00;
while(!(digitalRead(IR_IN))); //低等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10)//低电平560us
{
while(digitalRead(IR_IN));//是高就等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10)//接着高电平560us
return 0;
else if(Pulse_Width>=25&&Pulse_Width<=27) //接着高电平1.7ms
return 1;
}
return -1;
}
void pulse_deal()//接收地址码和命令码脉冲函数
{
int i;
int j;
ir_code=0x00;// 清零
adrL_code=0x00;// 清零
adrH_code=0x00;// 清零
//解析遥控器编码中的用户编码值
for(i = 0 ; i < 16; i++)
{
if(logic_value() == 1) //是1
ir_code |= (1<<i);//保存键值
}
//解析遥控器编码中的命令码
for(i = 0 ; i < 8; i++)
{
if(logic_value() == 1) //是1
adrL_code |= (1<<i);//保存键值
}
//解析遥控器编码中的命令码反码
for(j = 0 ; j < 8; j++)
{
if(logic_value() == 1) //是1
adrH_code |= (1<<j);//保存键值
}
remote_deal();
}
void remote_decode(void)//译码函数
{
TCNT1=0X00;
while(digitalRead(IR_IN))//是高就等待
TCNT1=0X00;
while(!(digitalRead(IR_IN))); //低等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=140&&Pulse_Width<=141)//9ms
{
while(digitalRead(IR_IN));//是高就等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms 此时判定为目标脉冲信号
{
pulse_deal();
return;
}
else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms
{
while(!(digitalRead(IR_IN)));//低等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10)//560us
{
return;
}
}
}
}
2.2、响应模块(蜂鸣器、LED灯、PC)
2.21、遥控器按键对应响应功能
3
1
2
1:上一页
3:下一页
6
5
4
2:鼠标上移
8:鼠标下移
4:鼠标左移
8
6:鼠标右移
5:确定
2.22、响应原理
通过红外遥控模块传递的变量adrL_code使Deal_Print()函数作出响应,响应分为三部分:
1.鼠标和键盘的响应: Mouse.move(); Keyboard.press();
2.蜂鸣器和LED灯:BuzzerDi();digitalWrite(LED,HIGH);
3.串口显示按键相关信息:remote_deal() (该函数在InfraredRemote.h中)。
2.2.3、关键代码
#include "InfraredRemote.h"
#include <CCEventKeyboard.h>
#define Buzzer 3
#define LED 13
void setup()
{
Serial.begin(9600);
pinMode(IR_IN,INPUT_PULLUP);//设置红外接收引脚为输入
Serial.flush(); //清除串口缓冲器内容函数。
timer1_init();//定时器初始化
Keyboard.begin();
Mouse.begin();
pinMode(Buzzer,OUTPUT); //蜂鸣器为IO输出
digitalWrite(Buzzer,LOW);
pinMode(LED,OUTPUT); //LED为IO输出
digitalWrite(LED,LOW);
}
void loop()
{
remote_decode(); //译码
Deal_Print();
}
void Deal_Print() //响应
{
if(adrL_code !=0x00)
{
BuzzerDi();
digitalWrite(LED,HIGH);
delay(200);
digitalWrite(LED,LOW);
}
if( adrL_code == 0x0c)
{
Serial.println("The previous one");
Keyboard.press(KEY_LEFT_ARROW); //向电脑发送向左按键按下的指令
delay(50);
Keyboard.releaseAll();
}
else if( adrL_code == 0x18 )
{
Serial.println("Up");
Mouse.move(0,-20);
}
else if( adrL_code == 0x5e )
{
Serial.println("The next one");
Keyboard.press(KEY_RIGHT_ARROW); //向电脑发送向right按键按下的指令
delay(50);
Keyboard.releaseAll();
}
else if(adrL_code == 0x08 )
{
Serial.println("Left");
Mouse.move(-20, 0);
}
else if( adrL_code == 0x1c )
{
Serial.println("Confirm"); //双击
Mouse.click(MOUSE_LEFT);
delay(300);
Mouse.click(MOUSE_LEFT);
}
else if( adrL_code == 0x5a )
{
Serial.println("Right");
Mouse.move(20, 0);
}
else if( adrL_code == 0x52)
{
Serial.println("Down");
Mouse.move(0,20);
}
adrL_code = 0x00;//变量重新赋初值
adrH_code = 0x00;
ir_code = 0x00;
}
void BuzzerDi()
{
digitalWrite(Buzzer,HIGH); //蜂鸣器响
delay(50);
digitalWrite(Buzzer,LOW); //蜂鸣器关闭
}
四、成果
1. 结论
以上设计在实际操作后可以实现,支持设计的功能。
2. 系统运行情况(文字描述、截图)
接好线:
以下图片为之前测试时的照片,还未加上蜂鸣器和LED灯。
控制移动鼠标至PPT文件处:
控制鼠标双击打开文件:
打开文件后控制鼠标移至播放按钮:
控制键盘的right键,实现下一页:
得到下一页面:
控制键盘的left键,得到上一页:
最后安装上蜂鸣器和LED后测试,按下并成功接收到时LED灯变亮。
串口助手数据:以下为按下各个按键后的结果
五、 总结与体会
展开阅读全文