{"id":10139,"date":"2014-09-11T00:19:41","date_gmt":"2014-09-10T22:19:41","guid":{"rendered":"http:\/\/www.pesadillo.com\/pesadillo\/?p=10139"},"modified":"2014-07-23T00:49:08","modified_gmt":"2014-07-22T22:49:08","slug":"ultrasonidos-barato-con-pic-o-arduino","status":"publish","type":"post","link":"https:\/\/www.pesadillo.com\/pesadillo\/?p=10139","title":{"rendered":"Ultrasonidos barato con PIC o arduino"},"content":{"rendered":"<p>\u00bfC\u00d3MO FUNCIONA Y ESQUEM\u00c3\u0081TICA DEL CIRCUITO<\/p>\n<p>Todo el mundo sabe la velocidad del sonido en el aire seco es de alrededor de 340 m \/ s. Enviar un pulso ultras\u00f3nico 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\u00f3nico el pulso de vuelta puede ser detectado. Si conoce el momento de la vuelta y de viajes de vuelta de la onda ultras\u00f3nica, usted sabe la distancia, dividir la distancia por dos y se conoce el rango del sensor de ultrasonidos para el primer obst\u00e1culo en frente de ella.<\/p>\n<p>Aqu\u00ed se utiliza un transmisor de ultrasonidos piezzo con su receptor, que son muy eficientes, f\u00e1ciles de encontrar y bastante barato.<\/p>\n<p>En primer lugar, tenemos que enviar el pulso: es f\u00e1cil de obtener un pulso de 40 Khz de una salida PWM PIC. Usted puede conducir un transmisor ultras\u00f3nico 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\u00f3nico obtendr\u00e1 alrededor de 20 voltios y el rango sentido se ampliar\u00e1 hasta 200 cm.<\/p>\n<p>En segundo lugar, tenemos que sentir el eco: el receptor piezzo puede proporcionar unas pocas decenas de milivoltios, esto ser\u00e1 suficiente para un ADC PIC con una resoluci\u00f3n de 4 mV sin necesidad de hardware adicional.<\/p>\n<p>PIC tel\u00e9metro ultras\u00f3nico<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-schematic1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-10140\" alt=\"090-ULTRASONIC-RANGER-schematic[1]\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-schematic1.png\" width=\"603\" height=\"358\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-schematic1.png 1005w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-schematic1-300x177.png 300w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/a><\/p>\n<p>Haga clic en esquema para agrandar<\/p>\n<p>C1 es un condensador de desacoplamiento<\/p>\n<p>El pulso PWM desde el pasador RC2 del PIC impulsa la base del transistor T1 a trav\u00e9s de la resistencia R1<\/p>\n<p>Un 330 \u00ce\u00bcH inductor se a\u00f1ade en paralelo al transceptor ultras\u00f3nico piezzo, para formar un resonnator LC, el diodo D1 protege T1 de tensi\u00f3n inversa.<\/p>\n<p>El receptor ultras\u00f3nico est\u00e1 conectado directamente a la patilla RA1 del PIC (ADC canal n\u00famero 1), con R3 en paralelo como Adaptador de impedancia.<\/p>\n<p>Ranger ultras\u00f3nica PIC, el lateral del componente<\/p>\n<p>La Placa de pruebas<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ranger21.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-10141\" alt=\"090-ULTRASONIC-RANGER-ranger2[1]\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ranger21.jpg\" width=\"564\" height=\"425\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ranger21.jpg 940w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ranger21-300x225.jpg 300w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/a><\/p>\n<p>Tenga cuidado de alinear lo mejor possibe el transmisor con el receptor<\/p>\n<p>EL C\u00d3DIGO FUENTE<\/p>\n<p>Aqu\u00ed est\u00e1 el c\u00f3digo fuente mikroC:<\/p>\n<p>[php]<br \/>\n\/ *<br \/>\n * Archivo: sonar.c<br \/>\n * Proyecto: Simple Ultras\u00f3nicas Range Finder<br \/>\n * Autor: Bruno GAVAND<br \/>\n * compilador: mikroC V6.2<br \/>\n * Fecha: 30 de septiembre 2006<br \/>\n *<br \/>\n * Descripci\u00f3n:<br \/>\n * Este es un tel\u00e9metro ultras\u00f3nico b\u00e1sico, del 30 al 200 cent\u00edmetros<br \/>\n *<br \/>\n * dispositivo de destino:<br \/>\n * PIC16F877A con 8 Mhz cristal<br \/>\n * o cualquier PIC con al menos un canal ADC y PWM<br \/>\n *<br \/>\n * bits de configuraci\u00f3n:<br \/>\n * Reloj SA<br \/>\n * no watchdog<br \/>\n timer * no encendido<br \/>\n * no brown out<br \/>\n * LVP deshabilitado<br \/>\n * datos EE proteger discapacitados<br \/>\n * ICD deshabilitado<br \/>\n *<br \/>\n * ver m\u00e1s detalles y esquem\u00e1tica en http:\/\/www.micro-examples.com\/<br \/>\n * \/ \/ ********************  * definiciones de macros  ******************** \/ \/ *  * longitud del pulso ultras\u00f3nico en microsegundos  * \/ # define PULSELEN 300<\/p>\n<p>\/ *<br \/>\n * tama\u00f1o del buffer circular para muestras promedio<br \/>\n * \/<br \/>\n# define BUFSIZE 10<\/p>\n<p>\/ *<br \/>\n * LCD PUERTO<br \/>\n * EasyPic2, EasyPic3: PORTB<br \/>\n * EaspyPic4: PORTD<br \/>\n * \/<br \/>\n# define LCDPORT PORTD<br \/>\n# define LCDTRIS TRISD<\/p>\n<p>\/ *******************<br \/>\n * VARIABLES GLOBALES<br \/>\n ******************* \/<br \/>\noutofrange unsigned char; \/ \/ Fuera de rango marca: establece cuando se detecta ning\u00fan eco<\/p>\n<p>unsigned int buf [BUFSIZE]; \/ \/ Muestras tamp\u00f3n<br \/>\nunsigned char idx = 0; \/ \/ \u00cdndice de muestra actual en tamp\u00f3n<\/p>\n<p>\/ *****************************************<br \/>\n * rutina de interrupci\u00f3n<br \/>\n * manijas Esta ISR TIMER1 desbordamiento s\u00f3lo<br \/>\n ***************************************** \/<br \/>\nvac\u00edo de interrupci\u00f3n (void)<br \/>\n        {<br \/>\n        if (PIR1.TMR1IF) \/ \/ desbordamiento timer1?<br \/>\n                {<br \/>\n                outofrange = 1; \/ \/ Establecer fuera de rango marca<br \/>\n                PIR1.TMR1IF = 0; \/ \/ Claro indicador de interrupci\u00f3n<br \/>\n                }<br \/>\n        }<\/p>\n<p>\/ ************<br \/>\n * bucle principal<br \/>\n ************ \/<br \/>\nvoid main ()<br \/>\n        {<br \/>\n        ADCON1 = 0; \/ \/ Permite ADC         TRISA = 0xff; \/ \/ PORTA como entradas         PORTA = 0;<\/p>\n<p>        TRISC = 0; \/ \/ PORTC como salidas<br \/>\n        PORTC = 0;<\/p>\n<p>        \/ \/ Configuraci\u00f3n Timer1<br \/>\n        T1CON = 0b00001100; \/ \/ Prescaler 1:1, osc. activado, no sincronizaci\u00f3n, clk interior, se detuvo # ifdef LCDPORT         \/ \/ init LCD         Lcd_Init (&amp; LCDPORT); Ajustes EP2\/3\/4 \/ \/ uso         Lcd_Cmd (Lcd_CLEAR); \/ \/ Claro display         Lcd_Cmd (Lcd_CURSOR_OFF); \/ \/ Cursor fuera<\/p>\n<p>        Lcd_Out (1, 1, &quot;UltraSonicRanger&quot;);<br \/>\n        Lcd_Out (2, 5, &quot;CM&quot;);<br \/>\n# endif<\/p>\n<p>        \/ \/ Init Channel PWM: 40 Khz, el ciclo de trabajo del 50%<br \/>\n        PWM1_Init (40.000);<br \/>\n        PWM1_Change_Duty (128);         INTCON.GIE = 1; \/ \/ Habilitar las interrupciones globales         INTCON.PEIE = 1; \/ \/ Habilitar las interrupciones perif\u00e9ricas         PIE1.TMR1IE = 0; \/ \/ Desactivar el temporizador de interrupci\u00f3n 1         PIR1.TMR1IF = 0; \/ \/ Claro temporizador 1 flag de interrupci\u00f3n<\/p>\n<p>        \/ \/ Para siempre<br \/>\n        for (; \ud83d\ude09<br \/>\n                {<br \/>\n                unsigned char i; \/ \/ Byte de prop\u00f3sito general<br \/>\n                unsigned long cm; \/ \/ Distancia en cent\u00edmetros<br \/>\n                unsigned char str [4]; \/ \/ Cadena para visualizador gama<\/p>\n<p>                \/ \/ Preparar temporizador<br \/>\n                T1CON.TMR1ON = 0; \/ \/ Detener el temporizador<br \/>\n                outofrange = 0; \/ \/ Reposici\u00f3n de la bandera de gama<br \/>\n                TMR1H = 0; \/ \/ Claro timer1<br \/>\n                TMR1L = 0;<\/p>\n<p>                T1CON.TMR1ON = 1; \/ \/ Iniciar el temporizador 1<br \/>\n                PIE1.TMR1IE = 1; \/ \/ Habilitar el temporizador 1 interrupciones en desbordamiento<\/p>\n<p>                \/ \/ Enviar impulsos<br \/>\n                PWM1_Start (); \/ \/ Activar la salida PWM: transductor es pulsada en frecuencia ultras\u00f3nica<br \/>\n                delay_us (PULSELEN); \/ \/ Durante microsegundos PULSELEN<br \/>\n                PWM1_Stop (); \/ \/ Detener PWM<\/p>\n<p>                Delay_us (PULSELEN * 2); \/ \/ Hacer nada por el doble de la duraci\u00f3n de la longitud del pulso para evitar la salida en falso<\/p>\n<p>                while (Adc_Read (1) &lt;1) \/ \/ mientras hay pulso detectado (no hay se\u00f1al en el canal ADC 1)<br \/>\n                        {<br \/>\n                        if (outofrange) break; \/ \/ A tarde, fuera de rango<br \/>\n                        }<\/p>\n<p>                T1CON.TMR1ON = 0; Temporizador \/ \/ stop 1<br \/>\n                PIE1.TMR1IE = 0; \/ \/ Desactivar el temporizador 1 interrumpe en caso de desbordamiento<\/p>\n<p>LCDPORT # ifdef<br \/>\n                if (outofrange) \/ \/ es el condtion overrange detectado?<br \/>\n                        {<br \/>\n                        Lcd_Out (2, 8, &quot;OverRange&quot;); Mensaje sobre rango \/ \/ display<br \/>\n                        }<br \/>\n                else if (TMR1H &lt;((PULSELEN * 6 * Clock_kHz ()) \/ (1000 * 4 * 256))) \/ se detecta \/ condiciones bajo rango?<br \/>\n                        {<br \/>\n                        Lcd_Out (2, 8, &quot;UnderRnge&quot;); Mensaje underrange \/ \/ display<br \/>\n                        }<br \/>\n                else \/ \/ buena lectura<br \/>\n                        {<br \/>\n                        buf [idx] = TMR1H; \/ \/ Crear un valor de 16 bits de timer1<br \/>\n                        buf [idx] &lt;&lt; = 8; \/ \/ MSB<br \/>\n                        buf [idx] + = TMR1L; \/ \/ LSB<\/p>\n<p>                        \/ \/ Buffer circular<br \/>\n                        idx + +; \/ \/ Siguiente ubicaci\u00f3n<br \/>\n                        if (idx == BUFSIZE) \/ \/ se llega al final?<br \/>\n                                {<br \/>\n                                idx = 0; \/ \/ Volver a<br \/>\n                                }<\/p>\n<p>                        cm = 0; \/ \/ Preparar cent\u00edmetro promediado<br \/>\n                        for (i = 0; i &lt;BUFSIZE; i + +) \/ \/ para todas las muestras en tamp\u00f3n<br \/>\n                                {<br \/>\n                                cm + = buf [i]; \/ \/ A\u00f1adir a resumir<br \/>\n                                }<br \/>\n                        cm \/ = BUFSIZE; \/ \/ muestras promedio<\/p>\n<p>                        \/ *<br \/>\n                         * cm contiene ahora el n\u00famero de ciclos de reloj<br \/>\n                         * desde el inicio de la transmisi\u00f3n de ultrasonidos<br \/>\n                         * hasta la primera detecci\u00f3n del eco<br \/>\n                         * la duraci\u00f3n en segundos es s = cm \/ (Clock_Khz () * 1000\/4)<br \/>\n                         * si se admite que el sonido velocidad en el aire es de 340 m \/ s<br \/>\n                         * la distancia en cent\u00edmetros (adelante y atr\u00e1s) es D = s * 340 * 100\/2<br \/>\n                         * o d = 340 * 100\/2 * cm \/ Clock_khz () \/ 1000 * 4<br \/>\n                         * d = 34 * 2 \/ Clock_Khz ()<br \/>\n                         * \/<br \/>\n                        cm * = 34 * 2; \/ \/ Ahora se convierte en cent\u00edmetros<br \/>\n                        cm \/ = Clock_Khz ();<\/p>\n<p>                        ByteToStr (cm, str); \/ \/ Convierte a string<br \/>\n                        Lcd_Out (2, 1, str); \/ \/ Imprimir cadena<br \/>\n                        Lcd_Out (2, 8, &quot;&quot;); \/ \/ Claro mensaje de error<br \/>\n                        }<br \/>\n# endif<\/p>\n<p>                Delay_ms (10); \/ \/ 10 milisegundos de retardo antes de la siguiente muestra<br \/>\n                }<br \/>\n        }<br \/>\n[\/php]<\/p>\n<p>INSTRUCCIONES DE USO<\/p>\n<p>Lo he comprobado con una placa de desarrollo EasyPIC4:<\/p>\n<p>Por supuesto, este ranger es muy b\u00e1sico y tienen algunos inconvenientes:<\/p>\n<p>Una peque\u00f1a sorpresa para la c\u00e9lula del receptor piezzo podr\u00eda conducir a una medici\u00f3n err\u00f3nea,<\/p>\n<p>Desde pulso ultras\u00f3nico no est\u00e1 codificado, cualquier otra fuente ultras\u00f3nica pondr\u00e1 el desorden:<\/p>\n<p>=&gt; Desbordara por arriba o condiciones no deseadas pueden suceder<\/p>\n<p>Este es el precio de la muy simple dise\u00f1o del guardabosques.<\/p>\n<p style=\"text-align: center;\">Esto es lo que debe ver en su \u00e1mbito de aplicaci\u00f3n, si usted sondea a los pines del receptor de ultrasonidos:<br \/>\n<a href=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ultrasonic_range_finder1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-10142\" alt=\"090-ULTRASONIC-RANGER-ultrasonic_range_finder[1]\" src=\"http:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ultrasonic_range_finder1.jpg\" width=\"554\" height=\"424\" srcset=\"https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ultrasonic_range_finder1.jpg 792w, https:\/\/www.pesadillo.com\/pesadillo\/wp-content\/uploads\/2014\/07\/090-ULTRASONIC-RANGER-ultrasonic_range_finder1-300x229.jpg 300w\" sizes=\"auto, (max-width: 554px) 100vw, 554px\" \/><\/a><\/p>\n<p>Horizontal: 1 ms \/ div<br \/>\nvertical: 5 mV \/ div<\/p>\n<p>El eco mec\u00e1nica se retira por un retraso de software.<br \/>\nLa onda reflejada es de alrededor de 40 mV pico a pico, se trata de alrededor de 9,5 ms despu\u00e9s de la r\u00e1faga ultras\u00f3nica, 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.<br \/>\nDe hecho, fue el techo, que era de 172 cm por encima del circuito, la pantalla LCD escribi\u00f3 170 cm.<\/p>\n<p>Fuente:\u00a0<a href=\"http:\/\/www.micro-examples.com\/public\/microex-navig\/doc\/090-ultrasonic-ranger.html\" target=\"_blank\">http:\/\/www.micro-examples.com\/public\/microex-navig\/doc\/090-ultrasonic-ranger.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfC\u00d3MO FUNCIONA Y ESQUEM\u00c3\u0081TICA 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\u00f3nico 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\u00f3nico el pulso de vuelta puede [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[48,58,69],"class_list":["post-10139","post","type-post","status-publish","format-standard","hentry","category-electronica","tag-arduino","tag-circuitos-electronicos","tag-electronica"],"_links":{"self":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/10139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10139"}],"version-history":[{"count":4,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/10139\/revisions"}],"predecessor-version":[{"id":10145,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=\/wp\/v2\/posts\/10139\/revisions\/10145"}],"wp:attachment":[{"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pesadillo.com\/pesadillo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}