文档库

最新最全的文档下载
当前位置:文档库 > 智能宿舍

智能宿舍

《自己动手打造智能宿舍》未删减版原稿

刊登于《无线电》2013年4月刊

智能家居原本只存在于科幻电影和一些高档的豪宅中,是顶级奢侈生活体现。但随着物联网技术的不断发展,相关配机价格不断降低,技术也变得更加成熟,智能家居正在越来越快的走进我们普通人的生活。智能灯光控制、家电智能化、电动窗帘等等智能家居的基本元素已经成熟。前段时间在优酷上无意之中看到国外的一个智能宿舍的视频,宿舍叫BRAD (berkekey ridiculouslu automated dorm),宿舍包含灯光控制、电动窗帘。控制方式包括语

音控制、IPAD终端控制、PC终端控制等。受到这一视频的启发,决定把我们的宿舍也改造

改造。到目前为止可以实现走廊灯和照明日光灯开关、空调开关、电视开关、电视音量频道切换、窗帘开合。控制方式包括PC控制、语音控制和按钮控制。下面就分几个部分简单介

绍一下智能宿舍的基本原理。由于我们是宿舍,不可以对线路做改造,所以在灯光控制部分采用了别的方案。我也对根据目前的效果给出一点改进建议。大家有兴趣也可以少走点弯路。

宿舍布局图:

智能宿舍

A:红外发射头(一对)B:灯光控制盒

PART 1灯光控制

灯光控制作为智能家居最主要的部分,是智能家居人性化的最主要体现。冬天躺在温暖的被窝里,关电视可以通过遥控器实现,但是关灯如果没有床头双联开关就是一件无比头疼的事。由于宿舍涉及到安全等等原因,不可以对原有线路进行改造。灯光控制不可以使用继电器。于是便想到了通过在开关面板外加接机械装置实现开关。如图:

智能宿舍

灯光控制实物图开关采用四连杆机构,动力源来自一个12g塑料齿舵机,基本控制原理也就是舵机的控制原理。详细原理请查看有关资料。舵机通过PWM(脉宽调制)实现,PWM方波信号可以

智能宿舍

智能宿舍

智能宿舍

“ 通过单片机定时器产生,或者通过增强型 8051单片机,如 STC12C 系列具备 PWM 输出功能。 由于我手中有一块 32路舵机控制板,所以我就直接使用了这一模块,如图。

舵机控制模块

该模块支持串口,波特率从 9600到 115200都可以,并且自动识别。我们采用的是 9600 波特率的 TTL 电平串口总线,正好符合这一模块的要求。虽然模块不支持主从总线模式,但 是模块指令均以“#”号开头,只有识别到“#”号之后的指令才会进行操作。具体不做解释。 在开关右侧有一个控制盒,用于实现按键控制。里边安装有舵机控制板、变压模块和一块单

片机。单片机用于读取 3x4键盘、读取总线数据、发送舵机控制指令。

灯光控制盒内部实物图

如图所示是控制盒的基本结构,大致工作顺序可以描述为单片机一直都是扫描矩阵键盘, 串口采用中断。当读取到键盘键值或者接收的串口发送的有关开光灯的指令后通过串口 TXD 向舵机控制模块发送对应操作指令,如: #1P2200T100\r\n ”表示 1号舵机在 100ms 内运动 到波特率 2200的位置。虽然共用串口,但是由于这一指令没有第九位,所以默认是数据, 由于开头没有地址字节,所以所有主机不接收也不转发。舵机控制板没有使用多机模式,会 接收并处理,做出相应动作。灯的开光就完成了。

改进建议:

1.建议使用继电器作为灯光开光。从可靠性和难度上来讲继电器无疑还是最好的选择, 我这个只是由于不能对原有线路做改造才使用这一方法。继电器方式的建议结构如图。

4路继电器模块

2.建议使用增强型 8051单片机,依靠 I/O 口工作方式设置寄存器(STC12C2052AD 为 PxM0

和 PxM1,x 为 0-3)。将对应 I/0口设置为高阻输入模式,就可以实现电容式触摸。(具体内 容请搜索高阻输入实现触摸)。这样可以改善人机交互性。但目前这种方式对电源要求比较 高,如不打算使用可以自己制作薄膜键盘代替。

3.对于开关较多的情况下如果不希望二次布线,可以考虑使用 Zigbee 方案进行解决。

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;i<8;i++)

{

set_count=40;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

flag=1; count=0; TR0=1;

//告诉定时中断发送一直是高电平//中断次数计数

//定时器开

while(count

TR0=0;

//等待中断次数到

if(ircode&0x01) //判断红外编码最低位,1宽的高电平,0窄的高电平{

set_count=130;

}

else

{

set_count=40;

}

flag=0; //告诉中断发送红外光

count=0;

TR0=1;

while(count

TR0=0;

ircode=ircode>>1; //移位

}

}

下边是发送多字节红外码的函数,其中将调用上一函数。

函数中数组irsys[][]为红外编码表,提前定义并写入ROM中,具体如下:(空调为格力,电视品牌未知)

uchar code irsys[7][6]={

{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(count

TR0=0;

set_count=348; //间隔4.5ms

flag=0;

count=0;

TR0=1;

while(count

TR0=0;

ircode=irsys[m][0]; //1

sendcode_8();

ircode=irsys[m][1]; //2

sendcode_8();

ircode=irsys[m][2]; //3

sendcode_8();

ircode=irsys[m][3]; //4

sendcode_8();

ircode=irsys[m][4]; //5

sendcode_8();

ircode=irsys[m][5]; //6

sendcode_2(); //这是发送2位红外码的函数,根据8位简单修改而来,因为空调这一字节只用到两位,不做具体介绍.

set_count=40;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

flag=1;

count=0;

TR0=1;

while(count

TR0=0;

ir=1;

delay(23);//延时23ms(编码中的23ms高电平)

set_count=696;//发送9ms 38k红外波

flag=1;

count=0;

TR0=1;

while(count

TR0=0;

set_count=348;//间隔4.5ms

flag=0;

count=0;

TR0=1;

while(count

TR0=0;

set_count=30;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

flag=1;

count=0;

TR0=1;

while(count

TR0=0;

ir=1;

ET0=0;

ES=1;

}

注:数组中有6个字节数,以上程序中只发送了4个字节加两位。因为空调总共用到34位,电视用到43位。具体程序可以用if判断第6字节是否为0来决定是否完整发送第5字节和第六字节前三位。

下边是中断函数:

其中ir为P1.0即红外二极管阴极,阳极直接接VCC。使用灌流驱动(只用于增强型8051单片机)。

void timer0(void) interrupt 1

{

count++;

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一个了。

先上滑槽的原理图:

智能宿舍

如图,卡扣A卡在右侧窗帘最靠近中间的吊轮上,卡扣B卡在左侧窗帘最靠近中间的

吊轮上。如果右侧同步轮连接电机,那顺时针旋转时,卡扣A往右运动,卡扣B往左运动。虽然只连接了一个吊轮,但是在第一个吊轮碰到第二个后会带动第二个运动,窗帘打开。当贴在同步带背面的反光片(锡箔纸)运动到光电开关位置时,光电开关导通,窗帘完成打开,电机停止转动。之后如果电机逆时针旋转,卡扣A和B相向运动,窗帘关闭。当反光片 2

运动到光电开关前端时,即如图所示位置时,窗帘关闭完成,电机停止。

原理很简单,但是制作过程中还是出现这样那样的问题。最主要的就是电机输出扭矩不够。窗帘运动一半后电机拉不动了。一方面由于我开始使用的是塑料减速箱的减速电机,本身扭矩就不大。另一方面我们宿舍的窗帘比较特殊,没有滑槽和吊轮。是一根窗帘杆上套上塑料环,塑料环下边吊着窗帘,所以阻力很大。最后不得已我拆了一个塑料齿36g舵机。才拉动了窗帘,但是噪音的确有一点点大。虽然可以接受,也没觉得有多烦人。但是电动窗帘最人性化的用处在于早晨自动拉开,让阳光把人叫醒。经常被突然的闹钟叫醒对人危害很大,如果噪音太大,窗帘和闹钟又有什么区别?

为了解决这一问题,电机是关键。想噪声小可以通过降低转速,但直流电机调速不是件容易的事,同时还会影响输出转矩。购买专用电机又总觉得只是玩玩而已,没必要那么大的投入。无意之中看到了一个感应电动玻璃门的安装视频。电动门用的是蜗杆减速电机。减速比大,输出扭矩大。同时结构简单,噪声也小得多。于是花了30几个大洋买了个最便宜的

蜗杆减速电机,通过直流电机控制板控制,虽然拉窗帘稍微慢了点,但是噪声小多了。

智能宿舍

蜗杆减速电机改装舵机直流电机控制板(H桥)注:中间图所示结构为改进前所改装的舵机。由于当时同步带还没买到,只好用很粗的棉线先代替。为了防滑在同步轮上包上了网球防滑胶带。

PART 4电动门锁

对于我这种出门都懒得带钥匙的人来说,开门的确是见麻烦事。电动门锁的确是不错的选择。电动门锁也是智能家居重要的组成部分。在一定程度上也可以提升安全性,毕竟电子锁比普通机械锁难搞定的多。

有想法只是一方面,干起来依然是困难重重。首先我们宿舍是金属的防盗门,上下都有锁头。锁门是通过向上提一下门把手实现。开门正好相反,往下按门把手。从外边开门的话只能通过钥匙,为此我纠结了很长时间。也上网研究了很多的电动锁,他们大部分都是简单

的单头防盗锁和磁力锁。唯一的一款是通过更换门内侧的锁,并将锁芯更换成一半钥匙,一半直接连接电机的专用锁芯。这对于我来说也不实际,宿舍的锁是不可以随便换的。但这款产品给了我启发,我可以在门内侧安上一个电机,电机主轴粘在钥匙上,带动钥匙转动就可以把门打开。但由于门可能用了几年了,不是很灵活,对电机要求特别高,于是我将一个金属齿标准舵机拆解后将减速箱装上两个电机,扭矩大了许多,开门速度可快多了。但同时也带了了比较大的噪音。双电机加完整钥匙的结构使得这个电动钥匙特别笨重。

智能宿舍

电动钥匙实物图电动钥匙安装效果对于扭矩要求不大的门如果也想采用类似方案的话可以考虑使用改进后的电动钥匙。如图所示,体积会有很大的减少,噪声的话同样可以考虑蜗杆电机。如果不是防盗门的话也可以考虑电磁铁。

对于控制这一块,要根据具体锁进行。我们的锁开门是钥匙正转两圈半后继续转一定角度到转不动,便可直接推门打开。锁门是反转两圈(钥匙水平位置转两圈转到水平位置)。所以控制被设计成一个行程开关。如图。

智能宿舍

ID卡读卡模块

通过将托盘切除一部分,安装上一个微型行程开关(我用的是从软驱中拆机得到的一个用于识别舱门是否闭合的微型按钮开关),当钥匙基本处于水平位置时行程开关就断开。通过读取它的通断可以判断钥匙旋转的状况。这样会比单纯用延时控制精确一些。

门既然可以电动打开了,那钥匙也就可以扔掉了。但怎样识别“敌我”?一个比较可靠的方法就是使用ID卡。也就是我们常用的校园一卡通。通过ID卡读模块,读取ID卡的卡号,进行识别。毕竟饭卡得随时随地带在身上的。ID卡相对IC卡安全性虽然欠佳,成本和技术难度低得多。如果需要较高安全性,可以考虑IC卡或者新兴的NFC技术。

PART 5语音识别

语音识别实际上早就已经有一套成熟的理论体系。但到目前为止依然有很多的问题,我个人觉得语音技术还需要非常强大的人工智能技术作为支撑才能将他的潜力展现出来。目前的智能手机也都有语音功能,识别的准确度已经有了很大的提高,但功能依然十分有限。基本原理也都是将识别结果送到服务器进行分析,接收结果并通过发音软件转化成人声。结果单一,发音机械,使得用户体验大打折扣。

作为非常具有潜力的一项技术,语音交互将是智能家居的重要组成部分。我也把它引入

到了智能宿舍之中。为了节约成本,降低开发难度,我用的是商品化生产的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。

智能宿舍

将串口工作方式设置为方式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 1{

unsigned 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 1{

unsigned char UART_data; RI = 0;

UART_data = SBUF; //定义串口接收数据变量

//将接收到的数据送入变量UART_data

if(RB8==1){

if(UART_data==Myaddress){ //本机地址,进入模式2,等待接收数据SM2=0;

return;

}

else{

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.这种方式目前在低数据量的控制信号传输中可以很高效的运行。但是目前存在的一个问题

是当两台从机同时递交地址或数据时会造成混叠,引起通讯障碍。解决方法是增加一条总线。用于标记总线忙或者空闲。当任意从机想发送数据时,必须先检查总线是否忙。如果总线空闲,将总线标记为忙,并开始发送数据,发送完成后标记为空闲。如果检测总线正忙,则等待总线空闲后按照检测到总线空闲的方式发送数据。由于数据量较小,不会引起总线堵塞。

2.为了提高可靠性。可以在发送和接收中加入数据校验。避免出现错误。

3.如果你了解其它更高效、更可靠的总线协议,可以尝试其他解决方案。

PART7浅谈人机交互和未来智能家居

对于一款产品,用户体验是最重要的成败因素。我的智能宿舍在一定程度上是不可用的。主要还是由于很多地方存在缺陷,使得用起来感觉没有带来多大的便利。同时安全第一,在宿舍没有人的时候这一系统是关闭的。在未来的智能家居,语音控制一定是一个大的发展方向。但他并不能解决所有问题。屏幕及按键是对语音的很好补充。由于我对计算机编程基本一窍不通,所以在计算机控制这一块主要还是依靠串口对系统的工作情况进行监控。我用手头的STM32开发板简单做了一个有交互界面的主机。可惜这一模块没有将串口单独引出,

而是直接接到了USB转串口芯片上,所以这一模块也没有投入最终使用。

我认为智能家居发展方向应该是这样的。在现有基础性功能的基础上加入比siri更智能

的语音家庭助手。依靠强大的计算机硬件和云数据库,对我们的生活做出规划和协助。整理日程行程、管理家庭物资和家庭安保等等。另外作为目前最主要交互方式的屏幕依然会是重要的交互媒介。他可以显示大量的信息,而且可以精确、简便的实现交互。到时候PC的概

念可能会被打破。家中只需要一台高性能的计算机,所有的屏幕都受其控制。你可以在上厕所的时候把书房电脑屏幕的进程切换过来继续操作。这在目前实现起来并不容易。

科技的发展并不会让人变得越来越懒。而是让我们生活的更高效、更安全。我们会有更多的时间来做我们喜爱的事情。科技会改变我们的世界,就像IBM倡导的那样,共建智慧的地球。

PART 8结束语

目前而言,如果我买房子装修希望加入智能家居的内容,我也会购买很多的商品化模块。因为他们都已经很成熟而且可靠。对于主控部分我会考录DIY。这样可以简化工作量,把更多时间用在开发友好的交互方式上。因为这些可以最直观的体现系统是否好用。所以对于这篇文章,只是给广大DIY爱好者简单介绍我自己做的智能宿舍的一些情况。文章中提到的解决方案和改进方法并不是最优的,有些太简单,有些可能还有错误。希望大家不要吹毛求疵。同时也希望大家充分发挥自身的专业特长,为我们未来更智慧的家,更智慧的地球尽一份绵薄之力。