martes, 18 de noviembre de 2014

Tutorial#1.03# - Lectura RFID + Arduino Funuino

 
En esta ocasión quiero presentar un pequeño tutorial sobre la plataforma RFID-RC522 que hace poco adquirí. Este módulo es un lector / grabador de información via RFID que soporta los standars  ISO/IEC 14443 A/MIFARE.

Este módulo esta basado en el chipset "MFRC522" que fabrica NXP y que entre sus principales características esta la frecuencia de comunicación a 13.56 MHz, soporte para protocolos I2C y UART,etc.

La características de físicas son:
  • Funcionamiento a 3.3 V
  • Corriente 13 - 26 mA
  • Temp. funcionamiento -20 y 80 ºC
  •  Dimensiones 5.9 x 3.9 x 0.6
 El datasheet del chip puede consultarse aquí.

Los pines de conexión del módulo RFID-RC522 son 8 , tal como se puede apreciar en la imagen superior. Son:

  • SDA: I2C-bus serial data line input/output.
  • SCK: SPI serial clock input.
  • MOSI: SPI master out, slave in.
  • MISO: SPI master in, slave out.
  • IRQ: interrupt request output: indicates an interrupt event.
  • GND: digital ground.
  • RST: Reset
  • 3.3V: Supply source of 3.3V
Una vez conocido por encima el dispositivo que vamos a usar, el proposito es configurarlo con un Arduino Funduino ( Uno ) para validar una tarjeta id y simular el acceso o denegación del mismo. Esto se representará con un par de LEDs ( Rojo y Verde ).

El esquema de conexión es como se muestra a continuación ( el RFID es equivalente al RC522):



Una vez realizada la conexiones pertinentes, procedemos a escribir el codigo de prueba para validad el funcionamiento del sistema.

  1 /* 
  2 Tutorial sobre funcionamiento de lectura de 
  3 RFID modulo RC522 sobre Arduino Funduino.
  4 */
  5 
  6 #include <SPI.h>
  7 #include <RFID.h> 
  8 
  9 #define SDA_I 10
 10 #define RST_I 9
 11 
 12 // Declaración de conexion de SDA y RST de RC522
 13 RFID rfid(SDA_I,RST_I); 
 14 
 15 int led_rojo = 8;
 16 int led_verde = 7;
 17 
 18 // Declaración de codigos / usuarios aceptados 
 19 int numero_serie[5];   
 20 int usuario_valido[1][5]={ {136,414,47,9,83} };
 21 
 22 int contador=0;
 23 int bandera=0;
 24 
 25 void setup(){
 26 // Iniciamos la configuracion     
 27 Serial.begin(9600);
 28 SPI.begin();
 29 rfid.init();
 30 pinMode(led_verde, OUTPUT);
 31 pinMode(led_rojo, OUTPUT);
 32 
 33 }
 34 
 35 // Loop principal de lectura del usuario
 36 
 37 void loop(){ 
 38 digitalWrite(led_verde,LOW);
 39 digitalWrite(led_verde,LOW);
 40 if (bandera==0){
 41         Serial.print("Esperando id......  ");
 42         Serial.println();
 43         delay(1000);
 44         bandera=1;
 45 }
 46 delay(100);    
 47 lectura_usuario();
 48 delay(100);
 49 }
 50 
 51 // Se detecta tarjeta compatible con el protocolo
 52 // y se imprime por pantalla el codigo
 53 
 54 void lectura_usuario(){
 55 contador = 0;
 56 if (rfid.isCard()){ 
 57     if (rfid.readCardSerial()){
 58         Serial.println("Usuario n:  ");
 59         for ( int i=0;i<=4;i++){
 60             numero_serie[i]=rfid.serNum[i];
 61         }
 62         for ( int j=0;j<=4; j++){
 63             Serial.print(numero_serie[j]);
 64         }
 65         delay(500);
 66         contador=1;
 67         comprobacion_id();
 68     }
 69     
 70 }
 71 rfid.halt();
 72 }
 73 
 74 // Se realiza la comparación entre los datos
 75 // leidos y los almacenados en la cadena "usuario_valido"
 76 
 77 
 78 void comprobacion_id(){
 79 int i,j=0;
 80         if ((usuario_valido[i][j])==(numero_serie[j])){
 81             j++;
 82         }
 83         else{
 84         i++;
 85         j=0;    
 86         }
 87         if(i >= 2){ 
 88 
 89                j=5;
 90          }
 91     switch(i)
 92     {
 93     case 0:
 94         usuario_validado();
 95         break;
 96         
 97     default:
 98         usuario_no_validado();
 99         break;
100         
101     }    
102 
103 bandera=0;
104 digitalWrite(led_verde,LOW);
105 digitalWrite(led_rojo,LOW);
106 }
107 
108 // Validacion de usuario mediante mensaje
109 // y encendido de Led Verde
110 
111 void usuario_validado(){
112     if(contador == 1)
113     {
114         Serial.print("  Usuario correcto");
115         Serial.println();
116         digitalWrite(led_verde,HIGH);
117         delay(1000);
118         contador = 0;
119     }
120 }
121 
122 // Negación de usuario mediante mensaje
123 // y encendido de Led Verde
124 
125 
126 void usuario_no_validado(){
127     if(contador == 1)
128     {
129         Serial.print("  Usuario incorrecto");
130         Serial.println();
131         digitalWrite(led_rojo,HIGH);
132         delay(1000);
133         contador = 0;
134     }
135 }

Así pues, solo queda probarlo.......yo en mi caso programé mi codigo para que detectara mi tarjeta "Oyster" de transporte publico de Londres ( archiamiga ! ), tal como muestro en la siguiente imagen:






Hay que decir que no todas las tarjetas valen......teneis que tener en cuenta que deben funcionar con los protocolos MIFARE adecuados ( toda la info en el datasheet)........

A continuación se muestra el Monitor Serial de Atmel Studio 6.2:


...y nada más, a sacarle provecho a la RFID. Yo por mi parte ya tengo un proposito para ella!

    miércoles, 5 de noviembre de 2014

    Tutorial#1.02# - Termistor con Arduino+LCD KeyPad Shield

     En este pequeño tutorial, vamos a continuar con el desarrollo de nuestro sistema de monitorización de temperatura con Arduino, y en este caso, vamos a implementarle una pantalla LCD para poder mostrar la información.


    LCD:

    Para desarrollar este sistema he seleccionado una LCD con un KeyPad que me servirá en el futuro para continuar con el desarrollo del sistema. La placa es de DFRobot, es bastante asequible economicamente ( 11.55 $ ).
    La LCD esta basada en en una pantalla de cristal líquido matricial de HITACHI, modelo HD44780U.

    Las principales características de la placa son las siguientes
    • Voltaje de funcionamiento 5V
    • 5 botones para programación de menú
    • 1 boton de Reset
    • Potenciómetro para ajuste manual de retroiluminación LCD
    • Juego de Pines:
      • D4-D7: Datos de LCD
      • D8: Reset
      • D9: Activación
      • D10: Control de retroiluminación

    Diagrama de LCD: 



    Montaje:
    El montaje del circuito del termistor con Arduino se realiza de la manera descrita en el Tutorial#1.01# - Termistor con Arduino, cuyo enlace es el siguiente:

    Así pues, lo único que debemos hacer es montar la LCD y empezar a picar código.

    Código de Arduino
      1 /*  Tutorial#1.02# - Termistor+LCD con Arduino
      2 
      3 Monitorizacion de temperatura con sensor NTC sobre plataforma
      4 Arduino y representacion en LCD con shield LCD Keypad Shield.
      5 
      6 Algortimo de calculo de temperatura en:
      7 http://en.wikipedia.org/wiki/Thermistor
      8  */
      9  
     10  #include <LiquidCrystal.h>
     11  
     12  // select the pins used on the LCD panel
     13 LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
     14 
     15 //Pines para las entradas analógicas
     16 int analogPin1 = 1;
     17 
     18 //Escala de Avisos
     19 int msg= 0;               //Barrera para el mensaje de bienvenida 
     20 
     21 //Variables para las ecuaciones
     22 float TempC = 0.0;       // [ºC]  Temperatura salida en Celsius
     23 
     24 
     25 void setup() {
     26   lcd.begin(16, 2);       // Iniciamos la LCD
     27   lcd.setCursor(0,0);
     28   //Comenzamos la comunicación puerto serie
     29   Serial.begin(9600);
     30   if(msg==0)             //Mostramos el mensaje de bienvenida una vez
     31   {
     32     lcd.setCursor(0,0);  
     33     lcd.print("Termistor  LCD");
     34     lcd.setCursor(0,1);
     35     lcd.print("Enrique Parro J.");
     36     delay(5000); 
     37     for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
     38       // scroll one position left:
     39       lcd.scrollDisplayLeft(); 
     40       // wait a bit:
     41       delay(150);
     42     }
     43     msg = 1;
     44     lcd.clear();        //Limpiamos mensaje bienvenida
     45   }
     46 }
     47 
     48 
     49 void loop()    // Bucle de programa principal
     50 {
     51 // ********** Algoritmo de termistor  ********** 
     52   double fTemp;
     53   double temp = Termistor(analogRead(1));  // Leemos el sensor
     54   TempC=temp;
     55   Serial.print("Valor de Temp: ");
     56   Serial.println(TempC); // envía valor medido 
     57   delay(100);
     58   lcd.clear(); 
     59   lcd.setCursor(0,0);
     60   lcd.println("Temperatura C   ");
     61   lcd.setCursor(0,5);
     62   lcd.print(TempC);
     63   delay(1000);
     64 } 
     65 
     66 //**************    Funcion Termistor lectura      *****************
     67 double Termistor(int RawADC) {
     68   double Temp;
     69   Temp = log(((10240000/RawADC) - 10000)); // Termistor de 10 K
     70   Temp = 1 / (0.001129148 + (0.000234125 * Temp) + 
     71   (0.0000000876741 * Temp * Temp * Temp));
     72   Temp = Temp - 273.15;           // Conversion de Kelvin a Celsius
     73   return Temp;
     74 }
     75 
     76 

    ....y lo dicho, solo queda montarlo y probarlo.En este caso comprobamos los resultados mediante el Monitor Serial de Arduino IDE:


    Nuestra LCD mostrando la temperatura: