Proyecto con Arduino: lector rfid y transmisión inalámbrica

Llevo tiempo sin subir las diferentes versiones que he ido haciendo de programas hasta llegar a la versión definitiva. Y bueno, tampoco voy a liarme mucho más, los siguientes dos posts de proyectos de arduino van a ser el transmiros y el receptor definitivos que voy a usar para el proyecto real con el que estoy.

La parte de transmisor consiste en un lector de tarjetas RFID (MFRC522), y un transmisor (nRF24L01) que emite el código de la tarjeta 127 veces seguidas cuando se realiza una lectura.

Es esquemático es este:

No he encontrado otro lector RFID para frizting con los nombres de los pines, pero el orden sería este:

Y el código:


//RST D9
//SDA(SS) D10
//MOSI D11
//MISO D12
//SCK D13

#include
#include
#include "RF24.h"
#include

int msg[1];

const int RST_PIN = 9; // Pin 9 para el reset del RC522
const int SS_PIN = 10; // Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crear instancia del MFRC522

//7 and 8 are a digital pin numbers to which signals CE and CSN are connected.
RF24 radio(7,8);
int radioss = 8;

//the address of the modem, that will receive data from Arduino.
const uint64_t pipe = 0xE8E8F0F0E1LL;

bool blockMfrc522;
byte RFID_Data[4];

void printArray(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}

void setup() {
Serial.begin(9600); //Inicializa la velocidad de Serial
SPI.begin(); //Función que inicializa SPI
mfrc522.PCD_Init(); //Función que inicializa RFID
RFID_Data[0] = 0;
RFID_Data[1] = 0;
RFID_Data[2] = 0;
RFID_Data[3] = 0;

// Setup and configure radio
radio.begin(); //it activates the modem.
radio.openWritingPipe(pipe); //sets the address of the receiver to which the program will send data.
blockMfrc522 = false;
digitalWrite(SS_PIN, LOW);
digitalWrite(radioss,HIGH);
}

void loop() {
// Read the RFID tag... when not transmitting
if (!blockMfrc522) getRFID();

if (RFID_Data[0] == 0 && RFID_Data[1] == 0 && RFID_Data[2] == 0 && RFID_Data[3] == 0){
} else {
blockMfrc522 = true;
digitalWrite(SS_PIN, HIGH);
digitalWrite(radioss,LOW);
send_rfid();
RFID_Data[0] = 0;
RFID_Data[1] = 0;
RFID_Data[2] = 0;
RFID_Data[3] = 0;
blockMfrc522 = false;
digitalWrite(SS_PIN, LOW);
digitalWrite(radioss,HIGH);
}
}

void send_rfid(){
Serial.println("comienza a emitir");
for(int i=0; i<127; i++){
radio.write(&RFID_Data, sizeof(RFID_Data));
//Serial.println("emitiendo");
}
//Serial.println("termina de emitir");
}

void getRFID(){
// Detectar tarjeta
if (mfrc522.PICC_IsNewCardPresent()) {
if (mfrc522.PICC_ReadCardSerial()) {
for (int i = 0; i < mfrc522.uid.size; i++) {
RFID_Data[i] = mfrc522.uid.uidByte[i];
}
Serial.print(F("Card UID:"));
printArray(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
// Finalizar lectura actual
mfrc522.PICC_HaltA();
}
}
}

Sobre el código:

He tenido algunos problemas a la hora de conectar varios módulos que van por SPI al arduino pero en realidad es bastante sencillo. Los pines SCK, MOSI Y MISO son comunes a todos los módulos, y es el pin SS (slave select) el que decide qué módulo está activo y qué modulo está inactivo. En este vídeo se explica maravillosamente, por si queréis ahondar en ello:

No he sentido que en el caso de este código sea necesario, pero aún así el lector de tarjetas se inhabilita mientras el módulo nRF24L01 está transmitiendo, y el transmisor se inhabilita mientras se espera una lectura (el pin SS del nRF24L01 es el CSN, y el del lector RFID es SDA). Son los digitalWrite que hay antes y después de llamar a send_rfid.

Esto es lo más complejo del código. El resto es muy estándar y, salvo un par de modificaciones, se puede encontrar en internet en cualquier proyecto con estos dos módulos (por separado, no los he encontrado juntos).

Lo de que emita 127 veces – unos 4 segundos – lo he decidido yo. Una ventana de emisión de 4 segundos me ha parecido más que suficiente para que el receptor sea capaz de leer al menos una vez lo emitod – de hecho lo lee bastantes más veces, ya lo veréis en el post que dedique al receptor. Pero así me aseguro -.

 

************************************************************

Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.

2 thoughts on “Proyecto con Arduino: lector rfid y transmisión inalámbrica

  1. Hola, amé tu página. Justo necesitaba entender cómo hacer una transmisión inalámbrica de códigos UID para otro proyecto. Gracias! Seguiré revisando las freaky beautiful things que ofreces.

  2. hola , primero que todo muchas gracias por tu aporte, me fue muy útil. en este momento tengo un dilema que no se como solucionar, resulta que el programa me funciona a la perfección pero solo cuando recién se carga el programa al Arduino, una vez hago desconexión y lo intento conectar de nuevo ya nada funciona, la única forma que vuelve a funcionar es cargándole otro programa y luego volver a cargarle el programa correcto y me funciona perfecto hasta que lo desconecto, ¿tu sabrás algo sobre este error ?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.