You are on page 1of 10

Balanza electrnica utilizando un sensor de presin resistivo

utilizando Arduino

Objetivo: medir el peso en onzas, utilizando una balanza fsica, circuitera y software de
programacin (hiperterminal de Arduino).

Este proyecto requiere los siguientes materiales:

1 Arduino UNO
1 sensor de presin
1 LM 258
2 resistencias de 1kOhm
1 resistencia de 100kOhms
2 LED's (rojo y verde)

Para empezar, cabe aclarar que el sensor utilizado para este tipo de proyecto no es el ideal para medir
peso. Por lo tanto este diseo se basa en un modelo estadstico para aproximar lo ms posible el peso.
Pero mejor empecemos hablando del sensor para entender por qu no sirve funciona correctamente
para esta implementacin?

Empecemos porque ese sensor es resistivo, recordemos el comportamiento de una resistencia variable
medida con un multimetro: tratamos de ajustar un valor, pero siempre cambia y no es estable. As es el
comportamiento de este sensor, incluso en el lugar donde se hace presin si se cambia da otros valores,
as que hay que tener muy en cuenta este factor.

Segn la hoja de datos este es el comportamiento del sensor:


A una mayor fuerza ejercida sobre el sensor, menor ser la resistencia. Adems de eso, la hoja de datos
nos proporciona varios circuitos, el que yo utilic fue este:

El AmpOp es un LM258, RM es la resistencia fija, la grfica de la par explica que valores podemos
tomar para esa resistencia y obviamente su comportamiento. Cabe resaltar que el comportamiento no
es exactamente igual, pero es similar, por ejemplo si usas la resistencia de 100K no te llegara a 4.7v
sino que llegara a unos 3.7 - 4.2v (Es muy importante para tu modelacin que pruebes antes este
circuito).

A m no me dej satisfecho el comportamiento de este circuito, as que decid hacer el divisor de voltaje
que hay entre RM y FSR invertido, el resultado obviamente es inverso, pero me gust ms los
resultados muestreados. El circuito que use para todo el proyecto es el siguiente, tiene un led rojo para
marcar el lmite de operacin del sensor (adems este led parpadea cuando no hay un sensor
conectado al circuito) y uno verde que indica que no sobre pasa el lmite. El circuito fue hecho en
Fritzing (Por qu Fritzing? Porque con este programa podemos hacer shields y conectarlo al Arduino
sin necesidad de cables):
Obteniendo la siguiente grfica (basada en la medicin de algunos objetos con un peso ya definido y
tabulndolos):

As que con los datos medidos, es hora de hacer una regresin (si miran la grfica tiende a una funcin
logartmica, por lo tanto realic una regresin logartmica) con mi calculadora voyage 200.
Luego de la obtencin de la ecuacin de regresin se estim los posibles rangos de medicin para cada
peso:

Valor medido Valor mostrado Lmite Lmite


(oz) regresin inferior superior
0 #NUM! #NUM! #NUM!
0.25 184 179 189
0.5 153 148 158
0.75 135 130 140
1 122 117 127
1.5 104 99 109
2 92 87 97
3 74 69 79
4 61 56 66
5 51 46 56
6 43 38 48
7 36 31 41
8 30 25 35
9 25 20 30
10 20 15 25
11 16 11 21
12 12 7 17
13 8 3 13
14 5 0 10
15 2 -3 7
16 -1 -6 4

Secuencia del programa:

1. Lee pin analgico

2. Compara el valor con un valor equivalente a la desconexin del sensor

a. Si es afirmativo:

i. Enciende y apaga el led rojo

ii. lee el pin analgico

iii. Regresa a paso 2

b. Si es negativo:

i. Continua con programa

3. Repetir 5 veces

a. lee pin analgico

b. Compara en los distintos rangos definidos en la tabla para cada valor

i. Si es afirmativo

1. enva valor de onzas

ii. Si es negativo

1. continua el programa

c. Retardo 500 milisegundos

d. Vuelve a paso 3, hasta cumplir condicin

4. Compara el valor del pin analgico

a. Si el valor no excede el rango de lectura normal

i. Led verde = ON
ii. Led rojo = OFF

b. Si el valor excede el rango de lectura normal

i. Led verde = OFF

ii. Led rojo = ON

5. Fin de comparacin

6. Reestablece variable

7. Retardo de 1.5 segundos

8. Regresa a paso 1

Cdigo del programa con comentarios:

int secuencia = 0;
int Pinanalogo = A0; // coloco en una variable el pin analogo
int valor = 0; // variable que almacenar la lectura analga
void setup() {
Serial.begin(9600); //inicia el protocolo de comunicacin a PC
pinMode(2,OUTPUT); //pin digital 2 salida
pinMode(3,OUTPUT); //pin digital 3 salida
}
void loop() {
valor = analogRead(Pinanalogo);
while (valor > 600)
{
digitalWrite(3,LOW); //pin digital 3 en 0 lgico
delay (150);
digitalWrite(3,HIGH); //pin digital 2 en 1 lgico
delay (150);
valor = analogRead(Pinanalogo);
}
digitalWrite(3,LOW); //pin digital 3 en 0 lgico
for (secuencia=0;secuencia<6;secuencia++)
{
valor = analogRead(Pinanalogo); // almacena en "valor" la lectura analoga
if (valor > 178 && valor< 188) //condicion para 0.25 onza
{
Serial.println("0.25 onza");
}
if (valor > 148 && valor< 158) //condicion para 0.5 onza
{
Serial.println("0.5 onza");
}
if (valor > 130 && valor< 140) //condicion para 0.75 onza
{
Serial.println("0.75 onza");
}
if (valor > 115 && valor< 127) //condicion para 1 onza
{
Serial.println("1 onza");
}
if (valor > 99 && valor< 109) //condicin para 1.5 onzas
{
Serial.println("1.5 onzas");
}
if (valor > 86 && valor< 96) //condicion para 2 onzas
{
Serial.println("2 onzas");
}
if (valor > 68 && valor< 78) // condicin para 3 onzas
{
Serial.println("3 onzas");
}
if (valor > 55 && valor< 65) //condicin para 4 onzas
{
Serial.println("4 onzas");
}
if (valor > 45 && valor< 55) //condicin para 5 onzas
{
Serial.println("5 onzas");
}
if (valor > 37 && valor< 47) //condicin para 6 onzas
{
Serial.println("6 onzas");
}
if (valor > 30 && valor< 40) //condicin para 7 onzas
{
Serial.println("7 onzas");
}
if (valor > 24 && valor< 34) //condicin para 8 onzas
{
Serial.println("8 onzas");
}
if (valor > 19 && valor< 29) //condicin para 9 onzas
{
Serial.println("9 onzas");
}
if (valor > 21 && valor< 25) //condicin para 10 onzas
{
Serial.println("10 onzas");
}
if (valor > 17 && valor< 20) //condicin para 11 onzas
{
Serial.println("11 onzas");
}
if (valor > 12 && valor< 16) //condicin para 12 onzas
{
Serial.println("12 onzas");
}
if (valor > 9 && valor< 13) //condicin para 13 onzas
{
Serial.println("13 onzas");
}
if (valor > 6 && valor< 10) //condicin para 14 onzas
{
Serial.println("14 onzas");
}
if (valor > 5 && valor< 7) //condicin para 15 onzas
{
Serial.println("15 onzas");
}
if (valor > 0 && valor< 4) //condicin para 16 onzas
{
Serial.println("16 onzas");
}
delay(500);
}
if (valor > 30) //condiciones para leds
{
digitalWrite(3,LOW); //pin digital 3 en 0 lgico
digitalWrite(2,HIGH); //pin digital 2 en 1 lgico
}
else
{
digitalWrite(2,LOW); //pin digital 2 en 0 lgico
digitalWrite(3,HIGH); // pin digital 3 en 1 lgico
}
secuencia=0;
delay(1500); // retardo 1.5 segundos
}

Recomendaciones:

Utilizar un Amplificador Operacional en modo de seguidor de corriente, es una tcnica que se


debe aplicar al momento de leer un valor analgico, de esta manera estamos protegiendo al
microcontrolador, ya que el Amplificador Operacional en esta configuracin se comporta:
Ventrada=Vsalida.
Utilizar indicadores visuales al momento de alguna falla como lo son LED's, as se podr tener
una nocin de lo que est sucediendo.
Realizar un buen diseo de balanza para que pueda concentrar en un solo punto la fuerza
ejercida al sensor resistivo y as tener una lectura ms o menos constante.
Utilizar los "shields" para Arduino simplifican la conexin a travs de alambres y evita que las
soldaduras se puedan quebrar ya que no se usan alambras para conectar al Arduino.
Utilizar un sensor de peso en lugar del sensor de presin resistivo, como lo habamos indicado en
los retos encontrados, este sensor no es bueno para medir el peso de objetos, sino ms bien para
medir el empuje o presin que alguien o algo ejerce al sensor. Recomendamos que se utilice este
sensor: http://www.sparkfun.com/products/10245. Claramente se puede observar en sus
especificaciones que fue diseado para medir peso y no fuerza como el sensor resistivo.

You might also like