TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: soymoe en 23 de Junio de 2017, 16:41:24

Título: problema de codigo en robot esquiva obstaculos
Publicado por: soymoe en 23 de Junio de 2017, 16:41:24
hola a todos, estoy queriendo hacer un robot esquiva obstaculos con un pic 12f675 y un modulo puente H, el circuito funciona el problema es que al chocar los sensores en RA2 yRA3 con la pared lo hago retroceder pero no se como incorporar a la programacion el giro para esquivar el objeto, este es el cogigo de mi programa principal, las rutinas ya la tengo definidas, a ver si alguien me da una mano con eso:
Código: [Seleccionar]
restart_wdt();
               Avanzar();
               if((!bit_test(PortA,2)))
               {
         retro:Retroceder();
               if((!bit_test(PortA,2)))goto retro;
               GirarIzquierda();
               }
               if((!bit_test(PortA,3)))
               {
          retro2:Retroceder();
               if((!bit_test(PortA,3)))goto retro2;
               GirarDerecha();
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: KILLERJC en 23 de Junio de 2017, 17:00:14
Código: C
  1. retro:Retroceder();
  2.                if((!bit_test(PortA,2)))goto retro;

No se para que existen los while o do..while en C.

Código: C
  1. do{
  2.     Retroceder();
  3. }while(bit_test(PortA,2))

o

Código: C
  1. while(1){
  2.     Retroceder();
  3.     if(!bit_test(PORTA,2)){
  4.         break;
  5.     }
  6. }

Y sinceramente, es masomenos lo que tenes en el codigo, si se detecto que RA2 o RA3 (supongo que son los sensores izquierdo y derecho) se detecto algo, entonces que pare, retroceda, y gire para el lado que debe ser
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: soymoe en 23 de Junio de 2017, 17:32:13
Vos programas de una forma, yo de otra pero el resultado en general es el mismo. Lo que tengo  que hacer es una funcion que sea "retrocederIzquierda"y otra para la derecha me parece
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: planeta9999 en 23 de Junio de 2017, 17:45:36
.

Lo que quieres hacer es muy subjetivo, ¿ retroceder que distancia ?, ¿ girar izquierda o derecha, cuantos grados ?.

Yo de todas formas eso lo haría con un sensor de ultrasonidos o de infrarrojos, es más elegante que dejar que el robot vaya pegándose golpes con todo lo que pilla por delante (eso no es esquivar obstáculos). Así además no tendrías que retroceder, solo cambiar la dirección con un ángulo, el que sea, y si el sensor sigue detectando un objeto que siga girando más hasta tener el camino libre.

Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: KILLERJC en 23 de Junio de 2017, 20:39:39
- EDIT -

Para soymoe

1 - Lee
2 - Busca
3 - Buena suerte
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: fandiño en 24 de Junio de 2017, 22:04:31
hola moe. estaba mirando tu código. creo que el problema que tienes es que te falta un delay despues de cada giro porque cuando le das girar a la izquierda o a la derecha, en seguida va a pasar a la siguiente linea de código y no alcanza a girar nada. si usas el compilador ccs te recomiendo que utilices delay_ms para que haga el giro. el delay lo tienes que ir cuadrando de tal forma que el robot alcance a girar noventa grados.

acá te dejo el tutorial de andres para aprender a utilizar los delays:

DELAY_MS(time)
Esta función realiza retardos del valor especificado en time. Dicho valor de tiempo es
en milisegundos y el rango es 0-65535.

Para obtener retardos más largos así como retardos 'variables' es preciso hacer
llamadas a una función separada; véase el ejemplo siguiente.

Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta
función, para que el compilador sepa la frecuencia de reloj.

Ejemplos:

Código: [Seleccionar]

#use delay (clock=4000000) // reloj de 4MHz
delay_ms( 2 ); // retardo de 2ms

void retardo_segundos(int n) { // retardo de 'n' segundos; 0 <= n => 255
for (; n!=0; n--)
delay_ms( 1000 ); // 1 segundo

}


si no usas el ccs, el delay lo puedes hacer simplemente con un bucle for muy largo

espero que se te arregle el error.
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: soymoe en 25 de Junio de 2017, 11:19:48
Hola gracias a todos por responder, la verdad todavia no probe el robot, el tema del delay es complicado porque mientras hago el delay los motores estan apagados y por ende el robot no se mueve
Título: Re:problema de codigo en robot esquiva obstaculos
Publicado por: planeta9999 en 25 de Junio de 2017, 12:49:32
.

Se supone que tus funciones de girar, están moviendo los motores y desplazando el robot durante el tiempo que hayas programado, no necesitas un delay para nada.

Lo de esquivar un objeto, lo haces a ciegas (nunca mejor dicho), a base de darte golpes con los objetos. Asi es como lo hacen los juguetes autónomos, chocan y cambian de dirección, un poco cutre.

No utilices el GOTO en programación, eso es prehistórico, utiliza instrucciones de bucle, como WHILE.  Monta un programa principal en el main(), con un bucle infinito While(1), y desde allí chequea los puertos de los sensores y manda a funciones según se activen.