Saltar la navegación

Rfid y tiras de Leds

Proyecto: Activar tiras de leds a partir de tarjetas RFID

El resultado final deberá de ser una caja donde poner el lector de tarjetas y el Arduino

arduino amagat

Información importante
En estos proyectos aparecen Arduinos Nanos que hemos comprado en AliExpress, por tener un precio muy asequible.
Con algunas de estas placas puede haber problemas cuando no son reconocidas por nuestro ordenador.
Normalmente con la ayuda de un instalador de drives se soluciona el problema pero, a veces, no. Entonces hay que seguir un procedimiento más complejo.
Os dejamos dos links externos, a dos informaciones puntuales donde explican como solucionar estos problemas:
Si vuestra intención es construir un solo ejemplar y no os molesta gastar un poco más de dinero, podéis utilizar los Arduinos oficiales.
Primer link: Tema drivers: 

https://www.geekfactory.mx/tutoriales/tutoriales-arduino/driver-ch340-para-arduino-chinos-o-genericos/

Segundo link. Tema firmas: 

https://www.muycomputer.com/2020/06/04/como-instalar-drivers-no-firmados/ 

Para realizar esta practica vamos a necesitar la librería MFRC522. Para poder instalarla deberemos ir a
Herramientas del Menú principal, Administración de Bibliotecas, se abrirá el cuadro de diálogo que podéis ver, 
donde vamos a buscarla e instalarla. 

libreria

Una vez que la tengamos instalada podemos buscar un ejemplo propia de esta librería
Menú Archivo, seleccionamos Ejemplos y buscamos el que se llama de DumpInfo de la libreria MFRC522
mrf522
Instalaremos este código en nuestro Arduino para poder saber que código lleva cada una de nuestras tarjetas RFID
Para ello, cuando tengamos instalada la placa Rfid (el lector) con el Arduino y este código, deberemos abrir el Monitor Serie,
Menú principal>Herramientas>Monitor Serie que nos mostrará en pantalla el código de cada tarjeta. 



monitor serie

Toda esta parte previa la podéis consultar en un excelente video de Arduino desde Cero: 

Arduino desde cero en Español - Capítulo 40 - RFID RC522 kit lector, tarjeta, llavero 13.56 Mhz

Nuestras tarjetas tienen estos códigos



Estos códigos los apuntaremos en las tarjetas. Podemos utilizar algún tipo de papel adhesivo o rotulador permanente.
tarjetas y codigos

Este es el esquema de nuestro proyecto

esquema tarja color

Cada tarjeta rfid activa un color concreto.
Ejercicio inicial. Senzillo.
Vamos a necesitar:
Tira de leds WS2811, o WS2812 o WS2812b.
Arduino Nano (cualquier Arduino)
Un lector de Rfid RC522
Y las tarjetas de RFID

Arduino Nano

arduinos nanos

Tira led ws2812b
tires leds

Lector Rfid
lector rfid
La mayoria de estos lectores llevan los pines sueltos y habrá que soldarlos, si no os atreveis, buscad un modelo que ya los lleve soldados. Saldrá un poco más caro pero, a veces, es mejor opción.

Código
En el puedes ver que aparecen dos numeracions pra cada color, representa al trabajo de dos personas con tarjetas diferentes. Lo mismo deberas hacer tu, saber el código de tus tarjetas yi sustituir las linias  267, 274, 279, etc.
En lugar de los numeros "1B:66:B0:21", por ejemplo, deberás poner los tuyos. La manera más senzilla de saber que numero se corresponde a cada tarjeta te lo hemos explica al principio de este apartado.
Aqui el código:

//sacosta.org
//amb cada una de les targes registrades el color puja per la tira un nombre de vegades(variable num_rep) i acaba il·luminada amb aquest color.
//amb una targe no registrada repeteix 5 vegades a groc i queda apagat.
//la tarja 14 apaga la tira
//línies 27-42 defineix els colors de cada tarja
//de la 235 al final defineix codi tarja


#include <Adafruit_NeoPixel.h>
#include <require_cpp11.h>
#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include "SPI.h"

// Setup of configurations

const int PIN = 6; // Pin Arduino a senyal tira
const int NUMPIXELS = 150; // Número de neopíxels de la tira
const int SS_PIN = 10; // Data PIN for MFRC522
const int RST_PIN = 9; // Reset PIN for MFRC522
const int TIME = 150; //

// Defining needed variables for the NeoPixel: pixels
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

// Defining colors
const uint32_t red = pixels.Color(193, 0, 0);//1 //1 vermell////////////////////////////////
const uint32_t green = pixels.Color(0, 193, 0);//2 //2 verd///////////////////////////////////
const uint32_t blue = pixels.Color(0, 79, 169); //3 blau//////////////////////////////////
const uint32_t purple = pixels.Color(0, 255, 255);//4 //4 blau claret //////////////////////////
const uint32_t taronja = pixels.Color(255, 155, 0); // //5 groc//////////////////////////////////
const uint32_t taronja_claret = pixels.Color(255, 123, 0); //6 vermell rosa///////////////////////////////
const uint32_t blau_clar = pixels.Color(0, 118, 35); //7 verd blavos//////////////////////////
const uint32_t violeta = pixels.Color(255,47, 84);//8 //8 rosa////////////////////////////////////
const uint32_t violeta_fort = pixels.Color(255, 0, 198);//9 //9 violeta//////////////////////////////
const uint32_t verd_clar = pixels.Color(200,200,200);//10 //10 blanc /////////////////////////////
const uint32_t chocolate = pixels.Color(210, 5, 30);//11 //11 vermell rosa//////////////////////
const uint32_t verd_blavos = pixels.Color(0, 255, 128); //12 ///////// //12 blau verdos/////////////////////////
const uint32_t hotpink = pixels.Color(25,25,112);//13 // //13 blau nit///////////////////////////////
const uint32_t yellow = pixels.Color(166, 136, 0);
const uint32_t blank = pixels.Color(0, 0, 0);//apagat

int num_rep=3;//nombre de repeticions abans de quedar encès
int tarja;

MFRC522 rfid(SS_PIN, RST_PIN); // Prepares PINS
MFRC522::MIFARE_Key key;


void setup() {
Serial.begin(9600);
Serial.println("Accés al castell...\n\n");
pixels.begin();
pixels.setBrightness(20);
SPI.begin();
rfid.PCD_Init();
}

void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()){
return;
//No hi ha carta o no l'ha pogut llegir, torna a començar
}
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);//analitza el tipus de tarja
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
//si no és una Mifare classic torna a començar el loop
}
String strID = "";
for (byte i = 0; i < 4; i++) {
strID +=
(rfid.uid.uidByte[i] < 0x10 ? "0" : "") +
String(rfid.uid.uidByte[i], HEX) +
(i != 3 ? ":" : "");
}
strID.toUpperCase();

if (validateCard(strID)) {
Serial.println("***POTS ACCEDIR A PALAU! ***");
Serial.print("*** LA TEVA ID ÉS: ");
Serial.println(strID);
Serial.print("");
if(tarja==1){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 1");


/////////////////////////////////////////////////////////////////////////////
setAll(blank);
delay(TIME);
setAll(red);
delay(TIME);
}
return;}

if(tarja==2){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 2");

setAll(blank);
delay(TIME);
setAll(green);
delay(TIME);
}
return;}

if(tarja==3){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 3");

setAll(blank);
delay(TIME);
setAll(blue);
delay(TIME);
}
return;}

if(tarja==4){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 4");

setAll(blank);
delay(TIME);
setAll(purple);
delay(TIME);
}
return;}


if(tarja==5){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 5");

setAll(blank);
delay(TIME);
setAll(taronja);
delay(TIME);
}
return;}

if(tarja==6){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 6");

setAll(blank);
delay(TIME);
setAll(taronja_claret);
delay(TIME);
}
return;}

if(tarja==7){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 7");

setAll(blank);
delay(TIME);
setAll(blau_clar);
delay(TIME);
}
return;}

if(tarja==8){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 8");

setAll(blank);
delay(TIME);
setAll(violeta);
delay(TIME);
}
return;}

if(tarja==9){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 9");

setAll(blank);
delay(TIME);
setAll(violeta_fort);
delay(TIME);
}
return;}

if(tarja==10){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 10");

setAll(blank);
delay(TIME);
setAll(verd_clar);
delay(TIME);
}
return;}

if(tarja==11){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 11");

setAll(blank);
delay(TIME);
setAll(chocolate);
delay(TIME);
}
return;}

if(tarja==12){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 12");

setAll(blank);
delay(TIME);
setAll(verd_blavos);
delay(TIME);
}
return;}

if(tarja==13){
for(int i=0;i<num_rep;i++){ // Repeteix num_rep vegades i queda encés del color de la tarja.
Serial.println("color 13");

setAll(blank);
delay(TIME);
setAll(hotpink);
delay(TIME);
}
return;}

if(tarja==14){//apaga la tira
setAll(blank);

return;}
}

else {// si la tarja no està autoritzada...
Serial.println("*** Acces denegat! ***");
Serial.print("*** You tried a card with this id: ");
Serial.println(strID);
Serial.println("");
for(int i=0;i<5;i++){ // repeteix 5 vegades a groc i queda apagat
setAll(yellow);
delay(TIME);
setAll(blank);
delay(TIME);

}
return;
}
}

//funció per donar color a la tira en funció dels colors definits
void setAll(uint32_t color) {
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, color);
pixels.show();
}
}

// Funció de validació de tarja
bool validateCard(String usercard) {

//if(usercard.indexOf("55:58:34:21") >= 0) {
if(usercard.indexOf("77:80:7A:36") >= 0) {
tarja=1;
return true;
}

//else if(usercard.indexOf("24:42:A7:2B") >= 0) {
else if(usercard.indexOf("1B:66:B0:21") >= 0) {
tarja=2;
return true;
}
//else if(usercard.indexOf("FB:A8:4D:AC") >= 0) {
else if(usercard.indexOf("3B:FC:ED:21") >= 0) {

tarja=3;
return true;
}
//else if(usercard.indexOf("55:7C:36:21") >= 0) {
else if(usercard.indexOf("53:DE:4B:35") >= 0) {
tarja=4;
return true;
}
//else if(usercard.indexOf("55:1E:74:21") >= 0) {
else if(usercard.indexOf("63:45:FE:35") >= 0) {
tarja=5;
return true;
}
// else if(usercard.indexOf("55:0B:3F:21") >= 0) {
else if(usercard.indexOf("81:F2:AD:1E") >= 0) {
tarja=6;
return true;
}
//else if(usercard.indexOf("55:CA:54:21") >= 0) {
else if(usercard.indexOf("53:03:DE:35") >= 0) {
tarja=7;
return true;
}
// else if(usercard.indexOf("F2:C9:A6:2C") >= 0) {
else if(usercard.indexOf("63:5D:6D:35") >= 0) {
tarja=8;
return true;
}
//else if(usercard.indexOf("55:D9:8B:21") >= 0) {
else if(usercard.indexOf("53:14:44:35") >= 0) {
tarja=9;
return true;
}
//else if(usercard.indexOf("00:B0:BF:2A") >= 0) {
else if(usercard.indexOf("43:EC:A1:35") >= 0) {
tarja=10;
return true;
}
//else if(usercard.indexOf("03:E6:AD:38") >= 0) {
else if(usercard.indexOf("53:86:E8:35") >= 0) {
tarja=11;
return true;
}
//else if(usercard.indexOf("F2:C5:B3:2C") >= 0) {
else if(usercard.indexOf("43:D1:7F:35") >= 0) {
tarja=12;
return true;
}
//else if(usercard.indexOf("19:F2:35:C2") >= 0) {
else if(usercard.indexOf("53:94:EE:35") >= 0) {
tarja=13;
return true;
}
//else if(usercard.indexOf("2B:1B:4F:AC") >= 0) {
else if(usercard.indexOf("63:0A:5B:35") >= 0) {
tarja=14;
return true;
}
else return false;
}