A luva inteligente para ciclistas





Traduzido de instructables.com, autor do projeto: Matlek



Neste artigo descreverei em detalhes o processo de confecção de uma "luva inteligente" e seu painel de LED, projetado para aumentar a segurança de ciclistas e outras pessoas que viajam na estrada. Primeiro, você pode ver uma pequena demonstração de como funciona:





Como funciona



A luva contém uma placa Arduino que coleta dados do giroscópio e do acelerômetro. O código usa o modelo tinyML de "minúsculo aprendizado de máquina" e reconhece gestos: cada movimento da mão é analisado e transformado em um sinal (a mão é inclinada para a esquerda, direita, para frente, para trás etc.). O sinal é enviado via Bluetooth (BLE) para outro microcontrolador ao qual está conectada uma matriz de LED (que, por exemplo, pode ser acoplada a uma mochila). De acordo com o sinal recebido, a matriz emite certas sequências de caracteres - para que outros pilotos e ciclistas possam entender o que o ciclista vai fazer (por exemplo, podem ser setas para a esquerda, direita ou texto).



















Origem do projeto



Em primeiro lugar, vou de bicicleta para o trabalho e passo mais de uma hora por dia no selim (viajando cerca de 22 km). É sempre interessante, mas moro em uma das cidades mais populosas da França, onde costumam ocorrer acidentes com carros e ciclistas. Marselha também é a pior cidade para ciclistas na França - há uma escassez desesperada de ciclovias . Portanto, este projeto visa tanto aumentar a segurança dos ciclistas quanto tentar chamar a atenção das autoridades municipais para este problema.



Em segundo lugar, este projeto ajudará todos os membros do movimento a se comunicarem e se compreenderem melhor. Do meu ponto de vista, a maioria dos problemas que ocorrem na estrada se deve ao fato de alguns usuários não entenderem os outros, o que resultou em medo e depois em agressão. Eu gostaria que esse dispositivo ajudasse os participantes do tráfego a se entenderem melhor. As setas indicam a direção, e você também pode exibir o texto por carta (no entanto, eu defendo total e completamente inscrições educadas e construtivas, a fim de evitar conflitos).



Por que luva inteligente?



Comecei a trabalhar no projeto no inverno e o frio me motivou a prender o dispositivo na luva. Mas logo percebi que a ideia não era muito boa, porque na nossa região faz bastante calor no verão. Então decidi que seria melhor colocar o dispositivo em uma caixa e prendê-lo no meu braço. Mas como não sabia dar um nome diferente, decidi deixar a palavra “luva” no título.



"Inteligente" vem da técnica de aprendizado de máquina que usei neste projeto.



Inspiração



O projeto é basicamente uma mistura de dois outros projetos. Não comecei do zero, mas usei suas melhores práticas, que desenvolvi posteriormente. Aqui está o que me inspirou ao desenvolver:



  • reconhecimento de gestos com Arduino Nano 33 BLE SENSE.
  • não um projeto específico, mas o conceito de uso de arranjos de LED para ciclistas. Existem muitos desses projetos - alguns usam mochilas com painéis integrados, outros oferecem apenas uma matriz pronta que pode ser colocada em qualquer lugar. Em qualquer caso, essas matrizes de LED são controladas por um controle remoto ao invés de reconhecimento de gestos.


Componentes



Para impressão 3D - uma impressora 3D ou acesso a uma.



Eletrônicos



  • Arduino Nano 33 BLE SENSE;
  • Outro MI com BLE (Arduino Nano 33 BLE, Arduino 33 BLE SENSE, Arduino nano 33 IOT, ESP32, etc.). Decidi usar uma placa ESP32.
  • Faixa de LED (WS2812B). Usei 160 LEDs para criar uma matriz 20x8;
  • Tampão de 4 níveis de 3 V a 5 V: 74AHCT125.
  • Capacitor 1000 uF.
  • Interruptores SPST, 3 peças.
  • Tábua de pão.
  • Fios.
  • Bateria 9 V.
  • Bateria externa.




  • 3.
  • -.


1: (, )











Depois de ler um artigo sobre Arduino e aprendizado de máquina, decidi fazer uma tentativa também. Como várias placas Arduino Nano surgiram recentemente, fiz uma placa de comparação para fazer a melhor escolha antes de comprar.







Todas as placas são interessantes, mas eu só poderia usar uma para reconhecimento de gestos - Arduino Nano 33 BLE SENSE. Só ela tem os sensores certos e o suporte Tensorflow Lite. Outro ponto interessante é que as placas Arduino Nano 33 IOT, BLE e BLE SENSE possuem seu próprio Bluetooth, então qualquer uma delas pode ser usada na matriz de LED para receber sinais BLE.



O código carregado na placa é baseado em muitos programas diferentes do Arduino que encontrei durante o desenvolvimento. Portanto, antes de começar a trabalhar, decidi testá-los com os exemplos que encontrei.



Vamos jogar com BLE



Neste projeto, a comunicação Bluetooth é crítica porque é assim que o sinal é enviado dos sensores para a matriz de LED. Antes disso, eu nunca tinha conectado duas placas Arduino ao BLE. Então, pratiquei com os seguintes exemplos da biblioteca ArduinoBLE :



  • O esboço LedControl usado com a placa Arduino Nano 33 BLE Sense e um botão com um resistor pull-up conectado ao pino 2. O exemplo pesquisa os periféricos BLE até encontrar um serviço com UUID 19b10000-e8f2-537e-4f6c-d104768a1214. Depois de detectá-lo e estabelecer uma conexão, ele controlará remotamente o LED BLE periférico pressionando um botão.
  • Sketch para LED e Arduino Nano 33 IoT.


Infelizmente, tive muitos problemas com o esboço das placas de LED - 3 "quebraram" durante o carregamento. Não tenho ideia de qual era o problema, mas decidi substituir a placa Arduino por outra MI com BLE - a placa ESP32. Com a nova placa, usei o seguinte:



  • BLE_write sketch da biblioteca BLE ESP32 ARDUINO. Eu adicionei algumas mudanças para fazê-lo funcionar com a placa Arduino Nano 33 BLE SENSE. Na etapa 10, você pode comparar o esboço BLE_write e o esboço de matriz Smartglove_BLE_LED que escrevi e carreguei.


Vamos brincar com os LEDs RGB integrados



Você sabia que a placa Arduino Nano 33 BLE SENSE tem LEDs RGB integrados? Neste projeto, eles serão úteis para verificar o correto funcionamento do reconhecimento de gestos. Temos que verificar se o sinal foi enviado para a matriz de LED - no entanto, como o painel provavelmente está nas costas do ciclista, será difícil para ele entender que o reconhecimento de gestos funcionou e o sinal foi enviado.



Não havia nada complicado aqui, eu apenas ajustei um pouco o exemplo do Blink . O código mostra que o LED vermelho está no pino 22, verde no pino 23, azul no pino 24. Sinal de entrada LOW liga o LED, HIGH - desliga.



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);                       //  
}


Vamos brincar com o reconhecimento de gestos e tinyML



Por fim, estudei o tutorial sobre como usar o aprendizado de máquina no Arduino e pratiquei com um exemplo de reconhecimento de gestos. O exemplo é dividido em três partes principais:



  • Reconhecimento de dados com o programa IMU_Capture (e Arduino Nano 33 BLE sense);
  • Treinamento de modelo sobre os dados registrados no google colab (em um computador);
  • Usando um modelo Arduino treinado com IMU_Classifier para reconhecimento de padrões (novamente em uma placa Arduino).


Etapa 2: luva 1/6 (eletrônica)























Das etapas 2 a 7, forneço o mesmo diagrama, indicando as etapas nele para que seja mais fácil para você entender o processo de fazer uma luva.



O circuito eletrônico da luva é muito simples:



  • Placa Arduino.
  • Bateria de 9V (uso uma bateria recarregável).
  • Interruptor SPST.


Etapa 3: luva 2/6 - corpo











































O caso é simples e consiste em apenas duas partes, impressas em uma impressora 3D:



  • A parte amarela contém a placa Arduino, bateria e switch. Orifícios na caixa permitem recarregar a bateria e reprogramar a placa Arduino sem ter que desmontar a caixa.
  • A parte preta é a tampa que protege a bateria e a placa.


Eu prendo na minha mão com uma tira de velcro.



Também desenhei um logotipo, que colei na tampa. Ele representa um ciclista sendo visto de cima e tem três setas - para frente, para a esquerda e para a direita. A quarta flecha é separada das outras três porque as bicicletas não andam para trás.



arquivos



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



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



content.instructables.com/NORIG9SZ3. stl



Etapa 4: luva 3/6: gravação de dados































Depois de montar o dispositivo, é hora de gravar os dados. O objetivo é registrar cada gesto várias vezes. Eu defino o limite do giroscópio e, quando ele ultrapassa esse valor, o Arduino começa a enviar os dados registrados para o monitor.



Gravei os seguintes gestos:



  • A mão aponta para a esquerda (um gesto padrão do ciclista para virar à esquerda).
  • Frenagem (gesto com os dedos alcançando a alavanca do freio).
  • A mão se inclina para trás.
  • A mão se inclina para frente.
  • A mão se inclina para a esquerda.
  • A mão se inclina para a direita.


Naturalmente, você pode gravar seus gestos.



Para registrar os dados, escrevi um programa que alterna as cores do LED a cada 20 cursos. Isso me ajudou a entender quando passar para outro gesto. Eu conectei o Arduino ao meu computador, abri o programa de rastreamento de portas e coloquei o laptop na minha mochila.



Depois de gravar todos os gestos, passei para a última etapa - copiei a saída de dados para o programa e salvei em formato csv.



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



Etapa 5: luva 4/6: treinamento















Para treinamento, usei o exemplo a seguir , corrigindo apenas algumas linhas nele. Antes do treino, vale a pena verificar se para cada gesto você tem seu próprio arquivo csv, e os dados de cada arquivo referem-se a este gesto em particular.



No site do Google Colab, use o link na seção "Upload de dados" para enviar seus dados.



Na seção "Dados do gráfico (opcional)", adicione o nome de um dos arquivos.



filename = "Arm_left.csv"



Em seguida, corrija esta linha para gerar apenas os dados do giroscópio:



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


Comente as seguintes linhas - não usamos dados do 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()


Na seção "Analisar e preparar os dados", adicione todos os nomes de arquivo:



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


Altere o número de amostras em um gesto se você os alterou no código do Arduino:



#SAMPLES_PER_GESTURE = 119
SAMPLES_PER_GESTURE = 64


Resta apenas comentar a aceleração:



# 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
      ]


Depois de passar por todo o programa, você pode baixar o modelo treinado.



arquivos



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



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



content.instructables.com/ORIG8/FQ csv



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



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



content.in7EA8Fstru2.com .csv



Etapa 6: Luva 5/6:







Código do Arduino Meu código final da luva inteligente é uma mistura dos seguintes programas:



  • exemplo "LED" da biblioteca "ArduinoBLE" (Periférico> LED).
  • "IMU_Classifier" daqui .


Não vou expandi-los em detalhes aqui, apenas recomendo a leitura dos programas originais para entender melhor o que está acontecendo.



Adicione seu modelo ao código e você pode testá-lo!



arquivos



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



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



Etapa 7: luva 6/6: testes



















Como você pode ver no vídeo, o LED acende de forma diferente dependendo do gesto reconhecido:





Etapa 8: Matriz de 1/4 LED: Eletrônica























Como mencionei, ao carregar um esboço da biblioteca ArduinoBLE para um LED no Arduino Nano 33 BLE SENSE, tive alguns problemas. Então decidi usar ESP32 em vez desta placa. Portanto, nas fotos acima você pode ver os dois painéis.



Como as placas Arduino Nano 33 BLE SENSE e ESP32 operam com lógica de 3,3 V, adicionei um buffer de 4 níveis de 3 V a 5 V (74AHCT125) conforme recomendado nas instruções de Adafruit .



Eu também adicionei um capacitor de 100uF para proteger o LED de picos de tensão repentinos.



Montei todo o circuito em uma placa de ensaio.



Percebe-se que usei os dois conectores da fonte de alimentação externa, pois tinha medo que a matriz de LED exigisse muita corrente. Portanto, a matriz e o MI são alimentados por conectores diferentes de uma fonte de alimentação externa.



Etapa 9: Matriz de LED 2/4: Corpo























































Eu precisava de uma caixa de matriz LED pré-fabricada. Portanto, ele consiste em várias partes (e também porque minha impressora 3D é muito pequena), e forneci orifícios para os parafusos nelas.



Usei Velcro novamente para prender o painel.



arquivos



content.instructables.com/ORIG/FH6/TB4H/K9N93ZZJ/FH6TB4HK9N93ZZJ.stl



content.instructables.com/ORIG/FK3/BZPC/K9N93ZZK/FK3BZPCK9N93ZZK.stl



content.instruct.ZKstruct.ZL93 stl



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



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



content.inelq / vf9qq .stl



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



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



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



























O código resultante é uma mistura dos seguintes códigos (e suas modificações):

  • Exemplo BLE_Write da biblioteca BLE ESP32 ARDUINO.
  • Exemplo de MatrixGFXDemo64 da biblioteca FastLED NeoMatrix.




Não vou expandi-los em detalhes aqui, apenas recomendo a leitura dos programas originais para entender melhor o que está acontecendo.



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



Etapa 11: matriz LED 4/4: teste











É hora de verificar tudo! Após o reconhecimento de cada gesto, um sinal é enviado para a matriz de LED, e mostra um determinado padrão. Pode-se observar que os LEDs da luva acendem de acordo com o gesto reconhecido.







Etapa 12: testes finais e conclusão











É assim que parece ao vivo:







Estou muito satisfeito com o dispositivo resultante. Graças ao projeto, me sinto muito mais confiante com o tinyML e o BLE. Desde então, comprei outro Arduino Nano 33 IOT, e agora estou envolvido em um projeto muito interessante, sobre o qual falarei mais tarde. O que eu mudaria na segunda versão do dispositivo que descrevi:



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


Levei vários meses para concluir o projeto e escrever este texto. Se algo não estiver claro ou algum arquivo estiver faltando, escreva nos comentários do artigo original .



Veja também:






All Articles