Automação residencial em módulos

Olá a todos, depois de ler este topico e outros forums tambem estou como voces a tentar descobrir qual a solução ideal para uma automação residencial.
Em tempo já trabalhei com uma empresa portuguesa que fazia a implementação de domotica em casas em fase de construção o que parede ser o caso de alguns.
Pois bem em minha opiniao e pela experiancia que tive a melhor opção é sem sombras de duvida um barramento rs485 e alimentação de caixa em caixa eles utilizavam um cabo com 2x1mm preto e vermelho para os 12V e dois 0,5 entrelançados para os dados. Uma fonte de 12v para todos os modulos e posso dizer-vos que a maior parte das casas já funcionam a mais de 5 anos sem problemas, as vezes uma ou outra fonte vão ao ar mas isso é normal.
A grande entrave era o preço, daí eu andar por aqui a tentar desenvolver o sistema para a minha casita que tem que ser uma coisa low-cost.

cumps

Holdman-2004

holdman_2004,

bem-vindo ao clube :smiley:

holdman_2004:
Olá a todos, depois de ler este topico e outros forums tambem estou como voces a tentar descobrir qual a solução ideal para uma automação residencial.
Em tempo já trabalhei com uma empresa portuguesa que fazia a implementação de domotica em casas em fase de construção o que parede ser o caso de alguns.
Pois bem em minha opiniao e pela experiancia que tive a melhor opção é sem sombras de duvida um barramento rs485 e alimentação de caixa em caixa eles utilizavam um cabo com 2x1mm preto e vermelho para os 12V e dois 0,5 entrelançados para os dados. Uma fonte de 12v para todos os modulos e posso dizer-vos que a maior parte das casas já funcionam a mais de 5 anos sem problemas, as vezes uma ou outra fonte vão ao ar mas isso é normal.
A grande entrave era o preço, daí eu andar por aqui a tentar desenvolver o sistema para a minha casita que tem que ser uma coisa low-cost.

Eu não discordo do que dizes que uma rede com fios é melhor que uma rede wireless. Prova disso é o facto que aplicações wireless ainda não são muito utilizadas na indústria e sempre que possível é usado um profibus ou semelhante baseado no RS-485.
Mas para algumas aplicações ou em casas velhas, passar canalizações novas incorre num custo que pode ser proibitivo para o benefício que se tira do sistema.

Esta solução dos rádios nRF24L01 creio ser boa... mas ainda não vi como funciona em rede. Até agora só usei de ponto a ponto.

No meu caso a aplicação é nova, estou colocando eletrodutos entre todos os nós, então o RS-485 possível sem muitos problemas. Mas me assustei quando fiz o teste de bancada com 3 nós (1 master e 2 slaves) e a falha de um nó (na alimentação) causou falha na comunicação dos outros dois nós. Não sei se o fato de eu estar utilizando o CI SN17576, que é bem antigo, foi o problema, mas fiquei com um pé atrás em utilizar o RS-485, pois se for dessa forma mesmo, uma falha em um nó vai causar toda a rede a parar de funcionar, e descobrir qual é o nó problemático vai ser complicado.

Por conta disso e pensando deixar a rede mais "robusta" (mais facilmente expansível e com mais possibilidades), estou começando a estudar o nRF24L01+, que é um padrão wireless relativamente seguro e difundido, com bastante possibilidades e barato (o módulo sai por pouco mais de 1 dólar!). Vou começar a fazer alguns experimentos essa semana, já encomendei um módulo com antena externa, vamos ver qual a capacidade de comunicação desses bichinhos. Mas de último caso, existem bibliotecas que implementam rede mesh com comunicação full duplex. Há limitações, mas acredito que é uma boa solução.

Finalmente tive tempo. Esta aí minha primeira versão da placa de interruptor Simples (caixa 4x2).
Tem controle de duas cargas, 2 molex para botão touch + led e 3 molex para sensores analógico ou digital.
Ainda falta a malha GND.

Sugestões?

Parabéns, mardden, ficou muito organizado! Queria conseguir organizar desse jeito xD.

Também consegui um tempo, no meu caso fiz experimentos com o nRF24L01+. Depois de quebrar a cabeça para entender porque o exemplo só funcionava quando queria (linhas comentadas demais), achei o resultado bem satisfatório. O alcance foi melhor do que eu esperava, para módulos tão pequenos. Essa semana deve chegar o módulo com antena, daí testo tanto o alcance de transmissão quanto de recepção.

E se o módulo com antena não resolver o problema, devo utilizar o RF24Network. Mas mesmo que o alcance seja bom com a antena, e não seja necessário fazer uma rede (o master consegue se comunicar diretamente com todos os slaves), a vantagem de utilizar a RF24Network é que o master não vai precisar questionando sempre os slaves sobre os estados: quando houver algum evento, o slave pode se reportar diretamente ao master, o que com o RS485 não é possível.

Gostei tanto que fiz uma outra PCI, dessa vez utilizando o nRF24L01+ e um módulo LM2596 externo para fornecer 3.3V para o sistema (não me senti muito confortável com o LM2576, uma de minhas placas já estava com problema no step-down, e o custo iria sair maior do que comprar essas placas prontas).

Depois de uma revisão nas placas, devo encomendar algumas para teste :D.

edit: testei a classe RF24Network, e pelo menos a comunicação entre dois pontos funciona muito bem! Tempos pequenos entre comando e resposta, biblioteca simples de usar, estou cada vez mais decidido a ficar no nRF24L01+ mesmo :D.

LegendBR:
E quanto ao módulo com antena externa com amplificador de sinal (nRF24L01 + PA + LNA), será que ele além de ter mais potência de transmissão também tem um maior alcance de recepção?

Respondendo minha própria pergunta: acho que esses módulos só funcionam com alcance estendido em par/rede. Testei comunicar um módulo com antena e outro sem, e o alcance é praticamente o mesmo se estivesse utilizando dois módulos sem antena. Então vai na topologia de árvore mesmo, mas não devo ter problema.

O próximo passo é testar essa topologia. Depois vou testar três módulos (raiz - tronco - folha) para ver se a biblioteca funciona bem mesmo.

Opa LegendBR, Obrigado. Fiz o roteamento manualmente módulo por módulo. Primeiro a fonte, depois os triacs+moc, rs485 e por último o atmel. No início você acha que não vai caber tanto componente na plaquinha, mas no final consegui deixando as trilhas em apenas uma face. Fiz uns testes com dryfilm na confecção da pcb e gostei muito do resultado. Acho que eu mesmo vou confeccionar as pcb's. No final de semana vou fazer uma com esse layout e posto as fotos aqui.

A proposta do nRF24L01 é muito boa, principalmente para usar em casas já construídas. Não precisa fazer muita mudança na estrutura.

Como estou construindo praticamente do zero, tive mais liberdade na distribuição dos eletrodutos. Atualmente a parte de conduítes, reboco esta tudo pronto. O pedreiro começou a colocar o revestimento hoje. Ou seja, estou bem atrasado no projeto :frowning:

Vou continuar seguindo o raciocínio da rede RS485 e fonte chaveada com LM2576. Alias já comprei todos os componentes menos os atmel. Minha idéia é alimentar os circuitos com uma fonte de computador (de boa qualidade claro) pegando a saída de 12V. Caso uma fonte não seja suficiente por causa da distância, colocarei outra no meio do caminho (deixei espaço para isso).

LegendBR, você tem exemplo ou fez algum documento sobre a última versão de sua lib do rs485?

Sobre sua placa, a luz do led não vai atrapalhar a iluminação dos botões touch? O espelho é outra coisa que estou pensando em como fazer. Acho que vou desenhar e levar para alguma gráfica que faz plotagem com vinil. A liberdade na criação esta limitada apenas na imaginação. Vi um conceito muito interessante de interruptor que tinha o formato da planta da casa. Cada cômodo seria um botão. Pensei em fazer uma outra pcb onde iria os leds smd + antena touch e colar atrás do espelho.

LegendBR, não tiveste problemas com falhas de comunicacão?

Eu usando a biblioteca do ManiacBug de quando em vez tinha pacotes que chegavam, outras que o feedback não chegava.
Quando me aventurei em fazer código com a biblioteca tinha um pacote que chegava e perdia prai uns 20 para esse chegar. Foi quando percebi que a funcão de envio desligava o chip e aí, depois de mudar a lib, as coisas melhoraram mas ainda caíam pacotes.
Tu notaste isso?

O que eu reparo é que estes chips são algo difíceis para estabelecer uma comunicacão bidireccional uma vez que o chip ou fala ou ouve a cada instante. Então numa configuracão como a que vocês estão a criar vai ser um desafio interessante de conseguir escalonar isso. :slight_smile:

@mardden

Fiz o roteamento manual também, mas mesmo assim não consegui fazer ficar tão bom quanto o seu, hehehe. E as minhas vou mandar fazer fora mesmo, o custo no final das contas deve ficar quase a mesma coisa do que se eu fosse fazer, e fica muito mais bem feita.

No meu caso, que estou construindo do zero e também passei eletrodutos extra por todas as caixas de luz, vou acabar ficando com o nRF24L01+ mesmo. Se no futuro quiser colocar o RS485, é possível, assim fico com mais liberdade. O que me desanimou no RS485 foram meus testes com 3 nós (2 slaves e 1 master), onde quando a parte elétrica de um módulo deu problema, toda a comunicação deixou de funcionar. Não sei se o problema foi o chip utilizado (SN17576), mas fiquei com um pé atrás, pois no caso de falha de um nó, identificar o nó defeituoso seria muito difícil! Se tivesse mais de um, então, nem quero pensar no trabalho!

Eu até tenho exemplo da lib sim, documentação não cheguei a fazer, mas quando chegar em casa envio para você com em breve explicação ;).

O espelho estou pensando em mandar fazer de acrílico, com os botões já desenhados. Pensei nessa solução porque quando falei com um amigo que os botões poderiam ser brancos, ele me lembrou que eles poderiam sujar e dificultar a limpeza, o que é fato. Mas se eu fizer de acrílico, com os botões desenhados por dentro, é tranquilo, sem contar que não terei o trabalho de fazer um por um (colar o vinil, cortar cada um, etc.). O difícil é descobrir a(s) empresa(s) daqui de Aracaju que façam esse serviço, hehehe.

Sobre os botões do interruptor, fiz um teste com 6 botões capacitivos em uma moldura para caixa de 4"x4", e o resultado é um pouco aleatório. Ele começa funcionando bem, depois começa a não funcionar, enfim, não fiquei muito satisfeito. Então comprei uma tela touch-screen para fazer um teste, acho que vai ficar legal e vai ser muito mais confiável. Vamos ver como vai ficar.

Sobre o led da placa, acho que não vai atrapalhar não, pois vou colocar um conezinho atrás do botão para direcionar a luz do led de cada um, então esse cone deve bloquear a luz do led da placa.

@bubulindo

Então, no começo dos meus testes eu tinha comentado a linha do powerdown(), como você falou, porque também estava tendo problema de comunicação. Mas depois que descobri qual era o problema (linhas comentadas no exemplo, no setup()), tirei o comentário do powerdown (se não me engano) e passou a funcionar sem problemas. Só não consigo feedback quando as placas estão muito distantes, ou o intervalo entre as perguntas são MUITO curtos (do tipo perguntou-respondeu-perguntou-respondeu, praticamente sem intervalo entre eles), aí perco algumas respostas. Mas tendo um intervalo entre as perguntas, funciona bem.

Ah, e o meu mega funciona 100% com o nRF24L01+, ele mesmo alimentando os 3.3V.

Ok...
É estranho. Eu dava um segundo entre pergunta e resposta. Isso devia ser suficiente, creio.

Quanto ao mega... o meu é Chiduino, por isso, pode ser esse o problema. Eu li que havia mais gente com problemas, mesmo com oficiais, mas isso é sempre uma sorte, né?

Vou tentar fazer mais testes quando chegar a casa. Desta vez tentando ter mais nós ligados... quando chegar já devo ter uns quantos Nano à minha espera. :slight_smile:

O meu também não é o oficinal não, é esse aqui: Mega 2560 R3 ATmega2560-16AU Board + USB Cable for Arduino -Black+Blue - Free shipping - DealExtreme

edit: entre pergunta e resposta eu só dava um delay de 1 ms, pode ser isso...

Acabei de testar o RF24Network, e funciona direitinho mesmo. Segue código:

Master:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

RF24 radio(9,10);

RF24Network network(radio);

#define THIS_NODE 00

#define INTERVAL 1000
#define TIMEOUT 500

struct message_t
{
  unsigned long ms;
  unsigned long counter;
};

unsigned long lastTimeSent;

byte OTHER_NODE = 01;

void setup(void)
{
  Serial.begin(115200);
  
  SPI.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.begin();
  network.begin(90, THIS_NODE);
  
  lastTimeSent = 0;
    
}

void loop()
{
  network.update();
  
  unsigned long now = millis();
  
  if ((now - lastTimeSent) >= INTERVAL)
  {
    message_t message = {now, 1};
    RF24NetworkHeader header(OTHER_NODE);
    
    lastTimeSent = now;
    
    if (network.write(header, &message, sizeof(message)))
    {
      
      while (!network.available() && ((millis() - now) < TIMEOUT))
      {
        network.update();
      }
      
      if ((millis() - now) < TIMEOUT)
      {
        while (network.available())
        {
          RF24NetworkHeader headerReceived;
          message_t receivedMessage;
          network.read(headerReceived,&receivedMessage,sizeof(receivedMessage));
          
          Serial.print("Sent: ");
          Serial.print(message.ms);
          Serial.print(", received: ");
          Serial.print(receivedMessage.ms);
          Serial.print(", from node: ");
          Serial.print(headerReceived.from_node);
          Serial.print(". It took: ");
          Serial.println(millis()-now);
        }
        
      }
      else
      {
        Serial.print("TIMEOUT! Node ");
        Serial.println(OTHER_NODE);
      }
    }
    else
    {
      Serial.print("Falha no envio!!! Node ");
      Serial.println(OTHER_NODE);
    }
    
    if (OTHER_NODE == 01) OTHER_NODE = 011;
    else                 OTHER_NODE = 01;
    
  }
  
}

Slave 1:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

RF24 radio(9,10);

RF24Network network(radio);

#define THIS_NODE 01

struct message_t
{
  unsigned long ms;
  unsigned long counter;
};

void setup(void)
{
  Serial.begin(115200);
  
  SPI.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.begin();
  network.begin(90, THIS_NODE);
  
  pinMode(4, OUTPUT);
  
}

void loop()
{
  network.update();
  
  while (network.available())
  {
    message_t receivedMessage;
    RF24NetworkHeader header;
    
    network.read(header, &receivedMessage, sizeof(receivedMessage));
    
    digitalWrite(A0, HIGH);
    delay(20);
    digitalWrite(A0, LOW);
    
    Serial.print("Received ms: ");
    Serial.print(receivedMessage.ms);
    Serial.print(", from node: ");
    Serial.print(header.from_node);
    
    RF24NetworkHeader sendHeader(header.from_node);
    receivedMessage.ms += 35;
        
    if (network.write(sendHeader, &receivedMessage, sizeof(receivedMessage)))
    {
      Serial.println(" ... answer sent.");
    }
    else
    {
      Serial.println(" ... error sending answer.");
    }    
    
  } 
}

Slave 2:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

RF24 radio(9,10);

RF24Network network(radio);

#define THIS_NODE 011

struct message_t
{
  unsigned long ms;
  unsigned long counter;
};

void setup(void)
{
  Serial.begin(115200);
  
  SPI.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.begin();
  network.begin(90, THIS_NODE);
  
  pinMode(4, OUTPUT);
  
}

void loop()
{
  network.update();
  
  while (network.available())
  {
    message_t receivedMessage;
    RF24NetworkHeader header;
    
    network.read(header, &receivedMessage, sizeof(receivedMessage));
    
    digitalWrite(A0, HIGH);
    delay(20);
    digitalWrite(A0, LOW);
    
    Serial.print("Received ms: ");
    Serial.print(receivedMessage.ms);
    Serial.print(", from node: ");
    Serial.print(header.from_node);
    
    RF24NetworkHeader sendHeader(header.from_node);
    receivedMessage.ms += 35;
        
    if (network.write(sendHeader, &receivedMessage, sizeof(receivedMessage)))
    {
      Serial.println(" ... answer sent.");
    }
    else
    {
      Serial.println(" ... error sending answer.");
    }    
    
  } 
}

Estava apanhando porque estava tentando usar o segundo nó com o endereço 11, mas deveria colocar 011. O que esse 0 na frente muda não sei, mas que precisa dele, precisa...

o 0 indica qual é o Master... como isto é uma topologia em árvore, tu podes colocar outro Arduino com o numero 1 e ele fica no mesmo patamar que o teu 0 ou master.
Ao não colocares lá isso, ele procura um nó 1 como master. Não havendo, dá erro.

Não, acho que você não entendeu. A parte da topologia em árvore, com um nó 0 (central / master) e os outros derivando dele (1...5, 11...51, 121...521, etc.) eu entendi e estou fazendo da forma correta (nó 1 e nó 31). O problema é que para o Arduino (pelo menos nunca tinha ouvido falar nesse fato em outra linguagem) 031 != 31!

Faça o teste:

Serial.println(31);
Serial.println(031);

O resultado será:

31
25

É a primeira vez que vejo o zero a direita fazer diferença :stuck_out_tongue_closed_eyes:.

Isso é realmente esquisito...
Terá a ver com as flags de tipo como o 0x, ou 0b?
Vou pesquisar isso. eh eh

Não sei... tentei pesquisar alguma coisa no Google, mas nem sei o que pesquisar, rs. Mas só funciona dessa forma, se usar o segundo nó como 11, 21, 31, etc, não funciona. Mas se usar 011, 021, 031, etc., funciona perfeitamente.

Já alguém tinha visto isto?

http://www.kickstarter.com/projects/microduino/microduino-arduino-in-your-pocket-small-stackable?ref=category

bubulindo:
Já alguém tinha visto isto?

http://www.kickstarter.com/projects/microduino/microduino-arduino-in-your-pocket-small-stackable?ref=category

Interessante, mas sai mais caro do que o ATMega328P ou o Arduino Mini Pro :P.

bubulindo, estava pesquisando sobre bibliotecas para o nRF24L01+ e descobri este blog: Maniacal Bits: New RF24 Driver Release - A Fork

O autor deu uma melhorada na biblioteca do maniacbug, inclusive ele fala no powerdown() no método write() que você tinha falado. Tenta substituir o driver para ver no que dá. Nos meus testes, parece funcionar melhor. Depois vou desenvolver uma biblioteca para network nos moldes da RF24Network (não uso esta porque algumas coisas não entendo como ela faz, então vou tentar fazer a minha mesmo xD).

Sim, é até bem mais caro... mas é um conceito engracado de "empilhar" placas.

Pois... dá para ver que ele meteu bem mais tempo a corrigir bugs que o autor original.
O que me chateia na biblioteca é que os exemplos parecem funcionar bem... mas a partir do momento que usas a biblioteca para algo funcional aquilo não funciona de maneira alguma.
Algo que também é dito é que existem vários delays no código que foram removidos... eu acho que esses delays eram utéis também para manter os exemplos funcionais.

Mas pronto, pelo menos este problema parece estar resolvido, hein? :slight_smile: Com um pouco de sorte ele tirou aquelas strings todas e printfs que não estavam a fazer nada.

Quanto a usar a network... eu não me parece que vá precisar disso... mas é um desafio engracado.

Neste momento, por motivos profissionais o meu projectinho caseiro vai de novo para a gaveta. :frowning: