Comunicação entre dispositivos

Fórum sobre plataforma Arduino

Moderadores: andre_luis, 51, guest2003, Renie

Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 27 Jun 2014 05:53

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.
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor xultz » 27 Jun 2014 08:33

Eu não entendi qual é a tua dúvida.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 27 Jun 2014 16:10

É 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!
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor andre_luis » 27 Jun 2014 23:13

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 ?



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 28 Jun 2014 00:31

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.
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor andre_luis » 28 Jun 2014 07:03

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 )


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 28 Jun 2014 23:17

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.
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor tcpipchip » 29 Jun 2014 09:17

Eu tenho observado muitas pessoas partindo para isto...
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: Comunicação entre dispositivos

Mensagempor Maffeis » 29 Jun 2014 17:52

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?
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 02 Jul 2014 19:48

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();
}
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 10 Jul 2014 04:26

up!.......
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor andre_luis » 10 Jul 2014 20:39

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



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Comunicação entre dispositivos

Mensagempor Rodrigo Lange » 04 Ago 2014 23:48

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.
Rodrigo Lange
Bit
 
Mensagens: 7
Registrado em: 27 Jun 2014 04:26

Re: Comunicação entre dispositivos

Mensagempor MOR_AL » 05 Ago 2014 18:44

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ


Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x