Lector RFID móvil: un proyecto Maker Kit con Particle y Ubidots
Durante los últimos años, Ubidots se ha asociado con Particle para lograr un objetivo final: permitir la creación rápida, fácil y eficiente de IoT .
En la actualidad, nos enorgullece afirmar que ambos productos se utilizan para acelerar IoT a nivel global. Desde emprendedores y startups hasta grandes y pequeñas empresas, ayudamos a las compañías a construir un futuro basado en datos.
Recientemente, Friedl aceptó el reto de crear un IoT desde cero. Desde el principio, sus conocimientosedge el tema eran limitados. Sin embargo, gracias a la investigación que realizó —y a numerosos vídeos de YouTube—, adquirió la confianza necesaria para utilizar diversas herramientas y materializar su objetivo: crear un lector RFID móvil sin ser un IoT .
Tras lograr este asombroso resultado, nos pusimos en contacto con Friedl para felicitarlo por su éxito y aprender de él. También queríamos compartir esta historia con la comunidad Ubidots porque creemos que es una historia inspiradora y de la que podemos 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 objetivo y otras lecciones valiosas.
La publicación original se puede encontrar en el Particle Community. Friedl también la ha compartido amablemente en Ubidots.
Escrito por: friedl_1977
Como primer proyecto, me propuse construir un lector RFID móvil que publicara datos en vivo en MySQL, Google Sheets o Ubidots a través de Webhooks.
- Crédito de la foto: Migal Vanas
Nota:
Este no es un tutorial propiamente dicho, sino una simple presentación del producto. Gracias a la gran ayuda que he recibido del foro Particle , he decidido publicar mis archivos y código de Eagle para que estén disponibles para cualquiera que desee usarlos.
Supongo que tienesedge básicos del entorno Particle y de los webhooks, y que has configurado tu cuenta y dispositivos en la consola Particle . De lo contrario, consúltalo antes de intentar esta compilación.
El resumen:
Construcción de un escáner RFID verdaderamente inalámbrico (móvil) con el propósito de escanear tarjetas RFID, capturar los UID de estas tarjetas y enviarlos a;
Lista de materiales:
- de 3 tarjetas MFRC522 Módulo lector
- LiPo de 3,7 V y Batería
- de batería 1 módulo
- LM394N 1
- Conjunto de LED 0603 para indicador de batería
- 2 LED RGB para el estado del sistema y el estado de lectura de la tarjeta
- Particle Fotón
- Interruptor deslizante - Alimentación principal
- de inclinación 1 Interruptor
- PCB de diseño personalizado (de PCBWAY o similar)
- Caja de diseño personalizado
- Varias resistencias 0603
- Ferrita 2 !!!
Lo primero es lo primero:
Si eres como yo, un prototipo genérico simple no será suficiente, así que puse un poco más de esfuerzo, me familiaricé con Rhinoceros y diseñé un prototipo simple pero elegante (o al menos eso pensé) que exhibiría el Particle Photon y algunos otros componentes.
Además de esto, decidí no optar por una placa proto genérica, ya que odio los cables. Incluí una imagen de mi primer intento de hacer una placa "bonita" con una placa proto y cables puente, pero después de un par de horas me di cuenta de que simplemente no servía. Otra curva de aprendizaje: busqué en Google y pasé un par de horas en YouTube y logré familiarizarme con Autodesk Eagle. Valió la pena cada minuto invertido.
***La última imagen muestra la placa de circuito impreso completamente ensamblada con el LED de estado que indica "OK", así como el LM3914N en funcionamiento, que indica una carga de batería de aproximadamente el 90 % (7 de 8 LED).
Envié los archivos Gerber a PCBWAY y en menos de una semana ya tenía mis nuevas placas de circuito impreso personalizadas listas para el ensamblaje.
Lo importante:
Ahora bien, la codificación es la parte con la que más me cuesta, pero gracias a un amable caballero de los foros Particle y Hackster, se me ocurrió el código que aparece a continuación. Probablemente no sea el código más limpio jamás escrito, pero funciona, así que siéntete libre de usarlo y mejorarlo si quieres.
// Proyecto: Registro de asistencia RFID móvil // Un proyecto de FireFli (PTY) LTD // Fecha: julio de 2019 // Compilado por: Friedl Basson // Detalles: Escanee los UID de las tarjetas RFID y publíquelos mediante webhooks en UbiDots, MySQL DB o Google Sheets // Créditos: ¡Un agradecimiento especial a la comunidad Particle por ayudar y hacer posible este proyecto! // Firmware: V2.1.1 //Modo del sistema// - comente si configurará WiFi a través de la aplicación Particle y no necesita conectarse a otra red inalámbrica después del hecho //SYSTEM_MODE(SEMI_AUTOMATIC); // Esta declaración #include fue agregada automáticamente por el IDE Particle . #include "RFID.h" #include <Ubidots.h> /* Define los pines utilizados para los pines SS (SDA) y RST (reinicio) para SPI de hardware y software */ #define SS_PIN A2 #define RST_PIN D2 /* Define los pines utilizados para los pines DATA OUT (MOSI), DATA IN (MISO) y CLOCK (SCK) SOLO para SPI DE SOFTWARE */ #define MOSI_PIN D3 #define MISO_PIN D4 #define SCK_PIN D5 //Inicialización de RGB START: el LED RGB y el zumbador se utilizan como indicador de estado del sistema int redPin = D6; int greenPin = D1; int bluePin = D0; int buzzPin = D7; //Inicializando RGB FIN /* Crear una instancia de la biblioteca RFID */ #if defined(_USE_SOFT_SPI_) RFID RC522(SS_PIN, RST_PIN, MOSI_PIN, MISO_PIN, SCK_PIN); // SPI de software #else RFID RC522(SS_PIN, RST_PIN); // SPI de hardware #endif //const char* NOMBRE_WEBHOOK = "rfid_uid"; const char* NOMBRE_WEBHOOK = "Ubidots"; Ubidots ubidots("webhook", UBI_PARTICLE); void setup() { Serial.begin(9600); // WiFi.listen(); pinMode(redPin, SALIDA); pinMode(greenPin, SALIDA); pinMode(bluePin, SALIDA); pinMode(buzzPin, SALIDA); // Configuración de credenciales para una nueva conexión WiFi /* Esta sección solo es necesaria si desea conectarse a una nueva red WiFi después de la configuración inicial. Esto solo funcionará si se han borrado las credenciales WiFi actuales. El código se ejecutará SOLO UNA VEZ al iniciar y establecer las nuevas credenciales especificadas. Una vez establecidas las nuevas credenciales, este código no se volverá a ejecutar. */ 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_) /* Habilitar la interfaz HW SPI */ SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); SPI.begin(); #endif /* Inicializar el lector RFID */ RC522.init(); delay(5000); digitalWrite(bluePin, HIGH); digitalWrite(greenPin, HIGH); digitalWrite(redPin, LOW); } void loop() { /* Contador de bucle temporal */ uint8_t i; /* ¿Se ha detectado una tarjeta? */ if (RC522.isCard()) { /* Si es así, obtener su número de serie */ 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 = el nombre de tu webhook str = los datos que quieres publicar PRIVADOS o PÚBLICOS */ // Particle.publish("RFID_WP", str, PRIVATE); //Publicar datos en la base de datos de Wordpress // Particle.publish("XLS", str, PRIVATE); // Publicar datos en Hojas de cálculo de Google Serial.print(str); /* Agrega pares clave-valor de contexto */ ubidots.addContext("UID", str); char* context = (char *) malloc(sizeof(char) * 60); /* Construye el contexto con la matriz anterior para enviar a Ubidots */ ubidots.getContext(context); ubidots.add("UID", 1, context); // Cambio para el nombre de tu variable bool bufferSent = false; bufferSent = ubidots.send(WEBHOOK_NAME, PUBLIC); // Usará webhooks particle para enviar datos //} // - 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(pinazul, ALTO); digitalWrite(pinverde, ALTO); digitalWrite(pinrojo, BAJO); digitalWrite(pinbuzz, BAJO); } delay(500); }
Extremos delanteros:
Gracias a la función de webhook de la consola Particle , pude publicar el código sin problemas prácticamente en cualquier lugar. Si conoces PHP y MySQL bien, podrías escribir tu propio script del lado del servidor, pero para quienes son nuevos en esto, como yo, recomiendo los siguientes dos servicios:
Son muy diferentes, así que te recomiendo que las analices para determinar cuál se adapta mejor a tus necesidades. En resumen, si quieres que los datos se publiquen en tiempo real en la ubicación que elijas, Zapier (o similar) es la mejor opción. Si no te importa almacenar los datos en el servidor de otra persona, Ubidots es mucho más rentable (coste por dato) y además cuenta con prácticos widgets para presentar tus datos gráficamente. Adjunto una captura de pantalla de un ejemplo Dashboard que creé en Ubidots.
- Crédito de la foto: Migal Vanas
En retrospectiva:
Inicialmente pensé que construir un indicador de batería que funcione fuera del microcontrolador era la mejor idea, ya que funcionaría de forma independiente y liberaría pines digitales muy necesarios, pero la desventaja es que, sin una entrada analógica enviada al MC, no se puede mostrar la duración de la batería en un dashboard. El LM3914N también requiere algunos cálculos para establecer volutas de referencia y determinar qué resistencias usar dependiendo de la diferencia de voltaje entre el estado de "carga completa" y "agotado". Tenga en cuenta que, por razones prácticas, debería trabajar con 3,1 V en la batería, ya que la mayoría de los componentes agotados no funcionarán por debajo de 3 V o comenzarán a comportarse esporádicamente. Seis de uno, supongo.
Tampoco volvería a usar 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 mucho mejor idea... es solo una idea.
Imprescindible:
El mayor aprendizaje para mí fue el efecto que cualquier metal o circuito tendrá en un lector RFID. Diseñé, construí y probé toda la unidad, primero 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 del lector RFID. La consecuencia… ¡No hubo escaneos! 😲 Como medida temporal, envolví la batería con cinta aislante eléctrica, lo cual funcionó bastante bien. Pedí ferrita en Amazon como un adelanto y, como por arte de magia, la interferencia desapareció.
Gracias a todos los que colaboraron con el proyecto de alguna manera, a @ScruffR por comprender que todos teníamos que empezar por algún lado y por su gran paciencia 🙂 También un enorme agradecimiento a @Joe de Particle por los fantásticos kits Maker. ¡¡¡Espero con ansias más proyectos!!!
Archivos:
Esquema de Eagle - DESCARGAR
Archivo del Eagle Board - DESCARGAR
Genial, ¿verdad? Como prometí... Aquí encontrarás algunas de las preguntas que Friedl amablemente respondió.
P/ ¿Qué te hizo empezar en el ecosistema IoT ?
R/ Siempre me ha apasionado la tecnología y mi deseo de crear cosas nuevas encaja perfectamente en el sector IoT . Desarrollar cosas nuevas que puedan mejorar la vida es lo que más me gusta.
P/ ¿Por qué probaste muchas plataformas?
R/ Como soy completamente nuevo en IoT y no me apasiona programar, buscaba una plataforma fácil de usar y rentable, en lugar de escribir por mi cuenta. Descubrí que la mayoría de las plataformas están diseñadas pensando en los usuarios experimentados, lo que dificulta mucho el trabajo de alguien nuevo en IoT. Incluso algunos usuarios experimentados podrían considerar que dedican demasiado tiempo a configurar sistemas innecesariamente complejos. Dado que mi enfoque principal es el desarrollo de productos y el diseño de PCB, era imperativo encontrar una solución que pudiera comprender y empezar a usar rápidamente.
P/ ¿Qué aprendiste de cada uno de ellos?
R/ La mayoría de las plataformas parecen intimidantes de aprender y muy caras si no se tiene cuidado. Los bajos costos iniciales o las versiones gratuitas pueden tentar fácilmente a usar el producto, pero en cuanto se empieza a transmitir datos en vivo, resulta bastante caro.
P/ ¿Por qué decidiste trabajar con Ubidots?
A/ Ubidots demostró ser lo mejor de ambos: fácil de aprender, bastante económico y con una política de uso de datos justa. Además, ¡el soporte fue excelente! La interfaz gráfica es bastante fácil de entender y la opción de etiqueta personalizada es interesante, aunque un poco cara.
Realmente espero que esta historia te inspire a comenzar a construir y experimentar con tus propios IoT , y mejor aún, esperamos que uses Ubidots para aprovechar al máximo tus esfuerzos y habilitar tu proceso.