Uma forma comum de ler uma célula de carga via microcontrolador é utilizar o HX711. Portanto, neste post, veremos o que é o HX711 e como utilizá-lo com o Arduino e uma célula de carga para medir massas.

Informações básicas

Antes de iniciar o assunto, recomendo que você leia o post aqui do site em que expliquei o que é uma célula de carga e como ela funciona.

O que é o HX711 (e por que usá-lo?)

Conforme comentado no post que mencionei acima, o peso de um objeto em cima de uma célula de carga gera uma variação na resistência do extensômetro que existe nela. E, dependendo de como ela é ligada em um circuito, essa alteração de resistência pode ser medida por meio de uma variação de tensão. Outra coisa que comentei é que a variação de resistência é muito pequena, o que gera uma alteração também pequena de tensão (na casa dos nano volts).

Portanto, usar o conversor AD que vem embutido nos microcontroladores não é possível, já que, no caso do Arduino UNO, a menor medição dele é de alguns mili volts. Claro, se você usar um amplificador externo será possível sim medir as tensões usando o ADC do Arduino. De todo modo, uma solução mais comum é usar o CI HX711 que desempenha 2 papeis: amplificar e ler o sinal com uma resolução bem maior que a do Arduino UNO.

Ou seja, o HX711 é um conversor AD com amplificação interna, tendo sido feito especificamente para esse tipo de aplicação de leitura de células de carga. A imagem abaixo mostra um módulo comum de encontrar, que utiliza ele:

Módulo HX711

Características do HX711

Nesta seção, vou abordar os detalhes técnicos do HX711. Se você quiser ir direto para a utilização dele, é só pular para a seção seguinte.

Características

Informações retiradas do datasheet dele.

  • Alimentação: 2,7 a 5,5 V (Vcc);
  • 24 bits de resolução:
    • 16.777.216 valores entre 0 e a tensão de leitura máxima (próxima de Vcc);
    • Essa resolução faz com que ele seja capaz de ler tensões na casa das centenas de nano volts (sem considerar a amplificação). Algo como: 0,000000298 V.
  • A leitura é feita de modo diferencial: o HX711 lê a tensão que existe entre dois pontos (ao invés de ler em relação ao terra);
    • Logicamente, a leitura será feita em relação ao terra se você aterrar um dos pontos.
  • 2 canais de leituras diferenciais (A+/A- e B+/B-);
  • Ganhos:
    • 128 ou 64 para o canal A;
    • 32 para o canal B.
  • Consumo de corrente:
    • Operação normal: 1,4 + 0,1 mA;
    • Em modo de economia: 0,2 + 0,3 μA.
  • Interface: digital não padronizada;
  • Taxas de amostragem: 10 ou 80 Hz.
    • Representa um atraso de 12,5 (80 Hz) ou 100 (10 Hz) milissegundos entre leituras.

Leia o datasheet para conhecer outros detalhes.

Comunicação

Para obter os valores de tensão que foram lidos pelo HX711, precisamos usar sua interface digital composta de 2 canais: SCK e DOUT. Ao gerar um clock no canal SCK, os bits da tensão lida são inseridos no canal DOUT pelo HX711.

Por padrão, o valor do canal A com ganho de 128 é retornado. Neste caso, devemos enviar 25 pulsos de clock. Mas é possível mudar o canal ou o ganho alterando a quantidade de pulsos de clock que são enviados. Se enviarmos 32, a próxima leitura retornada será do canal B com ganho de 32. E, se enviarmos 27, a próxima leitura será do canal A com ganho de 64. Veja um resumo abaixo:

O valor da leitura é retornado do bit mais significativo para o menos significativo, em que o 1º bit indica se o valor é positivo (bit em 0) ou negativo (bit em 1). Sendo mais específico, o sinal é enviado no formato de complemento de 2 (não pretendo entrar em detalhes).

Você não precisar entender o procedimento anterior para usar o módulo, já que existem diversas bibliotecas disponíveis que cuidam destes detalhes.

Pinos

Vou retomar a primeira imagem do post para explicar os pinos do módulo:

Módulo HX711

Na parte direita temos 4 pinos:

  • GND: Terra usado para alimentar o módulo;
  • DT: Pino de dados da comunicação;
  • SCK: Pino de clock da comunicação;
  • Vcc: Pino de alimentação do módulo (2,7 a 5,5 V).

E na parte esquerda são os pinos que devem ser ligados à célula de carga (mais detalhes na seção seguinte):

  • E+: internamente conectado à tensão AVDD (tensão próxima da de alimentação):
    • Deve ser ligado à alimentação positiva da célula de carga.
  • E-: internamente ligado ao GND:
    • Deve ser ligado à alimentação negativa da célula de carga.
  • A-: Ponto negativo do canal A;
  • A+: Ponto positivo do canal A;
    • A tensão lida do canal A será:

V_A = V_{A+} – V_{A-}

  • B-: Ponto negativo do canal B;
  • B+: Ponto positivo do canal B;
    • A tensão lida do canal B será:

V_B = V_{B+} – V_{B-}

Circuito do módulo

No datasheet do CI (pág 6), é possível encontrar o circuito recomendado, que basicamente é o mesmo circuito do módulo:

Utilizando o HX711 com o Arduino

Circuito com célula de carga de 4 fios

No post em que expliquei sobre as células de carga, comentei que o circuito adequado para lê-las é a ponte de Wheatstone. Portanto, é justamente ele que iremos usar, até porque é o tipo de ligação recomendada no próprio datasheet do HX711. Veja adiante:

Circuito com célula de carga de 4 fios e HX711
Fonte dos componentes: clique na imagem para acessar.

Os pinos Vcc e GND são ligados aos pinos 5V e GND do Arduino. O pino DT é ligado no pino digital D4 e o SCK no pino D5 do Arduino.

No caso da célula de carga, siga a relação: Fio vermelho no E+, fio preto no E-, fio branco no A- e fio verde no A+. Internamente, ela possui uma estrutura próxima da mostrada abaixo:

Estrutura interna de célula de carga

O arranjo acima é exatamente o formato da ponte de Wheatstone. Inverter o fio vermelho com o preto ou o branco com o verde é possível, mas fará a leitura diminuir à medida que a força aplicada aumenta (inversão do comportamento padrão).

Obs: crie uma boa conexão entre a célula de carga e o HX711, pois uma má conexão influencia negativamente na precisão das leituras. Por conta disso, ligar os fios na protoboard pode gerar leituras instáveis.

Circuito com célula de carga de 3 fios

A ponte de Wheatstone é composta por 4 resistências, mas o que fazer no caso das células de carga que possuem apenas 3 fios (2 resistências)? Neste contexto, existem duas abordagens:

1. Adicionar resistências externamente:

É possível substituir as 2 resistências faltantes por 2 resistores externos e ligar o circuito de forma semelhante ao anterior:

Circuito com célula de carga de 3 fios e HX711
Fonte dos componentes: clique na imagem para acessar.

Assim como antes, o fio vermelho vai no E+, o preto no E- e o branco no A-. A diferença é que o A+ é ligado na ponta de dois resistores de 1 kΩ e um deles é ligado ao E+ e o outro ao E-. Os resistores externos seriam equivalentes aos resistores R3 e R4 da figura do tópico anterior.

Os resistores são de 1kΩ, pois é o mesmo valor de resistência do extensômetro da célula de carga (pelo menos para o caso da célula de 50 kg que testei).

Aqui é preciso lembrar que a resistência dos resistores é influenciada pela temperatura. Então, um vento batendo nele (convecção) já é capaz de alterar as leituras de tensão, gerando um comportamento indesejado. Nos testes que fiz, a leitura não foi nada estável e o valor considerado como “peso 0” alterava consideravelmente (mesmo soldando os fios da célula de carga para deixar a conexão ótima). Sendo assim, eu não recomendo fazer essa ligação.

Seguindo em frente, a outra abordagem envolve:

2. Criar um arranjo com outras células de carga:

É possível substituir as 2 resistências faltantes por outra célula de carga (1 ou mais). Nesse caso, você terá que montar a estrutura física de forma que o peso se distribua igualmente entre as células de carga. As balanças domésticas de peso fazem uso deste tipo de arranjo e normalmente são usadas 4 células de carga.

Circuito com 2 células de carga de 3 fios e HX711

É igual a ligação anterior, sendo que o fio branco da 2ª célula de carga deve ser ligado ao A+. No fim das contas o que queremos é um arranjo que se pareça com a ponte de Wheatstone (seja para uma ligação com 2, 3 ou 4 células de carga):

Estrutura interna de célula de carga

No caso de agora os fios vermelhos e pretos são compartilhados, mas o fio branco de cada uma vai em uma ponta do canal A do HX711. E esta ligação é mais estável que a da célula de carga sozinha, porque não temos mais a influência negativa do resistor externo. Mas o ideal é que as 2 células de carga estejam sob o mesmo efeito de temperatura para que a variação de temperatura em uma não seja maior que na outra, o que causaria uma imprecisão nas medidas.

Montagem da célula de carga

Para a célula de carga funcionar corretamente, ela deve ser montada de um jeito específico. Cada modelo pode ter uma forma diferente, então fica difícil dar uma orientação global. Por conta disso, vou explicar como montar aquelas células de carga “retangulares” de 1/5/10 kg, que são comuns de encontrar.

No caso delas, você vai reparar que existem 4 furos, 2 em cada ponta da célula de carga. Isso acontece, pois você deve apoiar apenas uma das extremidades dela e fixar a plataforma de medição de peso na outra. Veja adiante:

Montando a célula de carga

Repare que apenas a parte direita da célula de carga está apoiada na base e a outra extremidade (a parte esquerda) é onde fixei  a base de medição. Normalmente o lado em que é apoiado na base é o lado em que saem os fios da célula de carga. Porém, confira e veja se a sua célula de carga possui uma indicação visual do lado certo de montar (uma setinha por exemplo).

A base que usei na imagem acima foi feita em uma impressora 3D e o modelo foi obtido deste site. Um adendo: minha célula de carga possui furos de 3mm e o modelo do link possui furos bem maiores. O que fiz foi abrir um furo na peça usando uma chave de fenda do tamanho de 3 mm.

Baixando biblioteca do Arduino

A biblioteca pode ser baixada na própria IDE do Arduino em Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas… E é só pesquisar por HX711 e baixar a opção que tem como autor “Olav Kallhovd”. Se não encontrar, pode baixar ela daqui.

Esta biblioteca é boa, pois vem com um código que facilita a calibração e que implementa uma funcionalidade de gravar a constante de calibração na memória do Arduino.

Leitura de uma célula de carga

Antes de mostrar como usar a biblioteca, preciso comentar sobre o que são os valores lidos pelo HX711, como converter os valores em massa e outros detalhes.

Assim como mencionei, o HX711 retornará a leitura de tensão entre os pontos A+ e A- (para o caso do canal A), que, no fim das contas, representa uma força aplicada na parte de cima da célula de carga. Por conta desta variação ser pequena e afetada por temperatura e diferenças nos processos produtivos, não dá pra dizer, por exemplo, que o valor 1725 corresponde à massa de 7 g para TODAS as células de carga.

Na realidade, você precisa descobrir por conta própria qual é essa relação. Porém, isso é bem tranquilo de fazer e mostrarei o passo a passo nos tópicos adiante. Mas resumidamente é o seguinte:

  1. O valor lido pelo HX711 quando não tem nada em cima da célula de carga é chamado de “tara” ou offset (ou peso 0). Ao aplicar um peso na célula de carga, é preciso subtrair o valor da tara do valor da leitura (a biblioteca faz isso automaticamente);
  2. Com a tara sendo subtraída da leitura, é preciso colocar um peso conhecido em cima da célula de carga para descobrir o fator de calibração. Se você colocar um peso de 100 gramas em cima dela e o valor lido for 47390, então o fator de calibração será 473,9:

fator\_calibracao = \frac{valor\_lido}{massa\_aplicada}

Se você usar o valor da massa em gramas, todas as medidas que você obtiver serão em gramas. Se você usar o valor em kg, as medidas obtidas serão em kg.

Comandos disponíveis

Recomendo fortemente utilizar os exemplos que vêm na biblioteca, mas se você precisar alterá-los, adiante explicarei simplificadamente alguns comandos que existem na biblioteca:

  • LoadCell.begin():
    • Inicializa a comunicação com a célula de carga.
  • LoadCell.start(tempo, tarar):
    • Adiciona um delay após a inicialização e tara a medição (obtém o valor do offset) ;
    • O 1º parâmetro é o tempo do delay em milissegundos;
    • O 2º parâmetro é um valor do tipo falso/verdadeiro que informa se você quer tarar a medição.
  • LoadCell.setCalFactor(valor):
    • Define o fator de calibração.
  • LoadCell.update():
    • A função retorna 1 se existem dados para ler (se a conversão AD está pronta) e 0 se não;
    • Portanto, pode ser usada para saber se é a hora certa de ler da célula de carga.
  • LoadCell.getData():
    • Retorna a última leitura feita já aplicando a tara e o fator de calibração (e também aplica uma média móvel para estabilizar os dados).

Calibrando

Para executar a calibração, grave o seguinte código de exemplo: Arquivo->Exemplos->HX711_ADC->Calibration.

Ao rodar o código, abra o monitor serial e observe os textos. Inicialmente ele pedirá para você colocar a célula de carga sem nenhum peso em cima e em uma superfície estável. Ao fazer isso, escreva a letra ‘t’ no monitor serial e envie para tarar.

Em seguida, ele pedirá para você colocar uma massa conhecida. Faça isso e digite o valor dela no monitor serial (pode ser em gramas ou kg). Após isso, o código informará qual é o fator de calibração e perguntará se você quer salvá-lo na memória. Responda ‘y’ se sim ou ‘n’ se não.

Pronto, agora a célula de carga está devidamente calibrada e o código começará a exibir a massa de qualquer objeto que você colocar em cima da célula de carga.

Lendo a massa continuamente

Uma vez que a calibração foi feita e você já sabe o valor do fator de calibração, você pode gravar o seguinte código de exemplo: Arquivo->Exemplos->HX711_ADC->Read_1x_load_cell.

Se você quiser usar o fator de calibração que foi salvo na memória, descomente a linha que começa com “EEPROM.get”. Caso contrário, altere o valor do “calibrationValue”.

Ao rodar o código, certifique-se de que não tenha nada em cima da célula de carga, pois a primeira coisa que ele faz é obter a tara. Após isso, ele mede continuamente a massa: