Página 1 de 1

Comunicação entre dispositivos

MensagemEnviado: 27 Jun 2014 05:53
por Rodrigo Lange
Bom dia pessoal,
Preciso de dicas para comunicar vários dispositivos remotos ( estes dispositivos recebem comandos endereçados do Master e respondem com feedback ).
Resumindo preciso comunicar módulos com um master via RF.
Pensei em usar os módulos NRF24L01+ para criar a rede mas não sei se é a melhor opção. O dispositivo precisa ter custo baixo por isso não quero usar zigbee.
A finalidade é domótica.
Sou iniciante, aprendi um pouco de PIC na faculdade de engenharia mas me identifiquei bastante com o brinquedinho (arduino) de "piá pansudo" rsrs to extraindo bastante coisa dessa plataforma!
Obs: O Master talvez precise ser um ARM, se bem que os Slaves faram o trabalho sujo, o Master apenas monitora de tempos em tempos, recebe as interrupções e trata as informações decidindo o que fazer..
Agradeço desde já as sugestões.

Re: Comunicação entre dispositivos

MensagemEnviado: 27 Jun 2014 08:33
por xultz
Eu não entendi qual é a tua dúvida.

Re: Comunicação entre dispositivos

MensagemEnviado: 27 Jun 2014 16:10
por Rodrigo Lange
É não ficou claro mesmo rsrs
Minha duvida é como fazer para comunicar os módulos que utilizaram a principio o ATMEGA328 com um módulo Master que pode também ser um ATMEGA328 ou Arduino Mega2560 utilizando o NRF24L01+ a principio.
Nada impede de fazer com modulo Bluetooth se for de fácil implementação no programa.
Aguardo dicas!

Re: Comunicação entre dispositivos

MensagemEnviado: 27 Jun 2014 23:13
por andre_luis
Do ponto de vista da programação, o modo físico como será transmitido não importa, pois será apenas uma UART enviando pelo TX e a UART do outro microcontrolador recebendo pelo RX, não é isso ?



+++

Re: Comunicação entre dispositivos

MensagemEnviado: 28 Jun 2014 00:31
por Rodrigo Lange
Sim!
Porém os dispositivos Slave enviam e rebem pacotes do Master. O que não sei é como fazer a comunicação.
Tenho 4 variáveis somente leitura e mais 4 leitura e escrita. Isso falando a grosso modo quando me refiro a variável por exemplo a variável temperatura recebe um valor fixo no Slave e eu apenas preciso ler, já a variável saidapwm preciso ler o valor já que é alterada no Slave e também alterar pelo Master, portanto leitura e escrita.
É mais ou menos isso,não sei se fui claro.

Re: Comunicação entre dispositivos

MensagemEnviado: 28 Jun 2014 07:03
por andre_luis
Então, na verdade teria uma infinidade de opções para implementar isso.
A sugestão é ir implementando aos poucos, mas já tendo em vista o que vai querer fazer.

O fato é que você tera de primeiramente definir o encapsulamento dos dados a serem enviados e recebidos, como por exemplo a seguinte sequencia: <STX><CMD><ADDRESS><D1><D2><D3><D4><CHECKSUM><ETX>. No caso, o byte CMD acima poderia ter funções como Envia ou Retorno. a variavel ADDRESS seria o endereço de cada receptor.

O passo seguinte seria definir o protocolo de comunicação, que nada mais é o fluxo desses pacotes acima, como por exemplo:
  • Transmissor → Receptor ( envia comando Escrita do valor Dx para o dispositivo ADDRESS )
  • Transmissor ← Receptor ( Recebe do dispositivo ADDRESS o comando Retorno seguido dos valores D4:D3:D2:D1 )


+++

Re: Comunicação entre dispositivos

MensagemEnviado: 28 Jun 2014 23:17
por Rodrigo Lange
Perfeito!
Era exatamente o que eu tinha em mente! :)
Bom com relação aos módulos Slave ja defini o que quero que os mesmos façam.
Estou na faze de implementar a programação neles.
Trata-se da automação da minha casa e estou disposto a investir nisso.
Acho que primeiramente vou terminar a programação dos Slaves dae posto aqui; pois no Master certamente vou precisar de ajuda!
Abaixo as funções dos escravos:

1-Dimmer 10Steps com indicação display 7seg (0-9) >(Feito)<
2-Botões Up/Down p/ controlar a saída do Triac >(Feito)<
3-Receptor IR para armazenar código de controles (2 teclas definidas pelo usuário; capturadas e armazenas) >(Parcialmente feito, preciso melhorar a lógica)<
4-LDR
5-Módulo NRF24L01+ ou HC-05 Bluetooth
*6-Emissor IR para controlar alguns equipamentos no ambiente
*7-Sensor LM35/LM335 ou DHT11 (o que for mais fácil de implementar e mais seguro nas leituras)
*8-Sensor PIR
*9-Relé de estado solido ou Triac p/ acionar cargas de até 10A >(Feito)<
*10-4 saidas p/ Triac utilizando em fita LED RGB + Fita LED cor branca

*Nem tudo será implementado, mas se couber na programação do ATMEGA328 crio um modulo genérico com todas as opções, dae apenas uma pci a ser fabricada.

Re: Comunicação entre dispositivos

MensagemEnviado: 29 Jun 2014 09:17
por tcpipchip
Eu tenho observado muitas pessoas partindo para isto...

Re: Comunicação entre dispositivos

MensagemEnviado: 29 Jun 2014 17:52
por Maffeis
Não sei até onde o zigbee é caro

A NXP tem o modulo com o JN5168 está 14 dólares

vc pensar em um XBee que deve ta mais de 100 reais eu acho caro

Agora esse JN5168 não está muito caro naum

Até onde eu entendi ele vem com a parte da antena e do protocolo mastigado, e vc tem um uc com 256K de flash uns 20 pinos com timer pwm a/d i/o SPI uart....

Será q ele funciona msm?

Re: Comunicação entre dispositivos

MensagemEnviado: 02 Jul 2014 19:48
por Rodrigo Lange
Meio difícil de achar esses módulos.
Bom já negociei com um China os NRF24 por $0,60 dae vou usar eles mesmos.
Uma duvida de lógica básica: (olha que quebrei a cabeça e nenhuma alternativa funcionou adequadamente)
Como faço pra quando pressionar o "botao_UP" por mais de 500ms a variável "conta" receba o valor "9" por exemplo??? Mesma coisa pro botão Down receber "0". ?
O programa abaixo está funciona perfeitamente bem. No outro programa o PWM é mais complexo. O acionamento é para cargas AC com detecção de passagem por zero e controlando os ângulos de disparo do Triac.
Editei/cortei algumas coisas pra deixar apenas o que interessa, que é no caso a rotina de incremento/decremento da variável "conta".

cpp code
/*
Este Sketch realiza um contador de 0 - 9 - 0
utilizando um display 7 seguimentos juntamente com o CI HCF4511 e mais
2 botões para incremento/decremento
*/


const int a = 4; //define contador binário // a-1, b-2, c-4, d-8 do HCF4511
const int b = 5;
const int c = 6;
const int d = 7;
const int botao_UP = 3; //botão Up conectado ao pino 9
const int botao_DW = 2; //botão Down conectado ao pino 10
const int saida = 11; //define o pino 11 como saída PWM
const int debounce_time = 10;

int conta = 5; //estado inicial da variável "conta" que será mostrado no display
int estado_botao_UP; //variável de leitura estado do botão
int estado_anterior_botao_UP; //variável de leitura estado anterior do botão
int estado_botao_DW; //variável de leitura estado do botão
int estado_anterior_botao_DW; //variável de leitura estado anterior do botão

boolean debounce(int pin) {
int contador = 0;
boolean estado; //guarda o estado do botão
boolean estado_anterior; //guarda o ultimo estado do botão

do {
estado = digitalRead(pin);
if(estado != estado_anterior) { // compara-se o estado atual com o anterior
contador = 0; // reinicia o contador
estado_anterior = estado;
}
else {
contador = contador + 1; // aumenta o contador em 1
}
delay(1);
} while(contador < debounce_time);

return estado;
}

void atualiza_numero() {
switch(conta) { // São atribuidos valores de 0 à 9 a variável
case 0: // De acordo com cada valor o mcu executa as instruções dentro do Switch Case
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(saida, LOW);
break; // Neste momento o programa finaliza as instruções, sem o Break iria executar as outras instruções.
case 1:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
analogWrite (saida, 5); //escrevemos um valor entre 0 - 255 na saída PWM sendo 0 para nenhum brilho e 255 para máximo brilho do LED
break;
case 2:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
analogWrite(saida, 18);
break;
case 3:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
analogWrite(saida, 45);
break;
case 4:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
analogWrite(saida, 80);
break;
case 5:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
analogWrite(saida, 110);
break;
case 6:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
analogWrite(saida, 140);
break;
case 7:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
analogWrite(saida, 175);
break;
case 8:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
analogWrite(saida, 215);
break;
case 9:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(saida, HIGH);
break;
}
}

void setup() {
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(botao_UP, INPUT); //declaramos os botões como entradas digitais
pinMode(botao_DW, INPUT);
pinMode(saida, OUTPUT); //declaramos o pino 11 como saída para o PWM
}

void loop(){
if(estado_botao_UP != estado_anterior_botao_UP){ //se houver mudança no estado // "!=" é o mesmo que "diferente"
if(debounce(botao_UP)) { //checa se está pressionado
conta++; //incrementa a contagem
if(conta > 9) {
conta = 9;
}
}
}
estado_anterior_botao_UP = estado_botao_UP; //guarda o estado do botão

estado_botao_DW = digitalRead(botao_DW); //lê o estado do botão
if(estado_botao_DW != estado_anterior_botao_DW){ //se houver mudança
if(debounce(botao_DW)) { //checa se está pressionado
conta--; //decrementa a contagem
if(conta < 0) {
conta = 0;
}
}
}
estado_anterior_botao_DW = estado_botao_DW;

atualiza_numero();
}

Re: Comunicação entre dispositivos

MensagemEnviado: 10 Jul 2014 04:26
por Rodrigo Lange
up!.......

Re: Comunicação entre dispositivos

MensagemEnviado: 10 Jul 2014 20:39
por andre_luis
Rodrigo Lange escreveu:Como faço pra quando pressionar o "botao_UP" por mais de 500ms a variável "conta" receba o valor "9" por exemplo??? Mesma coisa pro botão Down receber "0". ?


Acho que não entendi exatamente o que não tá funcionando.
Nesse caso não seria apenas implementar uma seleção por switch ou if-else ?

Tem um outro tópico abordando um assunto bastante parecido, onde o código sugerido implementa uma avaliação do tempo do botão pressionado. Dá uma olhada pra ver se aproveita alguma coisa...

Re: BOTAO COM MAIS DE UMA FUNÇÃO



+++

Re: Comunicação entre dispositivos

MensagemEnviado: 04 Ago 2014 23:48
por Rodrigo Lange
Então na vdd o que queria fazer e alterar o código de modo a conseguir o que mencionei no post.
Acho que estou preso a função de bouncing e o codigo não está muito flexível.
Do jeito que está funciona muito bem até pra outros botões porém ao segurar não consigo fazer a variável conta incrementar.

Re: Comunicação entre dispositivos

MensagemEnviado: 05 Ago 2014 18:44
por MOR_AL
Pelo que eu li e entendi, sua dúvida inicial era focada em um protocolo de comunicação entre um uC Mestre e diversos uC escravos.
Se você ainda tem essa dúvida, sugiro que primeiro tente estabelecer a comunicação entre um uC Mestre e apenas um uC escravo, até ter sucesso. Use a dica do André. Depois é que você deve entrar em detalhes, pois as suas novas dúvidas podem ser resolvidas posteriormente, já que não me parecem tão difíceis de se resolver.
MOR_AL