Proyectos IoT

Lector RFID móvil - un proyecto del Maker Kit con Particle y Ubidots

María Hernández
- 9 min read
Enviar por correo electrónico

Durante los últimos años, Ubidots se ha asociado con Particle para alcanzar un objetivo final: permitir la creación rápida, fácil y eficiente de soluciones IoT.

Si avanzamos rápidamente hasta la actualidad, nos enorgullece afirmar que ambos productos se están utilizando para acelerar proyectos de IoT a nivel mundial. Desde emprendedores y start-ups hasta grandes y pequeñas empresas, estamos ayudando a las empresas a crear el futuro impulsado por los datos.

Recientemente, Friedl aceptó el reto de crear un producto IoT desde cero. Desde el principio, los conocimientos de Friedl sobre el tema eran limitados. Sin embargo, gracias a la investigación que llevó a cabo -y a muchos vídeos de Youtube-, adquirió confianza en el uso de diversas herramientas para materializar su objetivo; Crear un lector RFID móvil sin ser un experto en IoT.

Tras lograr este asombroso resultado, nos pusimos en contacto con Friedl para felicitarle por su éxito y aprender de él. También queríamos compartir esta historia con la comunidad de Ubidots porque creemos que es una historia inspiradora y de la que se puede aprender.

A la luz de estos grandes logros, mi entrevista explorará el proceso de desarrollo de Friedl, las técnicas que utilizó para alcanzar su meta y otras valiosas lecciones.

El post original se puede encontrar en el sitio de Particle Community. Friedl ha tenido la amabilidad de compartirlo también con el Blog de Ubidots.

Escrito por: friedl_1977

Como primer proyecto me propuse construir un lector RFID móvil que enviara datos en tiempo real a MySQL, Google Sheets o Ubidots a través de Webhooks.

RFID1

Nota:

Esto no es un tutorial como tal, más bien sólo un escaparate del producto. Como he recibido mucha ayuda del Foro de Partículas, he decidido publicar mis archivos Eagle y el código para ponerlo a disposición de cualquiera que quiera utilizarlo.

Asumo que tienes conocimientos básicos del entorno Particle, web hooks y has configurado tu cuenta y dispositivos en Particle Console. Si no es así, por favor hágalo antes de intentar esta construcción.

El sumario:

Construir un escáner RFID verdaderamente inalámbrico (móvil) con el fin de escanear tarjetas RFID, capturar los UID de estas tarjetas y enviarlos a cualquiera de los dos;

Lista de materiales:

  1. MFRC522 Módulo lector de 3 tarjetas
  2. 3.7V LiPo 1 1100mA Batería
  3. Batería Charing 1 módulo
  4. LM394N 1
  5. Conjunto de LEDs 0603 para indicador de batería
  6. 2 x LED RGB para el estado del sistema y el estado de lectura de la tarjeta
  7. Partícula Fotón
  8. Interruptor deslizante - Alimentación principal
  9. Interruptor de inclinación 1
  10. Diseño personalizado de PCB (desde PCBWAY o similar)
  11. Armario de diseño personalizado
  12. Varias resistencias 0603
  13. ¡¡Ferrita 2!!

Lo primero es lo primero:

Si eres como yo, una simple caja prototipo genérica no será suficiente, así que me esforcé un poco más, aprendí a manejar Rhinoceros y diseñé una caja sencilla pero elegante (o al menos eso creía) que mostrara el Particle Photon y algunos otros componentes.

Además de esto, decidí no optar por una placa proto genérica ya que odio absolutamente los cables. He incluido una imagen de mi intento inicial de hacer un "bonito" tablero usando protoboard y cables de puente, pero después de un par de horas se dio cuenta de que simplemente no va a hacer. Otra curva de aprendizaje, Google'd y pasó un par de horas en YouTube y se las arregló para encontrar mi camino alrededor de Autodesk Eagle. Valió la pena cada minuto invertido.

IMG_3200
nuevo_caso
RFID2jpg

***La última imagen indica la PCB completamente montada con el LED de estado indicando "OK" así como el LM3914N en acción indicando ±90% de batería cargada. (7 de 8 LED's)

Envié los archivos Gerber a PCBWAY y en menos de una semana In tenía mi nueva PCB personalizada lista para el montaje.

Lo importante:

Ahora la codificación, esta es la parte que más me cuesta, pero gracias a algunos caballeros útiles en los foros de Particle y Hackster, se me ocurrió el código de abajo. Ahora bien, probablemente no es el código más limpio jamás escrito, pero funciona, así que siéntase libre de utilizar y mejorar si lo desea.

//  Project:        Mobile RFID Attendance register 
//                      A project by FireFli (PTY) LTD
//  Date:                July 2019
//  Compiled by:    Friedl Basson
//  Details:            Scan for UID's from RFID cards and posting via webhooks to, UbiDots, mySQL DB or Google Sheets
//  Credits:            Special thanks to the Particle community for assisting and making this project possible!
//  Firmware:       V2.1.1
//System Mode// - comment out if you will be setting up WiFi via Particle app and do not need to connect to another Wireless network after the fact
//SYSTEM_MODE(SEMI_AUTOMATIC);
// This #include statement was automatically added by the Particle IDE.
#include "RFID.h"
#include <Ubidots.h>
/* Define the pins used for the SS (SDA) and RST (reset) pins for BOTH hardware and software SPI */
#define SS_PIN      A2      
#define RST_PIN     D2
/* Define the pins used for the DATA OUT (MOSI), DATA IN (MISO) and CLOCK (SCK) pins for SOFTWARE SPI ONLY */
#define MOSI_PIN    D3      
#define MISO_PIN    D4      
#define SCK_PIN     D5      
//Initialising RGB START  - RGB LED and buzzer is used as system status indicator
int redPin = D6;       
int greenPin = D1;    
int bluePin = D0;     
int buzzPin = D7;
//Initializing RGB END   
/* Create an instance of the RFID library */
#if defined(_USE_SOFT_SPI_)
    RFID RC522(SS_PIN, RST_PIN, MOSI_PIN, MISO_PIN, SCK_PIN);    // Software SPI
#else
    RFID RC522(SS_PIN, RST_PIN);                                 // Hardware SPI
#endif
//const char* WEBHOOK_NAME = "rfid_uid";
const char* WEBHOOK_NAME = "Ubidots";
Ubidots ubidots("webhook", UBI_PARTICLE);
void setup()
{ 
  Serial.begin(9600);    
//  WiFi.listen();
        pinMode(redPin, OUTPUT);
        pinMode(greenPin, OUTPUT);
        pinMode(bluePin, OUTPUT);
        pinMode(buzzPin, OUTPUT);
// Setting credentials for new WiFi Connection
/*  
    This section is only needed if you want to connect to a new WiFi Network after initial setup
    This will only work if current WiFi credentials have been cleared.  
    Code will run ONLY ONCE on startup and set new credentials specified.  Once new credentials is set, this code will not run again.
*/
WiFi.on();
if (!WiFi.hasCredentials()) {
WiFi.setCredentials("SSID", "PASSWORD", WPA2, WLAN_CIPHER_AES);      
}
WiFi.connect();
waitUntil(WiFi.ready);
Particle.connect();
#if !defined(_USE_SOFT_SPI_)
  /* Enable the HW SPI interface */
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPI.begin();
#endif
  /* Initialise the RFID reader */
  RC522.init();
delay(5000);
            digitalWrite(bluePin, HIGH);
            digitalWrite(greenPin, HIGH);
            digitalWrite(redPin, LOW); 
}
void loop()
{
  /* Temporary loop counter */
  uint8_t i;
  /* Has a card been detected? */
  if (RC522.isCard())
  {
    /* If so then get its serial number */
    RC522.readCardSerial();
  char str[16]; 
  snprintf(str, sizeof(str)
          , "%02X %02X %02X %02X"
          , RC522.serNum[0]
          , RC522.serNum[1]
          , RC522.serNum[2]
          , RC522.serNum[3]
          );
// Webhooks//
/*
RFID_WP = your webhook name
str = your data you want to publish
PRIVATE or PUBLIC
*/
//            Particle.publish("RFID_WP", str, PRIVATE);          //Publish Data to Wordpress DB
//            Particle.publish("XLS", str, PRIVATE);              // Publish Data to Google Sheets   
        Serial.print(str);
/* Adds context key-value pairs */
    ubidots.addContext("UID", str);
    char* context = (char *) malloc(sizeof(char) * 60);
    /* Builds the context with the array above to send to Ubidots */
    ubidots.getContext(context);
    ubidots.add("UID", 1, context);  // Change for your variable name  
    bool bufferSent = false;
    bufferSent = ubidots.send(WEBHOOK_NAME, PUBLIC);  // Will use particle webhooks to send data
//}
// - TRY Ubidots - //          
//            digitalWrite(buzzPin, HIGH);
            delay(500);
            digitalWrite(buzzPin, LOW);
            digitalWrite(bluePin, LOW);
            delay(750);
            digitalWrite(bluePin, HIGH);
}
else if (RC522.isCard())
  {
    RC522.readCardSerial();
 char str[16]; 
  snprintf(str, sizeof(str)
          , "%02X %02X %02X %02X"
          , RC522.serNum[0]
          , RC522.serNum[1]
          , RC522.serNum[2]
          , RC522.serNum[3]
          ); 
            digitalWrite(bluePin, LOW);
            digitalWrite(greenPin, LOW);
            digitalWrite(redPin, HIGH);
 //         digitalWrite(buzzPin, HIGH);
            delay(1000);
            digitalWrite(bluePin, HIGH);
            digitalWrite(greenPin, HIGH);
            digitalWrite(redPin, LOW);
            digitalWrite(buzzPin, LOW);
    }
  delay(500);
}

Extremos delanteros:

Gracias a la función de webhook en la Particle Console, pude publicar el código sin problemas a casi cualquier lugar. Ahora bien, si sabes PHP y MySQL bastante bien, es posible que puedas escribir tu propio script del lado del servidor, pero para aquellos que son nuevos en esto como yo, yo recomendaría los dos servicios siguientes;

Difieren enormemente, así que echa un vistazo a ambos para determinar cuál es más adecuado para tu uso. En pocas palabras, si desea que los datos se publiquen en directo en una ubicación de su elección, Zapier (o algo similar) es el camino a seguir. Si no te importa almacenar los datos en el servidor de otra persona, Ubidots es mucho más rentable (coste por puntos de datos) y tiene la ventaja añadida de algunos widgets ingeniosos para presentar los datos de forma gráfica. He adjuntado una captura de pantalla de un ejemplo de Dashboard que construí en Ubidots.

18
RFID3

En retrospectiva:

Inicialmente pensé que construir un indicador de batería que funcionara fuera del Microcontrolador era la mejor idea ya que funcionaría independientemente y liberaría pines digitales muy necesarios, pero la contrapartida es que sin una entrada analógica enviada al MC, no puedes mostrar la vida de la batería en dashboard. El LM3914N también requiere algunos cálculos para establecer los voltios de referencia y determinar qué resistencias usar dependiendo de la diferencia de voltaje entre el estado de "carga completa" y "agotada". Ten en cuenta que por todas las razones prácticas deberías trabajar con 3.1V en la batería como agotada ya que la mayoría de los componentes no funcionarán por debajo de 3V o empezarán a comportarse esporádicamente. Seis del uno supongo.

Tampoco volvería a utilizar el interruptor de inclinación para activar el indicador de batería, ya que es demasiado sensible y provoca "parpadeos". Un simple interruptor táctil parece una idea mucho mejor... sólo una idea.

Imprescindible:

La mayor curva de aprendizaje aquí para mí fue el efecto que cualquier metal o circuito tendrá y un lector RFID. Primero diseñé, construí y probé toda la unidad conectada a una fuente de alimentación constante. Debido al diseño compacto de la unidad, la batería se instaló muy cerca del módulo lector de RFID. La consecuencia.... No hay escaneos 😲 Como medida temporal envolví la batería en cinta aislante eléctrica que hizo un trabajo "ok". Pedí un poco de ferrita de Amazon como un Ave María y como por arte de magia la interferencia era una cosa del pasado.

Gracias a todos los que ayudaron con el proyecto de alguna manera, @ScruffR por entender que todos teníamos que empezar en alguna parte y mostrando una paciencia extrema 🙂 También un enorme agradecimiento a @Joe en Particle por los impresionantes Maker Kits. ¡Esperando más proyectos!

Archivos:

Esquema Eagle - DESCARGAR

Eagle Board File - DESCARGAR


Impresionante, ¿verdad? Ahora, como prometí... Aquí encontrarás algunas de las preguntas que Friedl amablemente respondió.

P/ ¿Qué le hizo iniciarse en el ecosistema IoT?

R/ Siempre me ha gustado la tecnología y mi deseo de crear cosas nuevas encaja perfectamente en el sector del IoT. Desarrollar cosas nuevas que puedan mejorar la vida es lo que más me gusta.

P/ ¿Por qué ha probado muchas plataformas?

A/ Como soy completamente nuevo en IoT y no soy particularmente aficionado a la codificación, estaba buscando una plataforma fácil de usar que también sea rentable en lugar de escribir la mía propia. Encontré que la mayoría de las plataformas fueron diseñadas con usuarios experimentados en mente, esto hace que sea muy difícil para alguien nuevo en IoT. Incluso algunos usuarios experimentados podrían pasar demasiado tiempo configurando un sistema innecesariamente complicado. Como mi enfoque es principalmente y el desarrollo de productos, productos y diseño de PCB, era imperativo que encontrar una solución que rápidamente podría entender y empezar a usar.

P/ ¿Qué aprendió de cada uno de ellos?

A/ La mayoría de las plataformas parecen desalentadoras de aprender y muy caras si no se tiene cuidado. Los bajos costes iniciales o las versiones "gratuitas" pueden seducirte fácilmente para que utilices el producto, pero en cuanto empieces a transmitir datos en directo, te resultará bastante caro.

P/ ¿Por qué se decidió por Ubidots?

A/ Ubidots demostró ser lo mejor de ambos, fácil de aprender, bastante barato y con una política de uso de datos justa. Además, ¡el soporte fue estupendo! La interfaz gráfica de usuario es bastante fácil de entender y la opción de etiquetas personalizadas es interesante, aunque un poco cara.


Realmente espero que esta historia te inspire para empezar a construir y trastear en tu propio IoT diferentes tipos de proyectos, y mejor aún, esperamos que utilices Ubidots para aprovechar tus mejores esfuerzos para habilitar tu proceso.