Sur le papier, c'est plutôt simple à utiliser, via port série 2400 bauds
En utilisant ce code et les branchements suivants tout va bien:
VCC -> 5V
GND -> GND
Enable -> D2
SOUT -> RX0 (D0)
int val = 0;
char code[10];
int bytesread = 0;
void setup()
{
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
Serial.begin(2400);
// Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin
pinMode(2,OUTPUT);
// Activate the RFID reader
digitalWrite(2, LOW);
}
void loop()
{
if(Serial.available() > 0)
{
// if data available from reader
// check for header
if((val = Serial.read()) == 10)
{
bytesread = 0;
// read 10 digit code
while(bytesread<10) {
if( Serial.available() > 0)
{
val = Serial.read();
// if header or stop bytes before the 10 digit reading
if((val == 10)||(val == 13))
{
// stop reading
break;
}
// add the digit
code[bytesread] = val;
// ready to read next digit
bytesread++;
}
}
// if 10 digit read is complete
if(bytesread == 10)
{
// possibly a good TAG
Serial.print("TAG: ");
// print the TAG code
Serial.println(code);
}
bytesread = 0;
// deactivate the RFID reader for a moment so it will not flood
digitalWrite(2, HIGH);
// wait for a bit
delay(1500);
// Activate the RFID reader
digitalWrite(2, LOW);
}
}
}
Puis je me suis dit "super je vais pouvoir utiliser un autre port série de mon arduino mega et afficher ce que je récupère sur le port série principal.
Dans un premier temps j'ai donc remplacé Serial par Serial1, et j'ai branché le SOUT sur RX1 (19).
J'ai ajouté un Serial.begin(9600) dans mon setup pour afficher le TagCode.
Verdict, si j'affiche des test sur Serial ça passe, mais visiblement je ne lis rien via Serial1.
J'en déduis que je dois me planter quelque part mais où !?
L'idée ici c'est de comprendre ce qui cloche, car je pourrais me contenter de mon exemple ci-dessus mais à quoi bon...
int val = 0;
char code[10];
int bytesread = 0;
void setup()
{
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
Serial1.begin(2400);
// Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin
pinMode(2,OUTPUT);
// Activate the RFID reader
digitalWrite(2, LOW);
Serial.begin(9600);
}
void loop()
{
if(Serial1.available() > 0)
{
// if data available from reader
// check for header
if((val = Serial1.read()) == 10)
{
bytesread = 0;
// read 10 digit code
while(bytesread<10) {
if( Serial1.available() > 0)
{
val = Serial1.read();
// if header or stop bytes before the 10 digit reading
if((val == 10)||(val == 13))
{
// stop reading
break;
}
// add the digit
code[bytesread] = val;
// ready to read next digit
bytesread++;
}
}
// if 10 digit read is complete
if(bytesread == 10)
{
// possibly a good TAG
Serial.print("TAG: ");
// print the TAG code
Serial.println(code);
}
bytesread = 0;
// deactivate the RFID reader for a moment so it will not flood
digitalWrite(2, HIGH);
// wait for a bit
delay(1500);
// Activate the RFID reader
digitalWrite(2, LOW);
}
}
}
Ce qui ne marche pas = malgrés les Serial.print, rien ne s'affiche, j'ai donc l'impression que mon lecteur ne lit rien en fait.
En effet, mais alors que penser de la source de cet exemple ?
A la limite c'est surtout l'exemple 1 que j'aimerais comprendre, car j'imagine que c'est que je ne maitrise pas l'utilisation des différents port Serial du mega.
Merci
L'exemple 2 dans sa simplicité te permet de vérifier que tu reçois bien quelque chose de ton lecteur.
Dans l'exemple 1 tu n'affiches quelque chose que si tu trouves l'entête. Si cette entête n'arrive pas tu n'as aucun retour d'information.
Bonjour et merci pour ta réponse fdufnews.
Laissons l'exemple 2 de côté et concentrons nous sur l'exemple 1.
J'ai du mal m'exprimer.
Je sais ce que fait cet exemple puisque j'arrive à l'utiliser en utilisant Serial et en branchant comme suit :
VCC -> 5V
GND -> GND
Enable -> D2
SOUT -> RX0 (pin 0 arduino mega)
int val = 0;
char code[10];
int bytesread = 0;
void setup()
{
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
Serial.begin(2400);
// Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin
pinMode(2,OUTPUT);
// Activate the RFID reader
digitalWrite(2, LOW);
}
void loop()
{
if(Serial.available() > 0)
{
Serial.println("test");
// if data available from reader
// check for header
if((val = Serial.read()) == 10)
{
bytesread = 0;
// read 10 digit code
while(bytesread<10) {
if( Serial.available() > 0)
{
val = Serial.read();
// if header or stop bytes before the 10 digit reading
if((val == 10)||(val == 13))
{
// stop reading
break;
}
// add the digit
code[bytesread] = val;
// ready to read next digit
bytesread++;
}
}
// if 10 digit read is complete
if(bytesread == 10)
{
// possibly a good TAG
Serial.print("TAG: ");
// print the TAG code
Serial.println(code);
}
bytesread = 0;
// deactivate the RFID reader for a moment so it will not flood
digitalWrite(2, HIGH);
// wait for a bit
delay(1500);
// Activate the RFID reader
digitalWrite(2, LOW);
}
}
}
J'utilise donc le port Serial principal (le même que le câble USB) pour le debug console et mon lecteur rfid (en utilisant 2400 bauds).
Ceci fonctionnant, j'ai souhaité utilisé un port Serial différent pour le lecteur rfid = voir exemple 1 posté précédemment.
La seule différence c'est que je branche maintenant SOUT sur Rx1 et que j'utilise Serial1 d'une part pour le lecteur rfid et Serial (sur 9600 bauds cette fois) pour le câble usb et le debug console.
Et donc je ne comprends pas pourquoi je n'affiche rien sur Serial.
Enfin si à priori vu mon code si je n'affiche rien c'est que rien n'a été lu par le lecteur.
dzean:
Exemple 3 : idem exemple 2 mais avec RX1 et en utilisant Serial1.begin(9600).
Dans cet exemple tu devrais mettre 2400 et pas 9600 puisque ton lecteur RFID à l'air de fonctionner à 2400 bauds.
Dans ma réponse précédente, je voulais dire exemple 3 pas exemple 2. Cet exemple permet de vérifier que la liaison série est fonctionnelle sans ajouter autour de code qui risque de faire planter pour une quelconque raison. Tant que ce bout de code ne fonctionne pas il est inutile d'aller plus avant.
Par contre, il serait préférable de faire dans loop()
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
J'ai donc essayé en utilisant RX=A9 et ça a fonctionné.
Ensuite j'ai utilisé le pin 14 en remplacement du 2 et ça fonctionne aussi.
En revanche en utilisant RX=15 ça ne fonctionne pas étrange
L'idée de départ c'est que j'utilise un shield Ethernet et je voulais éviter d'utiliser les pin 2 à 13 (même si à priori le SPI est utilise plutôt 50 51 52 dans mon cas.
J'utilise la librairie freertos.h (multitâche), et il semble que cette dernière engendre une incompatibilité avec la librairie SoftwareSerial.h
D'après mes recherches cela a un rapport avec la gestion des interruptions par freertos
Pas trouvé de solution dans l'immédiat pour ce cas malheureusement
Note : dans un autre contexte j'ai également rencontré un pb en utilisant un objet String et en utilisant la concaténation +=
Ici encore, en supprimant la librairie freertos le pb disparait
Là par contre je vois moins le rapport avec freertos pour le moment