lunes, 14 de enero de 2013

Sensor Ultrasónico

En este post trataré de explicar el funcionamiento del Sensor Utrasónico, ya que es muy útil en muchas aplicaciónes para medición, y más ne la mecatrónica. Al final, presentaré como realizar un pequeño experimento con este sensor para una aplicación sencilla.

E sensor es el HC SR04, ya que es barato y muy fácil de usar.


El sensor ultrasónico es un sistema que tiene 4 patitas en su sistema. Tierra, Voltaje TTL, Trigger y Ecco.

Trigger es un pin de entrada de datos que manda a trabajar al sensor. Este recibe una señan de 10 uS para que el sensor ultrasónico pueda enviar un pulso de 8 bits a 40 KHz.
Ecco es un pin de salida de datos, que emite un pulso en alto de “N” tiempo, el cual equivale al factor de distancia que puede ser dividido entre 58 para obtener su distancia en Centímetros, o entre 148 para obtenerla en Pulgadas.

Este sistema se puede sensar de varias maneras, primero con una espera hasta que exista un flanco de subida en un pin de entrada de datos y luego poner en marcha el timer 1 del pic, o simplemente aproximándonos con un while y una variable que sume +1 o ++ cada tiempo determinado (58 o 148).

El sistema del pic se hizo de la siguiente manera:





#include <16f877a.h>
#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

int16 a=0;

void main()
{
set_tris_b(0XF0);
lcd_init(); //Se inicia el LCD
output_low(pin_b0);


while(true)
{

output_high(pin_b0);
delay_us(15);
output_low(pin_b0);
while(!input(pin_b7))
{
}
a=0;
while(input(pin_b7))
{
a=a+1;
delay_us(58);
}
if(a>200)
{
a=200;
}
delay_ms(30);
         printf(lcd_putc,"\fDistancia=%lu cm", a);
delay_ms(30);
}
}



Como se puede observar, se dejó una protección de 2 metros, ya que si no existía nada enfrente del sistema, daba valores muy altos que no tenía caso censar. Cabe aclarar que este sensor puede sensar hasta 4 metros con ángulo y precisión determinadas de 15° y 3cm respectivamente.


Diagrama esquemático de conecciónes.

Display funcionando

Sensor midiendo

Báscula Electrónica

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.





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.


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.



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);}
}