Autor Tema: Duda con sensor ultrasónico y PIC16f877  (Leído 10870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Duda con sensor ultrasónico y PIC16f877
« en: 11 de Noviembre de 2006, 17:35:49 »
Hola amigos , soy nuevo aquí y es la primera vez que escribo  :lol:. Les cuento , estoy haciendo mi proyecto de titulación y necesito medir la distancia de un objeto con un sensor ultrasónico. Después de buscar harto, encontré un sensor de Parallax modelo PING y lo compré. El problema que tengo con este sensor es que posee solo un pin de señal, por lo tanto debo estar invirtiendo el pin del pic como salida y entrada constantemente para que active al sensor y luego recibe la señal alta de éste para  temporizarla. Así  con este tiempo se puede calcular la distancia. La duda que tengo es la siguiente, que debo hacer para proteger el microcontrolador y el sensor , en caso que mi programa este erróneo y el sensor mande la señal alta ( TTL de 5 V) y el pic este configurado como salida? , porque lo más probable es que alguno de los 2 componentes se quemen en caso que suceda lo descrito.
Como soy relativamente principiante en lo que es programación , no me atrevo a probar el programa por miedo a quemar algo :D
De antemano muchas gracias por la ayuda
Saludos

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #1 en: 11 de Noviembre de 2006, 18:10:27 »
una pregunta par apoder responderte, cual es el codigo del sensor q has comprado? necesito saber como es el protocolo de comunicacion para poder ayudarte.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #2 en: 11 de Noviembre de 2006, 19:30:07 »
Hola micro_cadaver, gracias por responder.
Bueno el la comunicación entre el sensor y el PIC es a traves de señales TTL.
Te describo el funcionamiento:
Desde el PIC debo mandar un pulso alto de 5[us] al sensor como señal de activación (tengo configurado el PIN RB4 para esto). Al activar el sensor , éste esperará 750[us] antes de mandar el pulso alto hacia el pic, por lo tanto dentro de este tiempo se debe invertir el pin ahora como entrada. Durante  este tiempo tambien el sensor mandará la rafaga de sonido. Entonces , cuando el sensor haya mandado el pulso alto al PIC, éste solo bajará cuando le llege el eco al sensor.
Trate de poner un grafico del datasheet del sensor, donde se muestran los tiempos y el funcionamiento de mejor manera, pero sale que no hay capacidad , a pesar de que el tamaño del archivo es chico :S
Saludos.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #3 en: 11 de Noviembre de 2006, 19:36:17 »
hola amigo!
Intenta pegar el link a la datasheet, y el que pueda ayudarte la baja directamente a su PC desde alli.
Saludos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #4 en: 11 de Noviembre de 2006, 19:49:26 »
Aqui tienes algunas cosas que hice con los ultrasonidos: Medidor de distancias mediante Ultrasonidos SFR04

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #5 en: 11 de Noviembre de 2006, 20:17:17 »
Hola RedPIC.
Si habia visto tu link antes de postear, me ha servido de mucho, pero el problema que tengo es que el sensor mio tiene solo un pin de señal, el SFR04 tiene dos pines , uno de transmision y otro de recepcion, por lo tanto se configura en el pic un pin de entrada y otro de salida y no hay mayor problema.
El problema mio,es que si por error en el programa que tengo, el sensor manda el pulso alto al pic y todavia tengo el pin configurado como salida, alguno de los dos componentes quedarían dañados. Entonces me gustaria saber que puedo hacer para proteger el circuito para probar mi programa sin correr riesgos.
Bueno aca esta el link  :mrgreen:
http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
Gracias!!! :mrgreen:

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #6 en: 11 de Noviembre de 2006, 20:46:30 »
Orale knino esta super bien este sensor para los usuarios del Basic y mas como trae el codigo ejemplo, una pregunta cuanto te Costo y donde lo Conseguiste???.

Con lo de la conexion, en el pdf lo conectan a pelo directo al pin de I/O,  como lo muestra en los codigos ejemplos lo que podrias hacer es mandar el triger e inmediatamente despues hacer una pausa de 200microsegundos y poner como entrada tu pin.

Citar
The heart of the program is the Get_Sonar subroutine. This routine starts by making the output bit of
the selected IO pin zero – this will cause the successive PULSOUT to be low-high-low as required for
triggering the PING))) sensor. After the trigger pulse falls the sensor will wait about 200 microseconds
before transmitting the ultrasonic burst. This allows the BS2 to load and prepare the next instruction.
That instruction, PULSIN, is used to measure the high-going pulse that corresponds to the distance to
the target object.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #7 en: 11 de Noviembre de 2006, 21:34:42 »
Hola navaismo:
Bueno el sensor lo consegui acá en Chile, te doy la página http://www.rambal.cl/product/sensores.htm , me costo aproximadamente US$43.
Claro la idea es esa mandar un pulso alto e invertir el puerto, pero el problema es que aún no programo muy bien , entonces me gustaría saber como puedo proteger el pic y el sensor en caso que mi programa este erróneo y sin querer tenga el pin como salida cuando el sensor mande el pulso de entrada. Así podría probar mi programa sin miedo a quemar los componentes. :mrgreen:
Saludos.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #8 en: 13 de Noviembre de 2006, 12:54:06 »
Utiliza el código que proporciona Paralla, adáptalo a PBP.

No te preocupes por cambiar entradas y salidas ya que la instrucción PULSIN cambia la terminal del puerto a entrada y PULSOUT hace lo propio para salida.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #9 en: 14 de Noviembre de 2006, 04:00:05 »
Por ahi lei un post si no mal recuerdo, de CHALY (chaly danos luz porfavor, si me equivoco) que con un opto puedes tener salidas no lineal (a linieal me refiero 1 o 0 jiji) entonces un opto podria ser una opcion para aislar el pin de ambos.

Solo que te toparias con el grandissimo problema de como activar el led cunado el pin cambie de estado.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #10 en: 15 de Noviembre de 2006, 19:09:52 »
Problema solucionado  :mrgreen:
Puse unas resistencias como divisoras de corriente para proteger el uC y el sensor.
Más adelante publicaré el programa, lo voy a mejorar un poco más antes de postearlo.
Gracias por la ayuda
Saludos

Desconectado knino

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #11 en: 09 de Diciembre de 2006, 15:50:51 »
Bueno como lo prometido es deuda acá va el programilla....
Se puede arreglar mejor , pero no me he dado el tiempo para hacerlo  :mrgreen:
Ojalá les sirva.
Saludos


#include <16f877.h>
#device PIC16F877 *=16 ADC=8
#fuses HS,NOWDT,NOPROTECT
#USE DELAY(clock=20000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,bits=8)
#ORG 0x1f00,0x1fff void loader(){}
#USE FAST_IO(b)
#byte PORTB=6


               /*definicion de tiempos*/

               /* Delay trigger en microsegundos*/
#define INPUT_TRIGGER_DELAY 5       

               /* Delay entre medidas 200us */
#define DELAY_BETWEEN_ECHO_PULSE 200

               
               
#define MAX_DELAY_ECHO_PULSE 44000    /*incrementos del timer para 35 ms usando prescaler de 4 */
                                        
   
               
               /* Cada incremento del timer 1 toma 0.8us con un prescaler de 4 */
               /* = # increments *( 0.8* 347) / (5000 *4)  app. t / 72 */
#define GET_DISTANCE(t) (t / 72)

               /* Configuracion del PIN */
#define ULTRASONIC_TX PIN_B4

#define DISTANCE_INFINITE (0xffff)

               /* Definicion tipo de datos */
typedef int uint8_t;

typedef long uint16_t;

            /* definicion de variables */
char c;
   
uint16_t echo_delay;

               /* definicion de variables globales */
uint16_t distance = DISTANCE_INFINITE;    /*Esta es la distancia del obejto mas cercano
                 frente al sensor (en cm). Si es infinito, la distancia
                 del objeto es mayor a la distancia que puede medir el sensor*)
                
               /* Funciones prototipos*/
               /* Interfaces publicas */
void main(void);
void init_timers(void);
void init(void);
void monitor_distance_sensor();



               /* Inicializacion del driver.*/
void init(void) {

  init_timers();

}                   

                  
void init_timers(void) {
                   
                    

  setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);   /* Setup del Timer1 */

}                   

                  /* Programa principal. */
void main(void) {
 
 loop:    switch(getc()){
   case'1':{      init();
           for ( ; ; ) {
         enable_interrupts(INT_RDA);
         enable_interrupts(GLOBAL);
           set_tris_b(0b00000000);          
           output_low(ULTRASONIC_TX);
                monitor_distance_sensor();
         if(c=='2'){     delay_ms(1000);
                 set_tris_b(0b00000000);
                 goto loop;
                 }

             printf("echo delay %lu\r\n", echo_delay);
         
             printf("distancia %lu\r\n", distance);
           }
      }
}                   /* main */
}
void monitor_distance_sensor(void) {
                 

                 /*Se envia el pulso alto (trigger) por el Pin RB4 */
  output_high(ULTRASONIC_TX);

                
  delay_us(INPUT_TRIGGER_DELAY);   /*duracion de 5us del pulso*/

  output_low(ULTRASONIC_TX);
      delay_us(250);
    set_tris_b(0b00010000);        /*Se invierte el PIN RB4 para recibir el pulso alto que mandara el sensor*/   
     
                   

                    /* Se espera el pulso alto que mandará el sensor. Esto detectara*/
                   /*la transicion de bajo a alto en el PIN RB4 . */
  for ( ; !input(ULTRASONIC_TX); )
    ;

                   
   
                    /* Se restea el TIMER1. */
  set_timer1(0);

                    /*Aca se detecta la bajada del pulso anterior*/
  for ( ; input(ULTRASONIC_TX); )
    ;

                   /*se captura la cuenta del TIMER1*/
  echo_delay = get_timer1();

                  /*si la distancia es mayor a 35ms ( 44000*0.8 ) la distancia es infinita*/
  if (echo_delay >= 44000) {         
    distance = DISTANCE_INFINITE;
  }
  else {
    distance = GET_DISTANCE(echo_delay);   /*si la distancia es menor a 35ms la distancia se detectara*/
  }

 
  delay_us(DELAY_BETWEEN_ECHO_PULSE);
}                   

#int_rda   
inter() {
   c=getc();
      }

Desconectado juandeugarte

  • PIC10
  • *
  • Mensajes: 1
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #12 en: 28 de Mayo de 2008, 13:47:16 »
Hola, estoy haciendo un medidor de distancia tambien, estoy usando un sensor PIN))) de Parallax, estoy mostrando en LCD, se que con ella no hay problema , ni con el PIC (18f4550 es el que estoy usando) pero al conectar el sensor no se muestra nada en la LCD. no se si es que el sensor esta dañado ó es algo falta, la verdad me gustaria que me ayudaran, aqui dejo el programa es muy parecido al anterior pero con las modificaciones para LCD

#include <18f4550.h>
#fuses NOPROTECT,NOLVP,NOWDT,XT
#use delay(clock=4000000)
#include <LCD.C >
#use fast_io(b)
#byte PORTB=6

#define INPUT_TRIGGER_DELAY 5
#define DELAY_BETWEEN_ECHO_PULSE 200
#define MAX_DELAY_ECHO_PULSE 35000

#define GET_DISTANCE(t)(t/58)

#define ULTRASONIC_TX PIN_B4
#define DISTANCE_INFINITE (0xffff)

int echo_delay;
float distance = DISTANCE_INFINITE;

void main(void);
void distancia_sensor();


main()
{
   do
   {
   lcd_init();
   SETUP_ADC_PORTS( NO_ANALOGS );
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   set_tris_b(0b00000000);
   output_low(ULTRASONIC_TX);
   distancia_sensor();
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);

   printf(lcd_putc,"D = %2.2f cm",distance);
   }
   while(true);
 }

void distancia_sensor(void)
 {
   output_high(ULTRASONIC_TX);
   delay_us(INPUT_TRIGGER_DELAY);
   output_low(ULTRASONIC_TX);
   delay_us(750);
   set_tris_b(0b00010000);
   for(;!input(ULTRASONIC_TX););
   set_timer1(0);
   for(;input(ULTRASONIC_TX););
   echo_delay=get_timer1();
   if(echo_delay>=35000)
      {
         distance=DISTANCE_INFINITE;
      }
      else
         {
            distance=GET_DISTANCE(echo_delay);
         }
   delay_us(DELAY_BETWEEN_ECHO_PULSE);
}


Desconectado jpardo

  • PIC10
  • *
  • Mensajes: 6
Re: Duda con sensor ultrasónico y PIC16f877
« Respuesta #13 en: 19 de Julio de 2011, 13:04:33 »
Estoy en la implementacion de este modulo pero en PBP, agradeceria si  pudieran subir el esquematico para analizar los programas colgados anteriormente... Creo hay bastante info en C sobre este modulo.. sera por sus librerias que soporta el CCS C compiler...   :shock: :huh:

Saludos