Sistema RF Master/Slaves[RESOLVIDO]

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.

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?

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?

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

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.

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.

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.

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.

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.

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?

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).

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ó.

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.

Tem uma solução mais simples:

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

Obrigado pela ajuda, solução encontrada.