Que tal montar uma balança
digital utilizando um ESP32 e um sensor, mais conhecido como célula de carga?
Pois hoje, vou te mostrar como fazer isso através de um processo que te
possibilita também outros testes de laboratório, como identificar
a força que um motor efetua sobre um ponto, entre outros exemplos.
.
Vou, então, demonstrar alguns conceitos relacionados ao uso de células de carga, capturar dados da célula para construir uma balança de exemplo e apontar outras possíveis aplicações das células de carga.
Recursos usados
·
ESP WiFi Lora 32 da Heltec
·
Célula de carga (0 à 50 newtons, aproveitada de
uma balança)
·
1 potenciômetro de 100k (melhor se utilizar um
trimpot multivoltas para ajuste fino)
·
1 Amp Op LM358
·
2 resistores de 1M5
·
2 resistores de 10k
·
1 resistor de 4k7
·
Fios
·
Protoboard
·
Cabo usb para o ESP
·
Uma balança, recipiente com volume graduado ou
qualquer outro método para calibração.
Demonstração
Células de carga
·
São transdutores de força.
·
Podem utilizar de vários métodos para traduzir a
força aplicada em uma grandeza proporcional que pode ser utilizada como medida.
Entre os mais comuns estão os que utilizam extensômetros de folha, o efeito
piezoeléctrico, hidráulica, cordas vibrantes...
·
Podem também ser classificadas pela forma de
medida (tensão ou compressão)
Células de carga e extensômetros
·
Extensômetros de folha são filmes (comumente de
plástico) com um fio impresso cuja resistência pode variar com sua mudança de
dimensão.
·
Sua construção visa principalmente converter uma
deformação mecânica em uma variação de uma grandeza elétrica (resistência).
Preferencialmente em uma única direção, para que a avaliação de componentes
possa ser efetuada. Para isso é comum a combinação de vários extensômetros.
·
Quando corretamente fixado em um corpo, sua
deformação é igual a do corpo. Assim, sua resistência varia com a deformação do
corpo, que por sua vez está relacionada a força deformadora.
·
São conhecidos também com strain gauge.
·
Quando alongados por uma força de tensão, os
fios alongam-se e estreitam-se, aumentando a resistência.
·
Quando comprimidos por uma força de compressão,
os fios se encurtam e alargam-se, diminuindo a resistência.
Ponte de Wheatstone
·
Para uma medida mais precisa e para permitir uma
detecção mais eficiente da variação da resistência em uma célula de carga, os
strain gauge são montados formando uma ponte de Wheatstone.
·
Nesta configuração, podemos determinar a variação
da resistência através do desequilíbrio da ponte.
·
Se R1=Rx e R2=R3, os divisores de tensão serão
iguais e as tensões Vc e Vb também serão iguais, estando a ponte em equilíbrio.
Ou seja, Vbc = 0V;
·
Se Rx for diferente de R1, a ponte estará
desequilibrada e a tensão Vbc será diferente de zero.
·
É possível demostrar como essa variação deverá
ocorrer, mas aqui, faremos uma calibração direta, relacionando o valor lido no
ADC a uma massa aplicada à célula de
carga.
Amplificação
·
Mesmo utilizando a ponte de Wheatstone para
tornar a leitura mais eficiente, as micro deformações no metal da célula de
carga produzem pequenas variações de tensão entre Vbc.
·
Para resolver esta situação, vamos utilizar dois
estágios de amplificação. Um para determinar a diferença e outro para adequar o
valor obtido ao ADC do ESP.
Amplificação (esquema)
·
O ganho da etapa de subtração é dado por R6/R5 e
é o mesmo que R7/R8.
·
O ganho da etapa final não-inversora é dado por
Pot/R10
Coleção de dados para calibração
·
Depois de montado, ajustamos o ganho final para
que o valor da maior massa medida fosse próximo do valor máximo do ADC. No
caso, para 2kg aplicados na célula, a tensão de saída estava por volta de 3V3.
·
Em seguida, variamos a massa aplicada, conhecida
através de uma balança e para cada valor, associamos uma leitura do ADC, obtendo
a tabela ao lado.
Obtendo a função de relação entre a massa medida e o valor do ADC obtido
Utilizamos o software
PolySolve para obter um polinômio que represente a relação entre a massa e o
valor do ADC.
Código-fonte - #Includes
Agora que já temos como obter
as medidas e conhecemos a relação entre o ADC e a massa aplicada, podemos passar
para a escrita do software de fato.
//Bibliotecas para utilização do display oLED #include <Wire.h> // Necessário apenas para o Arduino 1.6.5 e anterior #include "SSD1306.h" // o mesmo que #include "SSD1306Wire.h"
Código-fonte - #Defines
//Os pinos do OLED estão conectados ao ESP32 pelos seguintes GPIO's: //OLED_SDA -- GPIO4 //OLED_SCL -- GPIO15 //OLED_RST -- GPIO16 #define SDA 4 #define SCL 15 #define RST 16 //RST deve ser ajustado por software
Código-fonte – Variáveis e constantes globais
SSD1306 display(0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display" const int amostras = 10000; //número de amostras coletadas para a média const int pin = 13; //pino de leitura
Código-fonte – Setup()
void setup() { pinMode(pin, INPUT); //pino de leitura analógica Serial.begin(115200); //iniciando a serial // Inicia o display display.init(); display.flipScreenVertically(); //Vira a tela verticalmente }
Código-fonte – Loop()
void loop() { float medidas = 0.0;//variável para manipular as medidas float massa = 0.0; //variável para armazenar o valor da massa //inicia a coleta de amostras do ADC for (int i = 0; i < amostras; i++) { medidas = medidas + float(analogRead(pin)); } medidas = (medidas / float(amostras));//Tira a média das amostras massa = calculaMassa(medidas); //Calcula a massa em gramas //Ao iniciar, exibirá uma mensagem por 5 segundos //para só depois mostrar as medidas realizadas if (millis() > (5000)) //se está ligado a mais que 5 segundos { //Envia um CSV contendo o instante, a medida média do ADC e o valor em gramas //para a Serial. Serial.print (millis() / 1000.0, 0); //instante em segundos Serial.print( " , "); Serial.print(medidas, 3);//valor médio obtido no ADC Serial.print( " , "); Serial.println((massa), 1); //massa em gramas //Escreve no buffer do display display.clear(); //Limpa o buffer do display //ajusta o alinhamento para a esquerda display.setTextAlignment(TEXT_ALIGN_LEFT); //ajusta a fonte para Arial 16 display.setFont(ArialMT_Plain_16); //Escreve no buffer do display a massa display.drawString(0, 0, "Massa: " + String(int(massa)) + "g"); //escreve no buffer o valor do ADC display.drawString(0, 30, "ADC: " + String(int(medidas))); } else //se está ligado a menos de 5 segundos { display.clear(); //limpa o buffer do display display.setTextAlignment(TEXT_ALIGN_LEFT); //Ajusta o alinhamento para a esquerda display.setFont(ArialMT_Plain_24); //ajusta a fonte para Arial 24 display.drawString(0, 0, "Balança"); //escreve no buffer display.setFont(ArialMT_Plain_16);//Ajusta a fonte para Arial 16 display.drawString(0, 26, "ESP-WiFi-Lora"); //escreve no buffer } display.display();//transfere o buffer para o display delay(50); }
Código-fonte – Função calculaMassa()
//função para cálculo da massa obtida pela regressão //usando oPolySolve float calculaMassa (float medida) { return -6.798357840659e+01 + 3.885671618930e-01 * medida + 3.684944764970e-04 * medida * medida + -3.748108838320e-07 * medida * medida * medida + 1.796252359323e-10 * medida * medida * medida * medida + -3.995722708150e-14 * medida * medida * medida * medida * medida + 3.284692453344e-18 * medida * medida * medida * medida * medida * medida; }
Iniciando e medindo
Faça o download dos arquivos
6 Comentários
Professor Fernando o senhor é o melhor , eu estava procurando algo exatamente o que senhor propos so que quero uma balança que meça até 100kg mais ajudou muito
ResponderExcluirO link para o arquivo .ino não esta funcionando.
ResponderExcluirSe receber o peso e mostrar no celular via html fica mais interessante. Trabalha com nada que foi apresentado ainda.
ResponderExcluirProfessor, poderia me dar alguma sugestão para o ESP32 realizar a leitura de até 8 células de carga? Obrigado.
ResponderExcluirProfessor, preciso desse Polysolve que você usou. É um programa? Ou web?
ResponderExcluirGostaria de ver esse projeto com ESP32-Wroom + HX711 + Display LCD 20x4 com I2C Backlight Azul
ResponderExcluir