Arduino com o RX/TX da Tato...

Olá pessoal, comprei um RX/TX da Tato e estou tendo problemas na comunicação.

Alguém poderia me ajudar com o código?

#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
#include <Stdio.h>

int val = 0;
int PreVal = 0;
int flag = 0;
int dado = 0;

SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);

void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
rfSerial.begin(9600);
Serial.begin(9600);
}

void loop()
{
if (flag == 0)
{
Serial.println("Arduino Pronto!");
flag = 1;
}
if (Serial.available() > 0)
{
dado = Serial.read();
Serial.print("Dado a ser transmitido: ");
Serial.println(dado);
}
if (dado == 49) // 49 == 1
{
val = dado;
if(val != PreVal)
{
Serial.print("Transmitir: ");
Serial.println(val);
rfSerial.print(val);
PreVal = val;
delay(100);
}
receptor();
}
if (dado == 50) // 50 == 2
{
val = dado;
if(val != PreVal)
{
Serial.print("Transmitir: ");
Serial.println(val);
rfSerial.print(val);
PreVal = val;
delay(100);
}
receptor();
}
}
void receptor()
{
val = rfSerial.read();
Serial.print("Receptor: ");
Serial.println(val);
delay(100);
}

Obrigado!

Amigo, q tipo de problema está tendo mais especificamente? Tens como passar mais detalhes? Que módulo está usando da Tato?? Tá flndo dos módulos de RF? A qts metros tá fazendo o teste??

Olá,

Os módulos que estou usando são estes...

http://www.tato.ind.br/files/TXMRXM.pdf

A distância está de 1 cm, pois estou testando eles na protoboard...

O programa que fiz, coleta um dado pelo teclado e manda para o TX, porém não consigo coletar o mesmo dado pelo RX...

Obrigado.

Erick , a faixa de frequencia de 433mhz possui uma infinidade de ruidos devido ao grande numero de dispositivos que a utilizam , tais como controle remoto de carro , portoes de garagem etc. O pdf que voce linkou não esclarece o tipo de codificação usada pelo componente. Se for OOK (On–off keying - Wikipedia) o tipo de codificação usada por estes componentes, ela tambem sofre grande influencia de ruidos , numa proxima vez sugiro usar do tipo FSK (Frequency-shift keying - Wikipedia) .

Faço as seguintes sugestões:
1 - comece a testar com velocidades mais baixas tipo 300 bps mandando um caracter só e va subindo a velocidade e o tamanho das mensagens conforme os resultados .
2 - repita a mesma mensagem 3 vezes
3 - use um protocolo simples para identificar no meio do ruido os dados que realmente estão vindo do seu transmissor , exemplo :
. um byte de sincronização AA em hexa;
. dois bytes de dados a serem transmitidos
. um byte de checksum simples com XOR ( ou exclusivo) dos dados transmitidos

No receptor voce fica escutando a porta serial até receber o byte de sincronização ; na hora que voce identifica-lo ; descarte-o e pegue os tres bytes seguinte , faça a conta do checksum com os dois bytes de dados , compare com o checksum recebido , se não estiver correto , descarte a mensagem ou melhore mais um pouco o software e informe ao transmissor que ele precisa retransmitir a mensagem.

Esses modulos são baratos e faceis de ligar mas em contrapartida e' necessário ter um software bem elaborado . Eles são muito sensiveis a ruido e a problemas de sincronização quando voce manda bytes com uma sequencia assimetrica de zeros e uns e então o receptor não recebe nada ou recebe lixo. Ai para resolver isso , voce vai ter que usar uma codificação para os dados conhecida como Manchester ( Manchester code - Wikipedia) que equilibra a quantidade de uns e zeros em cada caracter.
É uma grande alegria quando funciona. Divirta-se !!!!

Boa noite, Erick.

Eu e o Rafael já tivemos esse problema em um dos nosso projetos, realmente o problema é o formato dos dados que você deve usar com esses rádios.

Com o protocolo serial você dificilmente vai conseguir fazer eles conversarem, recomendo que você use a lib VirtualWire (http://www.open.com.au/mikem/arduino/VirtualWire.pdf, http://www.open.com.au/mikem/arduino/VirtualWire-1.1.zip), que implementa o procolo Manchester, o correto para uso com esse tipo de rádio.

Uma dica: não deixe o conjunto TX/RX tão próximo, pois pode haver sobremodulação no receptor, o que impossibilita a comunicação, mesmo usando o protocolo correto.

Detalhe... essa lib já implementa as sugestões que o Jeronimo indicou (header/sincronização e verificação de integridade por checksum).

Essa biblioteca é uma boa dica, Celso . Acho que ela resolve o problema de hobbistas e controles remotos com mensagens curtas com um link de baixo custo. Ha alguns anos atrás montei um prototipo de um coletor de dados wireless e usei estes chips ligados a um atmega88. Tive que implementar uma serie de controles em software para que funcionassem minimamente para demonstrar o conceito. Mesmo assim não deu para usar no projeto final , já que o cliente queria mais de um coletor conversando na mesma rede e acabei usando um transceiver da Radiometrix ( muito mais caro $$$) que deu conta do recado. Hoje em dia eu experimentaria os transceivers ZigBee Maxstream para resolver o mesmo problema

Olá Jeronimo,
E olha que o Site e o Pdf da Tato dizia que era super simples e fácil a comunicação!!!
Pelo visto é muito mais complicado do que eu imaginava!!!
Obrigado pelas dicas...

Olá Celso,
Eu baixei, estudei, instalei a biblioteca, porém ainda não rolou...
Precisei adicionar outra biblioteca para compilar o programa no Arduino e ainda estou em dúvidas quanto á configuração dos Pinos do Tx/Rx, e do motivo que não funcionou!!!
A distância entre os módulos ainda está pequena, cerca de 25cm, mas é a maior distância que consegui com a minha Protoboard...
Estou á espera de outro Arduino, que está atrasado em uma semana já...
Assim que chegar terei melhores condições de realizar o teste!!!
Obrigado pelas dicas...

Celso , qual foi a maior distancia que conseguiu comunicação entre transmissor e receptor usando esta biblioteca ? Qual a maior velocidade que voce conseguiu transmitir ?

Ops...
Talvez não tenha ficado claro uma coisa que escrevi...
O meu Rx está a 25 cm do Tx, não pq ele só consegue se comunicar a esta distância, mas sim, pq só tenho uma Protoboard... E essa é a distância máxima que consegui deixá-los... E acredito que essa pequena distância entre os dois está interferindo...
Abraços.

Eric,
Da primeira vez que usei passei pela mesma situação, li o exemplo da Tato , testei e só chegava lixo do outro lado, vasculhei a internet,consultei os amigos e no final cheguei a um programa em C que funcionava de forma estavel. Verifiquei que aconteciam muitos pedidos de retransmissao que para comunicação ponto a ponto dava até para aceitar mas não quis arriscar com mais terminais em comunicação multiponto.

Pessoal, não esqueçam de colocar uma antena (pode ser um pedaço de fio maciço) de mais ou menos 17cm.

No nosso projeto, conseguimos alcanças uma distância de 35m sem barreiras, usando módulos da Telecontrolli.

Rx: TeleControlLi.com is for sale | HugeDomains
Tx: TeleControlLi.com is for sale | HugeDomains

Mas a lógica é a mesma, referindo-se a lib e tal.

Nós estávamos mandando msgs de mais ou menos 10 bytes...

Flw

Erick, recomendo não usar os pinos RX/TX (0/1) do Arduino, pois um trem de pulsos chegando na serial pode disparar interrupções indesejadas.

Outra coisa, não precisa incluir a biblioteca software serial, e olhando rapidamente seu código, nem a stdio. A própria VirtualWire faz as devidas "configurações" dos pinos.

Se continuar tendo problemas, manda o seu novo código que a gente dá uma olhada.

Uma coisa que achei estranha... Você está tentando comunicar os 2 módulos com 1 só Arduino? Com certeza isso não vai funcionar, pois enquanto você estiver transmitindo, não poderá receber nada... Apenas a serial "de verdade" (pinos 0/1) consegue receber dados enquanto o processador estiver fazendo outra coisa, pois é um módulo assíncrono independente no hardware, com seu próprio buffer...

Olá Jeronimo,
Pois é, no meu caso, eu não posso me dar ao luxo do Receptor sofrer alguma interferencia, visto que irei usá-lo em uma situação "crítica"...

Abraços...

Olá Rafael,

Estes em questão já vem com antena!

Abraços.

Olá Celso,

É isso mesmo, vc matou a charada, ou melhor, o motivo do erro...

Eu estou usando apenas um Arduino, tanto para enviar, como para receber, achei que a mensagem ficava armazenada no Buffer e dava conta do recado!!!

Quanto aos Pinos 0 e 1, eu não estou os usando...

Agora é esperar o meu outro Arduino chegar e realmente testar os dois separados...

Abraços...