Go Down

Topic: Arduino + RFID question Rx Tx (Read 3729 times) previous topic - next topic

ak37

J'ai comme projet (iut) de développer une gestion d'identification par RFID.

J'ai donc choisi une  Duemilanove pour mon prototypage.
Ce matin j'ai reçu mon module RFID . J'ai brancher comme dans le DataSheet:

Carte      Module
Rx             Tx
Tx              Rx

Mais impossible de transférer le programme, cela ne fonctionne quand je branche les deux Rx ensemble et les deux Tx ensemble.

De plus j'utilise Serial.write et Serial.read pour communiquer avec le module mais quand je lui passe une commande rien ne ce passe.

ak37

Voici la doc http://www.ibtechnology.co.uk/products/quaditag.htm

fdufnews

Quote
Mais impossible de transférer le programme

Tu veux dire que tu n'arrives pas à charger le sketch dans la carte Arduino?
Si c'est ton problème, c'est possible car ton module RFID se trouve en conflit avec la liaison série de téléchargement. Pour charger ton sketch, il faudrait débrancher ton module RFID. Si tu dois faire cela souvent, tu aurais intérêt à prévoir un commutateur qui isolerait l'arduino de ton module RFID le temps du téléchargement.

ak37

Oui c'est mon problème, mais alors comment faire envoyer des commandes au module avec le pc en passant par la carte?

Tu peux utiliser la library serial software (http://arduino.cc/en/Reference/SoftwareSerial) pour communiquer avec le module RFID.
Cela te permet de créer des liaisons séries supplémentaires et de libérer la liaison série hardware pour la com avec le PC.

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

ak37

Ok, merci, je vais me pencher la dessus!

ak37

Code: [Select]
#include <SoftwareSerial.h>



#define rxPin 2

#define txPin 3
int Envoie = 0;
int Recoi = 0;
// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);


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

void loop(){
  if(Serial.available() > 0){ //attend un caractère du PC
   
     Envoie= Serial.read();
     mySerial.print(Envoie); //envoie du caractère sur le port Tx
     
  }
  Recoi = mySerial.read(); //attend un caractère disponible sur Rx
  Serial.println(Recoi); //envoie du caractère au PC
  delay(10);
}
 


Quelqu'un remarque un problème la dessus? Je veux simplement envoyer une commande au RFID et afficher ça réponse.
 

fdufnews

Code: [Select]
Recoi = mySerial.read(); //attend un caractère disponible sur Rx

Il faudrait peut être faire un test pour voir s'il y a quelque chose à lire avant de faire un read

ak37

#8
Mar 02, 2010, 08:33 pm Last Edit: Mar 02, 2010, 08:34 pm by ak37 Reason: 1
Quote
Description

Reads a character from the receive pin of the software serial port. This function waits for a character to arrive, reads it, and returns the character read. Data that arrives at other times is lost.


Je croyais que la fonction attendais un caractère avant de la lire et d'envoyer. J'ai essayé avec un test et cela ne change rien  :-/

oui, avec la lib soft serial il faut lire en permanence, au risque de louper des caractères.
Sur des tests d'envoie de chaine de caracteres depuis le pc (console arduino) vers l'arduino, j'avais constaté qu'il fallait que je rajoute systèmatiquement un <espace> en 1er pour que le message soit complet.

D'après la doc de ton module, il faut envoyer "W" pour déclencher une lecture. As-tu testé en envoyant en "dur" ce caractère au lieu de passer par la console pour éliminer un pb de liaison console?
Code: [Select]

mySerial.print("W"); //envoie du caractère sur le port Tx


Code: [Select]
int Envoie = 0;
int Recoi = 0;


le type "char" ne serait pas plus adapté ?

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

ak37

#10
Mar 02, 2010, 10:45 pm Last Edit: Mar 02, 2010, 10:46 pm by ak37 Reason: 1
Je vais essayé l'espace. Pour le type des variables tu as raison le type correct serai char (mais int marche normalement , je doit dire que j'ai programmer ça un peu vite), d'ailleurs je l'ai utiliser pour envoyer un caractère en "dur", 'z' pour voir la version du firmware, mais je ne parvient pas à avoir une réponse. Je vais réessayé

Merci!

#11
Mar 03, 2010, 07:50 am Last Edit: Mar 03, 2010, 07:51 am by Gromain59 Reason: 1
tu n'as pas plus de doc que ce qui dans le lien que tu nous as fournis ? c'est un peu léger.
A quoi servent les leds verte et rouge ?

edit: il y a une doc plus complète ici: http://www.ibtechnology.co.uk/PDF/RWD_QT.PDF
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

ak37

Oui oui j'ai bien sur le datasheet du module (celui de idtechnology) et les led m'indique que le fonctionnement est normal (led rouge non clignotante au repos) et led verte quand un tag RFID est présent proche de l'antenne.
Toujours pas réussie a avoir une réponse, même avec un caractère en dur, j'ai même essayé d'utiliser un terminal série en programmant juste les softserial dans l'arduino et rien non plus.

Quote
The serial communication system and protocol allows for a 10ms 'window' every Tag polling
cycle indicated by the BUSY line being low. During this 'window' the host must assert the
first start bit and start transmitting data. The BUSY goes high again 10ms after the last stop
bit is received. NOTE that only one command sequence is handled at a time.


ce que je comprends, c'est que tu dois envoyer la commande pendant les 10ms où le signal CTS=0, sinon le module l'ignore car il est occupé à autre chose. Donc tu dois connecter l'info CTS à une entrée de l'arduino.
Je pense que le problème vient de là.

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

ak37

Ok, j'avais brancher le CTS à la masse pour qu'il soit toujours en à l'écoute...
Donc il faut que je déclenche l'envoie de commande quand CTS=0 et la réception quand CTS=1 si je comprend bien.

Merci pour ton aide en tout cas  :)

Go Up