Votre ordinateur vous dit bonjour lorsque vous posez vos clés sur votre bureau !
Un porte clé contient un tag RFID, lu par un capteur sous le bureau. Lorsque le tag est détecté, l’ordinateur déclenche un son.
Application: toutes les applications connues découlant de cette technologie, marketing, sécurité, domotique…
Sources nécessaires: Lecture de tag RFID + bibliothèque Minim pour Processing
Voici le schéma de l’installation crée avec le logiciel Fritzing :
Vidéo explicative :
Code source :
Code Arduino :
/*
* Exemple d’utilisation du lecteur Rfid de parallax
* Application: Systéme d’ouverture de porte avec gâche électrique
* ENABLE sur D3
* SOUT sur D4
*/
/* Include pour le port série software */
#include <SoftwareSerial.h>
// Définition des broches
#define PIN_ENABLE 2
#define PIN_RX 3
#define PIN_TX 4 // Non utilisé
/* Constantes Parallax RFID */
#define CODE_LEN 10 // Taille d’un ID rfid
#define START_BYTE 0x0A // Byte de start
#define STOP_BYTE 0x0D // Byte de stop
/* Définition des constantes d’usage */
#define UNLOCK_TIME 2 // en secondes
#define RETRY_DELAY 2 // en secondes
/* Base de donnée des ID de tag valide */
char* tagId[] = {
« 2600D3D72E », // tag 1
« 27000DCA17″, // tag 2
« 0035395158 », // tag 3
};
/* Base de donnée des nom de tag valide */
char* tagNom[] = {
« Titre 1″, // tag 1
« Titre 2″, // tag 2
« Titre 3″, // tag 3
};
/* Nombre de tag dans la bdd */
const byte nbTag = 12;
int current = nbTag+1 ;
boolean firstUse = true;
/* Buffer contenant le tag en cours de lecture */
char tag[CODE_LEN];
/* Déclaration d’une instance de SoftwareSerial pour communiquer avec le lecteur rfid */
SoftwareSerial rfid(PIN_RX, PIN_TX);
/* Fonction setup() */
void setup() {
/* Initialisation du port série hardware */
Serial.begin(9600);
/* Initialisation du port série software */
rfid.begin(2400);
/* Mise en OUTPUT de la broche ENABLE du lecteur RFID */
pinMode(PIN_ENABLE,OUTPUT);
disableRfid();
}
/* Fonction loop() */
void loop() {
/* Récupération d’un ID valide ou non (fonction bloquante) */
getRfidTag();
/* index: résultat de la fonction isCodeValid() */
int index;
/* Si le tag est présent dans la bdd */
if((index = isCodeValid()) >= 0) {
if (current != index)
{
/* Affichage du msg d’accès, et du nom de la personne */
Serial.print(« R »); // Header of the message for AXIS
Serial.print(« , »);
Serial.print(index);
Serial.print(« , »);
Serial.println();
current = index;
}
}
else {
/* Sinon affichage */
//Serial.println(« Tag non reconnu »);
/* Attente avant de pouvoir repasser une carte */
//delay(RETRY_DELAY * 100);
}
/* Vide le buffer série du lecteur rfid (évite de lire des données parasites) */
flushRfid();
}
/*
* Fonction lisant un ID rfid depuis le port série software, et ne rendant la main qu’une fois un code rfid correctement recu
*/
void getRfidTag() {
/* Activation du lecteur RFID */
enableRfid();
waitTag: /* Etiquette de rappel */
do {
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Attente du byte de start */
}
while(rfid.read() != START_BYTE);
/* i: variable d’itération */
byte i;
/* Lecture du tag */
for(i = 0; i < CODE_LEN; i++) {
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Si jamais une erreur de lecture ce produit, et que le lecteur rfid retourne STOP_BYTE */
if((tag[i] = rfid.read()) == STOP_BYTE)
/* On quitte la boucle */
break;
}
/* Si i est différent de CODE_LEN c’est qu’il y a eu une erreur de lecture */
if(i != CODE_LEN)
/* On reprend donc depuis le début */
goto waitTag;
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Si l’octet suivant n’est pas le byte de stop c’est qu’il y a un probléme de syncro */
if(rfid.read() != STOP_BYTE)
/* On reprend donc depuis le début */
goto waitTag;
/* Désactivation du lecteur rfid */
disableRfid();
}
/*
* Retourne l’indice du tableau tagNom correspondant au tag rfid si celui ci est présent dans le tableau tagId, sinon -1
*/
int isCodeValid() {
/* Passe en revu chaque tag en bdd */
for(byte i = 0; i < nbTag; i++)
/* Si un tag correspond */
if(memcmp(tag, tagId[i], CODE_LEN) == 0)
/* on retourne son indice */
return i;
/* Si aucun tag ne correspond, on retourne -1 */
return -1;
}
Code Processing :
/**
* DRUMMING – Version SPLIT si double serial ne fonctionne pas
* RFID
*/
//Port de l’arduino RFID
short portIndex = 0;
Serial myPort;
short LF = 10; // « Fin de ligne »
////////////////////////////////////////////////////////////////
//RFID
char HEADERRFID = ‘R'; // ASCCII Linefield
//MIDI
int RFIDChannel = 14;
////////////////////////////////////////////////////////////////
String rfidTag;
void setup() {
size(512, 200);
// code sample ————————————–
minim = new Minim(this);
// load BD.wav from the data folder
kick = minim.loadSample( « BD.mp3″, // filename
512 // buffer size
);
// if a file doesn’t exist, loadSample will return null
if ( kick == null ) println(« Didn’t get kick! »);
// load SD.wav from the data folder
snare = minim.loadSample(« SD.wav », 512);
if ( snare == null ) println(« Didn’t get snare! »);
//—————————————————
// A vous de trouver quel port série est utilisé à l’aide de print(Serial.list())
String portName = Serial.list()[0];
// On initialise la communication série, à la même vitesse qu’Arduino
myPort = new Serial(this, portName, 9600);
}
void draw() {
}
// Un message est reçu depuis l’Arduino
void serialEvent(Serial p) {
////////////////////////////////////////////////////////////////
//FROM RFID
String messageRFID = myPort.readStringUntil(LF); // read serial data
if (messageRFID != null)
{
String [] data = messageRFID.split(« , »);
if (data[0].charAt(0) == HEADERRFID)
{
rfidTag = data[1];
println (rfidTag);
jouerMorceau(rfidTag);
}
}
////////////////////////////////////////////////////////////////
}
Porte clé – DJ
Antoine Bédat et Aymeric Faivre Chalon
Votre ordinateur vous dit bonjour lorsque vous posez vos clés sur votre bureau !
Un porte clé contient un tag RFID, lu par un capteur sous le bureau. Lorsque le tag est détecté, l’ordinateur déclenche un son.
Application: toutes les applications connues découlant de cette technologie, marketing, sécurité, domotique…
Sources nécessaires: Lecture de tag RFID + bibliothèque Minim pour Processing
Voici le schéma de l’installation crée avec le logiciel Fritzing :
Vidéo explicative :
Code source :
Code Arduino :
/*
* Exemple d’utilisation du lecteur Rfid de parallax
* Application: Systéme d’ouverture de porte avec gâche électrique
* ENABLE sur D3
* SOUT sur D4
*/
/* Include pour le port série software */
#include <SoftwareSerial.h>
// Définition des broches
#define PIN_ENABLE 2
#define PIN_RX 3
#define PIN_TX 4 // Non utilisé
/* Constantes Parallax RFID */
#define CODE_LEN 10 // Taille d’un ID rfid
#define START_BYTE 0x0A // Byte de start
#define STOP_BYTE 0x0D // Byte de stop
/* Définition des constantes d’usage */
#define UNLOCK_TIME 2 // en secondes
#define RETRY_DELAY 2 // en secondes
/* Macro de gestion hardware */
#define enableRfid() digitalWrite(PIN_ENABLE, LOW)
#define disableRfid() digitalWrite(PIN_ENABLE, HIGH)
#define flushRfid() while(rfid.available() > 0) rfid.read()
/* Base de donnée des ID de tag valide */
char* tagId[] = {
« 2600D3D72E », // tag 1
« 27000DCA17″, // tag 2
« 0035395158 », // tag 3
};
/* Base de donnée des nom de tag valide */
char* tagNom[] = {
« Titre 1″, // tag 1
« Titre 2″, // tag 2
« Titre 3″, // tag 3
};
/* Nombre de tag dans la bdd */
const byte nbTag = 12;
int current = nbTag+1 ;
boolean firstUse = true;
/* Buffer contenant le tag en cours de lecture */
char tag[CODE_LEN];
/* Déclaration d’une instance de SoftwareSerial pour communiquer avec le lecteur rfid */
SoftwareSerial rfid(PIN_RX, PIN_TX);
/* Fonction setup() */
void setup() {
/* Initialisation du port série hardware */
Serial.begin(9600);
/* Initialisation du port série software */
rfid.begin(2400);
/* Mise en OUTPUT de la broche ENABLE du lecteur RFID */
pinMode(PIN_ENABLE,OUTPUT);
disableRfid();
}
/* Fonction loop() */
void loop() {
/* Récupération d’un ID valide ou non (fonction bloquante) */
getRfidTag();
/* index: résultat de la fonction isCodeValid() */
int index;
/* Si le tag est présent dans la bdd */
if((index = isCodeValid()) >= 0) {
if (current != index)
{
/* Affichage du msg d’accès, et du nom de la personne */
Serial.print(« R »); // Header of the message for AXIS
Serial.print(« , »);
Serial.print(index);
Serial.print(« , »);
Serial.println();
current = index;
}
}
else {
/* Sinon affichage */
//Serial.println(« Tag non reconnu »);
/* Attente avant de pouvoir repasser une carte */
//delay(RETRY_DELAY * 100);
}
/* Vide le buffer série du lecteur rfid (évite de lire des données parasites) */
flushRfid();
}
/*
* Fonction lisant un ID rfid depuis le port série software, et ne rendant la main qu’une fois un code rfid correctement recu
*/
void getRfidTag() {
/* Activation du lecteur RFID */
enableRfid();
waitTag: /* Etiquette de rappel */
do {
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Attente du byte de start */
}
while(rfid.read() != START_BYTE);
/* i: variable d’itération */
byte i;
/* Lecture du tag */
for(i = 0; i < CODE_LEN; i++) {
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Si jamais une erreur de lecture ce produit, et que le lecteur rfid retourne STOP_BYTE */
if((tag[i] = rfid.read()) == STOP_BYTE)
/* On quitte la boucle */
break;
}
/* Si i est différent de CODE_LEN c’est qu’il y a eu une erreur de lecture */
if(i != CODE_LEN)
/* On reprend donc depuis le début */
goto waitTag;
/* Attente d’au moins un octet sur le port série */
while(rfid.available() < 1);
/* Si l’octet suivant n’est pas le byte de stop c’est qu’il y a un probléme de syncro */
if(rfid.read() != STOP_BYTE)
/* On reprend donc depuis le début */
goto waitTag;
/* Désactivation du lecteur rfid */
disableRfid();
}
/*
* Retourne l’indice du tableau tagNom correspondant au tag rfid si celui ci est présent dans le tableau tagId, sinon -1
*/
int isCodeValid() {
/* Passe en revu chaque tag en bdd */
for(byte i = 0; i < nbTag; i++)
/* Si un tag correspond */
if(memcmp(tag, tagId[i], CODE_LEN) == 0)
/* on retourne son indice */
return i;
/* Si aucun tag ne correspond, on retourne -1 */
return -1;
}
Code Processing :
/**
* DRUMMING – Version SPLIT si double serial ne fonctionne pas
* RFID
*/
import ddf.minim.*;
import processing.serial.*;
Minim minim;
AudioSample kick;
AudioSample snare;
//Port de l’arduino RFID
short portIndex = 0;
Serial myPort;
short LF = 10; // « Fin de ligne »
////////////////////////////////////////////////////////////////
//RFID
char HEADERRFID = ‘R'; // ASCCII Linefield
//MIDI
int RFIDChannel = 14;
////////////////////////////////////////////////////////////////
String rfidTag;
void setup() {
size(512, 200);
// code sample ————————————–
minim = new Minim(this);
// load BD.wav from the data folder
kick = minim.loadSample( « BD.mp3″, // filename
512 // buffer size
);
// if a file doesn’t exist, loadSample will return null
if ( kick == null ) println(« Didn’t get kick! »);
// load SD.wav from the data folder
snare = minim.loadSample(« SD.wav », 512);
if ( snare == null ) println(« Didn’t get snare! »);
//—————————————————
// A vous de trouver quel port série est utilisé à l’aide de print(Serial.list())
String portName = Serial.list()[0];
// On initialise la communication série, à la même vitesse qu’Arduino
myPort = new Serial(this, portName, 9600);
}
void draw() {
}
// Un message est reçu depuis l’Arduino
void serialEvent(Serial p) {
////////////////////////////////////////////////////////////////
//FROM RFID
String messageRFID = myPort.readStringUntil(LF); // read serial data
if (messageRFID != null)
{
String [] data = messageRFID.split(« , »);
if (data[0].charAt(0) == HEADERRFID)
{
rfidTag = data[1];
println (rfidTag);
jouerMorceau(rfidTag);
}
}
////////////////////////////////////////////////////////////////
}
void jouerMorceau (String tag)
{
if ( tag.equals(« 0″) )
{
//print (« test »);
snare.trigger();
}
else if ( tag.equals(« 1″) )
{
// print (« trigger »);
kick.trigger();
}
}