jueves, 25 de mayo de 2017

Acceso con Arduino y RFID

Control de acceso con Arduino y RFID.

En esta entrada explicaremos como montar tu propio control de acceso usando Arduino como la placa encargada del control y el módulo RFID-RC522 encargado de la comunicación y la lectura.
Despues de entender el funcionamiento del RFID se te abrirán las puertas de muchos otros proyectos en los que necesites está tecnología.


Conexión del módulo RFID con Arduino

Es fácil. El módulo RFID está serigrafiado. Solo hay que conectar los pines de la siguiente forma.
En los comentarios del código que más abajo facilitamos también aparece como conectarlo.



RFID-RC522
Pines Arduino UNO
SDA
10
SCK
13
MOSI
11
MISO
12
IRQ
No se conecta
GND
GND
RST
5
3,3V
3V3
LED´S
LedPinAbierto (Verde)
2
LedPinCerrado (Azul)
3



Código de prueba.
Antes de cargar el código en Arduino, necesitamos descargar y añadir la libraría para manejar el módulo RFID.
Puedes descargarla aquí.
Una vez tengamos la librería, cargamos el código en Arduino.




#include <MFRC522.h>//Descargar e incluir la librería

#include <SPI.h>

/*
Pins  SPI    UNO  Mega2560  Leonardo
1 (NSS) SAD (SS)   10     53        10
2       SCK        13     52        SCK1
3       MOSI       11     51        MOSI1
4       MISO       12     50        MISO1
5       IRQ        *      *         *
6       GND       GND     GND       GND
7       RST        5      ?         Reset
8      +3.3V (VCC) 3V3     3V3       3.3V
* No necesario
*/

#define SAD 10
#define RST 9
MFRC522 nfc(SAD, RST);


#define ledPinAbierto    2
#define ledPinCerrado  3


void setup() {
  pinMode(ledPinAbierto  , OUTPUT);   
  pinMode(ledPinCerrado, OUTPUT);   
  SPI.begin();
  Serial.begin(115200);
  Serial.println("Buscando RC522");
  nfc.begin();
  byte version = nfc.getFirmwareVersion();
  if (! version) {//Entra si no encuentra el módulo.
    Serial.print("No ha encontrado RC522");
    while(1); //detener
  }

  Serial.print("Ha encontrado RC522");
  Serial.print("Firmware version 0x");
  Serial.print(version, HEX);
  Serial.println(".");
}

#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {

                            {0xE4, 0xBD, 0xF5, 0xE2, 0x4E, }
                           //,{0x10, 0x14, 0x39, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas  0x83,.....
                            
                          };
                          
void printSerial(byte *serial);
boolean isSame(byte *key, byte *serial);
boolean isAuthorized(byte *serial);



void loop() {
  byte status;
  byte data[MAX_LEN];
  byte serial[5];
  boolean Abierto = false;
  digitalWrite(ledPinAbierto, Abierto);
  digitalWrite(ledPinCerrado, !Abierto);
  status = nfc.requestTag(MF1_REQIDL, data);

  if (status == MI_OK) {
    status = nfc.antiCollision(data);
    memcpy(serial, data, 5);
    
    if(isAuthorized(serial))
    { 
      Serial.println("Autorizado");
      Abierto = true;
    }
    else
    { 
      printSerial(serial);
      Serial.println("NO autorizado");
      Abierto = false;
    }
    
    nfc.haltTag();
    digitalWrite(ledPinAbierto, Abierto);
    digitalWrite(ledPinCerrado, !Abierto);
    delay(2000);
  }//if (status == MI_OK)

  delay(500);

}//void loop()

boolean isSame(byte *key, byte *serial)
{
    for (int i = 0; i < 4; i++) {
      if (key[i] != serial[i])
      { 
        return false; 
      }
    }
    
    return true;

}

boolean isAuthorized(byte *serial)
{
    for(int i = 0; i<AUTHORIZED_COUNT; i++)
    {
      if(isSame(serial, Authorized[i]))
        return true;
    }
   return false;
}

void printSerial(byte *serial)
{
        Serial.print("Serial:");
    for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la tarjeta completo
      Serial.print(serial[i], HEX);
      Serial.print(" ");
    }
}
Probando el montaje.


Para probar nuestro montaje abrimos el monitor serial de Arduino y lo hacemos funcionar a 115200 baudios.


El programa, lo primero que hace es buscar el módulo RFID, si no lo encuentra en el monitor serial se imprimirá un aviso informando de que no lo ha encontrado.


En el caso de que no encuentre el módulo RFID, tenemos que comprobar que todas las conexiones estan correctas y que nuestro módulo RFID esta en buen estado.


Una vez que ya lo encuentra, solo tenemos que acercar nuestra tarjeta o llavero; seguramente aparezca un mensaje en el que aparece unos números y las palabras NO AUTORIZADO.


Para autorizar una tarjeta tenemos que añadir su número de identificación a esta linea de código.



#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {

                            {0x11, 0x1D, 0xD3, 0xE, 0xD1,}
                           //,{0x10, 0x14, 0x39, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas  0x83,.....
                            
                          };


Para saber cual es el número de identificación de la tarjeta, solo tenemos que cambiar un valor en un bucle del código. Esto hace que cuando la tarjeta no está autorizada nos imprima el número de identificación de la tarjeta en cuestión.
La línea de código en la que hay que hacer la modificación es la siguiente.


void printSerial(byte *serial)
{
        Serial.print("Serial:");
    for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la tarjeta completo
      Serial.print(serial[i], HEX);
      Serial.print(" ");
    }

Solo tenemos que copiar el número que nos imprime por el monitor serial y añadirlo como tarjeta utorizada.
Una vez tenemos nuestra tarjeta autorizada solo tenemos que acercarla al módulo RFID. En el monitor serial nos aparecerá como tarjeta autorizada y se nos encenderá el led verde.


Si acercamos una tarjeta no autorizada nos imprimirá NO AUTORIZADA y permanecerá encedido el led Rojo.







jueves, 18 de mayo de 2017

LCD Gráfico Nokia 5110 con Arduino

Los pines del LCD son los siguientes:
lcd_nokia5110_3_Electronilab
Número de Pin
Nombre de Pin
Función de Pin
¿Entrada/Salida?
Notas
1
RST
Reset
Entrada
2
CE
Chip Selection (Selección de chip)
Entrada
3
DC
Data/Commands choice
Entrada
4
DIN
Serial data in
Entrada
5
CLK
Serial clock
Entrada
6
VCC
Positive power supply (Alimentación positiva)
Entrada
2.7V a 3.3V
7
LIGHT
LED backlight supply
Entrada
Conectar a GND para max brillo
8
GND
Ground (Tierra)
Entrada

Uso de las líneas de control

El LCD Nokia 5110 tiene 5 líneas de control; la interfaz es del tipo SPI. Cuando no se utilizan otros dispositivos SPI, el pin 2 (CE), de selección de chip se puede conectar a GND, de modo que se pueden usar solo 4 líneas de control. Para ahorrar más pines de Arduino, hay una opción para usar sólo 3 líneas de control, cuando el pin de reset del LCD está conectado al pin reset de Arduino. Esto sólo funciona cuando se utiliza una terminal serial, no con un Arduino independiente.
Puede usarse un pin adicional de tipo PWM, para controlar el brillo de forma dinámica de la luz de fondo de la pantalla (backlight).

Alimentación

La pantalla utiliza el chip controlador PCD8544 de Philips que fue utilizado en el Nokia 3310 y el 5110. Este chip está diseñado para funcionar sólo a 3.3V y tienen niveles de comunicación de 3V, por lo que para los microcontroladores de 5V se requiere un conversor de nivel lógico o resistencias de limitación de corriente (de lo contrario podría dañar fácilmente la pantalla).

Esquema de conexión

El esquema muestra el diagrama de conexión para el LCD y su uso con Arduino UNO. Se puede observar que se utilizaron resistencias de 10kΩ, para limitar la corriente por los pines y no dañar la pantalla.
 LCD_nokia-5110_Arduino_Electronilab_co-compressor

Librería y ejemplo en Arduino

 Library: LCD5110_Basic: Esta librería esta desarrollada no solo para Arduino sino además para Chipkit. Es de uso sencillo e integra varios tamaños de números, letras y la posibilidad de mostrar bitmaps.

Pasos de instalación y uso

  • Descargar la librería LCD5110_Basic haciendo click en el siguiente botón:
  • Descomprimir el archivo.
  • Abrir el IDE de Arduino. Click en Sketch > Import Library > Add Library y seleccionar la carpeta descomprimida. Con esto ya tendremos instalada la librería.

Ejemplo:

Esta librería viene con varios ejemplos. Para abrirlos damos click en File >Examples > LCD5110_Basic > Arduino (AVR) y seleccionamos algún ejemplo.
Esta librería usa una configuración distinta de pines del Arduino Uno. Para que los ejemplos funcionen con la configuración que hemos venido siguiendo, basta con cambiar esta linea de código:
LCD5110 myGLCD(8,9,10,11,12);
Por esta:
LCD5110 myGLCD(7,6,5,3,4);
En el siguiente vídeo se aprecia el ejemplo LCD5110_Bitmap de esta librería.