Hola, Me gustaría compartir con ustedes como mi primer Post en este blog un avance de una báscula electrónica que desarrollé con un PIC 16f877A, ya que engloba muchas de las aplicaciónes útiles que este PIC tiene y las muestro tanto gráficamente como analíticamente para la comprensión de su funcionamiento.
![](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_vkh__nQYrjI4dHSHQpxwYdfTaf6tzjhVoska0fay7mITA1teT1ZMTbHTUePtb_UQ9gNRykQmnfkylFKJWX0_k8e8xO1gRUTa4FiAmRrD8bx9HMZJqbcg=s0-d)
El sensor de peso o FSR es una
resistencia que varía su resistividad óhmica entre los 6 Kohms, y los 250 Kohms
lineales que comprenden un rango de 0 a 10Kg.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghoPMhWb1dfFVKNbbnIsuLjC-y9hh8tCCQ5ylpdZxSab1WtOTGqLHxYdflOH2JtlMbyB_owKknEac-g3_dbPgCbv_Mntecla4_oLYyCXC2DHvEIoDiAR0kxDiJAk-HjRko1WRMCysWbzVe/s320/1.png)
Es una resistencia sensible a una
fuerza con una ronda, 0,5 "de diámetro es su área de detección. Este FSR
puede variar su resistencia en función de la presión que se está aplicando a la
zona de detección. Mientras mayor sea la fuerza, menor es la resistencia.
Cuando no hay presión aplicada a la FSR, su resistencia será mayor que 1MΩ.
Este FSR puede sentir la fuerza aplicada en cualquier lugar de su periferia.
Dos pasadores se extienden desde la
parte inferior del sensor con 0,1 ".
Estos sensores son sencillos de
configurar y grandes para detectar la presión, pero no son muy precisos. Se
pueden emplear para detectar si se está siendo exprimido algo, pero es posible
que no se pueda usar por su precisión escasa como una escala o método de
medición.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtZGCj0DQU8z_DRlElX0mN79hvf9jPJeEYOMO5VjkIcfYP8e9c8MZbf1Jv6jwkb9K_ve5nbheQ0x_u-x20M56mQRC0Bp272EgBRE8-jcQJM4nyH0shLrQObTXdGltUoS1KyyAdrj1zc33l/s640/4.png)
Gráfica
que corresponde a la ecuación de caracterización de datos, donde el eje y
corresponde al peso en Kg, y X corresponde el valor del ADC desde 41 hasta 511
con ADC=10 para el rango lineal del sensor.
y=(511-x)/41
Ecuación
calculada con la ecuación de la recta, y la fórmula de punto/pendiente.
Tabla
de algunos pesos comparativos
Para poder sensar estas propiedades en
el sistema, se puede emplear un puente de wheatstone, donde la resistencia a
medir o “rara” sea el sensor, y medir el voltaje en los centros del puente,
pero en este caso, solamente se ocupó un divisor de voltaje, donde la resistencia
que no varía tiene el mismo valor óhmico que la resistencia en 0Kg.
Esquemático
de conexiones, donde RV1 es equivalente al sensor de fuerza resistivo.
Faceta
de alta resistencia o cero presión
Faceta
de baja resistencia o presión máxima
Imagen
real aplicando variaciones de fuerza al sensor resistivo
Para lograr la caracterización y los 3
estados de sensado, se empleó el pic 16f877a sin necesidad de un
pre-amplificador operacional o algo, ya que no se requería mucha exactitud.
Para ello, se empleó el siguiente código en Lenguaje C:
#include <16f877a.h>
#device adc=10 // Usa
resolución de 10 bits
#fuses HS, NOWDT
#use delay(clock=8000000)
#include <lcd.c> //incluye
librería del LCD
#define use_portd_lcd TRUE //Configuración puerto D control
lcd
float32 A=0.0;
float32 V=0.0;
float32 Kg=0.0;
void main()
{
set_tris_b(0XF0);
lcd_init(); //Se inicia el LCD
lcd_putc("\f Bascula
\n"); // Saca texto
lcd_putc(" Electronica
"); // Saca
texto
delay_ms(2000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Peso actual
Kg\n"); // Saca texto
delay_ms(1000);
lcd_gotoxy(13,2); // Acomoda cursor LCD
lcd_putc("Kg");
delay_ms(50);
setup_adc (adc_clock_internal);
setup_adc_ports (0);
set_adc_channel (0);
// Elige canal a medir RA0
delay_ms(20);
while(true)
{
lcd_gotoxy(4,2); // Acomoda cursor LCD
delay_ms(10); // Limpia ese sector de pantalla
lcd_gotoxy(4,2); // Acomoda cursor LCD
A=read_adc();
Kg=(511.0-A)/(41.0);
if(A>515)
{
lcd_gotoxy(1,2); //
Acomoda cursor LCD
printf(lcd_putc,"No hay
peso"); // xxx.x Kg
delay_ms (20);
while(true)
{
A=read_adc();
if(A<515)
{
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Peso actual
Kg\n"); // Saca texto
delay_ms(100);
lcd_gotoxy(13,2); // Acomoda cursor LCD
lcd_putc("Kg ");
delay_ms(50);
break;
}
}
}
if(A<80)
{
lcd_gotoxy(1,2); // Acomoda cursor LCD
printf(lcd_putc,"Peso
Maximo"); // xxx.x Kg
delay_ms (20);
while(true)
{
A=read_adc();
if(A>80)
{
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Peso actual
Kg\n"); // Saca texto
delay_ms(100);
lcd_gotoxy(13,2); // Acomoda cursor LCD
lcd_putc("Kg ");
delay_ms(50);
break;}
}
}
printf(lcd_putc,"%02.3f",Kg);
// xxx.x Kg
delay_ms (300);}
}