Go Down

Topic: Sistema RF Master/Slaves[RESOLVIDO] (Read 7118 times) previous topic - next topic

vasr

Oct 11, 2013, 08:01 pm Last Edit: Oct 14, 2013, 11:59 pm by vasr Reason: 1
Estou a implementar um sistema por RF (radiofrequência), bidirecional utilizando um transmissor e um recetor no master e igualmente nos slaves.
Os slaves enviam falhas para o master ou mesmo atuam as entradas ou as saidas impostas pelo mesmo.
Neste sistema pode acontecer o envio de falhas simultaneamente pelos slaves ou mesmo no momento que o master estar a enviar uma atuação a um slave receber falhas, o que pode gerar problemas de comunicação.
Já pensei num sistema que os slaves apenas enviam falhas quando interrogados, resolvia o problema anterior mas no entanto criava outro ou mesmo retirava o objetivo principal do sistema, pois não recebia a informação em tempo real.
Que acham sobre?Qual a melhor forma de implemantar?
Desde já obrigado pela ajuda.

LegendBR

A comunicação é muito rápida. No caso de falha no envio da informação do slave, dá um tempo e tenta enviar de novo. Quais as chances de mais de um nó enviar um comando ao mesmo tempo?

vasr

Obrigado pela tua opinião.
Já pensei nisso, slave envia a falha e caso master não envie o sucesso do recebimento dessa informação reenviar de novo.
Também pensei no master fazer o varrimento aos diversos slaves a procura de erros e esperar um "Ok" ou falhas. No entanto o master não esta apenas a fazer varrimento de falhas, também pode dar uma ordem a um slave (exemplo: colocar uma saída no estado HIGHT).
Mais alguma opinião?

vasr

Alguém conhece algum mecanismo de comunicação RF master/slaves que permita gerir um sistema como o descrito?

valter_paladino

Sugiro que o slave, ao reconhecer um erro, envie uma mensagem curta "quero reportar". O master recebendo esta mensagem envia um comando de leitura para o slave e recebe o código de alarme(s).  Se o slave não recebe o comando de leitura após algum tempo, repete o processo. Se for o caso, o master envia um comando de acionamento e/ou reset do alarme.

vasr

Obrigado pela sugestão.
Colocar os slaves a enviarem mensagens ao master assim que tenham falhas, pode gerar falhas de comunicação. Por exemplo e se vários slaves enviam uma falha no mesmo instante?
Já pensei no que disse anteriormente, master faz o varrimento dos slaves interrogando-os se têm falhas mas tinha o problema de não efetuar nenhuma ordem que o master indica-se pela porta serie.

LegendBR


Obrigado pela sugestão.
Colocar os slaves a enviarem mensagens ao master assim que tenham falhas, pode gerar falhas de comunicação. Por exemplo e se vários slaves enviam uma falha no mesmo instante?
Já pensei no que disse anteriormente, master faz o varrimento dos slaves interrogando-os se têm falhas mas tinha o problema de não efetuar nenhuma ordem que o master indica-se pela porta serie.


Cara, na prática, acho pouco provável que vários slaves falhem ao mesmo tempo (a não ser em uma falta de energia, ou algo do tipo). Acho que as duas visões são válidas, pois a comunicação RF é bem rápida (o driver RF24 para módulos nRF24L01+ leva menos de 5 ms para enviar e receber uma resposta). No caso do slave comunicar assim que falhar, no caso de ele não conseguir se comunicar com o master, aguarda um tempo (pode até ser um tempo aleatório, para não ficar sempre em "concorrência" com outro slave que também esteja tentando se comunicar), e tenta enviar de novo, até conseguir.

Se optar por o master ficar sempre questionando, também é possível. Mas você tem que ver qual o tamanho da sua rede (quantos slaves) e qual a velocidade você precisa saber das informações pelo master.

vasr

     Na primeira hipótese, apesar de ser pouco provável existe o problema dos slaves enviarem no mesmo instante visto que terei inumeros slaves na minha rede.Quanto mais slaves tiver maior a probabilidade de isso acontecer. Tenho um segundo problema, como também através do master tenho a possivilidade de dar uma ordem( ex. atuar uma saída de um slave), pode ocorrer o caso de enviar uma ordem e estar a receber falhas o que vai dar origem a mais falhas de comunicação.
     Na segunda, apenas com o varrimento dos slaves é que reportam falhas.O problema é ao efetuar uma ordem já que esta é inserida via porta serie e não existem dois simultaneos loop´s o que originava perda de informação ao realizar uma ordem.

LegendBR

A ordem não é enviada por RF também não? O envio de falhas é por RF e do ordens é pela porta serial? Tem alguma coisa aí que não entendi, hehehe.

Quando você diz inúmeros, quer dizer o que? 100? 500? 1000? Inúmero é relativo, hehehe.

Estava testando agora o RF24Network, consigo comunicação relativamente rápida entre os nós (envio de comando e recebimento de resposta em menos de 20 ms), se usar somente a biblioteca RF24 é bem mais rápido, mas todos os slaves devem estar ao alcance do master.

Você pode fazer um protocolo que o master só manda uma mensagem para cada slave. Uma parte enviando o comando (NULL se não tiver comando) e outra parte questionando o status do slave (se teve falha). Aí o slave responde de acordo com o que foi questionado.

Outra coisa: qual a necessidade da comunicação ser totalmente sem falhas? Há algum problema em uma mensagem ser perdida de vez em quando?

vasr

Sim a ordem e varrimento é enviado via RF.
Posso ter até 99 slaves.
Estava a referir-me que o varrimento de falhas podia faze-lo utilizando por exemplo um ciclo for, enquanto uma ordem é através de um imput pela porta serie pelo utilizador. Nao tenho forma de fazer ambas em simultaneo, esperar pela ordem e fazer o varrimento dos slaves a procura de falhas visto que enquanto faz o varrimento estaria impossibilitado de receber a ordem via porta serie(Serial.read).



LegendBR

Quem recebe a ordem é o master? Você não terá problema não, as partes funcionam em paralelo. Você tem duas opções: ou criar um interrupt para quando receber dados pela porta serial (aí então você faz o tratamento) ou então em cada laço do for você verifica se tem algum dado novo na porta serial, antes de enviar o comando/questionamento para outro nó.

vasr

LegendBR a solução pode ser essa, obrigado pela ajuda.
Por interrupção nem sei se isso será possivel, sem falar que pode causar problemas acrescidos. Estou a implementar a segunda hipótese que disseste, depois dou o feedback.

LegendBR

Tem uma solução mais simples:

http://arduino.cc/en/Tutorial/SerialEvent

Resolve seu problema, se o loop para varrer todos os slaves não for muito demorado...

vasr

Obrigado pela ajuda, solução encontrada.

Go Up