sábado, 13 de outubro de 2018

Conversor HX711: Balança Digital com Sensor de Peso e Arduino Uno



As balanças Digitais eletrônicas são utilizadas para diversas finalidades em diversas áreas como:
Indústria alimentícia;
Pesagem de caminhões;
Pesagem de aeronaves;
Contagem de peças;
Indústria química;
Metalúrgica;
Construção civil.

Uma balança digital é basicamente formada por célula de carga, amplificador e conversor AD (Conversor HX711).
A Célula de Carga

A Célula de carga nada mais é que um sensor de força. São capazes de medir deformações mecânicas, ou seja, à medida que o corpo sofre uma deformação a resistência fixada no corpo dessa célula é alterada.
Célula de Carga

Com a alteração da resistência é possível determinar a deformação causada pela força aplicada, essa resistência é um circuito ponte de Wheatstone. Veja a ponte na figura abaixo:
Ponte de Wheatstone

Quando R1=R2=R3=R4 a ponte estará em equilíbrio, assim o valor medido pelo voltímetro (Vm) será de 0V, mas quando variamos o potenciômetro R4 a ponte entra em desequilíbrio assim o voltímetro acusará um valor de tensão. Obviamente que na célula de carga não teremos esse potenciômetro e sim como já citado uma resistência que será variada de acordo com a deformação do corpo da célula. A célula de carga dispõe de meia ponte, e para completar uma ponte foram utilizadas duas células de carga.
Módulo Conversor HX711

O módulo conversor HX711 é um conversor analógico digital de 24 bits que também funciona como um amplificador, assim mantendo o nível de sinal dentro da faixa de operação do conversor.
Módulo conversor HX711

Pinagem do módulo conversor HX711:

E+: pino que alimentará a célula (+);
E-: pino que alimentará a célula (-);
A+: sinal da célula de carga;
A-: sinal da célula de carga;

VCC: alimentação positiva;
GND: alimentação negativa;
DOUT: conectada ao pino digital do Arduino;
SCK: conectada ao pino digital do Arduino.
Tela Osciloscópio Com Canal 1 e Canal 2

No canal 1 (amarelo) do osciloscópio temos conectado o pino DOUT e no canal 2 (azul) temos conectado o pino SCK do módulo conversor HX711. O pino SCK envia 25 pulsos sendo que o 24º pulso indica o fim da conversão e o 25º pulso indica que a próxima conversão tem que ser no canal A com ganho de 128. No pino DOUT temos a informação já convertida em digital e quando o pino SCK envia o 24º indicando que a conversão terminou o pino DOUT vai para nível lógico alto.
Quando o pino DOUT vai para nível lógico baixo, significa que o mesmo está pronto para a conversão aguardando o primeiro pulso do SCK para que esta conversão seja iniciada.
Montando o Circuito da Balança com o Arduino

Abaixo, segue o esquema elétrico da ligação das células de carga, a ligação do Arduino com o Módulo Conversor HX711 e as células de carga e a fixação das células: Ligação de Duas Células de Carga
Ligação do Arduino, Módulo Conversor HX711 e Células de Carga
Células de Carga Sob a Plataforma Circuito Montado com Módulo Conversor HX711, Sensor de Carga e Arduino

Materiais Utilizados
2 Unidades – Sensores de Peso 50Kg Célula de Carga
1 Unidade –Módulo Conversor HX711
1 Unidade – Plataforma 9 cm x 16 cm
1 Unidade – Arduino Uno
1 Unidade – Jumpers (Macho – Fêmea)

É importante que a parte inferior fique suspensa para que o efeito de deformação obtenha efeito, neste caso foi utilizada fita dupla face.

Programação

Será necessário desenvolver duas programações, uma para calibrar a balança e outra para mostrar o peso.

Para calibrar a balança é necessário seguir os passos abaixo:
Colocar um peso conhecido sobre a plataforma;
Através das teclas, ajustar o valor deste peso (você verá o valor do peso pelo monitor serial);
Retirar o peso da plataforma e zerar o peso da balança pela tecla t ( tara);
Repetir os 3 primeiros passos até obter o peso correto

Quando sua balança estiver pesando corretamente, guarde o valor de fator de calibração e utilize – o no programa seguinte para mostrar o peso correto no monitor serial.

Calibração
#include "HX711.h" #define DOUT 2 #define CLK 3 HX711 peso(DOUT, CLK); // instancia Balança HX711 float calibration_factor = 34730; // fator de calibração para teste inicial void setup() { Serial.begin(9600); Serial.println(); Serial.println("Calibracao da Balança"); peso.set_scale(); // configura a escala da Balança zerapeso (); // zera a Balança }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "HX711.h"

#define DOUT 2
#define CLK 3

HX711 peso(DOUT, CLK); // instancia Balança HX711

float calibration_factor = 34730; // fator de calibração para teste inicial

void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Calibracao da Balança");

peso.set_scale(); // configura a escala da Balança
zerapeso (); // zera a Balança
}

Explicando o Código de Calibração
#include "HX711.h" #define DOUT 2 #define CLK 3 HX711 peso(DOUT, CLK); // instancia Balança HX711 float calibration_factor = 34730; // fator de calibração para teste inicial


1
2
3
4
5
6
7
8
#include "HX711.h"

#define DOUT 2
#define CLK 3

HX711 peso(DOUT, CLK); // instancia Balança HX711

float calibration_factor = 34730; // fator de calibração para teste inicial


No trecho acima foi incluída a biblioteca do módulo Conversor HX711 através deste link.
Foram definidos quais pinos do Arduino serão ligados os pinos do HX711 DOUT e CLK. Em seguida foi criado o objeto peso HX711 peso(DOUT, CLK) para os pinos DOUT e CLK, ou seja, este objeto poderá estar dentro de funções e enviar ou guardar dados.
Temos também o valor do fator de calibração para testes iniciais float calibration_factor = 34730.
void setup() { Serial.begin(9600); Serial.println(); Serial.println("Calibracao da Balança"); peso.set_scale(); // configura a escala da Balança zerapeso (); // zera a Balança }


1
2
3
4
5
6
7
8
9
void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Calibracao da Balança");

peso.set_scale(); // configura a escala da Balança
zerapeso (); // zera a Balança
}


No trecho acima configuramos a porta serial do Arduino e “printamos “ no monitor serial da IDE uma mensagem inicial de calibração. A escala da balança é configurada peso.set_scale() e a rotina de zerar o peso é chamada.
void zerapeso () { Serial.println(); peso.tare(); // zera a Balança Serial.println("Zerando a Balança "); }


1
2
3
4
5
6
void zerapeso ()
{
Serial.println();
peso.tare(); // zera a Balança
Serial.println("Zerando a Balança ");
}


Temos a rotina de zerar o peso com a função peso.tare()e em seguida é enviada para o monitor serial uma mensagem de que a balança foi zerada.
void loop() { peso.set_scale(calibration_factor); // ajusta fator de calibração Serial.print("Peso: "); Serial.print(peso.get_units(), 2); // imprime peso da balança com 3 casas decimais Serial.print(" kg"); Serial.print(" Fator de Calibração: "); // imprime no monitor serial Serial.println(calibration_factor); // imprime fator de calibração delay(500) ;


1
2
3
4
5
6
7
8
9
void loop()
{
peso.set_scale(calibration_factor); // ajusta fator de calibração
Serial.print("Peso: ");
Serial.print(peso.get_units(), 2); // imprime peso da balança com 3 casas decimais
Serial.print(" kg");
Serial.print(" Fator de Calibração: "); // imprime no monitor serial
Serial.println(calibration_factor); // imprime fator de calibração
delay(500) ;


Logo a seguir se inicia o programa principal onde o fator de calibração é ajustado de acordo com a sua seleção, depois o peso é impresso no monitor serial com duas casas decimais Serial.print(peso.get_units(), 2), o valor do fator de calibração também é enviado para o monitor serial Serial.println(calibration_factor)
if (Serial.available()) // reconhece letra para ajuste do fator de calibração { char temp = Serial.read(); if (temp == '+' || temp == 'a') // a = aumenta 10 calibration_factor += 10; else if (temp == '-' || temp == 'z') // z = diminui 10 calibration_factor -= 10; else if (temp == 's') // s = aumenta 100 calibration_factor += 100; else if (temp == 'x') // x = diminui 100 calibration_factor -= 100; else if (temp == 'd') // d = aumenta 1000 calibration_factor += 1000; else if (temp == 'c') // c = diminui 1000 calibration_factor -= 1000; else if (temp == 'f') // f = aumenta 10000 calibration_factor += 10000; else if (temp == 'v') // v = dimuni 10000 calibration_factor -= 10000; else if (temp == 't') zerapeso (); // t = zera a Balança } }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (Serial.available()) // reconhece letra para ajuste do fator de calibração
{
char temp = Serial.read();
if (temp == '+' || temp == 'a') // a = aumenta 10
calibration_factor += 10;
else if (temp == '-' || temp == 'z') // z = diminui 10
calibration_factor -= 10;
else if (temp == 's') // s = aumenta 100
calibration_factor += 100;
else if (temp == 'x') // x = diminui 100
calibration_factor -= 100;
else if (temp == 'd') // d = aumenta 1000
calibration_factor += 1000;
else if (temp == 'c') // c = diminui 1000
calibration_factor -= 1000;
else if (temp == 'f') // f = aumenta 10000
calibration_factor += 10000;
else if (temp == 'v') // v = dimuni 10000
calibration_factor -= 10000;
else if (temp == 't') zerapeso (); // t = zera a Balança
}
}


No trecho acima se tivermos algum dado na serial if (Serial.available() as funções abaixo serão executadas. Essas funções se referem ás teclas do computador que irão aumentar ou diminuir o valor do fator de calibração, onde:
a,s,d,f irão aumentar respectivamente o fator de calibração em : 10,100,1000 e 10000.
z,x,c,v irão diminuir respectivamente o fator de calibração em: 10,100,1000 e 10000.
A letra t irá zerar o peso da balança.
Explicando o Código: Valor do Peso no Monitor Serial
#include "HX711.h" #define DOUT 2 #define CLK 3 HX711 bau(DOUT, CLK); // instancia Balança HX711 float calibration_factor = 34730; // fator de calibração aferido na Calibração void setup() { Serial.begin(9600); bau.set_scale(calibration_factor); // ajusta fator de calibração bau.tare(); // zera a Balança } void loop() { Serial.print("Peso: "); Serial.print(bau.get_units(), 2); // imprime peso na balança com duas casas decimais Serial.println(" kg"); // imprime no monitor serial delay(500) ; if (Serial.available()) // se a serial estiver disponivel { char temp = Serial.read(); // le carcter da serial if (temp == 't' || temp == 'T') // se pressionar t ou T { bau.tare(); // zera a balança Serial.println(" Balança zerada"); // imprime no monitor serial } } }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "HX711.h"

#define DOUT 2
#define CLK 3

HX711 bau(DOUT, CLK); // instancia Balança HX711

float calibration_factor = 34730; // fator de calibração aferido na Calibração

void setup()
{
Serial.begin(9600);
bau.set_scale(calibration_factor); // ajusta fator de calibração
bau.tare(); // zera a Balança
}

void loop()
{
Serial.print("Peso: ");
Serial.print(bau.get_units(), 2); // imprime peso na balança com duas casas decimais
Serial.println(" kg"); // imprime no monitor serial
delay(500) ;
if (Serial.available()) // se a serial estiver disponivel
{
char temp = Serial.read(); // le carcter da serial
if (temp == 't' || temp == 'T') // se pressionar t ou T
{
bau.tare(); // zera a balança
Serial.println(" Balança zerada"); // imprime no monitor serial
}
}
}


A diferença desta programação para a anterior é que não teremos a rotina de zerar a balança e nem das teclas de ajuste de fator de calibração para calibrar a balança. Agora teremos somente a tecla tara para zerar o valor do peso.

Imagem do Circuito Montado Com Peso Valores no monitor serial com um peso de 500g sobre a balança
Valores no monitor serial sem a balança sem peso

Que tal adicionar um display LCD nesta balança ou até implementá-la em uma aplicação industrial?
Monte uma balança com 4 células de carga (uma em cada ponta da plataforma) para aumentar a precisão da sua balança.
Envie seu projeto para nós usando a hashtag #ProjetoComBau e visite nossa loja.

http://blog.baudaeletronica.com.br/conversor-hx711-para-balanca-eletronica/