Problema ao usar portas seriais (TX e RX)

Boa noite,

Comprei um módulo RFID modelo RDM630 para meu Arduino Leonardo. Escrevi um código que esperava uma entrada serial gerada pelo RDM630. Entretanto, passava o cartao na antena, o led de leitura do módulo acusava leitura, mas nada do led RX do arduino informar a entrada recebida, e muito menos o meu código funcionar (e imprimir serial monitor meus dados).

Para verificar que havia dados sendo enviados, liguei um led na saída TX do módulo (ativa baixa), e o led que ficava sempre ligado, oscilava quando eu passava o cartao, o que imagino ser o envio de dados.

Testei códigos de outras pessoas, que utilizavam Portas seriais virtuais, com outros pinos digitais (e.g. 6 e 7), porém nada de funcionar novamente...

O problema acredito estar no nao recebimento desses dados, já que o envio eu testei e funciona (é o que parece).

Alguem já passou por algo parecido, ou sabe o que pode estar se passando?

Obrigado desde já!

Entao e o codigo?

É preciso ter em atenção que por vezes os LEDs de TX e RX estão "ligados" à entrada e saída USB. Ou seja, se ligares algo ao TX e RX do micro, os LEDs não são activados. Isto depende da placa, creio... mas já me chamaram à atenção para isso.

Lembre-se também que o RX de um tem que estar ligado ao TX de outro, e vice-versa.

Outra coisa:
Se você não estiver usando Arduino baseado no 328 ou 168, estes possuem apenas uma porta serial, e se você estiver usando o software serial para se comunicar com o computador (via USB), esta porta não pode ser usada para mais nada.

o código é simples:

void setup(){
  Serial.begin(9600);
}

void loop(){
  int a = Serial.read();
  Serial.println(a);
  delay(500);
}

Estou ligando o TX no RX e RX no TX sim, e acredito que meu arduino tenha somente uma entrada serial sim... Sendo assim, como que faria para ler o resultado do meu módulo, já que além de alimentar através do USB, imprimo caracteres no monitor serial?

Fiz uns testes e cheguei a conclusão que a porta serial está sendo usada na comunicaçao com o PC, pois se insiro algum dado no Serial monitor, ele acusa a entrada e imprime o que eu tinha enviado... O que devo fazer para testar se meu módulo está realmente funcionando? A aplicação final desse projeto nao terá comunicaçao com o PC e também nao será alimentada por ele!

Você tem como alimentar seu arduino sem ser pela USB ?
Você tem algum display de LCD ou alguns leds para te ajudarem na depuração do seu programa?

Se sim, faça o seguinte:
altere seu sketch para enviar as mensagens para o display ou acenda e apague alguns leds. Transfira seu sketch para o Arduino pela USB, desconecte-o, plug na energia externa pronto. sua porta serial do arduino não será mais "atrapalhada" pelo USB.

Outra alternativa é transferir e alimentar o Arduino por algum programador ISCP (como o USBasp), pois aí a porta serial não será usada e seus pinos RX/TX ficarão livres.

E o esquema do módulo?

Tens aí um manual ou esquema de ligação?

Esse código não comunica com o módulo, como já percebeste... o ideal será ver como funciona o módulo (e se está num shield) para ver como comunicar com ele.

Hoje liguei meu módulo ao osciloscópio para verificar se ele enviava saída. Identifiquei que sim. E tenho um display lcd, e vou usá-lo para o debug... Entretanto, nao sei se tenho como alimentar o arduino de outra forma que nao seja o usb... Nao dá para ser via usb, mas ligado a um carregador para celular de 5V?
Já que estamos tratando desse assunto, como funciona a alimentacao do arduino de um modo que nao seja o usb? Eu sei que tem o plug para fonte, mas que faixa de tensao posso aplicar (e a tensao mais correta) e qual a polaridade dos pinos (centro e borda)? Esse outro método q ISCP, como funciona?

Obrigado!!!!

Há algo que me irrita solenemente... perguntar algo e não ser respondido. Já tens o módulo a funcionar?

Acerca da power supply:

http://www.arduino.cc/playground/Learning/WhatAdapter

Onde diz:

The long answer is that an off-the shelf Arduino adapter:

  • must be a DC adapter (i.e. it has to put out DC, not AC);
  • should be between 9V and 12V DC (see note below);
  • must be rated for a minimum of 250mA current output, although you will likely want something more like 500mA or 1A output, as it gives you the current necessary to power a servo or twenty LEDs if you want to.
  • must have a 2.1mm power plug on the Arduino end, and
  • the plug must be "centre positive", that is, the middle pin of the plug has to be the + connection.

O ICSP é um método para gravar os programas no Arduino. Agora usas algo chamado bootloader, para usar o método de ICSP, tens de arranjar outro Arduino ou comprar um gravador dedicado como estes:

http://www.atmel.com/tools/AVRISPMKII.aspx o original... custa cerca de 36 euro.

Ou algo assim:

http://www.ebay.co.uk/itm/USBASP-USBISP-AVR-Programmer-USB-ATMEGA8-ATMEGA128-New-/320955542418?pt=UK_Computing_Other_Computing_Networking&hash=item4aba70eb92

No entanto, se não sabes muito, deixa-te ficar pelo bootloader. É mais simples, barato e não arriscas estragar o chip.

Babulindo,
Nao respondi diretamente a suas perguntas sobre o esquema do módulo pois achei que com o meu ultimo post estaria esclarecendo que nao acredito que o problema seja com o módulo ou com sua ligaçao, tanto que medi a saída com o osciloscópio (acredito as ligaçoes estao corretas). Mas se voce quiser, te passo as especificações: o módulo é um RDM630.
Vou tentar alimentar o Arduino com uma fonte regulável que eu consegui, e mais tarde eu posto aqui quais foram meus resultados, usando alimentaçao externa e lcd!
Me desculpe se o irritei, mas passei rapidamente ontem no fórum e só tive tempo para dar uma resposta rápida.

Abraços

E o módilo vem num shield ou estás a fazer as ligações em breadboard?

Entao... nao sei especificar bem se é ou nao um shield. O que eu comprei se parece com um shield, mas nao encaixa no Arduino como a maioria dos shields. Ele é bem menor, mas contém todo o circuito necessário para ler e identificar e enviar a saída certa. Eu uso um breadboard para colocar esse "shield" e ligo ele ao Arduino por meio de jumpers.

(obs: a imagem mostra o modelo antigo. O modelo novo tem a mesma pinagem e formato, só o circuito em si que é diferente)

Em outro blog, fiz a mesma pergunta e me disseram q a UART (porta serial TX e RX) era class 1 definida para usb e comunicação com o computador. Nao entendi o que isso significa, e pedi maiores explicaçoes, mas acredito que tenha haver com isso mesmo.

Minha hipótese é que a UART está dedicada para a comunicaçao com o pc, mesmo quando eu ligo o Arduino usando uma fonte externa, LCD para debug, e com o usb desconectado. Estou tentando entender como criar uma Software Serial, que seria uma UART emulada, mas devido ao novo modelo de programaçao (IDE 1.0 ou mais) estou bem confuso de como faço isso, e nao tive muito tempo de estudar isso a fundo ainda.

Espero o problema seja simples de ser resolvido!

Galera, resolvi o problema!

No Arduino Leonardo, a UART nao é utilizada quando estamos nos comunicando com o PC, pois o processador do leonardo é USB built in. Assim, temos a UART livre, mesmo quando usamos funçoes de impressao e leitura do serial monitor.

Entretando, para usar a UART para receber/enviar dados via pinos TX e RX, devemos referenciar a comunicaçao serial como Serial1.

Desse modo, inicializamos a comunicaçao com o módulo através de Serial1.begin e usamos Serial1.read para ler os enviados pelo módulo.
Graças a esse nao uso da UART na comunicaçao Arduino-PC, podemos inclusive receber dasdos do módulo de forma serial e imprimir no serial monitor!!

Obrigado a todos pela ajuda e disponibilidade, e espero que ese tópico ajude muitos com a mesma dúvida!

Cara, eu estou com o mesmo problema. Comprei um módulo RFID (MFRC522 - Serial UART) e não consigo ler as tags RFID. Não consigo fazer com que o a variável mySeria fique "available". Eu acho que eu estou com o mesmo problema que o Sofiz. Gostaria de saber como é essa solução, pois não entendi direito. Se possível poderia mostrar o código de como ficou?

valeu!

Entendi... pra quem está com o mesmo problema com o esse módulo RFID, fica aqui o código e a solução.

Módulo RFID

Pin RX(Módulo RFID) - PIN 18(TX1)
Pin TX(Módulo RFID) - PIN 19(DX1)

Código:

void setup()

{
Serial.begin(2400);

Serial.println("Waiting for Card\n");
Serial1.begin(9600);

Serial1.write(0x02); //Send the command to RFID, please refer to RFID manual
}

void loop() // run over and over

{
while(Serial1.available())
{
Serial.print(Serial1.read(),HEX); //Display the Serial Number in HEX
}
}

Espero ter ajudado.