El guante inteligente para ciclistas





Traducido de instructables.com, autor del proyecto: Matlek



En este artículo describiré en detalle el proceso de fabricación de un "guante inteligente" y su panel LED, diseñado para aumentar la seguridad de ciclistas y otras personas que viajan en la carretera. Primero, puede ver una pequeña demostración de cómo funciona:





Cómo funciona



El guante contiene una placa Arduino que recopila datos del giroscopio y el acelerómetro. El código utiliza el modelo tinyML de "aprendizaje automático diminuto" y reconoce los gestos: cada movimiento de la mano se analiza y se convierte en una señal (la mano se inclina hacia la izquierda, derecha, adelante, atrás, etc.). La señal se envía vía Bluetooth (BLE) a otro microcontrolador al que se conecta una matriz de LED (que, por ejemplo, se puede acoplar a una mochila). De acuerdo con la señal recibida, la matriz genera ciertas secuencias de caracteres, para que otros ciclistas y ciclistas puedan entender lo que va a hacer el ciclista (por ejemplo, pueden ser flechas hacia la izquierda, la derecha o el texto).



















Origen del proyecto



En primer lugar, voy en bicicleta al trabajo y paso más de una hora al día en el sillín (viajando unos 22 km). Siempre es interesante, pero vivo en una de las ciudades más pobladas de Francia, donde son frecuentes los accidentes de coches y ciclistas. Además, Marsella es la peor ciudad para ciclistas de Francia: hay una escasez desesperada de carriles bici . Por lo tanto, este proyecto está dedicado tanto a aumentar la seguridad de los ciclistas como a tratar de llamar la atención de las autoridades de la ciudad sobre este problema.



En segundo lugar, este proyecto ayudará a todos los miembros del movimiento a comunicarse y entenderse mejor entre sí. Desde mi punto de vista, la mayoría de los problemas que ocurren en la vía están asociados con el hecho de que algunos usuarios de la vía no entendieron a otros, lo que resultó en miedo y luego en agresión. Me gustaría que este dispositivo ayudara a los participantes del tráfico a entenderse mejor entre sí. Las flechas muestran la dirección, y también puede mostrar el texto por letra (sin embargo, defiendo total y completamente las inscripciones educadas y constructivas, para evitar conflictos).



¿Por qué Smart Glove?



Comencé a trabajar en el proyecto en invierno y el clima frío me motivó a colocar el dispositivo en mi guante. Pero pronto me di cuenta de que la idea no era muy buena, porque en nuestra zona hace bastante calor en verano. Entonces decidí que sería mejor colocar el dispositivo en una caja y sujetarlo a mi brazo. Pero como no sabía cómo nombrarlo de otra manera, decidí dejar la palabra "guante" en el título.



"Smart" proviene de la técnica de aprendizaje automático que utilicé en este proyecto.



Inspiración



El proyecto es básicamente una mezcla de otros dos proyectos. No comencé desde cero, sino que utilicé sus mejores prácticas, que luego desarrollé más. Esto es lo que me inspiró al desarrollar:



  • reconocimiento de gestos con Arduino Nano 33 BLE SENSE.
  • no es un proyecto específico, sino el concepto de usar matrices LED para ciclistas. Hay muchos proyectos de este tipo: algunos usan mochilas con paneles integrados, otros solo ofrecen una matriz lista para usar que se puede colocar en cualquier lugar. En cualquier caso, estas matrices LED se controlan mediante un control remoto en lugar de reconocimiento de gestos.


Componentes



Para impresión 3D: una impresora 3D o acceso a una.



Electrónica



  • Arduino Nano 33 BLE SENSE;
  • Otro MI con BLE (Arduino Nano 33 BLE, Arduino 33 BLE SENSE, Arduino nano 33 IOT, ESP32, etc.). Decidí usar una placa ESP32.
  • Tira de LED (WS2812B). Usé 160 LED para crear una matriz de 20x8;
  • Búfer de 4 niveles de 3V a 5V: 74AHCT125.
  • Condensador 1000 uF.
  • Interruptores unipolares, 3 uds.
  • Tabla de pan.
  • Alambres
  • Batería 9 V.
  • Batería externa.




  • 3.
  • -.


1: (, )











Después de leer un artículo sobre Arduino y el aprendizaje automático, decidí probarlo también. Dado que últimamente ha habido varias placas Arduino Nano nuevas, hice una placa de comparación para tomar la mejor decisión antes de comprar.







Todas las placas son interesantes, pero solo podría usar una para el reconocimiento de gestos: Arduino Nano 33 BLE SENSE. Solo ella tiene los sensores adecuados y la compatibilidad con Tensorflow Lite. Otro punto interesante es que las placas Arduino Nano 33 IOT, BLE y BLE SENSE tienen su propio Bluetooth, por lo que cualquiera de ellas se puede utilizar en la matriz de LED para recibir señales BLE.



El código cargado en la placa se basa en muchos programas Arduino diferentes que encontré durante el desarrollo. Por eso, antes de empezar a trabajar, decidí probarlos con los ejemplos que encontré.



Juguemos con BLE



En este proyecto, la comunicación Bluetooth es fundamental porque así es como se envía la señal desde los sensores al conjunto de LED. Antes de eso, nunca había conectado dos placas Arduino sobre BLE. Así que practiqué con los siguientes ejemplos de la biblioteca ArduinoBLE :



  • El boceto de LedControl usado con la placa Arduino Nano 33 BLE Sense y un botón con una resistencia pull-up conectada al pin 2. El ejemplo sondea los periféricos BLE hasta que encuentra un servicio con UUID 19b10000-e8f2-537e-4f6c-d104768a1214. Después de detectarlo y establecer una conexión, controlará de forma remota el LED BLE del periférico presionando un botón.
  • Boceto para LED y Arduino Nano 33 IoT.


Desafortunadamente, tuve muchos problemas con el boceto del LED: 3 placas se "rompieron" al cargarlo. No tengo idea de cuál era el problema, pero decidí reemplazar la placa Arduino con otra MI con BLE: la placa ESP32. Con la nueva placa, utilicé lo siguiente:



  • BLE_write boceto de la biblioteca BLE ESP32 ARDUINO. Agregué algunos cambios para que funcione con la placa Arduino Nano 33 BLE SENSE. En el paso 10, puede comparar el boceto BLE_write y el boceto de matriz Smartglove_BLE_LED que escribí y cargué.


Juguemos con los LED RGB incorporados



¿Sabías que la placa Arduino Nano 33 BLE SENSE tiene LED RGB incorporados? En este proyecto, serán útiles para comprobar el correcto funcionamiento del reconocimiento de gestos. Tenemos que verificar que la señal se haya enviado a la matriz de LED; sin embargo, dado que el panel probablemente esté en la espalda del ciclista, será difícil para él entender que el reconocimiento de gestos funcionó y que se envió la señal.



No había nada complicado aquí, solo modifiqué un poco el ejemplo de Blink . El código muestra que el LED rojo está en el pin 22, verde en el pin 23, azul en el pin 24. La señal de entrada LOW enciende el LED, HIGH - lo apaga.



const int LED_BUILTIN_RED = 22;
const int LED_BUILTIN_GREEN = 23;
const int LED_BUILTIN_BLUE = 24;

//  setup        
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN_RED, OUTPUT);
  pinMode(LED_BUILTIN_GREEN, OUTPUT);
  pinMode(LED_BUILTIN_BLUE, OUTPUT);
}

//  loop  
void loop() {
  digitalWrite(LED_BUILTIN_RED, LOW);   //  LED (HIGH –  )
  delay(1000);                       //  
  digitalWrite(LED_BUILTIN_RED, HIGH);    //  LED,    LOW
  delay(1000);                       //   

digitalWrite(LED_BUILTIN_GREEN, LOW);   //  LED (HIGH –  )
  delay(1000);                       //  
  digitalWrite(LED_BUILTIN_GREEN, HIGH);    //  LED,    LOW
  delay(1000);   //  
  
  digitalWrite(LED_BUILTIN_BLUE, LOW);   //  LED (HIGH –  )
  delay(1000);                       //  
  digitalWrite(LED_BUILTIN_BLUE, HIGH);    //  LED,    LOW
  delay(1000);                       //  
}


Juguemos con el reconocimiento de gestos y tinyML



Finalmente, estudié el tutorial sobre el uso del aprendizaje automático en Arduino y practiqué con un ejemplo de reconocimiento de gestos. El ejemplo se divide en tres partes principales:



  • Reconocimiento de datos con el programa IMU_Capture (y Arduino Nano 33 BLE sense);
  • Modelo de entrenamiento sobre los datos registrados en google colab (en una computadora);
  • Usando un modelo Arduino entrenado con IMU_Classifier para el reconocimiento de patrones (nuevamente en una placa Arduino).


Paso 2: guante 1/6 (electrónica)























De los pasos 2 al 7, proporciono el mismo diagrama, indicando los pasos para que le sea más fácil comprender el proceso de fabricación de un guante.



El circuito electrónico del guante es muy sencillo:



  • Placa Arduino.
  • Batería de 9V (yo uso batería recargable).
  • Interruptor SPST.


Paso 3: guante 2/6 - cuerpo











































El caso es simple y consta de solo dos partes, impresas en una impresora 3D:



  • La parte amarilla contiene la placa Arduino, la batería y el interruptor. Los agujeros en el estuche le permiten recargar la batería y reprogramar la placa Arduino sin tener que desmontar el estuche.
  • La parte negra es la tapa que protege la batería y la placa.


Lo coloco en mi mano con una tira de velcro.



También dibujé un logo, que luego pegué a la tapa. Representa a un ciclista visto desde arriba y tiene tres flechas: hacia adelante, hacia la izquierda y hacia la derecha. La cuarta flecha está separada de las otras tres porque las bicicletas no retroceden.



Archivos



content.instructables.com/ORIG/FS2/L3M3/K9N93ZYW/FS2L3M3K9N93ZYW.stl



content.instructables.com/ORIG/F72/21NG/K9N93ZZG/F7221NGK9N93ZZG.stl



content.instructables.com/F3IG9SZG stl



Paso 4: guante 3/6: registro de datos































Después de ensamblar el dispositivo, es hora de escribir datos. El objetivo es grabar cada gesto varias veces. Establezco el umbral para el giroscopio, y cuando supera este valor, el Arduino comienza a enviar los datos grabados al monitor.



Grabé los siguientes gestos:



  • La mano apunta hacia la izquierda (un gesto de ciclista estándar para girar a la izquierda).
  • Frenado (gesto con los dedos para alcanzar la palanca del freno).
  • La mano se echa hacia atrás.
  • La mano se inclina hacia adelante.
  • La mano se inclina hacia la izquierda.
  • La mano se inclina hacia la derecha.


Naturalmente, puede grabar sus gestos.



Para registrar los datos, escribí un programa que cambia los colores del LED cada 20 golpes. Me ayudó a entender cuándo pasar a otro gesto. Conecté el Arduino a mi computadora, abrí el programa de seguimiento de puertos y puse la computadora portátil en mi mochila.



Después de registrar todos los gestos, pasé a la última etapa: copié la salida de datos al programa y la guardé en formato csv.



content.instructables.com/ORIG/FC7/B0JT/K9UEA78V/FC7B0JTK9UEA78V.ino



Paso 5: guante 4/6: entrenamiento















Para el entrenamiento, utilicé el siguiente ejemplo , corrigiendo solo unas pocas líneas. Antes de entrenar, vale la pena verificar que para cada gesto tenga su propio archivo csv, y los datos en cada archivo se refieren a este gesto en particular.



En el sitio web de Google Colab, use el enlace en la sección "Cargar datos" para cargar sus datos.



En la sección "Datos del gráfico (opcional)", agregue el nombre de uno de los archivos.



filename = "Arm_left.csv"



Luego corrija esta línea para que solo genere los datos del giroscopio:



#index = range(1, len(df['aX']) + 1)
index = range(1, len(df['gX']) + 1)


Comente las siguientes líneas: no utilizamos datos de acelerómetro:



#plt.plot(index, df['aX'], 'g.', label='x', linestyle='solid', marker=',')
#plt.plot(index, df['aY'], 'b.', label='y', linestyle='solid', marker=',')
#plt.plot(index, df['aZ'], 'r.', label='z', linestyle='solid', marker=',')
#plt.title("Acceleration")
#plt.xlabel("Sample #")
#plt.ylabel("Acceleration (G)")
#plt.legend()
#plt.show()


En la sección "Analizar y preparar los datos", agregue todos los nombres de archivo:



#GESTURES = ["punch", "flex",]
GESTURES = ["Arm_left", "Brake", "Hand_back-tilt", "Hand_front-tilt", "Hand_left-tilt", "Hand_right-tilt"]


Cambie la cantidad de muestras con un gesto si las cambió en el código Arduino:



#SAMPLES_PER_GESTURE = 119
SAMPLES_PER_GESTURE = 64


Solo queda comentar la aceleración:



# normalize the input data, between 0 to 1:
# - acceleration is between: -4 to +4
# - gyroscope is between: -2000 to +2000
      tensor += [
          #(df['aX'][index] + 4) / 8,
          #(df['aY'][index] + 4) / 8,
          #(df['aZ'][index] + 4) / 8,
          (df['gX'][index] + 2000) / 4000,
          (df['gY'][index] + 2000) / 4000,
          (df['gZ'][index] + 2000) / 4000
      ]


Después de pasar por todo el programa, puede descargar el modelo entrenado.



Archivos



content.instructables.com/ORIG/F7A/GLEK/K9UEA8Z5/F7AGLEKK9UEA8Z5.csv



content.instructables.com/ORIG/FV1/853G/K9UEA8Z6/FV1853GK9UEA8Z6.csv



content.instructables.com/ORIG8/FQK csv



content.instructables.com/ORIG/F7N/P7AG/K9UEA8Z9/F7NP7AGK9UEA8Z9.csv



content.instructables.com/ORIG/FD4/WZRM/K9UEA8ZA/FD4WZRMK9UEA8ZA.csv



content.in7ea8struct2.com .csv



Paso 6: Guante 5/6: Código para Arduino







Mi código final de guante inteligente es una mezcla de los siguientes programas:



  • un ejemplo de "LED" de la biblioteca "ArduinoBLE" (Periférico> LED).
  • "IMU_Classifier" desde aquí .


No los ampliaré en detalle aquí, solo recomiendo leer los programas originales para comprender mejor lo que está sucediendo.



¡Agrega tu modelo al código y podrás probarlo!



Archivos



content.instructables.com/ORIG/F9N/4SBK/K9UEA98M/F9N4SBKK9UEA98M.h



content.instructables.com/ORIG/FKZ/ODO9/KB52VXZK/FKZODO9KB52VXZK.ino



Paso 7: guante 6/6: pruebas



















Como puede ver en el video, el LED se ilumina de manera diferente según el gesto reconocido:





Paso 8: Matriz LED 1/4: Electrónica























Como ya mencioné, al cargar un boceto de la biblioteca ArduinoBLE para un LED en el Arduino Nano 33 BLE SENSE, encontré algunos problemas. Entonces decidí usar ESP32 en lugar de esta placa. Por tanto, en las fotos de arriba puedes ver ambos tableros.



Dado que las placas Arduino Nano 33 BLE SENSE y ESP32 operan con lógica de 3.3V, agregué un búfer de 4 niveles de 3V a 5V (74AHCT125) como se recomienda en las instrucciones de Adafruit .



También agregué un capacitor de 100uF para proteger el LED de subidas repentinas de voltaje.



Monté todo el circuito en una placa de pruebas.



Se puede ver que utilicé ambos conectores de la fuente de alimentación externa, porque temía que la matriz LED necesitara demasiada corriente. Por lo tanto, la matriz y el MI se alimentan desde diferentes conectores de una fuente de alimentación externa.



Paso 9: LED Array 2/4: Cuerpo























































Necesitaba una caja de matriz LED prefabricada. Por lo tanto, consta de varias partes (y también porque mi impresora 3D es muy pequeña), y les he proporcionado agujeros para los pernos.



Usé Velcro nuevamente para sujetar el panel.



Archivos



content.instructables.com/ORIG/FH6/TB4H/K9N93ZZJ/FH6TB4HK9N93ZZJ.stl content.instructables.com/ORIG/FK3/BZPC/K9N93ZZK/FK3BZPCK9N93ZZK.stl



content.instructJFLUK9Nl93.stl



content.instructJFLUK9Nl93 stl



content.instructables.com/ORIG/F38/BF1P/K9N93ZZM/F38BF1PK9N93ZZM.stl



content.instructables.com/ORIG/FJC/DQMY/K9N93ZZN/FJCDQMYK9N93ZZN.stl



content.inel /qvf9qfr .stl



content.instructables.com/ORIG/FJE/C5FG/K9N93ZZR/FJEC5FGK9N93ZZR.stl



content.instructables.com/ORIG/F55/1X43/K9N93ZZS/F551X43K9N93ZZS.stl



Paso 10: Matriz de LED 3/4: Código Arduino



























El código resultante es una mezcla de los siguientes códigos (y su modificación):

  • Ejemplo de BLE_Write de la biblioteca BLE ESP32 ARDUINO.
  • Ejemplo de MatrixGFXDemo64 de la biblioteca FastLED NeoMatrix.




No los ampliaré en detalle aquí, solo recomiendo leer los programas originales para comprender mejor lo que está sucediendo.



content.instructables.com/ORIG/FIR/RETZ/KB52VXP4/FIRRETZKB52VXP4.ino



Paso 11: matriz de LED 4/4: prueba











¡Es hora de comprobarlo todo! Después de reconocer cada gesto, se envía una señal a la matriz de LED y muestra un patrón determinado. Se puede ver que los LED del guante se iluminan según el gesto reconocido.







Paso 12: pruebas finales y conclusión











Así es como se ve en vivo:







Estoy muy satisfecho con el dispositivo resultante. Gracias al proyecto, me siento mucho más seguro con tinyML y BLE. Desde entonces, compré otro Arduino Nano 33 IOT, y ahora estoy involucrado en un proyecto muy interesante, del que escribiré más adelante. ¿Qué cambiaría en la segunda versión del dispositivo que describí?



  • «». , . - - , . .
  • . , USB . , . .
  • . , . , ( 20 ). – , .


Me tomó varios meses completar el proyecto y escribir este texto. Si algo no está claro, o falta algún archivo, escriba los comentarios al artículo original .



Ver también:






All Articles