标题: OpenWRT路由器智能家居控制系统设计 单片机学习型红外遥控 [打印本页]
作者: chayunbin 时间: 2019-7-21 09:28
标题: OpenWRT路由器智能家居控制系统设计 单片机学习型红外遥控
硬件方面,本系统以HG255D路由器为载体,通过基于路由器的嵌入式软件开发,实现了一种超低成本的智能家居联网控制解决方案。本系统由控制板、学习型遥控板和刷入OpenWRT系统的路由器组成,其中控制板采用了STC12C5A60S2单片机作为控制核心,学习型红外遥控板采用了两个STC15F104E单片机为红外信号学习和发射的主控芯片。通过1838T红外接收头学习家用遥控器红外波形,通过两路红外发射管发射学习来的红外遥控信号。
软件方面,通过向OpenWrt系统移植PL2303-USB转串口芯片驱动实现了单片机向路由器的实时数据传输,通过Linux系统下交叉编译编写了OpenWrt系统下的串口数据处理程序,通过向OpenWrt系统移植boa(开源的嵌入式WEB服务器,支持CGI)实现了基于路由器的WEB服务器,然后以直观的控制网页呈现给用户。控制信号通过CGI程序发送给控制板,由控制板上的单片机直接控制8继电器开关的通断或者学习型红外遥控板发射红外遥控信号或者学习信号。
1.1简要介绍
1.1.1项目背景
物联网兴起,热潮澎湃,但对于国内的大多数人来说,对物联网的理解还是停留在一纸空文的状态。在物联网众多的应用领域中,智能家居成为物联网最接近百姓的产物,因为它是和人们的起居生活息息相关的,能够为他们带来便捷舒适的生活体验。但是市场上的智能家居类产品价格太过高昂,很难普及,而且系统结构复杂,可维护型差。
1.1.2设计目的
用一套低廉的硬件、以及尽可能低的成本实现智能家居控制系统,同时具备可裁剪、可扩展的特性。所以,本系统的设计目的为实现一个超低成本智能家居联网控制的基本框架。
1.1.3 OpenWRT系统简介
OpenWrt是适合于嵌入式设备的一个Linux发行版。相对原厂固件而言,OpenWrt不是一个单一、静态的固件,而是提供了一个可添加软件包的可写的文件系统。这使用户可以自由的选择应用程序和配置,而不必受设备提供商的限制,并且可以使用一些适合某方面应用的软件包来定制你的设备。对于开发者来说,OpenWrt是一个框架,开发者不必麻烦的构建整个固件就能得到想要的应用程序;对于用户来说,这意味着完全定制的能力,与以往不同的方式使用设备。
OpenWRT主页:http://openwrt.org
1.1.4 HG255D路由器简介
HG255D是华为出品的由电信定制的光纤宽带用的路由器。在电信用户中是相当普及的一块路由器,因其16MB的Flash和384MHz的mips处理器,成为了OpenWRT系统理想的载体。而且带有USB接口,扩展性得以极大地提高。
HG255D路由器硬件规格:
Architecture: MIPS |
Vendor: ChinaTelecom/HuaWei |
Bootloader: U-boot-1.1.4 |
System-On-Chip: Ralink RT3052 |
CPU Speed: 384 Mhz |
Flash-Chip: S29GL128P |
Flash size: 16MiB |
RAM: 32 MiB |
Wireless: Ralinl APSoC RT2860 b/g/n 2T2R (integrated) |
Ethernet: Integrated 6 Port Fast Ethernet Switch |
USB: Yes (1 Port) |
Serial: Yes |
JTAG: Yes |
1.2 设计方案
1.2.1控制板部分
分为控制板和学习型红外遥控板两部分,控制板使用STC12C5A60S2为主控芯片,直接控制着8路继电器开关,每个继电器都配有独立接线端子和通断指示灯,指示灯亮表示接通状态。学习型红外遥控板采用了两个STC15F104E单片机为红外信号学习和发射的主控芯片,通过1838T红外接收头学习家用遥控器红外波形,通过两路红外发射管发射学习来的红外遥控信号。
1.2.2路由器部分
通过向OpenWrt系统移植PL2303-USB转串口芯片驱动实现了单片机向路由器的实时数据传输,通过Linux系统下交叉编译编写了OpenWrt系统下的串口数据处理程序,通过向OpenWrt系统移植boa(开源的嵌入式WEB服务器,支持CGI)实现了基于路由器的WEB服务器,然后以直观的控制网页呈现给用户。控制信号通过串口处理程序发送给控制板,由控制板上的单片机直接控制8继电器开关的通断或者学习型红外遥控板发射红外遥控信号或者学习信号。
1.2.3 WEB控制界面
2硬件电路介绍
硬件电路分为控制板和学习型红外遥控板两部分。
控制板:STC12C5A60S2基本电路、继电器驱动电路、继电器指示灯电路。
学习型红外遥控板:STC15F104E基本电路、1838T红外信号接收电路、红外发射管发射电路、74HC138对8路按键的控制电路。
具体电路请参考附录原理图部分。
2.1 STC12C5A60s2单片机介绍
STC12C5A60s2单片机是STC生产的单时钟/机器周期1T的单片机,是高速、低功耗、抗干扰的新一代8051单片机,指令代码兼容传统的8051,单速度快8-12倍。片上集成1280字节RAM、60K的FLASH,通用IO口40个,内置EEPROM功能,有4个16位定时器。由于价格低廉、性能较好,成为了本系统的首选。
2.2 STC15F104E单片机介绍
STC15F104E单片机是STC生产的单时钟/机器周期1T的单片机,是高速、低功耗、抗干扰的新一代8051单片机,指令代码兼容传统的8051,单速度快8-12倍。内部集成高精度R/C时钟,可省掉外部晶振,内部高可靠复位,可省掉外部复位电路。片上集成128字节RAM、6K的FLASH,通用IO口6个,内置EEPROM(1KB)功能,有2个16位定时器。由于其采用DIP-8封装,速度快、体积小、价格低廉成为了本系统的首选。
2.3 USB转串口模块
通过给OpenWRT系统移植PL230驱动,实现了使用PL2303芯片的USB转串口模块与单片机的通讯。
2.4 连接关系
USB转串口模块的绿色连接到上图三个针脚的第一针,黑手连接第三针。
控制板:棕、红、橘、黄、绿、蓝 遥控板:蓝 、绿、黄、橘、红、棕
3系统结构
3.1单片机部分
3.1.1学习型红外遥控
带红外遥控器的家电给我们的生活带来极大的方便,但遥控器多了很容易弄混,如果有一种可对家中各种红外遥控器发射的控制信号进行识别、存储和再现的遥控板,而且能够联网控制,这绝对是个激动人心的功能。
- 使用说明
- 在第一次使用这个功能之前,必需先进行学习。
- 按客户端上相应的按键即可将之前保存的遥控信号发射出去。
- 遥控学习的方法
a) 按客户端上的学习键或者长按对应的物理按键。
b) 若指示灯长亮说明已经进入学习等待状态。
c) 对准接收头,短按一下要学习的遥控器按键。
d) 指示灯熄灭则说明学习成果。
3.1.2控制板部分
1)流程图
3.2路由器部分
这里将详细介绍一下为HG255D路由器安卓OpenWRT系统的过程和开源软件BOA的移植与配置,已经跨平台的交叉编译环境构建,和一下具体的细节。
3.2.1 HG255D路由器安装OpenWRT系统
1)设置本地连接为IP:192.168.1.2 子网掩码: 255.255.255.0 网关 192.168.1.1,DNS不用填写,网线插入hg255d的LAN口,保持路由器关闭状态。
- 先在浏览器输入 http://192.168.1.1/upload.html,然后按住路由的reset键并接通电源,保持reset按住,浏览器刷新刚才的那个地址,大约十秒左右就可以进入刷机界面,此时要选择ralink.bin固件并开始刷入。大约5分钟之后路由会自动重启,稍等片刻在浏览器中输入192.168.1.1 帐号密码同为admin.进入ralink的设置界面
- 刷u-boot,执行命令:/hg255d/hg255d-flash-uboot.sh提交,然后手动重启路由器。
- 路由重启后,wps/wlan/reset按钮任一按钮,然后刷入固件就行了,写入固件0909-DreamBox-ramips-rt305x-hg255d.bin大约10秒钟,此时电源灯为常亮,然后大约是5分钟的等待时间,电源灯会灭一下,然后频闪,之后稍等一会就可以192.168.1.1进入OpenWRT。
3.2.2 开源软件向OpenWRT系统的移植
BOA(WEB服务器,支持CGI)的移植:
BOA主页
0) 构建交叉编译环境,从svn下载backfire,make menuconfig时选择编译Toolchain
1)从官方网站下载BOA,最新版是boa-0.94.14rc21.tar.gz
2)使用mips-openwrt-linux-gcc 通过静态编译得到boa应用程序
5)修改boa.conf配置文件,比如端口、WEB路径等
6)登陆并配置路由器
7)其中mime.types从Linux系统下 /etc里可以找到。
8)在浏览器中写入http://<目标板ip>:<端口>即可访问
3.2.3 嵌入式系统下的软件开发
这个部分用到了Linux下的串口编程知识,通过系统调用(System Call) 来进行设备文件操作,PL2303模块插入后默认背加载为USBTTY0,WEB页面用GET方式提交的指令由一个CGI程序专门负责通过串口发射给控制板。
编写完后使用交叉编译工具mips-openwrt-linux-gcc直接编译。
3.3 客户端部分
3.3.1 Android客户端
注意:使用前需要先连接到路由器。
由于WEB方式控制对移动设备来说不是很方便,用户体验较差,为了更好的用户体验,专门开发了Android系统客户端。由于没有安卓应用开发经验,所以看起了比较简陋,不过基本功能还是没问题的。
兼容的系统版本:Android 2.1、Android 2.2、Android 2.3
其它版本未测试。
3.3.2 Windows客户端
注意:使用前需要先连接到路由器。
同样,为了更好的用户体验和便捷的操作,同时也做了这个Windows系统的客户端。
兼容性:Windows 2000、XP、Vista、Win7、Win8。
总结
本系统以普通路由器为核心,加上控制板实现了一种廉价的智能家居控制系统。成本相当低廉,加上路由器总成本也可以控制在百元以下,相比市场上的同类产品,很有性价比。目前,市场上智能家居类的产品中,目前还没有发现集成学习型红外遥控功能的,有了学习型遥控就可以用手机方便的集中控制电器,而不用到处找遥控器了。
在物联网实现产业化规模的发展的过程中,智能家居体现的不仅仅只是一些高科技的产品,更是一种全新的生活方式,一种意境和理念。未来随着经济的发展,人们对生活质量追求的提高,智能家居也将逐渐引领装修时尚潮流,成为新的消费趋势。所以基于此,相信本产品有很好的市场前景。
单片机源程序如下:
- ;STC15F104E 4路学习万能遥控器
- ;内部振荡11.0592M
- ;EPPROM寄存器
- IAP_DATA EQU 0C2H
- IAP_ADDRH EQU 0C3H
- IAP_ADDRL EQU 0C4H
- IAP_CMD EQU 0C5H
- IAP_TRIG EQU 0C6H
- IAP_CONTR EQU 0C7H
- ;***********************
- ;F38_4KHZ EQU 0FF70H ;38.4KHZ 1T MODE (65536-11059200/2/38400)
- ;F38_4KHZ EQU 0FFF4H ;38.4KHZ 12T MODE(65536-11059200/2/38400/12)
- AUXR EQU 08EH
- INT_CLKO EQU 08FH ;输出时钟使能
- K1 BIT P3.0;按键1
- K2 BIT P3.2;按键2
- K3 BIT P3.3;按键3
- K4 BIT P3.4;按键4
- LED BIT P3.3;指示灯(按键3复用)
- IR BIT P3.1;红外接收头
- T1CLKO BIT P3.5;红外发射管
- ;****************************
- ORG 0
- LJMP START
- ORG 3
- CLR EX0;关外中断0
- RETI
- ORG 0BH
- LJMP INT_T0;T0中断
- ORG 13H
- CLR EX1;关外中断1
- RETI
- ORG 53H
- MOV INT_CLKO,#0H ;关外中断 2
- RETI
- ORG 83H
- MOV INT_CLKO,#0H ;关外中断 4
- RETI
- ORG 100H
- ;************************
- ;************************
- START:;初始化
- MOV R0,#20H
- QL:
- MOV @R0,#0;内存清0
- INC R0
- CJNE R0,#80H,QL
- ;MOV AUXR,#40H ; 1T
- MOV P3,#0FFH;拉高管脚
- MOV AUXR,#00H ;定时器12T模式
- MOV TMOD,#00H ;定时器16位自动重装
- ;--------------------
- MOV TH1,#0FFH ;38K方波定时T1
- MOV TL1,#0F4H
- SETB TR1;开T1
- SETB IT0
- SETB IT1
- MOV TH0,#0;定时器0初值
- MOV TL0,#0
- SETB ET0
- SETB TR0;开T0
- SETB EA;开总中断
- ;MOV INT_CLKO,#02H; 发射38K
- ;MOV INT_CLKO,#00H;停止发射
- ;--------------------------
- MAIN:;主程序
- JNB 3,MAIN1
- CLR 3;清掉电标志
- MOV PCON,#2;进入掉电模式
- NOP
- NOP
- NOP
- NOP
- MAIN1:
- CALL PD;拉高P3,按键扫描
- JMP MAIN
- ;************************
- ;************************
- PD:;读管脚是否按下
- MOV P3,#0FFH;拉高管脚
- MOV A,P3
- ANL A,#11101B
- CJNE A,#11101B,PD1
- RET;无按键退出
- PD1:;有管脚按下
- CALL DELAY20MS;延时消抖
- MOV P3,#0FFH;拉高管脚
- MOV A,P3
- ANL A,#11101B
- CJNE A,#11101B,PD2;读管脚是否按下
- RET;是干扰退出
- PD2:;有管脚按下
- ;-----------------
- CLR EA;关中断
- MOV 2FH,#0;清计数,每计一次70MS
- MOV TH0,#0;定时器0初值
- MOV TL0,#0
- SETB TR0;打开T0判断长按
- ;-----------------
- JNB K1,KEY1;按键1
- JNB K2,KEY2;按键2
- JNB K3,KEY3;按键3
- JNB K4,KEY4;按键4
- RET
- ;**************************
- KEY1:;按键1
- MOV DPTR,#0H;第1扇区,00H地址
- CALL ADD2FH;;按键按下计时
- JNC sss;短按跳转
- JMP XIEXI;长按跳转到学习功能
- sss:
- JNB K1,KEY1;等待放开
- ;-----------------
- CLR TR0;关定时器0
- CALL FFSS;红外发射
- RET
- ;***************************
- KEY2:;按键2
- MOV DPTR,#100H;第1扇区,100H地址
- CALL ADD2FH;;按键按下计时
- JNC aaa;短按跳转
- JMP XIEXI;长按跳转到学习功能
- aaa:
- JNB K2,KEY2;等待放开
- ;-----------------
- CLR TR0;关定时器0
- CALL FFSS;红外发射
- RET
- ;************************
- ;************************
- KEY3:;按键3
- MOV DPTR,#200H;第2扇区,200H地址
- CALL ADD2FH;;按键按下计时
- JNC bbb;短按跳转
- JMP XIEXI;长按跳转到学习功能
- bbb:
- JNB K3,KEY3;等待放开
- ;-----------------
- CLR TR0;关定时器0
- CALL FFSS;红外发射
- RET
- ;************************
- KEY4:;按键4
- MOV DPTR,#300H;第2扇区,300H地址
- CALL ADD2FH;;按键按下计时
- JNC ccc;短按跳转
- JMP XIEXI;长按跳转到学习功能
- ccc:
- JNB K4,KEY4;等待放开
- ;-----------------
- CLR TR0;关定时器0
- CALL FFSS;红外发射
- RET
- ;************************
- ADD2FH:;按键按下时定时计数
- CLR C
- JNB TF0,ADD2FHOUT
- CLR TF0
- INC 2FH;计数
- MOV A,#12
- CJNE A,2FH,ADD2FHOUT;长按时长70MS*12=840MS
- ADD2FHOUT:RET
- ;-----------------------
- ;***************************
- INT_T0:;T0中断,用来定时进入掉电模式
- PUSH ACC
- PUSH PSW
- INC 33H
- MOV A,33H
- CJNE A,#80,INT_T0OUT; 70*20=5.6秒进入掉电
- MOV 33H,#0
- SETB EX1;;进入掉电模式前开外中断1
- SETB EX0;;进入掉电模式前开外中断0
- ORL INT_CLKO,#50H ;进入掉电模式前开外中断2,中断4
- SETB 3;打开掉电标志位
- INT_T0OUT:
- POP PSW
- POP ACC
- RETI
- ;***************************
- ;***********************
- ;*********************
- ;***************************
- XIEXI:;;红外接收;存入EEPROMW
- ;判断扇区是否为空,是空就擦除
- MOV R3,DPH;保存扇区指针
- MOV R4,DPL
- MOV R1,#200;读200个字节
- ZDKA:;
- CALL EEPROMR;读1字节
- INC DPTR;下个地址
- CJNE A,#0FFH,RESA;0FF就是空
- DJNZ R1,ZDKA;是否读完
- JMP PDSQOUT
- RESA:
- CALL ERASE;扇区擦除
- PDSQOUT:
- MOV DPH,R3;装入扇区指针
- MOV DPL,R4
- INC DPTR;从扇区第2字节开始写,第1字节用来写电平数
- CLR 2;清判断位
- CLR LED;亮灯
- MOV R1,#0;高电平和低电平总数
- CLR TR0;停止计时
- JB IR,$;等待接收信号
- MOV TH0,#0;;定时器初值归0
- MOV TL0,#0
- SETB TR0;有信号开始计数
- ;-------------------
- WAIT0:
- JBC TF0,XOUT;等待超时;超过70MS退出
- JNB IR,WAIT0;等待高电平到来
- CLR TR0;停止计数,存低电平时长
- ;-------------------
- BAOCUN:;存低(高)电平时长
- MOV A,TH0;高位
- CPL A;取反计数值就是定时初值
- CALL EEPROMW;写一字节EEPROMW大约60US
- INC DPTR;下一地址
- MOV A,TL0;低位
- CPL A;取反
- CALL EEPROMW;写一字节EEPROMW大约60US
- ;-------------------
- MOV TH0,#0;定时器初值归0
- MOV TL0,#6EH;补偿120US
- SETB TR0;开始计数
- INC DPTR;下一地址
- INC R1;电平个数加1
- CPL 2;取反判断位,初始是0
- JNB 2,WAIT0;是0就跳到等待高电平到来
- ;***********************************
- WAIT1:
- JBC TF0,XOUT;等待低电平超时,超过70MS计数完毕
- JB IR,WAIT1;是1就等待低电平到来
- CLR TR0;停止计时
- ;---------------------------
- JMP BAOCUN;存高电平时长
- XOUT:;退出
- CLR TR0;停止计时
- MOV DPH,R3;装入扇区指针
- MOV DPL,R4
- MOV A,R1;电平总数
- CALL EEPROMW;写入扇区第1个地址
- SETB LED;关灯
- MOV TH0,#0;定时器初值归0
- MOV TL0,0
- MOV 33H,#0;掉电计数
- SETB TR0
- SETB ET0
- SETB EA
- RET
- ;****************************
- ;****************************
- FFSS:;红外发射
- CLR 2;清标志位,用来判断发射还是停止发射
- CLR LED;;开灯
- ORL DPH,#10H
- MOV A,#0
- MOVC A,@A+DPTR
- ;CALL EEPROMR
- MOV R1,A;从第1扇区第1地址取出电平总数
- INC DPTR;下一地址开始为发射数据时长
- FFSS0:
- MOV INT_CLKO,#02H;发射38K红外(A版T1为3.5)
- ;***************************
- ZCZ:
- CLR TR0;停止计数
- CLR TF0;清溢出位
- ;CALL EEPROMR;读出定时时长装入定时器
- MOV A,#0
- MOVC A,@A+DPTR
- MOV TH0,A
- INC DPTR;下一地址
- ;CALL EEPROMR
- MOV A,#0
- MOVC A,@A+DPTR
- ;---------------------
- CLR C;数据修正,10US左右
- ADD A,#10
- MOV TL0,A
- MOV A,#0
- ADDC A,TH0
- MOV TH0,A
- ;**************************
- SETB TR0;开始计时
- INC DPTR;下一地址
- CPL 2;取反发射标志位
- JNB TF0,$;等待溢出
- DJNZ R1, FSW;电平数是否完毕
- MOV INT_CLKO,#00H;停止发射
- SETB P3.5;熄灭红外管
- CLR TR0;停止计数
- CLR TF0;清溢出位
- SETB LED;;关灯
- MOV TH0,#0;定时器初值归0
- MOV TL0,0
- MOV 33H,#0;掉电计数
- SETB TR0
- SETB ET0
- SETB EA
- RET
- ;**************************
- FSW:
- JNB 2,FFSS0;标志位是0就发射
- FFSS1:
- MOV INT_CLKO,#00H;停止发射
- SETB P3.5;熄灭红外管
- JMP ZCZ;定时时长装入定时器
- ;-----------------------
- ;******************
- ;EPPROM读写
- ;******************
- ERASE:;擦除
- MOV IAP_CONTR,#83H;允许IAP/IAP操作
- MOV IAP_CMD,#3 ;扇区擦除
- MOV IAP_ADDRH,DPH ;送高地址
- MOV IAP_ADDRL,DPL ;送低地址
- ACALL IAPXX ;触发
- RET
- ;************************
- EEPROMW:;写
- MOV IAP_CONTR,#83H;允许IAP/IAP操作
- MOV IAP_CMD,#2 ;送写命令
- MOV IAP_ADDRH,DPH ;送高地址
- MOV IAP_ADDRL,DPL ;送低地址
- MOV IAP_DATA,A ;A是要写入的数据
- ACALL IAPXX ;触发
- RET
- ;************************
- EEPROMR:;读
- MOV IAP_CONTR,#83H;允许IAP/IAP操作
- MOV IAP_CMD,#1 ;送读命令
- MOV IAP_ADDRH,DPH ;送高地址
- MOV IAP_ADDRL,DPL ;送低地址
- ACALL IAPXX ;触发
- MOV A,IAP_DATA ;读出的数据放到A
- RET
- ;************************
- IAPXX:;触发
- ;和11F/15F的相同,而与12C2052的不同
- ;CLR EA ;关中断在触发之前
- MOV IAP_TRIG,#5AH
- MOV IAP_TRIG,#0A5H;
- NOP
- NOP
- NOP
- ;SETB EA
- RET
- ;----------------------
- IAP_DISABLE:;禁止IAP/IAP操作
- MOV IAP_CONTR,#0
- MOV IAP_CMD,#0
- MOV IAP_TRIG,#0
- MOV IAP_ADDRH,#0FFH
- MOV IAP_ADDRL,#0FFH
- RET
- ;----------------------
- DELAY20MS: ;延时
- MOV R7,#0EH
- DL1:
- MOV R6,#0A8H
- DL0:
- MOV R5,#16H
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- RET
- END
复制代码
全部资料51hei下载地址:
作者: sky48818 时间: 2019-8-2 13:56
不知道直接串口接openwrt可行不呢
作者: lele5211314 时间: 2019-9-10 10:04
看看你的板子引出来串口了吗?注意一般路由器引出来的串口是调试串口,不可以用,看看是否有其他串口引出来,如果没有也没关系,看看路由器是否带有USB插口,如果有的话,插上USN转TTL模块,注意路由器系统内部要安装USB转TTL的驱动,你要会Linux串口编程,或者简单的用Lua脚本语言写出来也可以,我的QQ1014461948,不会的找我联系
作者: lele5211314 时间: 2019-9-10 10:06
CPU型号太老,工作频率太低只有300多兆Hz,WEB页面只有下发的没有上传的,建议增加上传的功能
作者: hackzx 时间: 2020-5-11 18:13
赞!学习学习
作者: kookzw 时间: 2022-11-10 10:50
请问楼主,最近这个实验有新的进展吗?
作者: lanshenlan 时间: 2022-11-15 11:19
谢谢楼主,学习非常有用
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |