智能宿舍.docx_第1页
智能宿舍.docx_第2页
智能宿舍.docx_第3页
智能宿舍.docx_第4页
智能宿舍.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月刊智能家居原本只存在于科幻电影和一些高档的豪宅中,是顶级奢侈生活体现。但随着物联网技术的不断发展,相关配机价格不断降低,技术也变得更加成熟,智能家居正在越来越快的走进我们普通人的生活。智能灯光控制、家电智能化、电动窗帘等等智能家居的基本元素已经成熟。前段时间在优酷上无意之中看到国外的一个智能宿舍的视频,宿舍叫 BRAD(berkekey ridiculouslu automated dorm),宿舍包含灯光控制、电动窗帘。控制方式包括语音控制、IPAD 终端控制、PC 终端控制等。受到这一视频的启发,决定把我们的宿舍也改造改造。到目前为止可以实现走廊灯和照明日光灯开关、空调开关、电视开关、电视音量频道切换、窗帘开合。控制方式包括 PC 控制、语音控制和按钮控制。下面就分几个部分简单介绍一下智能宿舍的基本原理。由于我们是宿舍,不可以对线路做改造,所以在灯光控制部分采用了别的方案。我也对根据目前的效果给出一点改进建议。大家有兴趣也可以少走点弯路。宿舍布局图:A:红外发射头(一对) B:灯光控制盒PART 1 灯光控制灯光控制作为智能家居最主要的部分,是智能家居人性化的最主要体现。冬天躺在温暖的被窝里,关电视可以通过遥控器实现,但是关灯如果没有床头双联开关就是一件无比头疼的事。由于宿舍涉及到安全等等原因,不可以对原有线路进行改造。灯光控制不可以使用继电器。于是便想到了通过在开关面板外加接机械装置实现开关。如图:灯光控制实物图开关采用四连杆机构,动力源来自一个 12g 塑料齿舵机,基本控制原理也就是舵机的控制原理。详细原理请查看有关资料。舵机通过 PWM(脉宽调制)实现,PWM 方波信号可以第 1 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月通过单片机定时器产生,或者通过增强型 8051 单片机,如 STC12C 系列具备 PWM 输出功能。由于我手中有一块 32 路舵机控制板,所以我就直接使用了这一模块,如图。舵机控制模块该模块支持串口,波特率从 9600 到 115200 都可以,并且自动识别。我们采用的是 9600波特率的 TTL 电平串口总线,正好符合这一模块的要求。虽然模块不支持主从总线模式,但是模块指令均以“#”号开头,只有识别到“#”号之后的指令才会进行操作。具体不做解释。在开关右侧有一个控制盒,用于实现按键控制。里边安装有舵机控制板、变压模块和一块单片机。单片机用于读取 3x4 键盘、读取总线数据、发送舵机控制指令。灯光控制盒内部实物图如图所示是控制盒的基本结构,大致工作顺序可以描述为单片机一直都是扫描矩阵键盘,串口采用中断。当读取到键盘键值或者接收的串口发送的有关开光灯的指令后通过串口 TXD向舵机控制模块发送对应操作指令,如: #1P2200T100rn”表示 1 号舵机在 100ms 内运动到波特率 2200 的位置。虽然共用串口,但是由于这一指令没有第九位,所以默认是数据,由于开头没有地址字节,所以所有主机不接收也不转发。舵机控制板没有使用多机模式,会接收并处理,做出相应动作。灯的开光就完成了。改进建议:1.建议使用继电器作为灯光开光。从可靠性和难度上来讲继电器无疑还是最好的选择,我这个只是由于不能对原有线路做改造才使用这一方法。继电器方式的建议结构如图。4 路继电器模块2.建议使用增强型 8051 单片机,依靠 I/O 口工作方式设置寄存器(STC12C2052AD 为 PxM0和 PxM1,x 为 0-3)。将对应 I/0 口设置为高阻输入模式,就可以实现电容式触摸。(具体内容请搜索高阻输入实现触摸)。这样可以改善人机交互性。但目前这种方式对电源要求比较高,如不打算使用可以自己制作薄膜键盘代替。3.对于开关较多的情况下如果不希望二次布线,可以考虑使用 Zigbee 方案进行解决。第 2 页 共 12 页版权所有 仅供参考“自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月Zigbee 最近降价也很快,是智能家居无线模块开发不错的选择。4.有线模式下注意考虑电缆本身电阻产生的压降可能造成单片机无法工作。所以尽量选用较大直径电缆。PART 2 空调电视控制智能家居光有灯是不行的,智能化的电器无疑是一个重要组成部分。但是目前这类智能化的家电大多还在家电厂商的实验室了。市面上出售的也都功能有限,价格也是不菲的。家电对于普通家庭来说依然属于大件物品。它的使用寿命也比较长,一般都要达到 10 年。更换智能家电显得不切实际,如何将现有家电整合到智能家居中,并尽可能减少对原有电路的改动是目前智能家居普及比较现实的一个问题。最简单的方案就是对原有遥控器进行克隆,将遥控器整合到智能家居的系统中,就可以实现对该家电尽可能多的智能操作。遥控器克隆技术已经相当成熟,学习型红外遥控器已经在市面上有售。对于我们 DIY 爱好者来说红外接收基本没有难度。单片机开发板上都有这一模块。获得的红外编码存储后如何发射是一个比较头疼的问题。特别是 38KHz 的红外方波难倒了不少人。网上比较通用的方式是使用 555 芯片加上外部电路产生 38KHz 方波。我为此也折腾了很长一段时间。当初的想法是用单片机定时器产生,但是发现 12MHz 的晶振根本产生不了。想买块发射模块,发现也没得卖。在逛了很多论坛之后无意之中发现一位大神写的用 22.1184MHz 晶振产生 38kHz方波,并带有红外码发送的程序,兴奋不已。经过对程序的修改和调试,用了 1 天时间,经过逻辑分析仪反复读波形调试,成功完成了对空调的控制。虽然产生的方波略高于 38kHz,约为 38.6kHz。但空调可以准确读出并完成相应操作。自己写的一个读红外并串口发送的程序也可以识别。下边简单介绍这一程序。设置:定时器 0 工作方式:8 位自动重装,初值 TH0=0XE8;TL0=0XE8; (定时 13us 38K 红外波晶振为22.1184MHz)。发送的一个字节红外码放在 ircode 中,下边是一个发送 8 位红外码的程序。void sendcode_8(void)/8 位红外码发送函数uchar i;for(i=0;i8;i+)set_count=40;/发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平)flag=1;count=0;TR0=1;/告诉定时中断发送一直是高电平/中断次数计数/定时器开while(countset_count);TR0=0;/等待中断次数到if(ircode&0x01)/判断红外编码最低位,1 宽的高电平,0 窄的高电平set_count=130;elseset_count=40;第 3 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月flag=0;/告诉中断发送红外光count=0;TR0=1;while(count1; /移位下边是发送多字节红外码的函数,其中将调用上一函数。函数中数组 irsys为红外编码表,提前定义并写入 ROM 中,具体如下:(空调为格力,电视品牌未知)uchar code irsys76=0x3c,0x09,0x20,0x50,0x02,0x00,0x34,0x09,0x20,0x50,0x02,0x00,0x1c,0x61,0xdc,0x4b,0xb4,0x03,0x1c,0x61,0xdc,0x4f,0xb0,0x03,0x1c,0x61,0xdc,0x5f,0xa0,0x03,0x1c,0x61,0xdc,0x43,0xbc,0x03,0x1c,0x61,0xdc,0x53,0xac,0x03;函数为:void sendcode(unsigned char m)ET0=1; /定时器 0 中断使能/关闭串口中断ES=0;/air ON/air OFF/ON/OFF/CH+/CH-/VO+/VO-空调打开(包含温度及其他信息)空调关闭(包含温度及其他信息)电视开关电视频道加电视频道减电视音量加电视音量减delay(1);set_count=696; /发送 9ms 38K 红外光flag=1;count=0;TR0=1;while(countset_count);TR0=0;set_count=348; /间隔 4.5msflag=0;count=0;TR0=1;while(countset_count);TR0=0;ircode=irsysm0; /1sendcode_8();ircode=irsysm1; /2sendcode_8();ircode=irsysm2; /3第 4 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月sendcode_8();ircode=irsysm3; /4sendcode_8();ircode=irsysm4; /5sendcode_8();ircode=irsysm5; /6sendcode_2(); /这是发送 2 位红外码的函数,根据 8 位简单修改而来,因为空调这一字节只用到两位,不做具体介绍.set_count=40;/发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平)flag=1;count=0;TR0=1;while(countset_count);TR0=0;ir=1;delay(23);/延时 23ms(编码中的 23ms 高电平)set_count=696;/发送 9ms 38k 红外波flag=1;count=0;TR0=1;while(countset_count);TR0=0;set_count=348;/间隔 4.5msflag=0;count=0;TR0=1;while(countset_count);TR0=0;set_count=30;/发送 0.56ms 38k 红外波(编码中的 0.56ms 低电平)flag=1;count=0;TR0=1;while(countset_count);TR0=0;ir=1;ET0=0;ES=1;注:数组中有 6 个字节数,以上程序中只发送了 4 个字节加两位。因为空调总共用到 34 位,电视用到 43 位。具体程序可以用 if 判断第 6 字节是否为 0 来决定是否完整发送第 5 字节和第六字节前三位。下边是中断函数:其中 ir 为 P1.0 即红外二极管阴极,阳极直接接 VCC。使用灌流驱动(只用于增强型 8051 单片机)。第 5 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿void timer0(void) interrupt 1count+;刊登于无线电2013 年 4 月if(flag=1)/flag=1 需要发送红外码irout=irout;else/不需要发送,直接高电平。irout=1;ir=irout;说明:由于空调和电视往往不在一个方向,用一个二极管没法对两台电器进行控制,可以通过在 P1.1 再加一个二极管,在程序中加入 ir1,通过判断具体是电视还是空调的红外码决定从哪个二极管发出。实现对两台电器的控制。红外发射头实物改进建议:1.为了调试,我把控制红外发生的单片机放到了主机里。在实际中可以将单片机和二极管做到同一块 PCB 上,方便扩展更多发射头。2.程序中我使用都是固定的红外编码。但是红外编码往往都有规律可循。比如格力空调温度就是第二字节低四位从 0 到 C 变化对应温度 18 度到 30 度。第一字节高四位为 4 时表示关闭空调,为 C 是表示打开空调。又比如电视,所有编码 1、2、3 字节都是一样的,第 4、5字节根据功能不同有所区别。在编码表中就只需要存储这两个字节的数据。从而节约 ROM资源。3.合理布置红外发射头的位置。我在布线时把发射头放的离空调比较近,离电视比较远。于是就出现了有时候发送了但是没有成功接收的情况。PART 3 电动窗帘电动窗帘第一次进入大家的视线可能是在那部很有名的电影非诚勿扰。范伟住的豪宅按一下遥控器窗帘就缓缓打开。现在电动窗帘已经很常见,网上都可以买到成品。但价格有点高,所以就只好 DIY 一个了。先上滑槽的原理图:第 6 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月如图,卡扣 A 卡在右侧窗帘最靠近中间的吊轮上,卡扣 B 卡在左侧窗帘最靠近中间的吊轮上。如果右侧同步轮连接电机,那顺时针旋转时,卡扣 A 往右运动,卡扣 B 往左运动。虽然只连接了一个吊轮,但是在第一个吊轮碰到第二个后会带动第二个运动,窗帘打开。当贴在同步带背面的反光片(锡箔纸)运动到光电开关位置时,光电开关导通,窗帘完成打开,电机停止转动。之后如果电机逆时针旋转,卡扣 A 和 B 相向运动,窗帘关闭。当反光片 2运动到光电开关前端时,即如图所示位置时,窗帘关闭完成,电机停止。原理很简单,但是制作过程中还是出现这样那样的问题。最主要的就是电机输出扭矩不够。窗帘运动一半后电机拉不动了。一方面由于我开始使用的是塑料减速箱的减速电机,本身扭矩就不大。另一方面我们宿舍的窗帘比较特殊,没有滑槽和吊轮。是一根窗帘杆上套上塑料环,塑料环下边吊着窗帘,所以阻力很大。最后不得已我拆了一个塑料齿 36g 舵机。才拉动了窗帘,但是噪音的确有一点点大。虽然可以接受,也没觉得有多烦人。但是电动窗帘最人性化的用处在于早晨自动拉开,让阳光把人叫醒。经常被突然的闹钟叫醒对人危害很大,如果噪音太大,窗帘和闹钟又有什么区别?为了解决这一问题,电机是关键。想噪声小可以通过降低转速,但直流电机调速不是件容易的事,同时还会影响输出转矩。购买专用电机又总觉得只是玩玩而已,没必要那么大的投入。无意之中看到了一个感应电动玻璃门的安装视频。电动门用的是蜗杆减速电机。减速比大,输出扭矩大。同时结构简单,噪声也小得多。于是花了 30 几个大洋买了个最便宜的蜗杆减速电机,通过直流电机控制板控制,虽然拉窗帘稍微慢了点,但是噪声小多了。蜗杆减速电机改装舵机直流电机控制板(H 桥)注:中间图所示结构为改进前所改装的舵机。由于当时同步带还没买到,只好用很粗的棉线先代替。为了防滑在同步轮上包上了网球防滑胶带。PART 4 电动门锁对于我这种出门都懒得带钥匙的人来说,开门的确是见麻烦事。电动门锁的确是不错的选择。电动门锁也是智能家居重要的组成部分。在一定程度上也可以提升安全性,毕竟电子锁比普通机械锁难搞定的多。有想法只是一方面,干起来依然是困难重重。首先我们宿舍是金属的防盗门,上下都有锁头。锁门是通过向上提一下门把手实现。开门正好相反,往下按门把手。从外边开门的话只能通过钥匙,为此我纠结了很长时间。也上网研究了很多的电动锁,他们大部分都是简单第 7 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月的单头防盗锁和磁力锁。唯一的一款是通过更换门内侧的锁,并将锁芯更换成一半钥匙,一半直接连接电机的专用锁芯。这对于我来说也不实际,宿舍的锁是不可以随便换的。但这款产品给了我启发,我可以在门内侧安上一个电机,电机主轴粘在钥匙上,带动钥匙转动就可以把门打开。但由于门可能用了几年了,不是很灵活,对电机要求特别高,于是我将一个金属齿标准舵机拆解后将减速箱装上两个电机,扭矩大了许多,开门速度可快多了。但同时也带了了比较大的噪音。双电机加完整钥匙的结构使得这个电动钥匙特别笨重。电动钥匙实物图电动钥匙安装效果对于扭矩要求不大的门如果也想采用类似方案的话可以考虑使用改进后的电动钥匙。如图所示,体积会有很大的减少,噪声的话同样可以考虑蜗杆电机。如果不是防盗门的话也可以考虑电磁铁。对于控制这一块,要根据具体锁进行。我们的锁开门是钥匙正转两圈半后继续转一定角度到转不动,便可直接推门打开。锁门是反转两圈(钥匙水平位置转两圈转到水平位置)。所以控制被设计成一个行程开关。如图。ID 卡读卡模块通过将托盘切除一部分,安装上一个微型行程开关(我用的是从软驱中拆机得到的一个用于识别舱门是否闭合的微型按钮开关),当钥匙基本处于水平位置时行程开关就断开。通过读取它的通断可以判断钥匙旋转的状况。这样会比单纯用延时控制精确一些。门既然可以电动打开了,那钥匙也就可以扔掉了。但怎样识别“敌我”?一个比较可靠的方法就是使用 ID 卡。也就是我们常用的校园一卡通。通过 ID 卡读模块,读取 ID 卡的卡号,进行识别。毕竟饭卡得随时随地带在身上的。ID 卡相对 IC 卡安全性虽然欠佳,成本和技术难度低得多。如果需要较高安全性,可以考虑 IC 卡或者新兴的 NFC 技术。PART 5 语音识别语音识别实际上早就已经有一套成熟的理论体系。但到目前为止依然有很多的问题,我个人觉得语音技术还需要非常强大的人工智能技术作为支撑才能将他的潜力展现出来。目前的智能手机也都有语音功能,识别的准确度已经有了很大的提高,但功能依然十分有限。基本原理也都是将识别结果送到服务器进行分析,接收结果并通过发音软件转化成人声。结果单一,发音机械,使得用户体验大打折扣。第 8 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月作为非常具有潜力的一项技术,语音交互将是智能家居的重要组成部分。我也把它引入到了智能宿舍之中。为了节约成本,降低开发难度,我用的是商品化生产的 LD3320 识别模块和开发板。LD3320 是 ICRoute 推出的非特定人语音识别芯片。只需要 MCU 将关键词语拼音串和设置寄存器传入 LD3320 芯片,就可以完成语音识别功能。并且模块支持 MP3 格式文件播放,可以实现语音应答。由于不小心静电烧坏了板载的 Flash 芯片,所以没有使用语音应答功能,只作为识别模块使用。LD3320 语音识别模块模块识别原理十分简单,将识别列表汉语拼音送入芯片,芯片会自动捕捉环境声音,得出比对后的最佳结果。读出这一最佳结果的序号就可以完成识别。具体原理请参考 LD3320数据手册。改进建议:1.语音识别已经很成熟,可以依靠语音识别库,通过 VC 进行开发。这样可以开发更多的引申功能,而不是使用硬件这样单纯的控制。2.可以使用手机语音识别这种模式,先识别内容,然后对内容进行处理的模式,而不是 LD3320比对识别列表的模式。通过寻找内容中的关键词来进行识别,可以改善交互性。比如“打开电视”可以说成很多种方式。通过内容识别的话只需要找到句子中包含“电视”和“开”两个关键词就可以得出识别结果。而 LD3320 必须说成打开电视才会得出识别结果,说电视打开就无法识别。3.如果你也想使用 LD3320 模块,建议再加上 SYN6288 语音合成模块。原本模块的回答内容是要在电脑上提前合成,并拷贝到 FLASH 芯片中的。这样会使得开发很麻烦。SYN6288 模块恰恰解决了这一问题。PART 6 模块通讯串口总线虽然没有 CAN 总线运用广泛,但对于单片机而言,依靠自带串口功能很容易实现。51 单片机串口有 4 种工作方式,其中工作方式 2 和 3 都是 9 位串口。工作方式 2 波特率固定,工作方式 3 波特率可调。所谓 9 位串口就是串口每次发送或者接收的数据都是 9 位。前八位都通过 SBUF 进行发送或接收,第 9 位则存放在串口控制寄存器 SCON 中的 RB8 或 TB8。SCON 寄存器第 9 页 共 12 页版权所有 仅供参考BityB7B6B5B4B3B2B1B0SCONSM0SM1SM2RENTB8RB8TIRI自己动手打造智能宿舍未删减版原稿刊登于无线电2013 年 4 月将串口工作方式设置为方式 3 时(SM0、SM1、SM2 均为 1),单片机会进入多机通讯模式。发送的数据均为 9 位。最高位也就是第 9 位是数据和地址的标志位。第 9 位为 1 时,表示当前发送的是地址,为 0 时表示当前发送的是数据。所有单片机都会接收地址,并会和自身的地址进行比较。如果比较结果一致,则将 SM2 置 0,等待接收数据。接收完成后 SM2置 1,重新等待接收地址。如果比较结果不一致,则 SM2 保持 1 不变。对于第九位为 0 的数据也就自动忽略,不会产生接收中断。从而实现多机通讯。由于串口特殊的两线结构,所以串口总线无法实现任意两机间的直接通讯。只能采用主从结构。任意两从机之间的通讯必须通过主机转发。基本程序如下:(本程序通讯的数据包含两个字节,一个地址字节,一个数据字节。)串口设置:(波特率 9600,晶振为 11.0592MHz)void UART_init (void)EA = 1;ES = 1;SCON = 0xf0;TMOD = 0x20;TH1 = 0xfa;TL1 = 0x90;PCON = 0x80;TR1 = 1;/允许总中断(如不使用中断,可用/屏蔽)/允许 UART 串口的中断/串口工作方式 3,允许串口接收(/定时器设置/定时器初值高 8 位设置/定时器初值低 8 位设置/波特率倍频/定时器启动主机中断响应函数:(主机接收所有从机数据,所以没有比对地址)void UART_R (void) interrupt 4 using 1unsigned char UART_data;RI = 0;UART_data = SBUF;if(RB8=1)address=UART_data;SM2=0;return;date=UART_data;tip=1;SM2=1;/定义串口接收数据变量/接收中断标志位清 0/将接收到的数据送入变量 UART_data/外部地址需外送数据/进入工作方式 2/地址接收完成,结束中断等待数据。/将接收到的数据送到外部定义的 date 中/数据接收完成标记/恢复工作方式 3从机中断响应函数:(本机地址定义在 Myaddress 中)void UART_R (void) interrupt 4 using 1unsigned char UART_data;RI = 0;UART_data = SBUF;/定义串口接收数据变量/将接收到的数据送入变量 UART_dataif(RB8=1)if(UART_data=Myaddress) /本机地址,进入模式 2,等待接收数据SM2=0;return;第 10 页 共 12 页版权所有 仅供参考自己动手打造智能宿舍未删减版原稿else刊登于无线电2013 年 4 月SM2=1;return;date=UART_data;/非本机地址,忽略下一地址前的数据/接收发送给本机的数据tip=1;SM2=1;数据发送函数:(主机和从机通用)void UART_T (unsigned char UART_adress,unsigned char UART_data) /目标地址和一字节数据TB8=1;SBUF = UART_adress;while(TI = 0);TI = 0;TB8=0;SBUF = UART_data;while(TI = 0);TI = 0;/检查发送中断标志位/令发送中断标志位为 0(软件清零)/检查发送中断标志位/令发送中断标志位为 0(软件清零)改进建议:1.这种方式目前在低数据量的控制信号传输中可以很高效的运行。但是目前存在的一个问题是当两台从机同时递交地址或数据时会造成混叠,引起通讯障碍。解决方法是增加一条总线。用于标记总线忙或者空闲。当任意从机想发送数据时,必须先检查总线是否忙。如果总线空闲,将总线标记为忙,并开始发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论