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();
}
}