universidade positivo núcleo de ciências exatas e tecnológicas
Transcrição
universidade positivo núcleo de ciências exatas e tecnológicas
0 UNIVERSIDADE POSITIVO NÚCLEO DE CIÊNCIAS EXATAS E TECNOLÓGICAS ENGENHARIA ELÉTRICA CONTROLADOR X10 PARA AUTOMAÇÃO RESIDENCIAL CURITIBA, 2009 MAURO STREISKY WAGNER REZENDE CONTROLADOR X10 PARA AUTOMAÇÃO RESIDENCIAL Trabalho apresentado ao Curso de Engenharia Elétrica da Universidade Positivo, para obtenção de avaliação parcial da disciplina de Trabalho de Conclusão de Curso (TCC), como requisito para obtenção do grau de Engenheiro Eletricista, sob orientação do Prof. Msc. Roberto Selow CURITIBA, 2009 AGRADECIMENTOS Agradeço aos professores pela colaboração no desenvolvimento do trabalho e na solução dos problemas, aos amigos que juntos enfretaram essa longa jornada, aos pais pelo eterno apoio e principalmente a minha esposa, pelo apoio moral, amor e paciência. Mauro Streisky Gostaria de agradecer primeiramente a Deus, pela oportunidade e capacitação fornecida ao longo do curso de Engenharia Elétrica, agradeço também a minha família pelo apoio, amor e compreenção durante esses 5 anos e a todos que me acompanharam nessa impressionante trajetória. "Se ando em meio à tribulação, tu me refazes a vida; estendes a mão contra a ira dos meus inimigos; a tua destra me salva." - Salmos, 138:7 Wagner W. Rezende “As pessoas que dizem não ter mais nada a aprender não atingiram o limite do conhecimento, posto que este provém de fontes inesgotáveis; alcançaram, isto sim, o limite de sua própria competência ! “ (Licínio César Porto) LISTA DE FIGURAS Figura 01: Réplica aplicada aos bits na transmissão X10 ....................................... 12 Figura 02: Processo de modulação OOK (On Off Keying) ...................................... 13 Figura 03: Pacote de dados X10 ............................................................................. 14 Figura 04: Redundância aplicada aos bits na transmissão X10 .............................. 14 Figura 05: Visão geral do projeto ............................................................................ 16 Figura 06: Controle dos dispositivos X10 via aplicativo........................................... 17 Figura 07: Fonte de alimentação do controlador ..................................................... 18 Figura 08: Circuito de transmissão de dados .......................................................... 19 Figura 09: Circuito de sincronismo .......................................................................... 19 Figura 10: Circuito de recepção de dados............................................................... 20 Figura 11: Diagrama em blocos de circuito PLL...................................................... 21 Figura 12: VCO travando o sinal de saída .............................................................. 22 Figura 13: Demodulação do sinal através do filtro PLL ........................................... 22 Figura 14: Montagem completa no protoboard........................................................ 26 Figura 15: Circuito transformerless no protoboard .................................................. 27 Figura 16: Circuito de recepção de dados no protoboard ....................................... 28 Figura 17: Circuito modelo, representado no datasheet do LM567......................... 28 Figura 18: Kit Micrcontrolador PIC (Brastron).......................................................... 29 Figura 19: Amostra da correção do software (House Code) ................................... 30 Figura 20: Função mover ........................................................................................ 30 Figura 21: Função monta frame .............................................................................. 30 Figura 22: Exemplo incorreto do pacote de dados para transmissão X10 .............. 32 Figura 23: Tela principal da interface gráfica........................................................... 33 Figura 24: Tela de help de como cadastrar um novo dispositivo............................. 34 Figura 25: Tela de configuração dos dispositivos.................................................... 34 Figura 26: Tela de configuração dos cenários......................................................... 35 Figura 27: Tela de configuração do simulador de presença.................................... 36 Figura 28: Texto de ajuda sobre o campo house code ........................................... 36 Figura 29: Lay out da placa do controlador ............................................................. 37 Figura 30: Visão 3D da placa roteada ..................................................................... 37 Figura 31: Sinal de saído do PWM.......................................................................... 40 Figura 32: Sinal de saída do circuito de detecção de passagem por zero .............. 40 Figura 33: Tamanho da portadora transmitida ........................................................ 41 LISTA DE TABELAS Tabela 01: Relação de macro e micro atividades.................................................... 24 Tabela 02: Relação de custos previstos no projeto................................................. 25 Tabela 03: Problemas encontrados na fonte de alimentação transformerless ........ 27 Tabela 04: Lista de componentes ........................................................................... 38 LISTA DE ACRÓNIMOS, SIGLAS E SÍMBOLOS - Ohm; µF – micro Faraday; ANSI - American National Standards Institute; bps – bits por segundo; C – Capacitor; CI – Circuito Integrado; – Frequência; – Frequência Inicial; Hz – Hertz; k - kilo Ohm; kHz – kilo Hertz; LCD – Liquid Crystal Display; mA – mili Amper; ms – mili segundos; mVpp – mili Volts pico-a-pico; OOK – On Off Keying; PC – Personal Computer; PCI – Placa de Circuito Impresso; PLC – Power Line Communication; PLL – Phase Locked Loop; PWM – Pulse Wide Modulation; R – Resistor; USB – Universal Serial Bus; V – Volts; Vca – Tensão alternada; Vcc – Tensão contínua; Vpp – Tensão pico-a-pico; Vrms – Tensão eficaz; VCO – Voltage Controlled Oscilator; X10 – Protocolo aberto desenvolvido para automação comercial; XC – Reatância Capacitiva. SUMÁRIO 1. INTRODUÇÃO .................................................................................................. 10 2. JUSTIFICATIVA................................................................................................ 10 3. OBJETIVOS ESPECÍFICOS............................................................................. 11 4. FUNDAMENTAÇÃO TEÓRICA ........................................................................ 11 4.1 TRANSMISSÃO DE DADOS PELA REDE ELÉTRICA .............................. 12 4.2 ENDEREÇAMENTO NO SISTEMA X10 .............................................. 13 4.3 COMUNICAÇÃO NO SISTEMA X10 .............................................. 14 5. ESPECIFICAÇÃO TÉCNICA ............................................................................ 16 5.1 INTERFACE COM O USUÁRIO................................................................. 16 5.2 FONTE DE ALIMENTAÇÃO................................................................. 17 5.3 MICROPROCESSADOR................................................................ 18 5.4 CIRCUITO DE TRANSMISSÃO DE DADOS........................... 18 5.5 CIRCUITO DE SINCRONIZAÇÃO .................................. 19 5.6 CIRCUITO DE RECEPÇÃO DE DADOS................. 20 5.6.1 FILTRO PLL (PHASE LOCKED LOOP)....... 20 6. FLUXOGRAMA FUNCIONAL........................................................................... 23 7. PLANO DE TRABALHO................................................................................... 24 8. IMPLEMENTAÇÃO........................................................................................... 26 8.1 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO HARDWARE ................ 26 8.2 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO FIRMWARE............. 29 8.3 CONFIGURAÇÕES DO SOFTWARE .............................................. 32 8.4 PLACA DE CIRCUITO IMPRESSO (PCB) .................................. 37 8.5 RELAÇÃO DE COMPONENTES ........................................... 38 9. RESULTADOS.................................................................................................. 40 10. CONCLUSÃO ................................................................................................. 42 11. REFERÊNCIAS BIBLIOGRÁFICAS ............................................................... 43 12. DOCUMENTOS CONSULTADOS .................................................................. 43 APENDICE A .......................................................................................................... 44 APENDICE B .......................................................................................................... 45 APENDICE C .......................................................................................................... 54 ANEXO A................................................................................................................ 56 10 1. INTRODUÇÃO O desejo de se conceber residências inteligentes não é novo. Há muito tempo o homem deseja possuir um lar onde ele possa interagir com o ambiente, e que este atenda a suas necessidades de conforto e praticidade. Aliando-se essas necessidades à tecnologia, surgiram inúmeros sistemas com intuito de preencher essa lacuna, entre eles o sistema de automação residencial conhecido como X10. Baseado no princípio de oferecer ao usuário uma interface simples, segura, de uso intuitivo e que se comunique com o padrão comercial do X10, este projeto propõe o desenvolvimento de um controlador microprocessado que implemente essa tecnologia e que além de suas funcionalidades, seja de baixo custo. 2. JUSTIFICATIVA Como a proposta do projeto de um controlador para automação residencial não é desenvolver nenhuma tecnologia nova e sim uma aplicação baseada em um padrão comercial, dentre os vários sistemas destinados à automação residencial disponíveis no mercado, o projeto foi baseado em um que atende a todas essas prerrogativas: • Simplicidade de instalação; • Padrão aberto de comunicação; • Utilização da rede elétrica como meio físico de transmissão de dados; • Ampla base instalada; • Diversidade de fornecedores de dispositivos sensores e acionadores de cargas; • Estabilidade da tecnologia; • Baixo custo. Atendendo a todas essas características, o protocolo X10 mostrou-se como a melhor alternativa para o desenvolvimento do projeto. 11 3. OBJETIVOS ESPECÍFICOS Os objetivos do projeto são: • Elaborar um controlador microprocessado capaz de se comunicar e controlar dispositivos comerciais baseados no padrão X10; • Dotar o controlador com a função de comunicação bidirecional; • Implementar por software as funções do protocolo X10; • Desenvolver uma interface gráfica através do PC para acesso e programação das funções de controle; • Desenvolver uma interface via modem celular para possibilitar o acionamento remoto das funções do controlador via mensagem de texto; • Implementar a comunicação serial sobre USB entre o controlador e o PC; • Delimitar a abrangência do sinal às dependências equivalentes de uma residência. 4. FUNDAMENTAÇÃO TEÓRICA O protocolo X10 desenvolvido pela empresa escocesa Pico Electronics Ltd. entre 1976 e 1978 (DIGITAT, 2009), foi o primeiro protocolo idealizado para trafegar sobre a rede Communications elétrica destinado à automação residencial (Power Line PLC). Ser um protocolo aberto, com equipamentos de baixo custo e sem necessidade de investimento em infra-estrutura nas residências, fez do modelo X10 líder mundial em sistemas de domótica (A CASA INTELIGENTE, 2009). A seguir é apresentado o protocolo X10, sendo descrita a forma como a informação trafega na rede elétrica, a estrutura dos pacotes de dados e detalhes de segurança da transmissão. 12 4.1 TRANSMISSÃO DE DADOS PELA REDE ELÉTRICA DE BAIXA TENSÃO O protocolo X10 utiliza a onda sinusoidal da rede elétrica de baixa tensão como sincronismo. Para isto são referenciadas as interseções ocorridas em 0V tanto na transição de subida, quanto na transição de descida. Para a informação do protocolo X10 ser transmitida em sistemas monofásicos, bifásicos e trifásicos, cada bit é replicado duas vezes durante um semiciclo sinusoidal. Usando como referência um bit inserido no ponto de sincronismo, a primeira réplica possui um atraso de aproximadamente 2,778ms e a segunda réplica um atraso de 5,556ms. Tais atrasos coincidem com os pontos 120º e 240º do sinal sinusoidal, equivalentes a origem de cada fase sem interferir no intervalo de sincronismo (figura 1). FIGURA 1 – RÉPLICA APLICADA AOS BITS NA TRANSMISSÃO X10. FONTE: PRÓPRIA Com o método de sincronismo definido, pode-se afirmar que a taxa de transmissão do protocolo X10 está limitada em 120bps para rede elétrica de 60Hz ou 100bps para a rede elétrica de 50Hz. Os bits adicionados na rede elétrica são modulados na forma de uma onda quadrada, com freqüência de 120kHz, amplitude de 5Vpp e 1ms de duração. Esse tipo de modulação é conhecida como On Off Keying (OOK). Neste caso, a modulação dos dados é feita da seguinte forma: se houver um bit com valor 1 a ser transmitido, um sinal elétrico com essas características é gerado e adicionado na rede elétrica. Caso o valor do bit seja 0, nenhum sinal é gerado (PADRÃO X10, 2009). A figura 2 ilustra o processo. 13 FIGURA 2 – PROCESSO DE MODULAÇÃO OOK (ON OFF KEYING) SINAL MODULADO 1 0 1 1 0 0 1 BITS DE INFORMAÇÃO FONTE: PRÓPRIA 4.2 ENDEREÇAMENTO NO SISTEMA X10 Equipamentos X10 utilizados para transmissão e gerenciamento dos dados que trafegam pela rede elétrica são denominados controladores, entretanto, os equipamentos utilizados para acionamento de cargas como lâmpadas, tomadas, cortinas elétricas, instalados em cada ponto automatizado da residência denominam-se módulos receptores. O endereçamento X10 possibilita 256 combinações possíveis, com a vantagem de vários módulos receptores poderem compartilhar o mesmo endereço, constituindo uma zona de automação. As 256 combinações estão distribuídas em 16 letras (House Code¹), onde cada letra possui 16 números com duas características, Unit Code² ou Function Code³. Todo controlador contém configuração House Code, porém, os módulos receptores, além dos House Codes, também possuem endereçamento Unit Code e controle realizados através do Function Code (DIGITAT, 2009). Como exemplo pode-se estabelecer em uma mesma residência a macror região A para controlar 16 zonas de iluminação, a macro região B para controlar 16 1 - House Code: Atribui macror regiões para automação da residência; 2 - Unit Code: Determina o endereçamento do módulo receptor na macror região definida pelo House Code; 3 - Function Code: Indica ao módulo receptor o comando solicitado pelo usuário. 14 zonas de tomadas, a macror região C para controlar 16 zonas de sensores de presença, e assim por diante. 4.3 COMUNICAÇÃO NO SISTEMA X10 Baseado nas informações do item 4.2, é apresentada a estrutura dos pacotes de dados utilizados para o controle dos módulos receptores (vide Apêndice A). Os 4 primeiros bits do pacote de dados são utilizados para sinalizar o início da comunicação, logo após são transmitidos 4 bits para o House Code, finalizando com a transmissão de 5 bits referentes ao Unit Code ou ao Function Code (figura 3). FIGURA 3 – PACOTE DE DADOS X10. FONTE: PRÓPRIA Cada bit dos comandos House Code e Unit Code ou Function Code é enviado 2 vezes, primeiramente é transmitido o valor do bit e logo em seguida seu valor complementar, resultando em um pacote de dados de 22 bits, que por sua vez é transmitido duas vezes (figura 4). Toda essa redundância serve para aumentar a segurança e a confiabilidade da transmissão. FIGURA 4 – REDUNDÂNCIA APLICADA AOS BITS NA TRANSMISSÃO X10. FONTE: PRÓPRIA 1 - House Code: Atribui macror regiões para automação da residência; 2 - Unit Code: Determina o endereçamento do módulo receptor na macror região definida pelo House Code; 3 - Function Code: Indica ao módulo receptor o comando solicitado pelo usuário. 15 Após a transmissão duplicada dos 22 bits, ou seja, 44 bits transmitidos em 22 ciclos sinusoidais, são necessários 3 ciclos sem nenhuma informação transmitida para que o sistema aceite outro comando de automação. Este caso denomina-se Tempo de Silêncio4. Por exemplo, para ligar um módulo X10 que esteja na macror região A (House Code A) e considerando que este seja o módulo de número 2 (Unit Code 2), a seguinte seqüência binária deveria ser enviada, um bit por cada passagem por zero (sincronismo)(BURROUGHS, 2002): - Envia o endereçamento 2 vezes: 1110 01101001 10101001 01 START HOUSE CODE A UNIT CODE 2 SUFIX 1110 01101001 10101001 01 START HOUSE CODE A UNIT CODE 2 SUFIX - Aguarda 3 ciclos completos (6 passagens por zero): 000000 - Envia o comando 2 vezes: 1110 01101001 01011001 10 START HOUSE CODE A ON SUFIX 1110 01101001 01011001 10 START HOUSE CODE A ON SUFIX - Aguarda mais 3 ciclos completos para enviar o próximo comando: 000000 Podemos observar que o unit code e o function code vem sempre depois do house code. O que os diferencia é o sufixo. Então, para um comando de ligar é necessário enviar 100 bits de informação, o que corresponde a um intervalo de tempo de 833ms. 4 – Para os comandos Brigth e Dim apresentados no apêndice A, não há Tempo de Silêncio. 16 5. ESPECIFICAÇÃO TÉCNICA O diagrama da figura 5 nos oferece uma visão geral do projeto. FIGURA 5 – VISÃO GERAL DO PROJETO FONTE: PRÓPRIA Com base no diagrama, o projeto é subdividido em 6 partes: a) Interface com o usuário; b) Fonte de alimentação: c) Microprocessador; d) Circuito de transmissão de dados; e) Circuito de sincronização; f) Circuito de recepção de dados. 5.1 INTERFACE COM O USUÁRIO Através de uma interface gráfica via aplicativo rodando sobre um microcomputador padrão IBM PC o usuário tem uma visão completa do sistema de 17 automação de sua residência, podendo controlar individualmente os dispositivos, fazer troca de cenários (acionamento programado de vários dispositivos simultaneamente) ou ainda programar ações como a simulação de presença e o acionamento através de timmers (com tempos pré definidos). Tanto os comandos quanto as programações são enviadas para o controlador via interface USB. Um exemplo de uma instalação típica é mostrada na figura 6. FIGURA 6 – CONTROLE DOS DISPOSITIVOS X10 VIA APLICATIVO FONTE: PRÓPRIA Já o display de LCD tem uma função apenas informativa. 5.2 FONTE DE ALIMENTAÇÃO De modo a deixar o módulo controlador com uma montagem bem compacta e como a corrente de alimentação tem um valor baixo (menor que 300mA), o projeto prevê o uso de uma fonte de alimentação sem o uso de transformador VRMS (transformerless). O cálculo da corrente é feito da seguinte I RMS = XC forma: Para uma tensão padrão de alimentação de 127 Vca, temos: I RMS = VRMS = 127(2π 60C ) ≅ 48mA / µF XC 18 Como o circuito necessita de duas tensões estabilizadas (+ 15Vcc e +5Vcc), inseriu-se após a etapa de filtragem composta de um capacitor e de um diodo zener dois circuitos reguladores monolíticos. O circuito completo pode ser visto na figura 7. FIGURA 7 – FONTE DE ALIMENTAÇÃO DO CONTROLADOR FONTE: PRÓPRIA Essa etapa do projeto foi baseada no artigo técnico TB008 (Transformerless Power Suplly) da Microchip. 5.3 MICROPROCESSADOR Este é o componente principal do projeto, pois a implementação do protocolo X10 é feita toda através de firmware. Para desempenhar esta função essencial, foi selecionado o microprocessador PIC 16F877A fabricado pela Microchip. A seleção deste modelo foi feita pela sua grande versatilidade, ao conhecimento em programação adquirido ao longo do curso, a sua memória FLASH interna para armazenamento do programa, a sua capacidade integrada de fazer a modulação PWM (Pulse Wide Modulation) e a variedade de configurações de seus pinos de entrada e de saída. O diagrama em blocos que mostra a arquitetura interna do microprocessador pode ser visto no anexo A. 5.4 CIRCUITO DE TRANSMISSÃO DE DADOS É o circuito responsável por fazer a transformação dos bits de dados em um sinal modulado, o qual é enviado sobre a rede elétrica. É composto por uma etapa de modulação de 120kHz e um filtro passa alta. O padrão de modulação adotado é o 19 OOK, conforme visto no item 4.1. A oscilação do modulador é obtida pela saída PWM do microcontrolador e um amplificador do tipo “push-pull” condiciona o sinal de saída. O circuito completo pode ser visto na figura 8. FIGURA 8 – CIRCUITO DE TRANSMISSÃO DE DADOS FONTE: PRÓPRIA 5.5 CIRCUITO DE SINCRONIZAÇÃO Esse é um dos circuitos mais importantes do controlador, pois é através do sinal de sincronismo que os dados são transmitidos e/ou recebidos. Ele é composto por um detector de passagem por zero que gera na saída um pulso retangular com 5Vcc e 200 s de duração. Esse pulso é encaminhado para o pino 33 do microprocessador, que por sua vez detecta a bordas de subida gerando a interrupção externa. Quando isso ocorre, o algoritmo verifica se há dados a serem recebidos ou transmitidos e executa a lógica de cada caso. Esse processo é melhor detalhado no fluxograma funcional (item 6). FIGURA 9 - CIRCUITO DE SINCRONISMO 200 s 8,333 ms FONTE: PRÓPRIA 20 5.6 CIRCUITO DE RECEPÇÃO DE DADOS Essa etapa é responsável por demodular o sinal proveniente da comunicação com outro dispositivo X10. Ela é composta por filtro passa alta, um limitador de tensão e um detector de portadora de 120kHz (figura 10). A detecção da portadora é feita através de um filtro PLL (Phase Locked Loop). O detalhamento do funcionamento do circuito PLL é feito no item 5.6.1. Após o sinal ser demodulado, o trem de bits contendo a informação é aplicado a entrada do microprocessador, e um algoritmo de leitura faz a decodificação / interpretação desses dados. FIGURA 10 – CIRCUITO DE RECEPÇÃO DE DADOS PIC16F877A V1 127 Vrms 60 Hz 0° 3 C1 100nF R1 1MO 0 2 FILTRO PLL DETECTOR DE PORTADORA IN 6,8V 1 6,8V 0 FONTE: PRÓPRIA 5.6.1 Filtro PLL (Phase Locked Loop) PLL é o nome de um dos mais importantes circuitos encontrados em aplicações eletrônicas de todos os tipos. O PLL está para a freqüência assim como o amplificador operacional está para a tensão (BRAGA, Newton C, 2007). A explicação do funcionamento desse circuito baseia-se no diagrama em blocos da figura 11. 21 FIGURA 11 – DIAGRAMA EM BLOCOS DE CIRCUITO PLL FILTRO PASSA BAIXA AMPLIFICADOR DE ERRO SAÍDA COMPARADOR DE FASE VCO OSCILADOR CONTROLADO POR TENSÃO CIRCUITO DE TEMPO C R FONTE: REVISTA SABER ELETRÔNICA, ANO 19, NÚMERO 127, NOVEMBRO / DEZEMBRO 2007 O primeiro bloco do circuito é comparador de fase. Nele são comparadas as fases do sinal de entrada com a gerada pelo VCO (Voltage Controlled Oscillator) e em sua saída aparece uma tensão proporcional a diferença entre as fases. Esse sinal de tensão é então aplicado a um filtro passa baixa e depois de amplificado, é encaminhado a entrada do bloco VCO. Esse sinal de tensão serve para controlar a freqüência de oscilação. O bloco VCO gera um sinal cuja freqüência pode ser deslocada dentro de uma faixa determinada pela relação RC externa. O sinal de saída do bloco é então realimentado no comparador de fase fechando o loop. Considerando uma situação inicial que não existe sinal de entrada, então o sinal de saída do PLL é o próprio sinal do bloco VCO, cuja freqüência central é dada pela relação: f0 = 1 R.C Quando um sinal com freqüência f é aplicado à entrada, então o comparador de fases entrará em ação e comparará a freqüência deste sinal com a gerada pelo bloco VCO. Se as freqüências forem diferentes, o sinal de saída do comparador será um sinal cuja freqüência é (f-f0). Se essa diferença for pequena, então um sinal com uma leve oscilação é aplicado a entrada do bloco VCO. A reação do VCO a esse sinal será uma alteração na freqüência de oscilação, cujo valor tende a se aproximar da freqüência f do sinal de entrada. No momento em que f=f0 a saída do comparador de fases vai à zero, “travando” o VCO exatamente na freqüência de entrada. A figura 12 ilustra este processo. 22 FIGURA 12 – VCO TRAVANDO O SINAL DE SAÍDA TRAVAMENTO FONTE: REVISTA SABER ELETRÔNICA, ANO 19, NÚMERO 127, NOVEMBRO / DEZEMBRO 2007 Utilizando esse conceito e implementando um circuito de detecção de tom, podemos fazer a detecção da portadora de 120kHz, fazendo dessa forma a demodulação do sinal (figura 13). FIGURA 13 – DEMODULAÇÃO DO SINAL ATRAVÉS DO FILTRO PLL FILTRO PLL FONTE: PRÓPRIA 23 6. FLUXOGRAMA FUNCIONAL O fluxograma demonstra a lógica de funcionamento do algoritmo que implementa o protocolo X10. 24 Analisando o fluxograma, pode-se observar que o ponto de partida do algoritmo é sempre baseado nas interrupções. Elas podem ser serial ou externa. A interrupção serial é gerada quando o usuário executada alguma ação, como enviar um comando. No instante em que os dados chegam ao buffer, o microprocessador executa as rotinas relativas a essa tarefa e aguarda a próxima interrupção. Já a interrupção externa é gerada toda vez que o sinal da portadora fundamental passa por zero. Isso ocorre a cada 8,333 ms. 7. PLANO DE TRABALHO Para que o projeto possa ser bem sucedido, é necessário que seja feito além das atividades técnicas, um planejamento das atividades identificando os responsáveis e o prazo de realização de cada tarefa. Esse planejamento está detalhado na tabela 1. Outro ponto importante é o detalhamento dos custos envolvidos no projeto, o qual está demonstrado na tabela 2. TABELA 1 – RELAÇÃO DE MACRO E MICRO ATIVIDADES RELAÇÃO POR MACRO ATIVIDADES ID RESPONSÁVEL PRAZO 01 Entrega da proposta Equipe 26/02/09 02 Apresentação oral da proposta Equipe 05/03/09 03 Entrega final da proposta Equipe 20/03/09 Equipe 22/04/09 05 Apresentação oral do item 04 para a banca Equipe 05/05/09 06 Entrega da monografia - Especificações Técnicas Equipe 01/06/09 07 Apresentação oral do item 06 para a banca Equipe 16/03/09 08 Apresentação de 20% das implementações Equipe 30/06/09 09 Apresentação de 60% das implementações Equipe 18/07/09 10 Entrega da monografia - Implementações Equipe 28/09/09 11 Avaliação final das implementações Equipe 06/10/09 04 TAREFA Entrega da monografia – Introdução e Fundamentação Teórica 25 12 Entrega final da monografia completa Equipe 26/10/09 13 Apresentação final do projeto Equipe 10/11/09 14 Entrega da versão definitiva da monografia Equipe 30/11/09 RELAÇÃO POR MICRO ATIVIDADES ID TAREFA RESPONSÁVEL PRAZO 15 Compra dos componentes eletrônicos Wagner 02/06/09 16 Compra dos módulos de acionamento Mauro 19/06/09 17 Projeto dos circuitos Equipe 01/07/09 18 Simulação dos protótipos Mauro 31/07/09 19 Montagem dos protótipos Wagner 16/08/09 20 Diagramação da PCI Wagner 28/09/09 21 Montagem das bibliotecas X10 Mauro 16/08/09 22 Programação do PIC Equipe 16/08/09 23 Desenvolvimento da interface do aplicativo Equipe 30/09/09 TABELA 2 – RELAÇÃO DE CUSTOS PREVISTOS NO PROJETO PLANILHA DE CUSTOS ITEM QUANTIDADE VALOR UNITÁRIO VALOR TOTAL Microcontrolador 01 R$13,00 R$13,00 Display de LCD 01 R$18,90 R$18,90 CI PLL 01 R$7,00 R$7,00 Componentes Diversos R$66,00 R$66,00 Miscelania Diversos R$30,00 R$30,00 Confecção da PCI 01 R$30,00 R$30,00 $49,99 $49,99 (R$ 97,65) (R$ 97,65) 01 KIT contendo: Módulos de acinamento X10 - 3 lamp modules; - 3 appliance modules; - 2 wall switches; TOTAL R$262,55 26 8. IMPLEMENTAÇÃO Como forma de modularizar o projeto e evitar eventuais problemas na implementação dos circuitos (comuns em montagens eletrônicas), todo o hardware desenvolvido (figura 14) foi dividido em vários blocos, sendo estes previamente simulados em protoboard para a realização de suas respectivas análises. Essa metodologia colabora na descoberta e na correção dos problemas, garantindo que cada bloco incluso no projeto não danifique a ele próprio e nem ao restante dos circuitos já testados, mas apresente as características idealizadas. Para elaboração do software e do firmware foram utilizadas as plataformas Borland Builder C++ 5 e CCS (também conhecida como PIC C Compiler), respectivamente. Essas plataformas auxiliam no desenvolvimento do código fonte pois a cada pré compilação elas verificam erros de sintaxe e impossibilitam a compilação do programa caso hajam erros. FIGURA 14 – MONTAGEM COMPLETA NO PROTOBOARD FONTE – PRÓPRIA. 8.1 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO HARDWARE A fonte de tensão transformerless foi o primeiro circuito a ser montado e simulado (figura 15). A análise de seu funcionamento foi realizada utilizando um 27 variador de tensão alternada (VARIAC) de 0 a 240Vac, onde gradualmente foi aplicada uma tensão elétrica à fonte transformerless até aproximadamente 127 Vac e com um voltímetro avaliada a saída do circuito correspondente a 5 Vcc. Mesmo tendo funcionado logo na primeira montagem, a tabela 03 apresenta os problemas apresentados pela fonte: TABELA 3 – PROBLEMAS ENCONTRADOS NA FONTE DE ALIMENTAÇÃO TRANSFORMERLESS Problema A fonte transformerless parou de funcionar após a inclusão de 01 todos os blocos de hardware do projeto. A troca dos capacitores de poliéster para aumentar a capacidade 02 de corrente da fonte desestabilizou a tensão na saída do circuito transformerless. Motivo A carga consumida por todos os circuitos estava saturando sua capacidade de distribuição de corrente. Redimensionado os capacitores de poliéster 2µ2F para 3µ3F, pois sabendo que a tensão Vrms é constante, a corrente resultante é corrigida apenas com a alteração da reatância capacitiva. A fonte transformerless é um circuito dependente da corrente consumida. I consumida > I transformerless Resp.: Tensão Baixa I consumida < I transformerless Resp.: Tensão Alta Onde: I = Corrente FIGURA 15 – CIRCUITO TRANSFORMERLESS NO PROTOBOARD FONTE – PRÓPRIA. Correção Adicionado um potenciômetro na saída da fonte transformerless para ajustar a corrente consumida. 28 Para a simulação do circuito de recepção (figura 16) de dados utilizou-se uma fonte externa de 5Vcc para alimentar o circuito e um gerador de funções sintonizado em 120kHz, onda quadrada e 200mVpp. FIGURA 16 – CIRCUITO DE RECEPÇÃO DE DADOS NO PROTOBOARD FONTE – PRÓPRIA. Nos testes realizados não houveram problemas relacionados ao circuito, porém para sintonizar o PLL, o resistor de 2,4k LM567 está dimensionado para frequências sugerido pelo datasheet do CI de 100kHz (figura 17), consequentemente substituiu-se o resistor por um potenciômetro de 0 a 10k , facilitando tanto a sintonia de 120kHz, para a correção de possíveis erros na frequência decorrente da transmissão. FIGURA 17 – CIRCUITO MODELO, PREPRESENDADO NO DATASHEET DO LM567 FONTE - NACIONAL SEMICONDUCTOR, LM567/LM567C TONE DECODER, FEVEREIRO 2003. 29 8.2 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO FIRMWARE Por suportar a estrutura C ANSI e possuir mais recursos de simulação, a plataforma Borland Builder C++ 5 foi adotada para o desenvolvimento e simulação prévia do firmware. Após a conclusão desta etapa, o código fonte foi migrado para a plataforma CCS a qual gera um arquivo hexadecimal específico para o microcontrolador. Quanto à funcionalidade do firmware, esta foi simulada e corrigida utilizando o Kit Microcontrolador PIC desenvolvido pela empresa Brastron (figura 18). FIGURA 18 – KIT MICRCONTROLADOR PIC (BRASTRON) FONTE – BRASTRON INDÚSTRIA ELETRÔNICA. O primeiro problema encontrado pela plataforma CCS durante o início dos testes de compilação indicava insuficiência de memória para o armazenamento da tabela dos códigos do protocolo X10 (Apêndice A). Este foi resolvido com a alteração do tipo das variáveis utilizadas na biblioteca X10Codes (Apêndice C), substituindo as variáveis do tipo int por variáveis do tipo short. A simples troca do tipo das variáveis fez com que o número de bits reservados por função reduzisse por 16 vezes, uma vez que variáveis do tipo int instanciam 16 bits e as variáveis do tipo short instancia 1 bit (figura 19). 30 FIGURA 19 – AMOSTRA DA CORREÇÃO DO SOFTWARE, REFERENTE AOS VALORES ATRIBUIDOS PARA OS HOUSE CODES // HOUSE CODES short HouseA[8] = short HouseB[8] = short HouseC[8] = short HouseD[8] = short HouseE[8] = short HouseF[8] = {0,1,1,0,1,0,0,1}; {1,0,1,0,1,0,0,1}; {0,1,0,1,1,0,0,1}; {1,0,0,1,1,0,0,1}; {0,1,0,1,0,1,1,0}; {1,0,0,1,0,1,1,0}; FONTE – PRÓPRIA. Um problema que foi detectado e não pode ser solucionado, foi relativo ao compilador CCS que ao chamar uma função que tem como parâmetro de entrada um vetor de ponteiros, e o índice dos elementos não começam em zero, o programa assume um comportamento aleatório na execução da lógica programada. A função que usa este tipo de estrutura é a Mover (figura20). Essa função faz parte da função MontaFrame (figura21) que tem como objetivo montar o frame de dados que será transmitido. FIGURA 20 – FUNÇÃO MOVER void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant) { int k=0; for (k;k<Quant;k++) { Dst[IniDst + k] = Src[IniSrc + k]; } } FONTE – PRÓPRIA. FIGURA 21 – FUNÇÃO MONTA FRAME Void MontaFrame(void) { //Monta o frames com 100 bits a ser transmitido Mover(TxFrame,0,Start,0,4); //4 bits Mover(TxFrame,4,House,0,8); //8 bits Mover(TxFrame,12,Unit,0,10); //10 bits Mover(TxFrame,22,Start,0,4); //4 bits Mover(TxFrame,26,House,0,8); //8 bits Mover(TxFrame,34,Unit,0,10); //10 bits Mover(TxFrame,44,Wait,0,6); //6 bits Mover(TxFrame,50,Start,0,4); //4 bits Mover(TxFrame,54,House,0,8); //8 bits Mover(TxFrame,62,Function,0,10); //10 bits Mover(TxFrame,72,Start,0,4); //4 bits Mover(TxFrame,76,House,0,8); //8 bits Mover(TxFrame,84,Function,0,10); //10 bits Mover(TxFrame,94,Wait,0,6); //6 bits } FONTE – PRÓPRIA. 31 Para tentar solucionar esse problema foram realizadas as seguintes etapas: Análise da sintaxe das funções MontaFrame, Mover e do vetor TxFrame; Simulação da função MontaFrame no Borland Builder C++ 5; Atualização do compilador CCS; Apesar das funções funcionarem no ambiente do Borland e da atualização do compilador CCS para a última versão (4.057), nenhuma das tentativas resultou em êxito. Para contornar esse problema, a lógica da função MontaFrame teve que ser substituída por vários laços for. Para consultar a função MontaFrame com as modificações, consulte a página 47 (Apêndice B). Outro problema que foi detectado na análise do sinal de saída do PWM, foram picos irregulares de tensão com intervalos de aproximadamente 40µs. Empiricamente constatou-se que há alteração no valor utilizado para configuração do duty cicle é de acordo com o tipo da variável declarada para a função PWM. Caso a declaração seja feita com o tipo long int, o PWM trabalha com 10 bits e com excursão máxima numérica é de 0 a 1023, mas para o caso da função PWM declarada como int, o sistema trabalha com 8 bits, possuindo conseqüentemente excursão máxima numérica de 0 a 255. A maior dificuldade apresentada foi não encontrar nenhuma referência bibliográfica que explicitasse esse modelo. O ponto fundamental para a funcionalidade integrada do hardware com o software está vinculado a compreensão de um erro existente no artigo AN236 (X-10® Home Automation Using the PIC16F877A) desenvolvido pela Microchip. O exemplo indicado no 4º parágrafo, da 2ª coluna, da 13ª pagina do artigo, induz ao pensamento de que a utilização da redundância complementar dos bits atribuídos ao House Code é realizada em blocos de 04 bits (figura 22). 32 FIGURA 22 - EXEMPLO INCORRETO DO PACODE DE DADOS PARA TRANSMISSÃO X10. FONTE: MICROCHIP TECHNOLOGY, 2002. O conhecimento adquirido através de outros artigos e buscas na internet, favoreceram na compreensão do erro no artigo da Microchip, onde a correção impondo um bit complementar para cada bit transmitido no House Code levou ao funcionamento total da base do projeto controlador X10. Obs.: o código fonte de todo o firmware encontra-se no Apêndice B. 8.3 CONFIGURAÇÕES DO SOFTWARE Para que o usuário possa ter um ambiente para interagir com o controlador, foi desenvolvida uma interface gráfica onde o mesmo pode acessar todos os recursos disponíveis, como controlar um dispositivo individualmente, configurar um cenário ou ainda cadastrar uma seqüência de ações para o simulador de presença. A interface foi divida em 4 partes para uma melhor organização estrutural, sendo elas: - Tela Principal; 33 - Configuração de dispositivos; - Configuração de cenários; - Configuração do simulador de presença. Na tela principal (figura 23), o usuário pode acessar as funções já programadas e ainda controlar os dispositivos cadastrados. FIGURA 23 – TELA PRINCIPAL DA INTERFACE GRÁFICA. FONTE: PRÓPRIA. Além dos comandos, essa tela traz algumas informações como o status dos equipamentos cadastrados, o último comando X10 detectado na rede (quando outro controlador envia sinais pela rede), o nível de sinal do modem celular e o detalhamento da última mensagem de texto recebida (número do celular que originou a mensagem, data e hora). Através das mensagens de texto é possível comandar um dispositivo específico, trocar um cenário ou ainda habilitar / desabilitar o simulador de presença. 34 Para o usuário principiante, quando ele acessar alguma das funções pela primeira vez, o sistema detectará e o ajudará com algumas telas de help automáticas, explicando sobre o uso desta funcionalidade (figura 24). FIGURA 24 – TELA DE HELP DE COMO CADASTRAR UM NOVO DISPOSITIVO. FONTE: PRÓPRIA. Para que os dispositivos de controle existentes possam ser colocados no software, uma tela de configuração de dispositivos pode ser acessada através do menu principal (figura 25). FIGURA 25 – TELA DE CONFIGURAÇÃO DOS DISPOSITIVOS. FONTE: PRÓPRIA. 35 Nessa tela pode-se escolher o house code, o unit code e ainda fornecer uma descrição sobre o dispositivo (Ex: A01 – Abajur da Sala). Ela ainda permite excluir algum dispositivo já cadastrado. Para a configuração dos cenários, a interface provê uma tela para este fim específico (figura 26). FIGURA 26 – TELA DE CONFIGURAÇÃO DOS CENÁRIOS. FONTE: PRÓPRIA. Aqui o usuário pode nomear o cenário, incluir os dispositivos a serem controlados e ainda definir uma ação para cada dispositivo. Assim depois de concluída essa configuração, o usuário terá a disposição um ambiente pré configurado ao qual ele pode selecionar a sua utilização pela tela principal. Como exemplo, o cenário “jantar” pode deixar toda a iluminação da sala com um brilho mais aconchegante para esta ocasião. A última estrutura é a tela para configuração da seqüência de ações do simulador de presença (figura 27). 36 FIGURA 27 – TELA DE CONFIGURAÇÃO DO SIMULADOR DE PRESENÇA. FONTE: PRÓPRIA. Através dessa tela o usuário pode cadastrar diversas seqüências temporais como os respectivos comandos para cada dispositivo. Isso permite, por exemplo, que quando a pessoa viaja, a sua casa pode ficar no modo simulador de presença, onde a seqüência pré definida é executada simulando assim a presença humana na casa. Para uma maior facilidade na utilização da interface, em alguns campos está habilitada a função “F1”, a qual fornece um descritivo de ajuda sobre aquele campo em questão. No exemplo da figura 28 está a ajuda para o campo house code. FIGURA 28 – TEXTO DE AJUDA SOBRE O CAMPO HOUSE CODE. FONTE: PRÓPRIA. 37 8.4 PLACA DE CIRCUITO IMPRESSO (PCI) Para confecção da placa de circuito impresso, o software escolhido para fazer o roteamento da placa foi o Proteus versão 7.4. A figura 29 mostra o layout das trilhas e componentes enquanto que a figura 30 mostra uma visão 3D roteada. FIGURA 29 – LAY OUT DA PLACA DO CONTROLADOR FONTE – PRÓPRIA FIGURA 30 – VISÃO 3D DA PLACA ROTEADA FONTE – PRÓPRIA 38 8.5 RELAÇÃO DE COMPONENTES TABELA 4 – LISTA DE COMPONETES ! #! % # " # # " # ) # # $ # ) - . -6 -6 -6 -6 -6 -6 -6 & - & ' # & ' " * + ,* / 0 1 " " #)! ""! $" !! $" !! - 4 !! #)! !!! #% 5 ! #% 5 % - 4 )( - 4 !! - 4 %! - 4 ! - 4 !! 5 " " - 4 "" - 4 "" - 4 6- $ ((/ 7& %$( ()7 !) ()7 ! ( !% ( % 1#"# 7 8 5"9 , -6 "2 "2!3 0 0 0 ! "! ! "! ! $! ! !% ! !( " !! #! !! ! "! ! ! ! ! ! !% ! #% ! ! ! ! ! !% ! !% ! !% ! !% ! !% ! ! ! !% ! !% ! !% % ! # )! ! %! ! %! ! (" ! (" "% !! ! #! ! )! ! "! ! "! ! $! ! #% ! ) " !! #! !! ! 3! ! #! ! #! ! % ! %! ! ! ! ! ! #! ! !% ! ! ! ! ! "! ! ! ! !% ! !% ! ! % ! # )! ! %! ! %! ! (" ! (" "% !! ! ! ! )! 39 - $& : ; #& : ; + )!!( +% 3 $ $ 7- #2 $ #! # < < = $ - > ? , @ A 7 # $ $ ( # # C # # # 1 1 1 1 1 1 D ! !B % % #( #!! !! )(! $#! B B% #8) !B #(B "$B !B $ !B &# % ) E -%)( -%) -%%( #+ #3!( , -6 ! "! !B !! !! ! ! ! ! ! ! ! ! !! $! ! !" %! ! ! ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) ! !) # )! #! ! (! ! (! ! (! "! ! ! !! !! !! ! #! ! ! ! ! ! ! !! $! ! %! ! ! !! ! #) ! #) ! !) ! !) ! !) ! !) ! !) !# ! !) ! !) !! ! !) !! # )! #! )! ! (! ! (! # $! $! !! # )% 40 9. RESULTADOS Segundo a especificação do protocolo (PADRÃO X10, 2009) alguns parâmetros devem ser atendidos para garantir a comunicação entre os dispositivos: a) Frequencia de oscilação da portadora: 120kHz ± 5% A frequencia de oscilação na saída do PWM obtida foi 120kHz (figura 31) FIGURA 31 – SINAL DE SAÍDA DO PWM FONTE – PRÓPRIA b) Deteccção de cruzamento por zero: 100 s ± 100 s O circuito de sincronismo acusa a passagem por zero com um erro de 41 s (figura 32). FIGURA 32 – SINAL DE SAÍDA DO CIRCUITO DE DETECÇÃO DE PASSAGEM POR ZERO FONTE – PRÓPRIA 41 c) Tamanho da portadora transmitida: 1ms ± 50 s O tamanho da portadora obtida foi extamente 1ms (figura 33) FIGURA 33 – TAMANHO DA PORTADORA TRANSMITIDA FONTE – PRÓPRIA d) Potência média de saída do transmissor: 60mW (5Vpp, 5 ) Pelas medições realizadas, o estágio de amplificação fornece aproximadamente 130mW de potência na saída. Nos testes de banca, todas as transmissões foram bem sucedidas. Apesar disso, experiências mostram que casa maiores que 185 m2 passam a ser um problema para a cobertura do sinal. O sintoma mais comum é o envio e o não recebimento de comandos. (PADRÃO X10, 2009) Casos onde o transmissor está em uma fase e o módulo receptor está em outra, há a necessidade de se fazer o acoplamento entre as fases. Isso pode ser feito através de bridges ou com a colocação de capacitores de 0,1 F entre as fases. O teste de acoplamento utilizando capacitores foi realizado em laboratório sendo bem sucedido. 42 10. CONCLUSÃO O desenvolvimento desse projeto abrangeu uma série de fatores importantes, que vão do acadêmico ao comercial. Do ponto de vista acadêmico sua importância está na interdisciplinaridade do conceito, que para sua realização necessitou conhecimentos sobre modulação de sinais, algoritmos, programação em C e C++, comunicação serial, protocolos de comunicação, interrupções, microprocessadores, eletrônica digital, circuitos elétricos e eletrônica básica. Do ponto de vista comercial, destaca-se o alto potencial de comercialização devido à aplicabilidade, uma vez que o uso da rede elétrica como meio de transmissão de dados nos permite automatizar qualquer tipo de residência, sendo ela nova ou antiga, ou ainda espaços comerciais como teatros, cinemas e salas comerciais. Aliado a tudo isso ainda temos um baixo custo de produção, o qual pode ser reduzido mais ainda se produzido em escala industrial, e a interatividade, visto que a interface gráfica fornece um ambiente único onde o usuário pode controlar todas as funções com comodidade, praticidade e segurança, além claro da funcionalidade da mensagem de texto, que permite o acesso remoto das funções do controlador. Uma característica não explorada na fase do projeto foi a bidirecionalidade da comunicação celular via mensagem de texto, que hoje só tem a função de recebimento. Porém com as devidas modificações essa funcionalidade pode ser adicionada ao controlador para, por exemplo, enviar uma mensagem de texto quando detectada a presença de intrusos. Apesar do foco acadêmico, o desenvolvimento desse tipo de projeto representa não só a aplicação dos conhecimentos obtidos na faculdade, mas também uma excelente oportunidade de negócios para os futuros engenheiros. 43 9. REFERÊNCIAS BIBLIOGRÁFICAS AURESIDE – ASSOCIAÇÃO BRASILEIRA DE AUTOMAÇÃO RESIDENCIAL – PROTOCOLOS . Disponível em: http://www.aureside.org.br/temastec/default.asp?file=protocolos09.asp. Acesso em 23/02/2009 PADRÃO X10. Disponível em: http://members.tripod.com/~albt/x10.htm. Acesso em 25/02/2009 A CASA INTELIGENTE. Disponível em: http://www.acasainteligente.com/imprensa.asp?idImp=2. Acesso em 25/02/2009 DIGITAT - DIGITAL HABITAT. Disponível em: http://digitat.info/modules/sections/index.php?op=printpage&artid=5. Acesso em 25/02/2009 BRAGA, Newton C.. Conhecendo o PLL. Revista Saber Eletrônica, ano 19, numero 127, novembro / dezembro 2007. BURROUGHS, Jon. X10 HOME AUTOMATION USING PIC16F877A. Artigo técnico AN236.Microchip Tecnology Inc., 2002 D’SOUZA, Stan. TRANSFORMELLES POWER SUPPLY. Artigo técnico TB008.Microchip Tecnology Inc., 2000 10. DOCUMENTOS CONSULTADOS PROJETO EM X10. Disponível em: http://maia.empacotal.com/nuno//plm/descrica.htm . Acesso em 25/02/2009 X10 – CUSTOMER SUPPORT. Disponível em: http://www.x10.com/support2.htm. Acesso em 23/02/2009 BOLZANI,Caio Augustus M.. Residências Inteligentes. 1 Ed. São Paulo: Livraria da Física, 2004. MORESCHI, Eduardo H. ; SOARES,Gyl. Sistema de Acionamento Residencial Através da Rede Elétrica. Trabalho de Conclusão de Curso. Curitiba, 2007. PIC16F87X Data Sheet: 28/40 – Pin 8 – Bit CMOS FLASH Microcontrollers. Disponível em: http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf Acesso em 23/03/2009. . 44 APÊNDICE A – LISTA DE CÓDIGOS X10 TABELA A1 – ENDEREÇO DOS DISPOSITIVOS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 NUMBER CODE X1 X2 X4 X8 0 1 1 0 1 1 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 X16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP TABELA A2 – MACRO REGIÕES HOUSE CODES H1 H2 H4 A 0 1 1 B 1 1 1 C 0 0 1 D 1 0 1 E 0 0 0 F 1 0 0 G 0 1 0 H 1 1 0 I 0 1 1 J 1 1 1 K 0 0 1 L 1 0 1 M 0 0 0 N 1 0 0 O 0 1 0 P 1 1 0 FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP TABELA A3 – CÓDIGO DAS FUNÇÕES All units OFF All lights ON ON OFF Dim Bright All lights OFF Extended Code Hail Request Hail Acknowledge Pre-set Dim Extended Data (analog) Status: ON Status: OFF Status: Request FUNCTION CODE X1 X2 X4 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP H8 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 X8 0 1 0 1 0 1 0 1 0 1 X 0 1 0 1 X16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 45 APÊNDICE B – CÓDIGO FONTE DO FIRMWARE // PROGRAMA PRINCIPAL //UTILIZAÇÃO DOS PINOS // C0 - LED:INDICA X10TX // C1 - LED:INDICA X10RX // C2 - SAIDA PWM // C4 - ENTRADA VINDA DO PLL // C5 - LED:COMANDO NO BUFFER SERIAL // C6 - TXSERIAL // C7 - RXSERIAL // B0 - INTERRUPÇÃO EXTERNA - SINAL DE SINCRONISMO // B1 - RELE - LIGA / DESLIGA // A1 - ENTRADA PLL //BIBLIOTECAS .h #include <16F877A.h> #include <string.h> //DIRETIVAS DO PIC #fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT #use delay(clock=12000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //BIBLIOTECAS .c #include <mod_lcd.c> #include <X10Codes.c> //DECLARAÇÃO DAS FUNÇÕES void Inicializa(void); void MontaFrame(void); void Decodifica(void); void Transmite(void); void X10Receive(void); void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant); short Compara(short *Vetor1, int Pos1, short *Vetor2, int Pos2, int Num); //DECLARAÇÃO DAS VARIAVEIS short TxSet=0,RxSet=0,NewTxCmd=0,TxFrame[101],House[8],Unit[10],Function[10],RxFrame[44],AddOk=0; char Cmd[10],Hs[3],Ut[4],Fc[4]; int y=0,i=0,m,n=0,Func_Dmm=0; void Main(void) { Inicializa(); printf("\n\n\r---------------\n\r"); printf("CONTROLADOR X10\n\r"); printf("---------------\n\r"); for(;;) { if(!TxSet) { if(NewTxCmd) { disable_interrupts(INT_EXT); Decodifica(); printf("COMANDO DECODIFICADO\n\r"); printf("H:%s,U:%s,F:%s\n\r",Hs,Ut,Fc); printf("Start: "); for(y=0;y<4;y++) { printf("%d",Start[y]); } printf("\n\r"); printf("House: "); 46 for(y=0;y<8;y++) { printf("%d",House[y]); } printf("\n\r"); printf("Unit: "); for(y=0;y<10;y++) { printf("%d",Unit[y]); } printf("\n\r"); printf("Function: "); for(y=0;y<10;y++) { printf("%d",Function[y]); } printf("\n\r"); MontaFrame(); printf("FRAME X10\n\r"); } } } for(y=0;y<101;y++) { printf("%d",TxFrame[y]); } printf("\n\r"); TxSet = 1; lcd_pos_xy(1,1); lcd_escreve("TRANSMITINDO...."); NewTxCmd = 0; output_low(pin_c5);//Comando no Buffer Serial; output_high(pin_c0);//TX; enable_interrupts(INT_EXT); } // INTERRUPÇÕES #INT_RDA void Serial(void) { gets(Cmd); NewTxCmd = 1; output_high(pin_c5);//Comando no Buffer Serial; } #INT_EXT void Externa(void) { //printf("INT_EXT\n\r"); if(TxSet) { disable_interrupts(INT_EXT); Transmite(); enable_interrupts(INT_EXT); } else { disable_interrupts(INT_EXT); Delay_us(1100); if (input(pin_a1)) //if(TesteRx[t]) { RxSet = 1; output_high(pin_c4); 47 } else { RxSet = 0; output_low(pin_c4); } X10Receive(); enable_interrupts(INT_EXT); } } // FUNÇÕES void Transmite(void) { if(i<101) { if(TxFrame[i]) { set_pwm1_duty(12); //Transmite Fase R Delay_ms(1); //Delay_us(10); set_pwm1_duty(0); ///Delay_us(1778); ///set_pwm1_duty(255); //Transmite Fase S ///Delay_ms(1); //Delay_us(10); ///set_pwm1_duty(0); ///Delay_us(1778); ///set_pwm1_duty(255); //Transmite Fase T ///Delay_ms(1); //Delay_us(10); ///set_pwm1_duty(0); } i++; } else { TxSet = 0; lcd_pos_xy(1,1); lcd_escreve("CONTROLADOR X10"); i = 0; memset(TxFrame,0,sizeof(TxFrame)); output_low(pin_c0);//TX; } } void Inicializa(void) { enable_interrupts(INT_RDA); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); lcd_ini(); lcd_escreve(' \f' );//apaga display lcd_pos_xy(1,1); lcd_escreve("CONTROLADOR X10"); lcd_pos_xy(1,2); lcd_escreve("TCC VER:03/2009"); setup_timer_2(T2_DIV_BY_1,24,1); 48 setup_ccp1(ccp_pwm); set_pwm1_duty(0); memset(TxFrame,0,sizeof(TxFrame)); memset(Hs,0,sizeof(Hs)); memset(Ut,0,sizeof(Ut)); memset(Fc,0,sizeof(Fc)); memset(Cmd,0,sizeof(Cmd)); ext_int_edge( L_TO_H ); } void MontaFrame(void) { if(Func_Dmm==1) { //Monta o frames com 101 bits a ser transmitido TxFrame[0]=0; //Mover(TxFrame,1,Start,0,4);//0 //4 bits for(y=0;y<4;y++) { TxFrame[1+y]=Start[y]; } //Mover(TxFrame,5,&House[0],0,8);//4 for(y=0;y<8;y++) { TxFrame[5+y]=House[y]; } //Mover(TxFrame,13,Unit,0,10);//12 for(y=0;y<10;y++) { TxFrame[13+y]=Function[y]; } //Mover(TxFrame,23,Start,0,4);//22 for(y=0;y<4;y++) { TxFrame[23+y]=Start[y]; } //10 bits //4 bits //Mover(TxFrame,27,House,0,8);//26 for(y=0;y<8;y++) { TxFrame[27+y]=House[y]; } //8 bits //Mover(TxFrame,35,Unit,0,10);//34 for(y=0;y<10;y++) { TxFrame[35+y]=Function[y]; } //10 bits //Mover(TxFrame,45,Quiet,0,6);//44 //for(y=0;y<6;y++) //{ // TxFrame[45+y]=0; //} //6 bits //Mover(TxFrame,51,Start,0,4);//50 for(y=0;y<4;y++) { TxFrame[51+y]=Start[y]; } //4 bits //Mover(TxFrame,55,House,0,8);//54 for(y=0;y<8;y++) { TxFrame[55+y]=House[y]; } //Mover(TxFrame,63,Function,0,10);//62 for(y=0;y<10;y++) { TxFrame[63+y]=Function[y]; //8 bits //10 bits 49 } //Mover(TxFrame,73,Start,0,4);//72 for(y=0;y<4;y++) { TxFrame[73+y]=Start[y]; } //4 bits //Mover(TxFrame,77,House,0,8);//76 for(y=0;y<8;y++) { TxFrame[77+y]=House[y]; } //8 bits //Mover(TxFrame,85,Function,0,10);//84 for(y=0;y<10;y++) { TxFrame[85+y]=Function[y]; } //10 bits //Mover(TxFrame,95,Quiet,0,6);//94 //6 bits for(y=0;y<6;y++) { TxFrame[95+y]=0; } } if(Func_Dmm==0) { //Monta o frames com 101 bits a ser transmitido TxFrame[0]=0; //Mover(TxFrame,1,Start,0,4);//0 //4 bits for(y=0;y<4;y++) { TxFrame[1+y]=Start[y]; } //Mover(TxFrame,5,&House[0],0,8);//4 for(y=0;y<8;y++) { TxFrame[5+y]=House[y]; } //Mover(TxFrame,13,Unit,0,10);//12 for(y=0;y<10;y++) { TxFrame[13+y]=Unit[y]; } //Mover(TxFrame,23,Start,0,4);//22 for(y=0;y<4;y++) { TxFrame[23+y]=Start[y]; } //10 bits //4 bits //Mover(TxFrame,27,House,0,8);//26 for(y=0;y<8;y++) { TxFrame[27+y]=House[y]; } //8 bits //Mover(TxFrame,35,Unit,0,10);//34 for(y=0;y<10;y++) { TxFrame[35+y]=Unit[y]; } //10 bits //Mover(TxFrame,45,Quiet,0,6);//44 //for(y=0;y<6;y++) //{ // TxFrame[45+y]=0; //} //6 bits //Mover(TxFrame,51,Start,0,4);//50 for(y=0;y<4;y++) { //4 bits 50 } TxFrame[51+y]=Start[y]; //Mover(TxFrame,55,House,0,8);//54 for(y=0;y<8;y++) { TxFrame[55+y]=House[y]; } //8 bits //Mover(TxFrame,63,Function,0,10);//62 for(y=0;y<10;y++) { TxFrame[63+y]=Function[y]; } //Mover(TxFrame,73,Start,0,4);//72 for(y=0;y<4;y++) { TxFrame[73+y]=Start[y]; } //4 bits //Mover(TxFrame,77,House,0,8);//76 for(y=0;y<8;y++) { TxFrame[77+y]=House[y]; } //Mover(TxFrame,85,Function,0,10);//84 for(y=0;y<10;y++) { TxFrame[85+y]=Function[y]; } } //Mover(TxFrame,95,Quiet,0,6);//94 for(y=0;y<6;y++) { TxFrame[95+y]=0; } } //10 bits //8 bits //10 bits //6 bits void Decodifica(void) { //Separa a string recebida pela serial em 3 partes - House, Unit, Function strncpy(Hs,Cmd,2); //House strncpy(Ut,Cmd+2,3); //Unit strncpy(Fc,Cmd+5,3); //Function //Identifica qual house(A,B,C,...) foi solicitada if(!strcmp(Hs,HA))Mover(House,0,HouseA,0,8); else if(!strcmp(Hs,HB))Mover(House,0,HouseB,0,8); else if(!strcmp(Hs,HC))Mover(House,0,HouseC,0,8); else if(!strcmp(Hs,HD))Mover(House,0,HouseD,0,8); else if(!strcmp(Hs,HE))Mover(House,0,HouseE,0,8); else if(!strcmp(Hs,HF))Mover(House,0,HouseF,0,8); else if(!strcmp(Hs,HG))Mover(House,0,HouseG,0,8); else if(!strcmp(Hs,HH))Mover(House,0,HouseH,0,8); else if(!strcmp(Hs,HI))Mover(House,0,HouseI,0,8); else if(!strcmp(Hs,HJ))Mover(House,0,HouseJ,0,8); else if(!strcmp(Hs,HK))Mover(House,0,HouseK,0,8); else if(!strcmp(Hs,HL))Mover(House,0,HouseL,0,8); else if(!strcmp(Hs,HM))Mover(House,0,HouseM,0,8); else if(!strcmp(Hs,HN))Mover(House,0,HouseN,0,8); else if(!strcmp(Hs,HO))Mover(House,0,HouseO,0,8); else if(!strcmp(Hs,HP))Mover(House,0,HouseP,0,8); //Identifica qual unit foi solicitada if(!strcmp(Ut,U01))Mover(Unit,0,Unit01,0,10); else if(!strcmp(Ut,U02))Mover(Unit,0,Unit02,0,10); else if(!strcmp(Ut,U03))Mover(Unit,0,Unit03,0,10); else if(!strcmp(Ut,U04))Mover(Unit,0,Unit04,0,10); else if(!strcmp(Ut,U05))Mover(Unit,0,Unit05,0,10); else if(!strcmp(Ut,U06))Mover(Unit,0,Unit06,0,10); else if(!strcmp(Ut,U07))Mover(Unit,0,Unit07,0,10); else if(!strcmp(Ut,U08))Mover(Unit,0,Unit08,0,10); 51 else if(!strcmp(Ut,U09))Mover(Unit,0,Unit09,0,10); else if(!strcmp(Ut,U10))Mover(Unit,0,Unit10,0,10); else if(!strcmp(Ut,U11))Mover(Unit,0,Unit11,0,10); else if(!strcmp(Ut,U12))Mover(Unit,0,Unit12,0,10); else if(!strcmp(Ut,U13))Mover(Unit,0,Unit13,0,10); else if(!strcmp(Ut,U14))Mover(Unit,0,Unit14,0,10); else if(!strcmp(Ut,U15))Mover(Unit,0,Unit15,0,10); else if(!strcmp(Ut,U16))Mover(Unit,0,Unit16,0,10); //Identifica qual função foi solicitada if(!strcmp(Fc,F01)){Mover(Function,0,AllUnitsOff,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F02)){Mover(Function,0,AllUnitsOn,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F03)){Mover(Function,0,On,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F04)){Mover(Function,0,Off,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F05)){Mover(Function,0,Dm,0,10);Func_Dmm=1;} else if(!strcmp(Fc,F06)){Mover(Function,0,Brgt,0,10);Func_Dmm=1;} else if(!strcmp(Fc,F07)){Mover(Function,0,AllLightsOff,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F08)){Mover(Function,0,ExtendedCode,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F09)){Mover(Function,0,HailRequest,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F10)){Mover(Function,0,HailAcknowledge,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F11)){Mover(Function,0,PresetDim,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F12)){Mover(Function,0,ExtendedData,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F13)){Mover(Function,0,StatusOn,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F14)){Mover(Function,0,StatusOff,0,10);Func_Dmm=0;} else if(!strcmp(Fc,F15)){Mover(Function,0,StatusRequest,0,10);Func_Dmm=0;} } void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant) { int k=0; for (k;k<Quant;k++) { Dst[IniDst + k] = Src[IniSrc + k]; } } short Compara(short *Vetor1, int Pos1, short *Vetor2, int Pos2, int Num) { int m,n=0; for(m=0;m<Num;m++) { if(Vetor1[Pos1+m]==Vetor2[Pos2+m])n++; } } if(n==Num) return 1; else return 0; //rotina de recebimento void X10Receive(void) { int x; short a,b; //ROTACIONA OS BITS RECEBIDOS DENTRO DO FRAME for(x=0;x<43;x++) { RxFrame[x]=RxFrame[x+1]; } //INSERE O BIT RECEBIDO NO FIM DO VETOR if(RxSet) RxFrame[43]=1; else RxFrame[43]=0; //VERIFICA SE HÁ UM FRAME COM DOIS CONJUNTOS DE START BIT 52 if((RxFrame[0]==1) && (RxFrame[1]==1) && (RxFrame[2]==1) && (RxFrame[3]==0) && (RxFrame[22]==1) && (RxFrame[23]==1) && (RxFrame[24]==1) && (RxFrame[25]==0)) { output_high(pin_c1);//Liga led RX; //VERIFICA SE FRAMES SÃO IGUAIS //Compara(RxFrame,0,RxFrame,22,22) n=0; for(m=0;m<22;m++) { a=RxFrame[m]; b=RxFrame[22+m]; if(a==b)n++; } if(n==22) { for(y=0;y<43;y++) { printf("%d",RxFrame[y]); } printf("\n\r"); //VERIFICA SE O FRAME É DE ENDEREÇO if((RxFrame[20]==0) && (RxFrame[21]==1)) { //Compara(RxFrame,4,HouseA,0,8) n=0; for(m=0;m<8;m++) { a=RxFrame[4+m]; b=HouseC[m]; if(a==b)n++; } if(n==8) { output_high(pin_c3);//Liga led RX; //Compara(RxFrame,12,Unit02,0,10) n=0; for(m=0;m<10;m++) { a=RxFrame[12+m]; b=Unit02[m]; if(a==b)n++; } if(n==10) AddOk=1; } output_low(pin_c3);//Liga led RX } //VERIFICA SE O FRAME É DE COMANDO if((RxFrame[20]==1) && (RxFrame[21]==0) && AddOk) { //Compara(RxFrame,12,On,0,10) n=0; for(m=0;m<10;m++) { a=RxFrame[12+m]; b=On[m]; if(a==b)n++; } if(n==10) output_high(pin_b1); //Compara(RxFrame,12,Off,0,10) n=0; for(m=0;m<10;m++) 53 { a=RxFrame[12+m]; b=Off[m]; if(a==b)n++; } if(n==10) output_low(pin_b1); //Compara(RxFrame,12,AllUnitsOff,0,10) n=0; for(m=0;m<10;m++) { a=RxFrame[12+m]; b=AllUnitsOff[m]; if(a==b)n++; } if(n==10) output_low(pin_b1); } AddOk=0; memset(RxFrame,0,sizeof(RxFrame)); output_low(pin_c1);//Desliga led RX; } else { } } } memset(RxFrame,0,sizeof(RxFrame)); output_low(pin_c1);//Desliga led RX; 54 APÊNDICE C – CÓDIGO FONTE DO FIRMWARE // DEFINIÇÕES DOS CÓDIGOS DO PROTOCOLO X10 // Criação - 2009 // HOUSE CODES short HouseA[8] = {0,1,1,0,1,0,0,1}; short HouseB[8] = {1,0,1,0,1,0,0,1}; short HouseC[8] = {0,1,0,1,1,0,0,1}; short HouseD[8] = {1,0,0,1,1,0,0,1}; short HouseE[8] = {0,1,0,1,0,1,1,0}; short HouseF[8] = {1,0,0,1,0,1,1,0}; short HouseG[8] = {0,1,1,0,0,1,1,0}; short HouseH[8] = {1,0,1,0,0,1,1,0}; short HouseI[8] = {0,1,1,0,1,0,1,0}; short HouseJ[8] = {1,0,1,0,1,0,1,0}; short HouseK[8] = {0,1,0,1,1,0,1,0}; short HouseL[8] = {1,0,0,1,1,0,1,0}; short HouseM[8] = {0,1,0,1,0,1,0,1}; short HouseN[8] = {1,0,0,1,0,1,0,1}; short HouseO[8] = {0,1,1,0,0,1,0,1}; short HouseP[8] = {1,0,1,0,0,1,0,1}; // UNIT CODES short Unit01[10] = {0,1,1,0,1,0,0,1,0,1}; short Unit02[10] = {1,0,1,0,1,0,0,1,0,1}; short Unit03[10] = {0,1,0,1,1,0,0,1,0,1}; short Unit04[10] = {1,0,0,1,1,0,0,1,0,1}; short Unit05[10] = {0,1,0,1,0,1,1,0,0,1}; short Unit06[10] = {1,0,0,1,0,1,1,0,0,1}; short Unit07[10] = {0,1,1,0,0,1,1,0,0,1}; short Unit08[10] = {1,0,1,0,0,1,1,0,0,1}; short Unit09[10] = {0,1,1,0,1,0,1,0,0,1}; short Unit10[10] = {1,0,1,0,1,0,1,0,0,1}; short Unit11[10] = {0,1,0,1,1,0,1,0,0,1}; short Unit12[10] = {1,0,0,1,1,0,1,0,0,1}; short Unit13[10] = {0,1,0,1,0,1,0,1,0,1}; short Unit14[10] = {1,0,0,1,0,1,0,1,0,1}; short Unit15[10] = {0,1,1,0,0,1,0,1,0,1}; short Unit16[10] = {1,0,1,0,0,1,0,1,0,1}; // FUNCTION CODES short AllUnitsOff[10] = {0,1,0,1,0,1,0,1,1,0}; //F01 short AllUnitsOn[10] = {0,1,0,1,0,1,1,0,1,0}; //F02 short On[10] = {0,1,0,1,1,0,0,1,1,0}; //F03 short Off[10]= {0,1,0,1,1,0,1,0,1,0}; //F04 short Dim[10] = {0,1,1,0,0,1,0,1,1,0}; //F05 short Bright[10] = {0,1,1,0,0,1,1,0,1,0}; //F06 short AllLightsOff[10]= {0,1,1,0,1,0,0,1,1,0}; //F07 short ExtendedCode[10] = {0,1,1,0,1,0,1,0,1,0}; //F08 short HailRequest[10] = {1,0,0,1,0,1,0,1,1,0}; //F09 short HailAcknowledge[10] = {1,0,0,1,0,1,1,0,1,0}; //F10 short PresetDim[10] = {1,0,0,1,1,0,1,0,1,0}; //F11 short ExtendedData[10] = {1,0,1,0,0,1,0,1,1,0}; //F12 55 short StatusOn[10] = {1,0,1,0,0,1,1,0,1,0}; //F13 short StatusOff[10] = {1,0,1,0,1,0,0,1,1,0}; //F14 short StatusRequest[10] = {1,0,1,0,1,0,1,0,1,0}; //F15 //CONSTANTS short Quiet[6] = {0,0,0,0,0,0}; short Start[4]= {1,1,1,0}; char HA[3] = "HA"; char HB[3] = "HB"; char HC[3] = "HC"; char HD[3] = "HD"; char HE[3] = "HE"; char HF[3] = "HF"; char HG[3] = "HG"; char HH[3] = "HH"; char HI[3] = "HI"; char HJ[3] = "HJ"; char HK[3] = "HK"; char HL[3] = "HL"; char HM[3] = "HM"; char HN[3] = "HN"; char HO[3] = "HO"; char HP[3] = "HP"; char U01[4] = "U01"; char U02[4] = "U02"; char U03[4] = "U03"; char U04[4] = "U04"; char U05[4] = "U05"; char U06[4] = "U06"; char U07[4] = "U07"; char U08[4] = "U08"; char U09[4] = "U09"; char U10[4] = "U10"; char U11[4] = "U11"; char U12[4] = "U12"; char U13[4] = "U13"; char U14[4] = "U14"; char U15[4] = "U15"; char U16[4] = "U16"; char F01[4] = "F01"; char F02[4] = "F02"; char F03[4] = "F03"; char F04[4] = "F04"; char F05[4] = "F05"; char F06[4] = "F06"; char F07[4] = "F07"; char F08[4] = "F08"; char F09[4] = "F09"; char F10[4] = "F10"; char F11[4] = "F11"; char F12[4] = "F12"; char F13[4] = "F13"; char F14[4] = "F14"; char F15[4] = "F15"; 56 ANEXO A – ARQUITETURA INTERNA DO PIC16F877A FONTE – DATSHEET PIC16F877A - MICROCHIP