基于单片机的红外发射器遥控彩灯汇编.docx
《基于单片机的红外发射器遥控彩灯汇编.docx》由会员分享,可在线阅读,更多相关《基于单片机的红外发射器遥控彩灯汇编.docx(12页珍藏版)》请在冰豆网上搜索。
基于单片机的红外发射器遥控彩灯汇编
哈尔滨理工大学
学年设计I
姓名:
谷允捷
班级:
通信13-1
学号:
1305030105
评阅教师:
成绩:
说明:
2016年1月8日
内容:
学习使用Arduino系统,使用ATmega328p组成的Arduino系统实现三色LED灯的变色,继电器通断,蜂鸣器鸣响,温度采集,光强采集等动作,对实习成绩欲获优秀者,使系统实现红外遥控编码,驱动红外二极管,控制任意色LED灯的变色开关等动作。
成绩标准:
1.优秀:
(1)报告完整清晰。
(2)能够良好的完成对红外任意色LED灯的变
色开关等多种动作。
(3)答辩考核回答基本正确。
2.良好:
(1)报告基本完整。
(2)能够基本完成对红外任意色LED灯的控制。
(3)答辩考核回答部分正确。
3.中、及格:
(2)能够基本将Arduino系统中三个以上
功能配合运行。
4.不及格:
(1)多次无假条缺勤。
(2)无报告,不参加考核。
(3)报告及实验演示效果严重雷同。
(4)实验无现象。
(5)答辩考核不合格。
设计要求
1.设计目的
运用Arduino微云电子开发板进行红外遥控,代替彩灯遥控器按键功能,能够实现遥控器上彩灯的切换以及灯的亮灭。
2.设计背景
本次学年设计是基于Arduino的红外模块的应用之一,红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
发射机一般由指令键(或操作杆)、指令编码系统、调制电路、驱动电路、发射电路等几部分组成。
当按下指令键或推动操作杆时,指令编码电路产生所需的指令编码信号,指令编码信号对载波进行调制,再由驱动电路进行功率放大后由发射电路向外发射经调制定的指令编码信号。
3.设计内容
对Arduino进行较为全面的了解,先进行简单模块的开发利用,了解开发板的基本硬件架构,以及开发板的各个硬件元件之间的主从或者通信的关系。
从而通过对开发板的较高级应用打下坚实的基础。
全面了解红外接收,红外发射模块,并使用单片机代替遥控器,对彩灯进行遥控。
将课堂上学到的理论知识与实际应用结合起来,对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
在使用时应该注意以下几点,对于Arduino部分的应用,如果需要下载程序或者进行串口监控的时候,需要将2*20端子排的RXU-TXA、TXU-RXA使用跳线帽连接起来,即使用Arduino的IDE进行下载程序之前,需要将RXU-TXA、TXU-RXA四个排针端子使用跳线帽短路连接起来,然后使用手机线连接开发板和电脑,同时电脑需要安装CH340G的驱动,即常见的Arduino串口驱动。
4.设计器材
PC、keil软件、st-link驱动程序、单片机学习板、遥控灯,遥控灯遥控器、数字示波器、st-link仿真器、电源线、杜邦线若干
遥控灯与遥控器配合使用,能够实现灯亮、灯灭、亮度增强、亮度减弱、R(红光)、
G(绿光)、B(蓝光)、W(白光)、FLASH(闪烁)、SMOOTH(渐变),以及各种颜色光的功能。
三.关键程序及其注释
#defineADD0x00//宏定义,用户码是不变的,所以可以在宏定义中将他定义为ADD
intIR_LED=2;//接arduino2号引脚,2号引脚是学习板连接红外发射贴片的引脚
voidsetup()初始化设置,本函数只执行一次
{
pinMode(IR_LED,OUTPUT);将2号引脚写成输出形式
}
voidloop()
uint8_tdat,temp=0xc8;定义八位存储变量,dat与temp均为八位2进制变量,注意可在前面加上0x表示16进制书写形式
Send38KHZsquare(280,1);//发送9ms的起始码,本起始码是38Khz载波,持续时间是9MS,通过示波器调整,9MS需要连续280次发送。
Send38KHZsquare(140,0);//发送4.5ms的结果码,持续时间是4.5MS,通过示波器调整,4.5MS需要连续140次发送。
Sendcode(ADD);//用户识别码这里调用了IR_Sendcode(uint8_tx)函数
dat=~ADD;
Sendcode(dat);//用户识别码反码,该码是对用户码的取反
Sendcode(temp);//操作码
dat=~temp;
Sendcode(dat);//操作码反码
Send38KHZsquare(21,1);//发送结束码持续时间为560ms的载波信号
delay(200);
voidSend38KHZsquare(intx,inty)//产生38KHZ红外脉冲
for(inti=0;i{if(y==1){digitalWrite(IR_LED,1);delayMicroseconds(9);digitalWrite(IR_LED,0);delayMicroseconds(9);//当输出为1时,根据NEC协议要发送载波,38Khz,经过示波器连续调整发现调整延时时间为9时为实现26us最佳时间。同样,该值可以取10,11,甚至12,但大于11时表见极其不灵敏。}else{digitalWrite(IR_LED,0);delayMicroseconds(20);当输出为0时,根据NEC协议要发送载波,38Khz,经过示波器连续调整发现调整延时时间为20时为实现26us最佳时间。同样,该值可以取21,22.但大于23后变现极其不灵敏。}}}voidSendcode(uint8_tx)//发送8位字符函数,通过此函数发送用户码,操作码及其反码。{for(inti=0;i<8;i++)//8次循环逐位比较{if((x&0x80)==0x00)判断每位数字是否为0,当是0时进行以下操作{Send38KHZsquare(23,1);//560ms载波Send38KHZsquare(21,0);//560ms低电平这两句表示发送0码,}else{Send38KHZsquare(23,1);//560ms载波Send38KHZsquare(64,0);//1680ms低电平这两句表示发送1码。}x=x<<1;//代码左移1位}} 四.设计原理(一)NEC协议1.本设计是基于常用的NEC红外协议进行编码解码的。首先对NEC的逻辑1码与逻辑0码进行介绍:NEC协议采用脉冲距离编码的位。每个脉冲长度是560μs的38kHz载波脉冲(约发射21次高电平,通常调制于455kHz载波频率的1/12,即37.9kHz)。一个逻辑“1”的传输时间是2.25ms,而逻辑“0”只用了其一半,即1.125ms。2.NEC协议发送方式地址和命令被传输两次。第二次所有的二进制位被取反,用于验证所接收到消息的正确性。总的传输时间是恒定的,因为每个位被重复发送其取反的长度。即使在遥控器上的按键一直被按下时,命令也只发送一次。只要按键被一直按下,每110ms会发送一次重复编码。重复编码是一个简单的9ms的AGC同步脉冲,然后接着一个2.25ms的空格和560μs脉冲。3.NEC协议命令和地址构成遥控信号编码波形图(NEC红外协议)这108ms发射代码由一个引导码(9ms+4.5ms)。由低8位用户识别码(9ms-18ms>,高8位用户识别码(9ms-18ms),8位操作码(9ms~18ms)和这8位操作码反码(9ms~18ms),共32位的“0”、“1”遥控码组成,因此,只要了解遥控器编码标准,就可接收、解调红外信号,然后编写程序由单片机解码。编码采用脉时调制方式(PTM)。遥控码的“0”和“1”二进制“0”:用脉宽为0.56ms,间隔为0.56ms,周期为1.12ms的组合表示;二进制的“1”:以脉宽为0.56、间隔1.68ms、周期为2.24ms的组合表示。接收器输出的信号与发射器的信号正好反向。上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射。(二)38KHz方波生成方式1.计算周期38KHz方波是通过延时函数构造出来的,而并不是由单片机的定时器分频出来的,这点需要注意,在一般Arduino板上,红外LED贴片会被镶嵌在第三脚上,但是在我们的学习板上,它镶在2号脚,而2号脚是不带PWM输出引脚,也就是说我们如法通过设定定时器的方法来进行在2号脚输出方波。只能通过延时函数来构造。通过计算38KHz方波周期是26us,则高低电平时间各位13us,则在延时函数中,我们把2号引脚置高一段时间,再置低一段时间,且都是微秒级别则会构成方波,但需要注意的是,不是简简单单的将引脚置高延时13微秒,再讲引脚置低延时13微秒。任何计算机在运行过程中都会有一定误差,单片机在低电平到高电平跳变需要一定时间,执行每一条语句也需要一定时间,比如,学习板上12Mhz晶振,则每条语句执行所需要的时间是1us,这就说明在设定延时函数时要进行微调。在此,我们选择delayMicroseconds(9)或10,11,均可作为能使灯接收到信号逻辑“1”的最佳跳变延时时间。同样,逻辑“0”电平不需要跳变,我们可以选择delayMicroseconds(20),21,22,作为能使灯接收到信号的最佳延时时间。2.连接方式通过循环函数可以将一个个高低电平连接起来,这样就构成了连续不断的38KHz方波,560的高电平大约由21个高电平构成,所以循环次数可以写入21,22,或23,再发送22次低电平这构成了逻辑“0”,同样,先发送21个高电平再发送64个低电平可构成逻辑“0”。3.字符发送方式字符可以通过二进制的方式输入,但是在此我们为了避免书写错误,我们可以通过把字符写成0X16进制形式,而且根据所给资料,我们可知用户码是00000000而用户反码是11111111,所以在开始进行宏定义是,ADD=0X00,所以在改变发射带码时,我们只需要改变用户码就可以了 五.具体使用到的芯片:(1)CH340通信硬件电路低端的单片机是不支持USB的,只有串口,所以CH340芯片的作用就是连接了单片机和上位机,以完成通信。USB接口上的DM和DP是通信的两个接口。UART-USB-DP连接到USB总线的D+数据线,UART-USB-DM连接到USB总线的D-数据线,它们是CH340芯片(USB转串口芯片)的输入。(2)电源供电电路ASM1117USB串口提供5V电源,ASM1117是用于交换式电源5V至3.3V的线性稳压器。通过此电路可以将5V的电源电压转换成3.3V。在本电路中使用3.3V的电压对STM8VDD引脚供电,并且在以后使用的各种芯片上也都是有3.3V电压供电的(3)反相器电路ULN2003AULN2003A是一个7路反向器电路,即当输入端为高电平时ULN2003A输出端为低电平,当输入端为低电平时ULN2003A输出端为高电平。在本电路中,我们用到的芯片被焊接在U7处,通过protel99观察PCB板结构,我们可以了解到,红外灯电路是通过芯片引脚连接到5脚上。也就通过该芯片的12脚输出到红外发射灯处。(4)ArduinoATMGA328芯片本次设计使用的芯片为ATMGA328,3.3V供电,主频12MHz,主要用来提供PTM调制方波,或者使用延时函数提供方波。本次试验把2脚作为输出引脚,也就是方波信号由2引脚输出。其它电路请参照电路原理图 六.实习心得1.这次课程设计中,我首次接触到Arduino单片机,并能通过芯片功能图准确地判断哪个引脚可以执行那个功能,有些引脚的输出功能是不相同的,比如说3,11,9,5等可以带有定时器输出功能,然而其他引脚多数不具备这个功能,所以当需要用到这些功能时,一定要注意把这些引脚连接到应该的位置上。2.学会了如何通过PCB电气连接看各个引脚的位置,比如说,红外引脚连接在了2号脚上,并且通过反相器输出。闪灯引脚是13号,可以根据pcB图看出他的位置具体在哪里。3.学会了区分数字引脚和模拟引脚,有些引脚的功能可以通过digitalwrite来书写,而有些却可以通过analongwrite来书写,前者只能把引脚置高置低,而后者却可以把它按照模拟引脚去写,使电压呈现连续变化,用于做呼吸灯等实验。4.学会一种通信协议NEC协议,它是建立在38Khz方波为载波的情况下传输代码的方式,采用调制方式为PTM调制而非PWM调制,且发送过程一定要遵守起始码,用户码,用户反码,操作码,操作反码,结束码的方式进行书写,以38Khz的方式输出是为了提高发射功率5.学会了如何使用protel软件对电路图进行处理6.认识到了理论与实际误差之间的关系,理论上延时13ms,然而在实际中必须要考虑机器周期,考虑电平上升时间,同时要考虑芯片温度偏移因数导致时间误差,而且使用时间越长,误差越大,越容易出现时间上的缩进或增长。7学会了红外解码。虽然在本次设计中没有涉及到解码程序部分,但是在灯内储存了一个红外接收管,和一个专门用来处理接受信息用的芯片,它将收到的信息吗译码即可得到相应的灯光颜色。 附录按键上的所有密码:A0101000001,1变亮20001000001,2变暗60011000001,3OFFE0111000001,4ON90100100002,1变红50010100002,3蓝色10000100002,2绿D0110100002,4白色B0101100003,1橙30001100003,2天蓝170011100003,3淡紫F0111100003,4FLASHA8101010004,1中橙28001010004,2浅蓝69011010004,3深紫色E8111010004,4STROBE闪光灯98100110005,1浅橙色18000110005,2中蓝58010110005,3中紫D8110110005,4FADE渐变88100010006,1黄08000010006,2亮蓝48010010006,3紫红C8110010006,4SMOOTH
if(y==1)
digitalWrite(IR_LED,1);
delayMicroseconds(9);
digitalWrite(IR_LED,0);
delayMicroseconds(9);//当输出为1时,根据NEC协议要发送载波,38Khz,经过示波器连续调整发现调整延时时间为9时为实现26us最佳时间。
同样,该值可以取10,11,甚至12,但大于11时表见极其不灵敏。
else
delayMicroseconds(20);当输出为0时,根据NEC协议要发送载波,38Khz,经过示波器连续调整发现调整延时时间为20时为实现26us最佳时间。
同样,该值可以取21,22.但大于23后变现极其不灵敏。
voidSendcode(uint8_tx)//发送8位字符函数,通过此函数发送用户码,操作码及其反码。
for(inti=0;i<8;i++)//8次循环逐位比较
if((x&0x80)==0x00)判断每位数字是否为0,当是0时进行以下操作
Send38KHZsquare(23,1);//560ms载波
Send38KHZsquare(21,0);//560ms低电平这两句表示发送0码,
Send38KHZsquare(64,0);//1680ms低电平这两句表示发送1码。
x=x<<1;//代码左移1位
四.设计原理
(一)NEC协议
1.本设计是基于常用的NEC红外协议进行编码解码的。
首先对NEC的逻辑1码与逻辑0码进行介绍:
NEC协议采用脉冲距离编码的位。
每个脉冲长度是560μs的38kHz载波脉冲(约发射21次高电平,通常调制于455kHz载波频率的1/12,即37.9kHz)。
一个逻辑“1”的传输时间是2.25ms,而逻辑“0”只用了其一半,即1.125ms。
2.NEC协议发送方式
地址和命令被传输两次。
第二次所有的二进制位被取反,用于验证所接收到消息的正确性。
总的传输时间是恒定的,因为每个位被重复发送其取反的长度。
即使在遥控器上的按键一直被按下时,命令也只发送一次。
只要按键被一直按下,每110ms会发送一次重复编码。
重复编码是一个简单的9ms的AGC同步脉冲,然后接着一个2.25ms的空格和560μs脉冲。
3.NEC协议命令和地址构成
遥控信号编码波形图(NEC红外协议)这108ms发射代码由一个引导码(9ms+4.5ms)。
由低8位用户识别码(9ms-18ms>,高8位用户识别码(9ms-18ms),8位操作码(9ms~18ms)和这8位操作码反码(9ms~18ms),共32位的“0”、“1”遥控码组成,因此,只要了解遥控器编码标准,就可接收、解调红外信号,然后编写程序由单片机解码。
编码采用脉时调制方式(PTM)。
遥控码的“0”和“1”二进制“0”:
用脉宽为0.56ms,间隔为0.56ms,周期为1.12ms的组合表示;二进制的“1”:
以脉宽为0.56、间隔1.68ms、周期为2.24ms的组合表示。
接收器输出的信号与发射器的信号正好反向。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
(二)38KHz方波生成方式
1.计算周期
38KHz方波是通过延时函数构造出来的,而并不是由单片机的定时器分频出来的,这点需要注意,在一般Arduino板上,红外LED贴片会被镶嵌在第三脚上,但是在我们的学习板上,它镶在2号脚,而2号脚是不带PWM输出引脚,也就是说我们如法通过设定定时器的方法来进行在2号脚输出方波。
只能通过延时函数来构造。
通过计算38KHz方波周期是26us,则高低电平时间各位13us,则在延时函数中,我们把2号引脚置高一段时间,再置低一段时间,且都是微秒级别则会构成方波,但需要注意的是,不是简简单单的将引脚置高延时13微秒,再讲引脚置低延时13微秒。
任何计算机在运行过程中都会有一定误差,单片机在低电平到高电平跳变需要一定时间,执行每一条语句也需要一定时间,比如,学习板上12Mhz晶振,则每条语句执行所需要的时间是1us,这就说明在设定延时函数时要进行微调。
在此,我们选择delayMicroseconds(9)或10,11,均可作为能使灯接收到信号逻辑“1”的最佳跳变延时时间。
同样,逻辑“0”电平不需要跳变,我们可以选择delayMicroseconds(20),21,22,作为能使灯接收到信号的最佳延时时间。
2.连接方式
通过循环函数可以将一个个高低电平连接起来,这样就构成了连续不断的38KHz方波,560的高电平大约由21个高电平构成,所以循环次数可以写入21,22,或23,再发送22次低电平这构成了逻辑“0”,同样,先发送21个高电平再发送64个低电平可构成逻辑“0”。
3.字符发送方式
字符可以通过二进制的方式输入,但是在此我们为了避免书写错误,我们可以通过把字符写成0X16进制形式,而且根据所给资料,我们可知用户码是00000000而用户反码是11111111,所以在开始进行宏定义是,ADD=0X00,所以在改变发射带码时,我们只需要改变用户码就可以了
五.具体使用到的芯片:
(1)CH340通信硬件电路
低端的单片机是不支持USB的,只有串口,所以CH340芯片的作用就是连接了单片机和上位机,以完成通信。
USB接口上的DM和DP是通信的两个接口。
UART-USB-DP连接到USB总线的D+数据线,UART-USB-DM连接到USB总线的D-数据线,它们是CH340芯片(USB转串口芯片)的输入。
(2)电源供电电路ASM1117
USB串口提供5V电源,ASM1117是用于交换式电源5V至3.3V的线性稳压器。
通过此电路可以将5V的电源电压转换成3.3V。
在本电路中使用3.3V的电压对STM8VDD引脚供电,并且在以后使用的各种芯片上也都是有3.3V电压供电的
(3)反相器电路ULN2003A
ULN2003A是一个7路反向器电路,即当输入端为高电平时ULN2003A输出端为低电平,当输入端为低电平时ULN2003A输出端为高电平。
在本电路中,我们用到的芯片被焊接在U7处,通过protel99观察PCB板结构,我们可以了解到,红外灯电路是通过芯片引脚连接到5脚上。
也就通过该芯片的12脚输出到红外发射灯处。
(4)ArduinoATMGA328芯片
本次设计使用的芯片为ATMGA328,3.3V供电,主频12MHz,主要用来提供PTM调制方波,或者使用延时函数提供方波。
本次试验把2脚作为输出引脚,也就是方波信号由2引脚输出。
其它电路请参照电路原理图
六.实习心得
1.这次课程设计中,我首次接触到Arduino单片机,并能通过芯片功能图准确地判断哪个引脚可以执行那个功能,有些引脚的输出功能是不相同的,比如说3,11,9,5等可以带有定时器输出功能,然而其他引脚多数不具备这个功能,所以当需要用到这些功能时,一定要注意把这些引脚连接到应该的位置上。
2.学会了如何通过PCB电气连接看各个引脚的位置,比如说,红外引脚连接在了2号脚上,并且通过反相器输出。
闪灯引脚是13号,可以根据pcB图看出他的位置具体在哪里。
3.学会了区分数字引脚和模拟引脚,有些引脚的功能可以通过digitalwrite来书写,而有些却可以通过analongwrite来书写,前者只能把引脚置高置低,而后者却可以把它按照模拟引脚去写,使电压呈现连续变化,用于做呼吸灯等实验。
4.学会一种通信协议NEC协议,它是建立在38Khz方波为载波的情况下传输代码的方式,采用调制方式为PTM调制而非PWM调制,且发送过程一定要遵守起始码,用户码,用户反码,操作码,操作反码,结束码的方式进行书写,以38Khz的方式输出是为了提高发射功率
5.学会了如何使用protel软件对电路图进行处理
6.认识到了理论与实际误差之间的关系,理论上延时13ms,然而在实际中必须要考虑机器周期,考虑电平上升时间,同时要考虑芯片温度偏移因数导致时间误差,而且使用时间越长,误差越大,越容易出现时间上的缩进或增长。
7学会了红外解码。
虽然在本次设计中没有涉及到解码程序部分,但是在灯内储存了一个红外接收管,和一个专门用来处理接受信息用的芯片,它将收到的信息吗译码即可得到相应的灯光颜色。
附录
按键上的所有密码:
A0101000001,1变亮
20001000001,2变暗
60011000001,3OFF
E0111000001,4ON
90100100002,1变红
50010100002,3蓝色
10000100002,2绿
D0110100002,4白色
B0101100003,1橙
30001100003,2天蓝1
70011100003,3淡紫
F0111100003,4FLASH
A8101010004,1中橙
28001010004,2浅蓝
69011010004,3深紫色
E8111010004,4STROBE闪光灯
98100110005,1浅橙色
18000110005,2中蓝
58010110005,3中紫
D8110110005,4FADE渐变
88100010006,1黄
08000010006,2亮蓝
48010010006,3紫红
C8110010006,4SMOOTH
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1