Arduino + RFID question Rx Tx

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.

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

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.

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

Ok, merci, je vais me pencher la dessus!

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

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

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 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?

mySerial.print("W"); //envoie du caractère sur le port Tx
int Envoie = 0;
int Recoi = 0;

le type “char” ne serait pas plus adapté ?

Gromain

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!

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

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.

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

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

c'est comme ça que je le comprend en tout cas.

Le lien que tu avais donné en début indique

9600 baud, 8 data bits, no parity, 1 stop bit protocol with CTS handshake

Donc CTS est bien utile

Eu par contre mon CTS ne passe jamais à zerro.... :-/

Ou alors la carte n'est pas assez rapide pour le voir, car quand je banche une led au cts la led clignote bien, donc il y a bien un changement d'état.

dans ce cas, il faut utiliser une interruption externe:

Connecte CTS sur la pin 2, et initialise la fonction "attachInterrupt(0, "nom de la fonction à executer sur detection", RISING);" dans le setup() Ca executera la fonction d'envoie à chaque detection du passage à 0 de la pin 2.

voir ici: http://arduino.cc/en/Reference/AttachInterrupt