Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 3 visitas.| 3484499 Visitas (desde Dic. 2011), hoy: 327 Visitas 1000 Pag. Vistas , ultimos 36 dias: 11188 Visitas. 38212 Pag. Vistas. Tu IP: 3.147.68.201
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

Ultrasonidos barato con PIC o arduino

¿CÓMO FUNCIONA Y ESQUEMÁTICA DEL CIRCUITO

Todo el mundo sabe la velocidad del sonido en el aire seco es de alrededor de 340 m / s. Enviar un pulso ultrasónico corto a 40 Khz en el aire, y tratar de escuchar el eco. Por supuesto que no se oye nada, pero con un sensor ultrasónico el pulso de vuelta puede ser detectado. Si conoce el momento de la vuelta y de viajes de vuelta de la onda ultrasónica, usted sabe la distancia, dividir la distancia por dos y se conoce el rango del sensor de ultrasonidos para el primer obstáculo en frente de ella.

Aquí se utiliza un transmisor de ultrasonidos piezzo con su receptor, que son muy eficientes, fáciles de encontrar y bastante barato.

En primer lugar, tenemos que enviar el pulso: es fácil de obtener un pulso de 40 Khz de una salida PWM PIC. Usted puede conducir un transmisor ultrasónico directamente de la salida de CFP, pero el rango sentido no exceda de 50 cm. El uso de un transistor y un circuito resonador, el transmisor ultrasónico obtendrá alrededor de 20 voltios y el rango sentido se ampliará hasta 200 cm.

En segundo lugar, tenemos que sentir el eco: el receptor piezzo puede proporcionar unas pocas decenas de milivoltios, esto será suficiente para un ADC PIC con una resolución de 4 mV sin necesidad de hardware adicional.

PIC telémetro ultrasónico

090-ULTRASONIC-RANGER-schematic[1]

Haga clic en esquema para agrandar

C1 es un condensador de desacoplamiento

El pulso PWM desde el pasador RC2 del PIC impulsa la base del transistor T1 a través de la resistencia R1

Un 330 μH inductor se añade en paralelo al transceptor ultrasónico piezzo, para formar un resonnator LC, el diodo D1 protege T1 de tensión inversa.

El receptor ultrasónico está conectado directamente a la patilla RA1 del PIC (ADC canal número 1), con R3 en paralelo como Adaptador de impedancia.

Ranger ultrasónica PIC, el lateral del componente

La Placa de pruebas

090-ULTRASONIC-RANGER-ranger2[1]

Tenga cuidado de alinear lo mejor possibe el transmisor con el receptor

EL CÓDIGO FUENTE

Aquí está el código fuente mikroC:

/ *
 * Archivo: sonar.c
 * Proyecto: Simple Ultrasónicas Range Finder
 * Autor: Bruno GAVAND
 * compilador: mikroC V6.2
 * Fecha: 30 de septiembre 2006
 *
 * Descripción:
 * Este es un telémetro ultrasónico básico, del 30 al 200 centímetros
 *
 * dispositivo de destino:
 * PIC16F877A con 8 Mhz cristal
 * o cualquier PIC con al menos un canal ADC y PWM
 *
 * bits de configuración:
 * Reloj SA
 * no watchdog
 timer * no encendido
 * no brown out
 * LVP deshabilitado
 * datos EE proteger discapacitados
 * ICD deshabilitado
 *
 * ver más detalles y esquemática en http://www.micro-examples.com/
 * / / ********************  * definiciones de macros  ******************** / / *  * longitud del pulso ultrasónico en microsegundos  * / # define PULSELEN 300

/ *
 * tamaño del buffer circular para muestras promedio
 * /
# define BUFSIZE 10

/ *
 * LCD PUERTO
 * EasyPic2, EasyPic3: PORTB
 * EaspyPic4: PORTD
 * /
# define LCDPORT PORTD
# define LCDTRIS TRISD

/ *******************
 * VARIABLES GLOBALES
 ******************* /
outofrange unsigned char; / / Fuera de rango marca: establece cuando se detecta ningún eco

unsigned int buf [BUFSIZE]; / / Muestras tampón
unsigned char idx = 0; / / Índice de muestra actual en tampón

/ *****************************************
 * rutina de interrupción
 * manijas Esta ISR TIMER1 desbordamiento sólo
 ***************************************** /
vacío de interrupción (void)
        {
        if (PIR1.TMR1IF) / / desbordamiento timer1?
                {
                outofrange = 1; / / Establecer fuera de rango marca
                PIR1.TMR1IF = 0; / / Claro indicador de interrupción
                }
        }

/ ************
 * bucle principal
 ************ /
void main ()
        {
        ADCON1 = 0; / / Permite ADC         TRISA = 0xff; / / PORTA como entradas         PORTA = 0;

        TRISC = 0; / / PORTC como salidas
        PORTC = 0;

        / / Configuración Timer1
        T1CON = 0b00001100; / / Prescaler 1:1, osc. activado, no sincronización, clk interior, se detuvo # ifdef LCDPORT         / / init LCD         Lcd_Init (& LCDPORT); Ajustes EP2/3/4 / / uso         Lcd_Cmd (Lcd_CLEAR); / / Claro display         Lcd_Cmd (Lcd_CURSOR_OFF); / / Cursor fuera

        Lcd_Out (1, 1, "UltraSonicRanger");
        Lcd_Out (2, 5, "CM");
# endif

        / / Init Channel PWM: 40 Khz, el ciclo de trabajo del 50%
        PWM1_Init (40.000);
        PWM1_Change_Duty (128);         INTCON.GIE = 1; / / Habilitar las interrupciones globales         INTCON.PEIE = 1; / / Habilitar las interrupciones periféricas         PIE1.TMR1IE = 0; / / Desactivar el temporizador de interrupción 1         PIR1.TMR1IF = 0; / / Claro temporizador 1 flag de interrupción

        / / Para siempre
        for (; ;) 
                {
                unsigned char i; / / Byte de propósito general
                unsigned long cm; / / Distancia en centímetros
                unsigned char str [4]; / / Cadena para visualizador gama

                / / Preparar temporizador
                T1CON.TMR1ON = 0; / / Detener el temporizador
                outofrange = 0; / / Reposición de la bandera de gama
                TMR1H = 0; / / Claro timer1
                TMR1L = 0;

                T1CON.TMR1ON = 1; / / Iniciar el temporizador 1
                PIE1.TMR1IE = 1; / / Habilitar el temporizador 1 interrupciones en desbordamiento

                / / Enviar impulsos
                PWM1_Start (); / / Activar la salida PWM: transductor es pulsada en frecuencia ultrasónica
                delay_us (PULSELEN); / / Durante microsegundos PULSELEN
                PWM1_Stop (); / / Detener PWM

                Delay_us (PULSELEN * 2); / / Hacer nada por el doble de la duración de la longitud del pulso para evitar la salida en falso

                while (Adc_Read (1) <1) / / mientras hay pulso detectado (no hay señal en el canal ADC 1)
                        {
                        if (outofrange) break; / / A tarde, fuera de rango
                        }

                T1CON.TMR1ON = 0; Temporizador / / stop 1
                PIE1.TMR1IE = 0; / / Desactivar el temporizador 1 interrumpe en caso de desbordamiento

LCDPORT # ifdef
                if (outofrange) / / es el condtion overrange detectado?
                        {
                        Lcd_Out (2, 8, "OverRange"); Mensaje sobre rango / / display
                        }
                else if (TMR1H <((PULSELEN * 6 * Clock_kHz ()) / (1000 * 4 * 256))) / se detecta / condiciones bajo rango?
                        {
                        Lcd_Out (2, 8, "UnderRnge"); Mensaje underrange / / display
                        }
                else / / buena lectura
                        {
                        buf [idx] = TMR1H; / / Crear un valor de 16 bits de timer1
                        buf [idx] << = 8; / / MSB
                        buf [idx] + = TMR1L; / / LSB

                        / / Buffer circular
                        idx + +; / / Siguiente ubicación
                        if (idx == BUFSIZE) / / se llega al final?
                                {
                                idx = 0; / / Volver a
                                }

                        cm = 0; / / Preparar centímetro promediado
                        for (i = 0; i <BUFSIZE; i + +) / / para todas las muestras en tampón
                                {
                                cm + = buf [i]; / / Añadir a resumir
                                }
                        cm / = BUFSIZE; / / muestras promedio

                        / *
                         * cm contiene ahora el número de ciclos de reloj
                         * desde el inicio de la transmisión de ultrasonidos
                         * hasta la primera detección del eco
                         * la duración en segundos es s = cm / (Clock_Khz () * 1000/4)
                         * si se admite que el sonido velocidad en el aire es de 340 m / s
                         * la distancia en centímetros (adelante y atrás) es D = s * 340 * 100/2
                         * o d = 340 * 100/2 * cm / Clock_khz () / 1000 * 4
                         * d = 34 * 2 / Clock_Khz ()
                         * /
                        cm * = 34 * 2; / / Ahora se convierte en centímetros
                        cm / = Clock_Khz ();

                        ByteToStr (cm, str); / / Convierte a string
                        Lcd_Out (2, 1, str); / / Imprimir cadena
                        Lcd_Out (2, 8, ""); / / Claro mensaje de error
                        }
# endif

                Delay_ms (10); / / 10 milisegundos de retardo antes de la siguiente muestra
                }
        }

INSTRUCCIONES DE USO

Lo he comprobado con una placa de desarrollo EasyPIC4:

Por supuesto, este ranger es muy básico y tienen algunos inconvenientes:

Una pequeña sorpresa para la célula del receptor piezzo podría conducir a una medición errónea,

Desde pulso ultrasónico no está codificado, cualquier otra fuente ultrasónica pondrá el desorden:

=> Desbordara por arriba o condiciones no deseadas pueden suceder

Este es el precio de la muy simple diseño del guardabosques.

Esto es lo que debe ver en su ámbito de aplicación, si usted sondea a los pines del receptor de ultrasonidos:
090-ULTRASONIC-RANGER-ultrasonic_range_finder[1]

Horizontal: 1 ms / div
vertical: 5 mV / div

El eco mecánica se retira por un retraso de software.
La onda reflejada es de alrededor de 40 mV pico a pico, se trata de alrededor de 9,5 ms después de la ráfaga ultrasónica, si decimos que la velocidad del sonido es 340 m / s significa que la distancia del objeto fue de alrededor 0,0095 / 2 * 340 = 1.615 metros.
De hecho, fue el techo, que era de 172 cm por encima del circuito, la pantalla LCD escribió 170 cm.

Fuente: http://www.micro-examples.com/public/microex-navig/doc/090-ultrasonic-ranger.html

Escribe un comentario

Tu comentario