No meu projecto
Automatic Cat Feeder, precisei de criar uma interface entre uma balança digital e o arduino para controlar a quantidade de comida que era despejada na tigela do gato.
Como precisava de medir massas entre as 40 a 150 gramas utilizei uma balança de joalharia que se vende no ebay a um preço bastante aceitável. Eu decidi utilizar uma balança que mede entre [ 0g ; 500g ], mas existem outras [ 0g ; 1000g ], [ 0g ; 100g ], ou mesmo para pesos maiores.
Estas balanças funcionam baseadas no principio
strain gauge. Encontrei uma
aula online do prof. Alok Barua, em que explica com bastante detalhe o seu funcionamento.
Depois de desmontar a balança, identifiquei que a minha balança tem um strain gauge de 4 fios, dois são de alimentação os outros dois são os de saída.
Normalmente a configuração é a seguinte :
* Red (+) Vs +
* Black (-) Vs -
* Green (+) Sensing
* White (-) Sensing
Antes de aplicar uma tensão ao terminais da balança, medi que tensão era aplicada no circuito original. Essa tensão era de 2,5 [V], então medi a resistência entre os terminais Vs+ e Vs-, como essa resistência era de 1 k[Ohm] utilizei uma resistência do mesmo valor num divisor de tensão para obter 2,5 [V] tal como no circuito inicial.
Quando aplicamos os 2,5 [V] aos terminais de alimentação e colocamos um peso em cima da balança, podemos observar que a tensão nos terminais de saída é muito reduzida e nem sequer se altera, no meu caso o multimetro marcava 0.7 m[V]
Como sabem o arduino tem uma resolução de ~5m[V] por step (5 [V] / 1024 steps), por isso nunca conseguiremos medir as variações a não ser que amplifiquemos a tensão diferencial entre os terminais de saida.
Para amplificar o sinal utilizei o IC INA126P (podem pedir samples à texas!). Aqui fica o esquema que utilizei.
O ganho deste amplificador é dado pela seguinte expressão:
G = 5 + ( 80000 / RG ) = 9761.1
Agora finalmente poderemos começar ler alguma coisa no arduino!
Como uma load cell é linear, a tensão de saída do amplificador é proporcional ao peso colocados na balança. Um método simples de calibrar a balança é o seguinte:
- Sempre que faço uma medição, retorno a média de 40 leituras separadas por 50 milissegundos entre leituras.
- Primeiro temos de registar a posição zero, isto é a tensão sem qualquer carga.
- Colocar um peso conhecido me cima da balança e medir a tensão de saida.
- Agora calculamos os steps/grama através de uma regra de 3 simples :
No meu caso apliquei uma massa de 150g e registei a diferença entre a posição zero e a tensão com a massa
steps = ( (output_voltage_for150g) - (zero position voltage) ) = 64,5
Se 150g é equivalente a 64,5 steps, então 1g é 64.5/150 = 0.43 steps. Este valor é a constante de proporcionalidade kp = 0.43, Agora sabemos que uma grama é equivalente a 0.43 steps.
Para converter de steps para gramas:
grams = [ (output_steps_forYourWeight) - (zero position steps) ] / kp
Existe outro método possível, consiste em utilizar dois pesos conhecidos, medir os steps de cada um deles e utilizar a função map() do arduino. Atenção que a função map() que referi utiliza número inteiros, mas para obter um valor mais próximo o possível devem utilizar floats.
/**************************************************
***************************************************
***** ARDUINO LOAD CELL INTERFACE *****************
***** by Vitor Rosa *******************************
***** [url]https://sites.google.com/site/vitorrosamd/[/url] **
***** http://http://lusorobotica.com/ *************
***************************************************
***************************************************/
//balance pin
const int balancePin=1;
//zero point holds the output voltage without weight
float zero_point=0;
//proportional constant
float kp=0.42;
//number of readings
int average=40;
//delay
int time=50;
float peso=0;
void setup() {
Serial.begin(9600);
float zero[3] = { 0 } ;
for( int i = 0 ; i < 3 ; i++) {
zero[i] = read_weigh();
Serial.print("Zero (STEPS) = "); Serial.println(zero[i]);
delay(300);
}
zero_point = ( zero[0] + zero[1] + zero[2] ) / 3 ;
}
float voltage_to_weigh(int voltage) {
return (voltage-zero_point)/kp;
}
float read_weigh() {
float read_v = 0;
for (int i=0; i<=average ; i++) {
read_v = read_v + analogRead( balancePin );
delay(time);
}
return read_v/average;
}
void loop() {
delay(500);
Serial.println("---------------");
float steps = read_weigh();
Serial.print("Zero point (STEPS) = "); Serial.println(zero_point);
Serial.print("Peso (STEPS) = "); Serial.println(steps);
peso = voltage_to_weigh(steps);
Serial.print("Peso (g) = ");
Serial.println(peso);
}