Autor Tema: problema de codigo en robot esquiva obstaculos  (Leído 2831 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
problema de codigo en robot esquiva obstaculos
« 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();

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #1 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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #2 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

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #3 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.

« Última modificación: 23 de Junio de 2017, 17:48:56 por planeta9999 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #4 en: 23 de Junio de 2017, 20:39:39 »
- EDIT -

Para soymoe

1 - Lee
2 - Busca
3 - Buena suerte
« Última modificación: 23 de Junio de 2017, 20:44:25 por KILLERJC »

Desconectado fandiño

  • PIC10
  • *
  • Mensajes: 12
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #5 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.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #6 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

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:problema de codigo en robot esquiva obstaculos
« Respuesta #7 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.
« Última modificación: 25 de Junio de 2017, 12:52:29 por planeta9999 »


 

anything