RFID + Processing ?

Bonjour à tous :slight_smile:

Je suis sur un projet actuellement, dans lequel j’utilise un lecteur RFID.
J’aimerai simplement qu’à la lecture de la carte, l’identifiant capté renvoie un média (une image pour l’instant, admettons).

Voilà mon code actuel pour lire l’identifiant de ma carte :

#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.




void setup() {
  Serial.begin (9600);
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init(); // initialisation du module RFID
  Serial.print("Scanner la carte.");

}



void loop() {

 // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

 
      if(mfrc522.uid.uidByte[1] == 29){ 
        Serial.print("carte no. 1");
        delay(2000);
       
     }
    }

Je ne suis pas très calée avec tout ça, il me semble que je ne peux pas demander dans ce code là de faire apparaître des médias une fois la carte reconnue, si ?
(Sachant que je dois pouvoir afficher les médias sur l’écran de mon ordinateur, je dois le laisser branché, donc pas d’utilité de stocker ça sur un module SD… Si tant est que cette solution existe haha, j’extrapole sur un truc dont je ne suis même pas sûre).

Je ne sais pas trop vers où me diriger : on m’a évoqué d’utiliser la librairie SerialCallResponse pour lier mon code Arduino à un code Processing dans lequel j’appelle mes médias, et j’ai lu sur Internet des solutions en utilisant Firmata… Je n’ai pas trop compris ni l’une ni l’autre des solutions ;D

En tout cas, si vous pouvez m’en conseiller une je saurais déjà où approfondir mes recherches !
(À moins qu’il existe encore une autre possibilité !)

Merci ! :slight_smile:

bonsoir utiliser processing pour afficher une image X , Y ou Z en fonction d'une info envoyée par le serial arduino sur un port com du PC est un exercice relativement simple. voir là et

Génial, j’ai réussi ! (pourtant c’était pas gagné, haha, je suis vraiment novice !)

Merci beaucoup !

J’ai une seconde question.

Voici mon code Arduino :

#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.

int i = 0;



void setup() {
  Serial.begin (9600);
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init(); // initialisation du module RFID

}


void loop() {

 // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;


      if(mfrc522.uid.uidByte[1] == 29){ 
   
        Serial.println("Badge no. 1");
            
     }
     
    }

Et voici mon code Processing :

import processing.serial.*;

Serial myPort; 
String val;    
PImage img;

void setup() {
  String portName = Serial.list()[1]; 
  myPort = new Serial(this, portName, 9600); 
  size (displayWidth, displayHeight);
  img = loadImage("conniefrancis.jpg"); 
}


void draw()
{
  if ( myPort.available() > 0) 
  {  // If data is available,
    val = myPort.readStringUntil('\n'); 
    image(img, 0, 0); 
} 
 else {
   background(51);
 }

  println(val);
  
}

Le problème, c’est que quand je pose le badge sur le lecteur RFID, l’image clignote puisqu’elle est relue en boucle. J’aimerais que l’image s’affiche quand je pose le badge, mais reste dessus pendant une certaine durée…
J’ai essayé de mettre des delay(), une boucle while (i < 1) en incrémentant i de +1 lors de la première lecture du badge, mais ça ne marche pas très bien…
Le while me permet d’approcher de ce que je veux, mais une fois que l’incrémentation maximum est atteinte je ne peux plus du tout utiliser le badge (logique !), alors que j’aimerai pouvoir le réutiliser un moment après.

En fait j’aimerai juste éviter le clignotement en affichant mon image une seule fois assez longtemps, sans pour autant m’empêcher de réutiliser le badge après un certain temps.

Une astuce ?

Georgeslechien: J'ai une seconde question. ... En fait j'aimerai juste éviter le clignotement en affichant mon image une seule fois assez longtemps, sans pour autant m'empêcher de réutiliser le badge après un certain temps.

Une astuce ?

bonjour mettre un delay() juste derrière l'affichage de ton image dans ton code processing ? ce n'est surement pas la methode la plus efficace , mais si ça te suffit ... 8)

Je vais essayer ça, je verrais ce que ça donne !

Encore merci ! :)

A priori ça devrait pouvoir convenir, il faut que je fasse encore quelques tests :)

Par contre, j'ai encore un petit souci :confused: J'appelle l'ensemble de mes images (pour l'instant 2) dans un tableau, mais je ne vois pas trop comment appeler l'une ou l'autre depuis mon code Processing...

J'ai donc ajouté

PImage photos[];

au début de mon code, puis

photos = new PImage[2];
  photos[0] = loadImage("kennebec.jpg");
  photos[1] = loadImage("conniefrancis.jpg");

dans mon setup.

Dans mon draw, ça se présente donc comme suit :

void draw()
{
  if ( myPort.available() > 0) 
  {  
    val = myPort.readStringUntil('\n');        
    image(photos[0], 0, 0);
  } 
  
  else {
    background(51);
  }

  println(val);
}

En l'état, l'image s'affiche bien mais c'est la même quel que soit le badge utilisé. Je trouve ça logique, si je comprends bien le code agit de cette façon : "Quand je reçois des données depuis le Serial, je le lis et le stock dans la valeur "val", et j'affiche l'image 0", donc mon image ne spécifie pas à quelle clé elle s'applique.

Cependant je ne vois pas comment, textuellement, mettre une condition du type : "si val = "badge 1", j'affiche l'image 1, si val = "badge 2" j'affiche l'image 2", et ainsi de suite. Je ne saisis même pas comment est censé se nommer "badge 1" ou "badge 2" étant donné qu'il attend visiblement un String, et pas un int, ou autre... Je nage ! ::)

J'ai essayé de façon hasardeuse de changer la valeur " 0" après "myPort.available() >" et la valeur "('\n')" après "val = myPort.readStringUntil", mais visiblement les trucs faits au pif fonctionnent pas vraiment :D

hello

chez moi, arduino envoie une chaine de 50 variables précédées de CAN et suivies de fin CAN. les variables sont séparées par “:”

CAN=:val0:val1:val2:val3:val4:val5…:=finCAN
tu y voies une ressemblance avec:
Serial.println(“Badge no: 1”);

etudies le code suivant et adaptes

void serialEvent (Serial myPort) // fonction appelée lors de la survenue d'un évènement série
{                                           
   String inString = myPort.readStringUntil('\n');  // chaine stockant la chaîne reçue sur le port Série
   if ((inString != null));// & (Pause==1)) 
      {                                             // si la chaine recue n'est pas vide et toggle pause false
      inString = trim(inString);                  // enlève espace blancs de la chaine recue
println("Chaine_recue="+inString); // debug

compteur_frequence++;
compteur_horaire++;if (compteur_horaire>59){compteur_horaire=0;}//compteur_frequence=0;
//println("compteur_frequence = "+ compteur_frequence+"   compteur_horaire = "+compteur_horaire);
                //---- extraction des valeurs à partir de la chaine reçue ----
                // la chaine reçue avec la valeur des 40 mesures est sous la forme CAN=:val0:val1:val2:val3:val4:val5.....:=finCAN
   String[] inSubstring = split(inString, ':'); // extrait
   //for (int i=0; i<=nombrevariablessauvegardees+1; i++) //
   /*
   for (int i=0; i<=nombrevariablessauvegardees; i++) //
      {
       println("Case="+i+inSubstring[i]); // debug
      }
      */
              //--- déclaration tableaux utiles
   int[] inByte_brut= new int[nombrevariablessauvegardees]; // tableau pour valeur reçue en valeur numérique entiere
   float[] inByte= new float[nombrevariablessauvegardees]; // tableau pour valeur reçue en valeur numérique décimale
                //---- extraction des valeurs de CAN à partir de la chaine
   for (int i=0; i<nombrevariablessauvegardees; i++) // de 0 à 59
     {
//print("nombrevariablessauvegardees"+nombrevariablessauvegardees);println("    i= "+i); // //
//print("Valeur CAN("+i+")= "+ inSubstring[i+1]); // debug
     inByte_brut[i]=int(inSubstring[i+1]); // conversion valeur reçue en valeur numérique entiere
//print( " soit en valeur entière : " + inByte_brut[i]); // debug
     inByte[i]=float(inSubstring[i+1]); // conversion valeur reçue en valeur numérique décimale
//print( " soit en valeur décimale : " + inByte[i]); // debug

Merci beaucoup !

Je t’avoue que je n’ai pas tout compris à ton code haha, mais ça m’a fait comprendre que j’avais un problème avec mes types de données envoyées (j’ai enlevé les appels String pour appeler des int).

Tout fonctionne bien, maintenant je vais pouvoir tout personnaliser :slight_smile:

Je mets mon code entier, si ça peut dépanner quelqu’un.

Arduino :

#include <SoftwareSerial.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.

int i = 0;



void setup() {
  Serial.begin (9600);
  SPI.begin();           // MFRC522 Hardware uses SPI protocol
  mfrc522.PCD_Init(); // initialisation du module RFID
  

}



void loop() {

 // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;


      if(mfrc522.uid.uidByte[1] == 29){ 
    
        //ton code
        Serial.write(mfrc522.uid.uidByte[1]);
         }

          if(mfrc522.uid.uidByte[1] == 144){ 
    
        //ton code
        Serial.write(mfrc522.uid.uidByte[1]);
         }
     }

Processing

import processing.serial.*; // Librairie serial

Serial myPort;  // Create object from Serial class 
PImage photos[]; // instancier le tableau d'images



void setup() {

  String portName = Serial.list()[1]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600);  
  size (displayWidth, displayHeight);
  frameRate(5);



  photos = new PImage[2]; // tableau de mes images
  photos[0] = loadImage("kennebec.jpg");
  photos[1] = loadImage("conniefrancis.jpg");
}


void draw()
{
  if ( myPort.available() > 0) 
  {  // If data is available,
    int inValue = myPort.read();  // Lire les données envoyées
    
    if (inValue == 29) { // Si la donnée reçue = 29
      println("Valeur_recue="+inValue); // test
      fill(255);
      rect(0, 0, width, height);
      image(photos[0], 0, 0);
      
    } 
    
    else if (inValue == 144) { // Si la donnée reçue = 144
      println("Valeur_recue="+inValue);
      fill(255);
      rect(0, 0, width, height);
      image(photos[1], 0, 0);
    } 
    
    else {
      println("Valeur_recue="+inValue); // pas de données lues : écran uni
      background(255, 0, 0);
    }
  }
}

En tout cas merci à vous deux, vous m’avez bien dépannés !
Je publierai un article avec mon projet entièrement finalisé, dans quelques jours, merci encore !
:smiley: