Lector RFID móvil: un proyecto Maker Kit que utiliza Particle & Ubidots
Durante los últimos años, Ubidots se ha asociado con Particle para lograr un objetivo final; permitiendo la creación rápida, fácil y eficiente de IoT .
Avancemos hasta el día de hoy y estamos orgullosos de afirmar que ambos productos se están utilizando para acelerar IoT a nivel global . Desde emprendedores y empresas emergentes hasta empresas grandes y pequeñas, estamos ayudando a las empresas a crear el futuro impulsado por los datos.
Recientemente, Friedl asumió el desafío de crear un IoT desde cero. Desde el principio, los conocimientos de Friedl sobre el tema eran limitados. Sin embargo, gracias a la investigación que realizó -y a muchos videos de Youtube-, tomó confianza en utilizar una variedad de herramientas para materializar su objetivo; Crear un lector RFID móvil sin ser un IoT .
Después de lograr este sorprendente resultado, nos pusimos en contacto con Friedl para felicitarlo por su éxito y aprender de su logro. También queríamos compartir esta historia con la comunidad Ubidots porque creemos que es una historia para inspirar y 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 sitio de Particle Community . Friedl también lo ha compartido 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 como tal, sino simplemente una muestra del producto. Como he recibido mucha ayuda del Foro de Partículas, he decidido publicar mis archivos y código Eagle para que estén disponibles para cualquiera que quiera usarlos.
Supongo que tiene conocimientos básicos del entorno de Particle, webhooks y ha configurado su cuenta y dispositivos en Particle Console. De lo contrario, hágalo antes de intentar esta compilación.
El resumen:
Construir un escáner RFID verdaderamente inalámbrico (móvil) con el propósito de escanear tarjetas RFID, capturar los UID de estas tarjetas y publicarlos en cualquiera de ellas;
Lista de materiales:
- Módulo lector de 3 tarjetas MFRC522
- Batería LiPo de 3,7 V 1
- de batería 1 módulo
- LM394N 1
- Montón de LED 0603 para indicador de batería
- 2 x LED RGB para el estado del sistema y el estado de lectura de la tarjeta
- Fotón de partículas
- Interruptor deslizante - Alimentación principal
- Interruptor de inclinación 1
- PCB de diseño personalizado (de PCBWAY o similar )
- Gabinete de diseño personalizado
- Varias resistencias 0603
- Ferrita 2 !!!
Lo primero es lo primero:
Si eres como yo, un simple prototipo de gabinete genérico no será suficiente, así que puse un poco más de esfuerzo, conocí Rhinoceros y diseñé un gabinete simple pero elegante (o al menos eso pensé) que mostraría la partícula fotón y algunos otros componentes.
Además de esto, decidí no optar por una placa de prototipos genérica porque ODIO absolutamente los cables. Incluí una imagen de mi intento inicial de hacer una placa "bonita" usando una placa proto y cables de puente, pero después de un par de horas me di cuenta de que simplemente no funcionaba. Otra curva de aprendizaje más: busqué en Google, pasé un par de horas en YouTube y logré orientarme en Autodesk Eagle. Vale la pena cada minuto invertido.
***La última imagen indica la PCB completamente ensamblada con el LED de estado que indica "OK ", así como el LM3914N en acción que indica ±90% de batería cargada. (7 de 8 LED)
Envié los archivos Gerber a PCBWAY y en menos de una semana tenía mis nuevos PCB personalizados listos para ensamblar.
Lo importante:
Ahora, la codificación, esta es la parte con la que más me cuesta, pero gracias a un caballero servicial en los foros de Particle y Hackster, se me ocurrió el siguiente código. Probablemente no sea el código más limpio jamás escrito, pero funciona, así que siéntete libre de usarlo y mejorarlo si lo deseas.
// Proyecto: Registro de asistencia RFID móvil // Un proyecto de FireFli (PTY) LTD // Fecha: julio de 2019 // Compilado por: Friedl Basson // Detalles: Escaneo de UID desde tarjetas RFID y publicación mediante webhooks en UbiDots , mySQL DB o Google Sheets // Créditos: ¡Un agradecimiento especial a la comunidad de Particle por ayudar y hacer posible este proyecto! // Firmware: V2.1.1 //Modo de sistema// - comente si configurará WiFi a través de la aplicación Particle y no necesita conectarse a otra red inalámbrica después de hacerlo //SYSTEM_MODE(SEMI_AUTOMATIC); // Esta declaración #include fue agregada automáticamente por Particle IDE. #include "RFID.h" #include < Ubidots .h> /* Defina los pines utilizados para los pines SS (SDA) y RST (reset) para AMBOS hardware y software SPI */ #define SS_PIN A2 #define RST_PIN D2 /* Defina los pines utilizados para los pines DATA OUT (MOSI), DATA IN (MISO) y CLOCK (SCK) para SOFTWARE SPI SOLAMENTE */ #define MOSI_PIN D3 #define MISO_PIN D4 #define SCK_PIN D5 //Iniciando RGB START - RGB LED y el zumbador se utiliza como indicador de estado del sistema int redPin = D6; int pinverde = D1; intpinazul = D0; int buzzPin = D7; //Inicializando RGB END /* Crea una instancia de la biblioteca RFID */ #if definido(_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); configuración vacía() { Serial.begin(9600); // WiFi.escuchar(); pinMode(pinrojo, SALIDA); pinMode(pinverde, 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á SÓLO UNA VEZ al inicio y establecerá las nuevas credenciales especificadas. Una vez que se establezcan nuevas credenciales, este código no se volverá a ejecutar. */ WiFi.on(); if (!WiFi.hasCredentials()) { WiFi.setCredentials("SSID", "CONTRASEÑA", WPA2, WLAN_CIPHER_AES); } WiFi.conectar(); esperar hasta (WiFi.listo); Partícula.connect(); #if !definido(_USE_SOFT_SPI_) /* Habilitar la interfaz HW SPI */ SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); SPI.begin(); #endif /* Inicializa el lector RFID */ RC522.init(); retraso(5000); escritura digital (pinazul, ALTA); escritura digital (pinverde, ALTO); escritura digital (pin rojo, BAJO); } void loop() { /* Contador de bucle temporal */ uint8_t i; /* ¿Se ha detectado una tarjeta? */ if (RC522.isCard()) { /* Si es así, obtenga su número de serie */ RC522.readCardSerial(); cadena de caracteres [16]; snprintf(cadena, tamaño de(cadena), "%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 = tus datos que deseas publicar PRIVADOS o PÚBLICOS */ // Particle.publish("RFID_WP", str, PRIVATE); // Publicar datos en Wordpress DB // Particle.publish("XLS", str, PRIVATE); // Publicar datos en Google Sheets Serial.print(str); /* Agrega pares clave-valor de contexto */ ubidots .addContext("UID", str); char* contexto = (char *) malloc(sizeof(char) * 60); /* Crea el contexto con la matriz anterior para enviarlo a Ubidots */ ubidots .getContext(context); ubidots .add("UID", 1, contexto); // Cambia el nombre de tu variable bool bufferSent = false; bufferSent = ubidots .send(WEBHOOK_NAME, PUBLIC); // Utilizará webhooks de partículas para enviar datos //} // - PRUEBE Ubidots - // // digitalWrite(buzzPin, HIGH); retraso(500); escritura digital (buzzPin, BAJO); escritura digital (pinazul, BAJO); retraso(750); escritura digital (pinazul, ALTA); } más si (RC522.isCard()) { RC522.readCardSerial(); cadena de caracteres [16]; snprintf(cadena, tamaño de(cadena), "%02X %02X %02X %02X", RC522.serNum[0], RC522.serNum[1], RC522.serNum[2], RC522.serNum[3]); escritura digital (pinazul, BAJO); escritura digital (pinverde, BAJO); escritura digital (pinrojo, ALTO); // digitalWrite(buzzPin, ALTO); retraso(1000); escritura digital (pinazul, ALTA); escritura digital (pinverde, ALTO); escritura digital (pin rojo, BAJO); escritura digital (buzzPin, BAJO); } retraso(500); }
Extremos frontales:
Gracias a la función de webhook en Particle Console, pude publicar el código sin problemas en casi cualquier lugar. Ahora bien, si conoce bastante bien PHP y MySQL, es posible que pueda escribir su propio script del lado del servidor, pero para aquellos que son nuevos en esto como yo, recomendaría los dos servicios siguientes;
Se diferencian mucho, por lo que puede echar un vistazo a ambos para determinar cuál es más adecuado para su uso. En pocas palabras, si desea que los datos se publiquen en vivo en una ubicación de su elección, Zapier (o algo similar) es el camino a seguir. Si no le importa almacenar datos en el servidor de otra persona, Ubidots es una forma mucho más rentable (costo por punto de datos) y tiene el beneficio adicional de algunos ingeniosos widgets para presentar sus 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 funcionara fuera del microcontrolador era la mejor idea, ya que funcionaría de forma independiente y liberaría pines digitales muy necesarios, pero la desventaja de esto es que sin enviar una entrada analógica al MC. , no puedes 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 "completamente cargado" y "agotado". Tenga en cuenta que por todas las razones prácticas debe trabajar con 3,1 V en la batería, ya que la mayoría de los componentes no funcionarán por debajo de 3 V o comenzarán a comportarse esporádicamente. Seis de 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 un "parpadeo". Un simple interruptor táctil parece una idea mucho mejor... solo una idea.
Imprescindible:
La mayor curva de aprendizaje aquí para mí fue el efecto que tendrá cualquier metal o circuito y 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 lector RFID. La consecuencia…. Sin escaneos 😲 Como medida temporal, envolví la batería en cinta aislante eléctrica, lo que funcionó “bien”. Pedí ferrita a Amazon como Ave María y, como por arte de magia, la interferencia fue cosa del pasado.
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 mostrar extrema paciencia 🙂 También un gran agradecimiento a @Joe de Particle por los increíbles Maker Kits. Esperamos más proyectos!!!
Archivos:
Esquema del Águila - DESCARGAR
Archivo de tablero Eagle - DESCARGAR
Impresionante, ¿verdad? Ahora, como prometí... Aquí encontrará algunas de las preguntas que Friedl amablemente respondió.
P/ ¿Qué te hizo iniciarte en el ecosistema IoT ?
R/ Siempre me ha gustado la tecnología y mis ganas de crear cosas nuevas encajan 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 gusta mucho la codificación, estaba buscando una plataforma fácil de usar que también fuera rentable en lugar de escribir la mía propia. Descubrí que la mayoría de las plataformas se diseñaron teniendo en cuenta la experiencia de los usuarios, lo que hace que sea muy difícil para alguien nuevo en IoT . Incluso algunos usuarios experimentados podrían dedicar demasiado tiempo a configurar un sistema innecesariamente complicado. Como mi enfoque es principalmente el desarrollo de productos, diseño de productos y PCB, era imperativo encontrar una solución que pudiera comprender y comenzar a usar rápidamente.
P/ ¿Qué aprendiste de cada uno de ellos?
R/ La mayoría de las plataformas parecen difíciles de aprender y muy caras si no se tiene cuidado. Los bajos costos iniciales o las versiones “gratuitas” pueden fácilmente atraerlo a usar el producto, pero tan pronto como comience a transmitir datos en vivo, resultará bastante costoso.
P/ ¿Por qué decidiste optar por Ubidots ?
R/ 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 de esto, ¡el apoyo fue excelente! La GUI es bastante fácil de entender y la opción de etiqueta personalizada es interesante, aunque un poco cara.
Realmente espero que esta historia lo inspire a comenzar a construir y modificar sus propios IoT de diferentes tipos y, mejor aún, esperamos que utilice Ubidots para aprovechar sus mejores esfuerzos para habilitar su proceso.