Arduino + RFID question Rx Tx

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

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

Ok, n'importe quel pin peut faire office de softserial?

Bon j'ai réussi !

#include <SoftwareSerial.h>



#define rxPin 3
#define txPin 4
int pin = 2;
volatile int state = LOW;



int cts = 7;
int Recoi = 0;
// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);


void setup(){

  pinMode(rxPin, INPUT);
  pinMode(9, OUTPUT); 
  pinMode(txPin, OUTPUT);
  pinMode(cts, INPUT);
  pinMode(pin, INPUT);
  attachInterrupt(0, CTS, LOW);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(20);
}

void loop(){
 
   
}
void CTS(){ 
delay(10);
mySerial.print(char('v'));
mySerial.print(byte('v'));
Recoi = mySerial.read();
Serial.println(Recoi,BIN);
}

Je le referais proprement avec un flag et tout plus tard, par contre as tu compris en lisant la doc comment envoyer les arguments de la commande? Car personnellement je n'ai rien trouver à ce sujet! :cry:

Merci pour votre aide en tout cas!

Merci pour votre aide en tout cas!

de rien...

comment envoyer les arguments de la commande?

D'après la doc, il semble que tu dois simplement envoyer les arguments à la suite de la commande:

mySerial.print(0x76); // la commande "v"
mySerial.print(0x2); // argument 1= 00000010 (par exemple)

Gromain

Oui c'est ce que j'ai fait mais cela ne semble pas fonctionner.
Normalement je peut aussi envoyer les deux d'un coup étant donné que les deux font 8 bit et par conséquent arrive l'un après l'autre.
Bon et bien je m'y remet :slight_smile: