Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Uma palmilha inteligente faça você mesmo para verificar sua distribuição de pressão

Componentes e suprimentos

Arduino MKR1000
× 1
Resistência sensível à força
Usei o modelo 402 da Interlink
× 3
OpenBuilds Wire Cable - By the Foot
× 1
Resistor 10k ohm
× 3
Power Bank
× 1
SparkFun Triple Axis Accelerometer Breakout - ADXL345
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Não se esqueça de comprar solda, termorretrátil e outros acessórios aplicáveis, caso não os tenha

Aplicativos e serviços online

Plataforma Thinger.io
Arduino IDE

Sobre este projeto


A medição de pressão já é usada em várias situações. Fornece informações sobre a mecânica da marcha e tem uma vasta gama de aplicações, ou seja, em situações clínicas e desportivas. Neste projeto, os sensores são usados ​​para obter informações sobre a distribuição de peso. A visualização em tempo real do mapeamento de pressão também é incorporada porque torna muito mais fácil entender seus dados.





Hardware necessário

  • Arduino MKR1000 - A maioria das placas de 3,3 V ou 5 V com Wi-Fi serve, mas eu não encorajaria o uso de um ESP para isso. Por alguma razão, várias placas ESP retornaram medições imprecisas durante a criação deste projeto.
  • Resistores sensíveis à força (3). Usei o Interlink 402 (100 N). Também usei um Interlink 406 mais caro, mas olhando para trás, o 402 também teria funcionado. Use mais FSRs para melhor precisão.
  • Resistores de 10K. Altere o resistor para dimensionar suas leituras para que fiquem na faixa desejada. Quanto mais altos os resistores, maiores são os incrementos. Encontre mais informações sobre isso aqui.
  • Acelerômetro, usei o 16G ADXL345. Use para medir a aceleração e o movimento do pé.
  • Um ferro de solda para juntar tudo. As pinças de crocodilo não funcionam bem em um sapato por razões óbvias.





Instalação elétrica


Algumas notas rápidas sobre o circuito:

FSR's: Ler isto antes você começar solda: seja extremamente cauteloso ao soldar os fios aos FSRs. Não tente fazer isso se não tiver certeza se possui as habilidades necessárias. Você precisa soldá-lo muito rapidamente ou o plástico derrete. Acredite em mim, descobri da maneira mais difícil ...

Não há lado positivo ou negativo em um FSR, então você não precisa se preocupar com isso.

Como mencionei anteriormente, você pode alterar os resistores para dimensionar suas leituras para que fiquem na faixa de sua preferência.

Terrestre / 5V: Como você pode ver, todos os sensores são soldados na linha 5V e no comum.

Acelerômetro: Você pode deixar o acelerômetro de fora se não precisar dele para o seu projeto. Não é necessário usá-lo se você quiser apenas medir a pressão, mas pode ser útil se você gosta de medir a aceleração ou se precisar analisar o ciclo da marcha. No entanto, não é estritamente necessário para este tutorial.





Fixação do hardware na palmilha


Eu recomendo fazer isso depois de executar o código primeiro, porque se você cometeu algum erro de soldagem, você descobrirá nesse ponto. Isso pode lhe poupar alguns problemas para anexar e reconectar o hardware à palmilha, caso você precise revender alguma coisa.

Os FSRs são fixados em três pontos da palmilha. O FSR superior esquerdo mede a eversão, o FSR superior direito mede a inversão e o FSR no calcanhar mede a pressão do calcanhar. Encontrar o local certo para os seus FSRs é uma questão de tentar. A melhor posição para fixá-los é o local onde o valor analógico mais muda durante a caminhada.

Fita é usada para segurar os fios no lugar. Se eles se moverem, podem causar interferência nas leituras FSR. Também usei fita velcro na parte inferior da sola e na parte interna do sapato para segurar a palmilha no lugar.

Prenda o acelerômetro na parte de trás do calcanhar do sapato, se você usar um. Usei fita dupla-face para isso.





Medindo as forças


Agora estamos prontos para medir as forças. Nota:nas próximas duas seções, presumo familiaridade com a biblioteca Thinger.io. Para mais informações, consulte a seção intitulada "enviar os dados através do Thinger.io".

O programa tem uma parte de cabeçalho bastante longa, incluindo as variáveis ​​necessárias para configurar as coisas, como os dados de conexão sem fio. Esta parte também inclui as variáveis ​​globais, principalmente matrizes, usadas no programa. Uma escolha importante que fiz foi usar arrays tanto quanto possível. A ideia é usar elementos de array individuais para cada sensor FSR. Portanto, neste caso, os arrays têm um comprimento de 3.

Não crie o hábito de usar muitas variáveis ​​globais, por causa de efeitos colaterais indesejados. Nós os usamos porque em vários casos eles são necessários para enviar os dados através do Thinger.io.

O código é explicado nos comentários. Percorreremos o código passo a passo. Você pode baixar o código completo abaixo.
  #define _DEBUG_ // nos permite usar o Monitor Serial 
#include
#include
#include // Acelerômetro
#include // Acelerômetro
#include // Acelerômetro
#include
#define NOME DE USUÁRIO "yourUsername"
#define DEVICE_ID "yourDeviceID"
#define DEVICE_CREDENTIAL "yourDeviceCredential"
#define SSID "yourSSID"
#define SSID_PASSWORD "yourSSIDPassword"
// * Sensores FSR * /
#define noFSRs 3 // Número de FSRs conectados
#define FSR1 A1
#define FSR2 A2
#define FSR3 A3
float fsrVoltageArray [3 ]; // A leitura analógica convertida e escalonada para tensão como um número de ponto flutuante
float fsrForceArray [3]; // A força em Newton
float fsrWeightInGramsArray [3]; // Peso convertido em gramas
int pinArray [3] ={FSR1, FSR2, FSR3}; // O pin ID para os três dispositivos
float forceMaxArray [3] ={100.0, 100.0, 100.0}; // Forças máximas suportadas
float milhões =1000000.0; // Unidade para "1 / micro
float conversionToKgrams =1.0 / 9.80665;
long K =1000;
long R =10 * K; // R em K Ohm
long Vcc =5000; // 5V =5000mV, 3,3V =3300 mV
float voltageMax =0,98 * Vcc; // Tensão máxima definida para 95% de Vcc. Defina a força para o máximo além deste valor.
Coisa ThingerWifi101 (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

Não entre em pânico se ainda não entender tudo. Fará mais sentido, uma vez que você tenha visto o resto do código.

Queremos visualizar os resultados. Para isso usamos a biblioteca Wi-Fi Thinger.io. Essa conexão é configurada por meio da seguinte linha:
  ThingerWifi101 coisa (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);  

Os argumentos de entrada são obtidos por meio de sua conta no Thinger.io, portanto, você precisa configurar isso primeiro.

Na função setup (), a conexão serial é estabelecida primeiro. Isso é seguido por uma chamada para criar a conexão sem fio.
  configuração de void (void) {
Serial.begin (115200); // Iniciar comunicação serial
thing.add_wifi (SSID, SSID_PASSWORD); // chamada para configurar a função WiFi
}
void loop (void) {
thing.handle ();
}

A seguir, definimos uma "coisa" chamada "pressão". Uma "coisa" é um conceito-chave da biblioteca Thinger.io. Ele se comporta como uma função, mas tem uma estrutura especial. É necessário enviar os dados do resultado para a nuvem. Mais detalhes sobre esta biblioteca podem ser encontrados na seção "Envio de dados pelo Thinger.io".

A "coisa" chamada "pressão" lê os valores dos três sensores FSR e os imprime no console serial. Os mesmos valores também são enviados para o canal "de saída". Dessa forma, podemos verificar facilmente os dados de entrada brutos.

Na "coisa" com o nome "voltagem", os valores de voltagem são lidos e armazenados em uma variável local chamada "fsrReading". Com a função "map", o valor é escalado, em relação aos valores mínimo e máximo suportados, e retornado ao array "fsrVoltageArray". Por meio do loop for, garantimos que cada FSR tenha sua própria localização nesta matriz de resultados.

Observe que todo o código é colocado dentro da função de configuração. Não coloque nada dentro do loop (como você provavelmente está acostumado). A biblioteca Thinger.io não aguenta isso ...
  configuração de void (void) {
Serial.begin (115200); // Iniciar comunicação serial
thing.add_wifi (SSID, SSID_PASSWORD); // chamada para configurar a função WiFi
/ * Sensores FSR * /
coisa ["pressão"]>> [] (pson e saída) {
saída ["FSR1"] =analogRead (FSR1);
Serial.print ("FSR1:");
Serial.println (analogRead (FSR1));
out ["FSR2"] =analogRead (FSR2);
Serial.print ("FSR2:");
Serial.println (analogRead (FSR2));
out ["FSR3"] =analogRead (FSR3);
Serial.print ( "FSR3:");
Serial.println (analogRead (FSR3));
};
coisa ["tensão"]>> [] (pson e saída) {
para (int FSR =0; FSR fsrVoltageArray [ FSR] =0,0; // Reinicializa os valores na entrada
fsrForceArray [FSR] =0.0;
int fsrPin =pinArray [FSR];
int fsrReading =analogRead (fsrPin);
fsrVoltageArray [FSR] =(float) map (fsrReading, 0, 1023, 0, 5000); // mude 5000 para outro valor se você não usar um dispositivo de 5V
} // fim do loop sobre FSR's
out ["FSR1voltage"] =fsrVoltageArray [0];
out ["FSR2voltage"] =fsrVoltageArray [1];
out ["FSR3voltage"] =fsrVoltageArray [2];
};
loop vazio (vazio) {
thing.handle ();
// Não coloque nenhum código aqui porque Thinger.io não vai gostar disso.
}

Após a conclusão do loop for, os valores são enviados para o canal de saída "out". Cada sensor possui uma string única, como "FSR1voltage".

A "coisa" chamada "newton" é a função mais complexa neste programa. Ele converte a tensão em uma força em Newtons. Novamente, um loop for é usado para fazer isso para cada FSR.

O cálculo é bastante complexo, porque precisamos distinguir vários casos extremos. Caso o valor da tensão seja muito pequeno ou muito grande, atribuímos um valor fixo à força. Caso a tensão esteja entre os valores de corte, uma função logarítmica é usada para calcular a força. Esta função é escolhida para reduzir a inclinação da curva.

Observe que as fórmulas são apenas aproximadas. Cada sensor pode ter uma curva (um pouco) diferente, mas para simplificar, não distinguimos isso aqui.

O valor resultante dos cálculos é armazenado na matriz "fsrForceArray". Novamente, cada FSR tem sua própria posição nesta matriz. Os três valores finais são enviados para o canal de saída "out".

A função final de "coisa" é chamada de "peso". Uma conversão direta é aplicada para retornar a força como o peso em gramas.
  thing ["newton"]>> [] (pson &out) {
for (int FSR =0; FSR // O valor de a força F em função da tensão V é calculada como:F (V) =(Fmax / Vmax) * V
float force_value =(forceMaxArray [FSR] / voltageMax) * fsrVoltageArray [FSR];
// Três situações são distinguidas:
//
// 1. Se V estiver muito próximo do máximo (conforme definido por voltageMax), o
//
// 2 . Se a força calculada F for muito pequena, nós a definimos como zero para evitar efeitos de ruído.
//
// 3. Em todos os outros casos, tomamos o valor logarítmico para reduzir o sloop e
if (fsrVoltageArray [FSR] // V não é muito alto neste branch
if (force_value <=1.00) {
fsrForceArray [FSR] =0.0; // Force é muito pequeno, defina para zero
} else {
fsrForceArray [FSR] =log10 (force_value); // O valor está certo, pegue o log disso
}
} else {
// Limite a força se a tensão estiver muito perto de Vcc (para Vcc seria infinito)
fsrForceArray [FSR] =log10 (forceMaxArray [FSR]);
Serial.print ("Corte ativado para FSR ="); Serial.println (FSR);
}
} // Fim do loop sobre FSRs
out ["FSR1newton"] =fsrForceArray [0];
out ["FSR2newton"] =fsrForceArray [1];
out ["FSR3newton"] =fsrForceArray [2];
}; // fim da coisa
coisa ["peso"]>> [] (pson e saída) {
// Cálculo direto para converter a força em Newton para o peso em gramas
para ( int FSR =0; FSR fsrWeightInGramsArray [FSR] =fsrForceArray [FSR] * conversionToKgrams * 1000.0;
}
out ["FSR1weight"] =fsrWeightInGramsArray [0];
out ["FSR2weight"] =fsrWeightInGramsArray [1];
out ["FSR3weight"] =fsrWeightInGramsArray [2];
}; // fim da coisa

Não se esqueça de configurar o painel no Thinger.io. Presumo que você saiba como isso funciona.

Dica :Se tudo funcionar conforme o esperado, seu painel deve ser semelhante a este:





Medindo a aceleração


Na verdade, isso é muito mais fácil do que medir a pressão. Precisamos adicionar algum código à parte do cabeçalho primeiro. Começamos com a inclusão das bibliotecas "Wire.h" (para se comunicar com o pino SDA e SDL), "Adafruit_Sensor.h" e "Adafruit_ADXL345_U.h". Também precisaremos de três novas variáveis ​​globais, para que possamos medir e transferir a aceleração nos eixos x, y e z

Não remova as bibliotecas que você adicionou anteriormente. Você precisará deles para se conectar ao Thinger.io.

No próximo bloco de código, verificamos se o acelerômetro responde. Do contrário, nada acontecerá. Caso contrário, a faixa é definida e uma "coisa" chamada "acelerômetro" é executada. Isso consulta o dispositivo e envia os três valores de aceleração nas direções x, y e z para o canal de saída "de saída".

Esta parte do código é semelhante ao código de amostra incluído de Adafruit (Arquivo> Exemplos> Adafruit ADXL345), mas deixei algumas partes de fora, porque não precisamos delas.
  #include  
#include
#include
/ * Atribua um ID exclusivo a este sensor no mesmo tempo * /
Adafruit_ADXL345_Unified accel =Adafruit_ADXL345_Unified (12345);
int x =0;
int y =0;
int z =0;
void setup (void) {
Serial.begin (115200);
if (! accel.begin ()) {// Inicializar o sensor
Serial.println ("Não ADXL345 detectado ");
} else {
// Intervalo para este sensor - Se você não souber o intervalo, execute o
// displayDataRate do código de exemplo do ADXL345 fornecido por Adafruit
accel.setRange (ADXL345_RANGE_16_G);
coisa ["acelerômetro"]>> [] (pson &out) {// Uma nova função "coisa" para Thinger.io
sensores_event_t evento;
accel.getEvent (&evento); // Obter um novo evento de sensor
out ["x"] =event.acceleration.x; // Exibe os resultados (a aceleração é medida em m / s ^ 2)
out ["y"] =event.acceleration.y;
out ["z"] =event.acceleration.z;
Serial.print ("X:"); Serial.print (event.acceleration.x); Serial.print ("");
Serial.print ("Y:"); Serial.print (event.acceleration.y); Serial.print ("");
Serial.print ("Z:"); Serial.print (event.acceleration.z); Serial.print (""); Serial.println ("m / s ^ 2");
}; // fim da coisa
} // fim da instrução if / else
}

Dica: depois de executar o código acima, sua saída deve ser semelhante ao exemplo mostrado abaixo





Juntando tudo


Encontre o código completo no final da página :)





Envie os dados através do Thinger.io


Esta biblioteca está bem documentada aqui, mas aqui estão algumas informações importantes para tornar as "coisas" (sem trocadilhos) mais fáceis de escrever e usar.

Thinger.io é uma biblioteca muito extensa. Nesta seção, cobrimos apenas a funcionalidade necessária e usada em nosso aplicativo. A estrutura é a seguinte (observe o ponto e vírgula ";" após a chave de fechamento "}"):
  thing []>> [] (pson &out) 
{

};

Isso é chamado de função lambda em C ++. A primeira palavra obrigatória para iniciar a definição é "coisa" e toda a função também é chamada de "coisa".

A string (por exemplo, thing ["myFirstThing"]) dá um nome à função. Cada "coisa" precisa ter um nome exclusivo.

O símbolo ">>" indica que essa "coisa" tem apenas valores de saída. Caso a entrada seja necessária, altere para "<<". Se a entrada e a saída forem necessárias, o símbolo "=" deve ser usado. Em nosso caso, temos apenas valores de saída.

O argumento "pson &out" significa que nossos valores de saída são enviados por meio de uma estrutura de dados chamada "out". O tipo de dados "pson" é muito flexível e pode conter vários tipos de variáveis, além de oferecer suporte a documentos JSON.

Em nosso código, usamos a forma "out [] =value" t o enviar valores para o display de visualização conectado com a chamada "ThingerWifi101 thing (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL)" na primeira parte do programa.

Como você deve ter notado, normalmente não há muito código dentro da função de loop. Você só precisará chamar "thing.handle ()". Você também pode chamar terminais e transmitir recursos na parte do loop. Todo o outro código é tratado nas "coisas" que você define.

O código dentro das "coisas" é executado em loop continuamente. É importante colocar seus cálculos dentro das "coisas" se seus dados são atualizados regularmente, como no nosso caso.





FAQ


Nada acontece!

Verifique seus fios. Provavelmente, algo quebrou neste nível. Se nada aparecer dentro do seu Monitor Serial, verifique se "#define _DEBUG_" está na primeira linha do seu código. O TLS também pode estar interferindo. Você pode desabilitar isso, mas tenha cuidado com isso. Verifique também se sua conexão com o Thinger.io está funcionando bem.

O resultado não é o esperado

Todo o código que precisa ser atualizado está dentro de uma "coisa"? Se estiver fora de uma "coisa", não é atualizado. Também descobri que os dispositivos ESP não funcionam bem com os sensores FSR sem motivo aparente.

O saída é não atualizado regularmente

Você adicionou algum atraso ao seu código? Remova-os :) Você pode definir a taxa de atualização no próprio Thinger.io.

Eu prefiro ter toda a saída em um gráfico

Adicione todo o código dentro de uma única "coisa"





Muito bem!


Espero que este tutorial tenha ajudado você a entender os conceitos básicos de sensores FSR, acelerômetros e Thinger.io. Eu adoraria ler qualquer sugestão para melhorar este código, e por favor, não seja tímido e compartilhe suas criações!

Código

  • Tutorial de palmilha inteligente
Tutorial de palmilha inteligente Arduino
Código completo deste tutorial
 #define _DEBUG_ // Certifique-se de que vem antes de qualquer outro include ou sua placa pode travar / * Encontre o tutorial aqui:https://www.hackster.io/projects/a5ceae*/# include  // Thinger # include  // Thinger # include  // Acelerômetro # include  // Acelerômetro # include  // Acelerômetro # definir USERNAME "yourUsername" #define DEVICE_ID "yourDevice" #define DEVICE_CREDENTIAL "yourCredential" #define SSID "yourSSID" #define SSID_PASSWORD "yourSSIDPassword" Adafruit_ADXL345_Unified accel =Adafruit_ADN345_Unified_ // Accelerometerint x =0; // Redefinir para 0 int y =0; int z =0; // * Sensores FSR * / # define noFSRs 3 // Número de FSRs conectados # define FSR1 A1 // Portas analógicas # define FSR2 A2 # define FSR3 A3 float fsrVoltageArray [3]; // A leitura analógica convertida e // escalada para tensão como um ponto flutuante // numberfloat fsrForceArray [3]; // A força em Newtonfloat fsrWeightInGramsArray [3]; // Peso convertido em gramasint pinArray [3] ={FSR1, FSR2, FSR3}; // O pin ID para // três dispositivosfloat forceMaxArray [3] ={100.0, 100.0, 100.0}; // Forças máximas // supportedfloat million =1000000.0; // Unidade para "1 / conversão de microfloatToKgrams =1.0 / 9.80665; long K =1000; long R =10 * K; // R em K Ohmlong Vcc =5000; // 5V =5000mV, 3,3V =3300 mVfloat voltageMax =0,98 * Vcc; // Tensão máxima definida para 95% de Vcc. Defina // a força para o máximo além deste //value.ThingerWifi101 coisa (USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Chamada para configurar a configuração da função de WiFi (void) {Serial.begin (115200); thing.add_wifi (SSID, SSID_PASSWORD); if (! Accel.begin ()) {// Inicialize o sensor Serial.println ("Nenhum ADXL345 detectado.");} Else {accel.setRange (ADXL345_RANGE_16_G); // Alcance para este sensor ["acelerômetro"]>> [] (pson &out) {sensores_event_t event; accel.getEvent (&event); out ["x"] =event.acceleration.x; out [ "y"] =event.acceleration.y; out ["z"] =event.acceleration.z;};} / * sensores FSR * / thing ["pressure"]>> [] (pson &out) {out ["FSR1"] =analogRead (FSR1); // Serial.print ("FSR1:"); // Serial.println (analogRead (FSR1)); out ["FSR2"] =analogRead (FSR2); // Serial .print ("FSR2:"); // S erial.println (analogRead (FSR2)); out ["FSR3"] =analogRead (FSR3); // Serial.print ("FSR3:"); // Serial.println (analogRead (FSR3)); }; coisa ["voltagem"]>> [] (pson e saída) {para (int FSR =0; FSR > [] (pson &out) {for (int FSR =0; FSR > [] (pson &out) {// Cálculo direto para converter a força em Newton para o peso em gramas para (int FSR =0; FSR  

Esquemas

Três FSR's (com divisores de tensão) e um acelerômetro.

Processo de manufatura

  1. Bartender inteligente
  2. ABB apresenta o sensor inteligente para verificar a condição do rolamento
  3. Fique esperto:O futuro da sua casa
  4. Seja inteligente com seu dólar IoT
  5. Sistema de gerenciamento de edifícios:sua passagem para uma cidade inteligente
  6. Verifique o uso de memória de seus objetos Python
  7. Uma verificação trimestral de sua cadeia de suprimentos
  8. Meça seu tempo de reação
  9. A misteriosa bomba de pressão de água pode ser o trabalhador mais difícil em sua casa
  10. Reduzindo a queda de pressão em seu sistema de ar comprimido