Autor Tema: Ayuda Sensor Ultrasónico HC-SR04 mikroC  (Leído 9614 veces)

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

Desconectado fernando_2494

  • PIC10
  • *
  • Mensajes: 4
Ayuda Sensor Ultrasónico HC-SR04 mikroC
« en: 19 de Diciembre de 2014, 21:01:55 »
Hola a todos, soy algo nuevo programando pics y he aprendido la mayoría con ayuda de un compañero y con ayuda de videos en internet, este es mi primer proyecto formal más que una prueba, es un pequeño robot que cuenta con 2 motores que le dan el movimiento y una rueda loca para sostenerse,El PIC usado es el Pic16F886 y programado en mikro C(les adjunto el archivo en pdf y hex) el funcionamiento se basa en que el carro se energiza, espera un tiempo (alrededor de 4 segundos) y comienza a avanzar, esto hasta que el sensor ultrasónico (Hcsr04) detecta "algo" en un rango de distancias, entonces el carro se detiene y gira 180° primero a la derecha, luego a la izquierda (esto se determina por una condición de la variable x), al terminar este giro el sensor vuelve a repetir su acción para determinar si hay algo en frente, si no lo hay avanza de lo contrario da una vuelta de 360° y vuelve al programa principal.

Este programa lo ocupe en un principio con la ayuda de un push button para comprobar la sintaxis de mi programa, a la hora de reformular el programa para usarlo con el sensor aparecieron los problemas, parece que el sensor no reconoce bien las distancias y el programa no realiza bien las subrutinas que tiene que son las de giro.

He leido algunos foros tratando de buscar ayuda pero no tienen el mismo problema en específico que yo, el uno leí que decía que había que alterar la fórmula usada para calcular distancias del sensor dependiendo de la frecuencia que uso en el PIC, sólo que no se de que depende este cambio.

Cabe mencionar que el PIC16F886 que estoy usando lo configuro con una frecuencia de 8MHz, si el programa tiene un error en su escritura les agradecería me corrigieran y notificaran, como les digo soy principiante para esto quiero aprender lo más posible, leeré y agradeceré todas sus respuestas.

Les adjunto un link de la datasheet del sensor http://www.micropik.com/PDF/HCSR04.pdf   
así como del pic http://www.wvshare.com/img/pinout/PIC16F886_l.jpg

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Sensor Ultrasónico HC-SR04 mikroC
« Respuesta #1 en: 19 de Diciembre de 2014, 23:34:51 »
Seria mas simple si pusieras el codigo en el foro con el comando (code)(/code)  con corchetes [] o tenes el acceso con un botoncito que tiene la forma de numeral #

Creo que esta es la parte donde activas el trigger y esperas el sensor no?

Código: [Seleccionar]
portb=0x01; //ultrasonic trigger
delay_us(20); //delay trigger (datasheet)
portb=0x00; //trigger off
while(portb.b1==0){}

Citar
Este programa lo ocupe en un principio con la ayuda de un push button para comprobar la sintaxis de mi programa, a la hora de reformular el programa para usarlo con el sensor aparecieron los problemas, parece que el sensor no reconoce bien las distancias y el programa no realiza bien las subrutinas que tiene que son las de giro.

Es necesario solo 10uS de pulso.
Con ese codigo estarias viendo si existe o no una recepcion (echo), si quisieras saber la distancia tenes que medir el ancho de pulso de la salida del receptor.
Lo que no se es si no detecta nada que ocurriria, si la salida queda en alto o la salida queda en bajo.

Asi que deberias de tomar ese ancho de pulso y definir la distancia maxima o minina que queres.
Como hacerlo?
Dependiendo de que puerto estas usando podes configurar una interrupcion para que cuando ocurra comience a contar un temporizador, cuando recibe un pulso bajo (es decir se termino el pulso) paras el temporizador y te fijas si el tiempo que conto esta dentro de unos valores maximos y minimos que vos definis con anterioridad asi actuas segun sea la distancia, (aca si depende el oscilador por que el temporizador cuenta a una velocidad dada por el oscilador y preescalers), si por alguna razon no recibe nada podes llegar a usar el mismo timer para que cuando se rebalse ejecute otra interrupcion que corresponderia a que no hubiera nada al frente.

Distance in centimeters = Time / 58  ( Tiempo en uS )

Aca hay algo parecido para un 887 ( la misma flia ) y hace uso de lo que dije, interrupcion portb y timer. Esta para XC8 pero es C y termina siendo facil portarlo a otro compilador en C, al menos para darte una referencia.
http://tutorial.cytron.com.my/2013/11/19/sn-hc-sr04-pic16f887/

Tambien podes hacer uso del modulo CCP como lo hizo MLO, hecho en CCS
http://www.todopic.com.ar/foros/index.php?topic=42732.msg354265#msg354265

Y aca tenes una explicacion como funciona en español:
http://www.tecbolivia.com/index.php/articulos-y-tutoriales-microcontroladores/17-como-medir-distancias-con-el-sensor-ultrasonico-ping

Tambien tenes que tener en cuenta que el sensor cubre unos 30º y no es perfectaemente lineal hacia al frente.

« Última modificación: 19 de Diciembre de 2014, 23:47:04 por KILLERJC »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Ayuda Sensor Ultrasónico HC-SR04 mikroC
« Respuesta #2 en: 20 de Diciembre de 2014, 07:38:27 »

Lo que no se es si no detecta nada que ocurriria, si la salida queda en alto o la salida queda en bajo.


Si no detecta nada te devuelve un pulso fuera de rango. Es un poco fastidioso pero es así. Es necesario acotar un rango porque si no te encuentras con falsos positivos.

Saludos,
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado fernando_2494

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda Sensor Ultrasónico HC-SR04 mikroC
« Respuesta #3 en: 21 de Diciembre de 2014, 18:48:48 »
Hola, muchas gracias por sus comentarios, he solucionado el problema del sensor, lo único que ahora me causa problema es la variable "direct", que determina si va a girar izquierda o derecha (tienen que ir intercalados), el problema es que siempre gira hacia la derecha, no respeta que yo cambie el valor de la variable, podrían ayudarme?
Código: [Seleccionar]
const time1=1000; //time to turn 90°
const time2=2000; //time to turn 180°
const timeb=200; //time for brake
int direct;           //direction variable
int width;           //distance variable
int range;
  // agregar tiempos de freno en voids de dirección antes de avanzar derecho si se patina, agregar escaneo a ifs de right y left
void left()          //turn 90 left
{
portb=0x00;
 width=0;
 range=0;
porta=0x00;
delay_ms(timeb);
porta=0x11;
delay_ms(time1);
porta=0x00;
portb=0x01;      //ultrasonic trigger
 delay_us(20);    //delay trigger (datasheet)
 portb=0x00;      //trigger off
 while(portb.b1==0){}
 while(portb.b1==1){
 delay_us(10);
width++;
}
range=(width*10)/58;
if((range>=2)&&(range<=10))
{
porta=0x22;
delay_ms(time2);
}
else {}
}

void right()         //turn 90 right
{
portb=0x00;
 width=0;
 range=0;
porta=0x00;
delay_ms(timeb);
porta=0x22;
delay_ms(time1);
porta=0x00;
portb=0x01;      //ultrasonic trigger
 delay_us(20);    //delay trigger (datasheet)
 portb=0x00;      //trigger off
 while(portb.b1==0){}
 while(portb.b1==1){
delay_us(10);
width++;
}
range=(width*10)/58;
if((range>=2)&&(range<=10))
{
porta=0x11;
delay_ms(time2);
}
else{}
}

void main() {
 direct=0;
 ansel=0x00;
 anselh=0x00;
 trisb=0x02;           //port B for ultrasonic 0 trigger 1 echo
 portb=0x00; //        Ultrasonic
 trisc=0x00;      // c 2 & 3 frontal lights, c 4 & 5 backwards lights
 trisa=0x00;      // port a is for outputs only
 porta=0x00;
 portc=0x00;
 delay_ms(1300);   //wait before going forward
 while (1) {
 portb=0x00;
 width=0;
 range=0;
 porta=0x21;      // a0 & a5 are activated so it moves forward
 portc=0x3C;      // all lights are on
 portb=0x01;      //ultrasonic trigger
 delay_us(20);    //delay trigger (datasheet)
 portb=0x00;      //trigger off
 while(PORTB.F1==0){}
 while(PORTB.F1==1)
 {
delay_us(10);
width++;
}
range=(width*10)/58;
 if ((range>2)&&(range<15)&&(direct=0))
 {direct==1;
 right();}
 if ((range>2)&&(range<15)&&(direct=1))
 {direct==0;
 left();}
 else{}
 }
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Sensor Ultrasónico HC-SR04 mikroC
« Respuesta #4 en: 21 de Diciembre de 2014, 19:10:30 »
 if ((range>2)&&(range<15)&&(direct=0))
 {direct==1;
 right();}

En las condiciones tenes un problema con:

direct=0

Estas asignando un 0 a direct, la condicion de igualdad deberia ser direct == 0 , luego asignas. Creo que hay 2 partes del codigo con ese problema
Quedaria asi

 if ((range>2)&&(range<15)&&(direct==0))
 {direct=1;
 right();}


http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Y no hace falta que pongas los else si no los usas:

Citar
else{}

Y por la cantidad de condiciones no se si haria algo asi:

Citar
if (range>2)&&(range<15)) {
          if (!direct) {
                  direct=1;
                  right();
                  }
          else {
                  direct=0;
                  left();
          }
}

Permitiria que solo se produzca la comparacion de rango 1 sola ves (menos codigo), por lo tanto el codigo una sola ves.  y luego la comparacion del direct, como este vale 0 o 1 ( falso o verdadero ) puedo ponerlo sin el == pero es decision tuya eso, si te sentis mas comodo usas el direct == 0 y no !direct
« Última modificación: 21 de Diciembre de 2014, 19:32:53 por KILLERJC »


 

anything