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
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
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:
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
Tuitear 4.947 Veces leído 0 comentarios |
11 septiembre 2014 en Electronica | tags: Arduino, Circuitos electrónicos, Electronica |