Lector de RFID móvil: un proyecto de kit de fabricantes utilizando 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 .
Hoy en día, 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 empresas a crear un futuro basado en datos.
Recientemente, Friedl aceptó el reto de crear un IoT desde cero. Al principio, sus conocimientos edge el tema eran limitados. Sin embargo, gracias a la investigación que realizó y a numerosos 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 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 encuentra en el Particle Community . Friedl también la compartió amablemente con 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:
- Módulo lector de 3 tarjetas MFRC522
- Batería LiPo de 3,7 V y
- 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
- Interruptor de inclinación 1
- 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 PCB completamente ensamblada con el LED de estado "OK ", así como el LM3914N en funcionamiento, indicando una batería con una carga de ±90 %. (7 de 8 LED)
Envié los archivos Gerber a PCBWAY y en menos de una semana tenía mis nuevas PCB personalizadas listas para ensamblar.
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:
Difieren enormemente, así que échale un vistazo a ambos para determinar cuál es el más adecuado para ti. En resumen, si quieres que los datos se publiquen en tiempo real en la ubicación que elijas, Zapier (o algo similar) es la mejor opción. Si no te importa almacenar datos en el servidor de otra persona, Ubidots es una opción mucho más rentable (costo por punto de datos) y cuenta con la ventaja adicional de algunos widgets ingeniosos para presentar tus datos de forma gráfica. Adjunto una captura de pantalla de un Dashboard que construí 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 ayudaron con el proyecto de alguna manera. @ScruffR por comprender que todos teníamos que empezar por algún lado y por su paciencia extrema. 🙂 También muchas gracias a @Joe de Particle por los increíbles kits de creación. ¡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.