Autocentrado de ruedas de direccion....

Iniciado por Wendigo, 01 de Marzo de 2007, 00:18:54 AM

Tema anterior - Siguiente tema

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

Wendigo

actualmente uso un bucle, un while, repeat, o loop o como se llame. el tipico

while distancia >10 do
{
     mover 10
}


pero hace parones..

Jetro

¿Que lenguaje de programación usas?
Quieres poner el programa en un mensaje?

Wendigo

#17
uso el de lego, el de los bloques.

realmente mi programa hace esto, lo del NQC que me pasaste pero comprobando la distancia.

     while (true)
          {
          OnFwd (OUT_L+OUT_R);
          Wait (20);
          if (TachoSpeed(OUT_R) < threshold) //default behaviour

hace como pausas cuando comprueba la distancia..
con el código este que me dijiste no se te paraba cuando comprobaba la distancia?
es que entiendo que durante 20ms se mueven los dos motores hacia adelante, comprueba la si alguna de las dos ruedas no se está moviendo como se espera y así sucesivamente..
corrígeme si me equivoco.


Siguiendo con lo del autocentrado: El problema es que creo que no combino bien el sensor de rotación con el uso del motor. Para practicar con el sensor de rotación hice que me mostrase por pantalla los grados a los que estaba moviendo la dirección yo, partiendo de que 0 fuese la posición de ruedas rectas. Luego le metí que cuando fuese distinto de 0 grados, hiciese un movimiento contrario al que se hacía, el resultado era que no podia mover, porque rapidamente el motor la corregía, pero curiosamente, sólo para un lado... O_o.
La idea puede estar en almacenar en un fichero la última posición en la que estaba el motor, y al encenderlo girar esos grados pero en negativo. El problema es que si se ha movido con el programa apagado ya no lo reconocería.

Tendré que probar a cuando se arranca que gire a tope hacia un lado hasta que no pueda y luego sabiendo que el tope está en 45 grados, pues girarlos en negativo.

Jetro

#18
En NQC debería ser algo como

While (TachoSpeed (OUT_R) < threshold)
{
OnFwd (OUT_L+OUT_R);
}

Wendigo

muchas gracias, mirare a ver si lo hago en el lenguaje de lego, y sino me pasare al NQC ya de una vez.
el threshold deberia ser la velocidad a la que he puesto el motor, verdad?

Jetro

ehm... threshold debería ser la velocidad del tacometro.

Wendigo

Cita de: Jetro en 29 de Mayo de 2007, 23:01:15 PM
ehm... threshold debería ser la velocidad del tacometro.

y esto tiene tacómetro?  :confundido:

Jetro

¿usas nxt, no?
Los motores llevan un 'encoder' que lleva la cuenta de cuanto ha girado. En el Cybermaster a ese mismo sistema se accede con TachoSpeed bajo NQC.

Wendigo

sí, NXT. Lo que estoy viendo es que todo lo que he encontrado de NQC en internet es referente a RCX, no a NXT.

Jetro

Para NXT existe NXC que es muy similar a NQC

Wendigo

por si a alguien que esté empezando le sirve de ayuda, con esto (está sin probar todavía) se controlaría el tema de la distancia para que no se choque con nada por la parte frontal.

task comprobar_sensor_distancia()
{
   SetSensorLowspeed(IN_4);
   while (true)
   {
      distancia_actual=SensorUS(IN_4);
      if (distancia_actual < DISTANCIA_MINIMA){
         //decidir que dirección tomar
         //poner semáforo
         OnRev(OUT_AC, 75);

      }
}


lo ideal para "decidir la dirección a tomar", sería tener dos ultrasónicos frontales y así poder decir que tiene que girar al lado contrario al del ultrasónico que tiene el objeto más próximo.

que haceis vosotros ver que direccion tomar cuando un obstáculo? aleatoria, siempre a la misma?

Jetro

No tengo la 'fortuna' de tener un nxt, pero el problema se me antoja similar al de buscar la zona de mas luz con el sensor de luz y el rcx.
Con un poco de ayudo escribí el siguiente código NQC, aunque en este caso la tarea era encontrar la zona con mas luz en vez de evitarla. (como el foro no accepta ficheros con extensión nqc tendras que cambiarlo tu mismo)

Wendigo

Existen en el NXC unas sentencias "avanzadas" para los motores, básicamente son 3, la del funcionamiento normal, otra en la que si un motor pierde velocidad el motor empuja más para compensar (todo lo contrario al control de traccion de un coche jeje) y la última es que si coges una rueda/motor y la sujetas se ralentiza la otra con la que esté asociada.

OnFwdReg(OUT_AC,50,OUT_REGMODE_IDLE);    //normal
OnFwdReg(OUT_AC,50,OUT_REGMODE_SPEED);  //mas potencia para mantener velocidad
OnFwdReg(OUT_AC,50,OUT_REGMODE_SYNC);   //si se ralentiza una se ralentiza otra

Yo creo que ninguna de las tres opciones vale para el autocentrado y para evitar el deslizamiento en caso de chocar con algo que no haya visto por delante ni sentido por detrás.

He puesto avanzadas antes entre comillas porque luego hay otra opción, PID Control, que parece muy interesante pero hay mucho que investigar.

Tengo que ver si no hay ningún problema en cambiar un puerto de sensor de rotación a motor, y empezar a investigar también por ese lado lo del sensor de rotación.

PD: me enrollo más que las persianas ¬¬

Jetro

Creo que lo que necesitas es MotorTachoCount o similar

Wendigo

Cita de: Jetro en 07 de Junio de 2007, 13:38:23 PM
Creo que lo que necesitas es MotorTachoCount o similar

Probé el TachoSpeed ese que me pusiste en un enlace pero no lo reconoce el NXC, el MotorTachoCount parece que si que lo pilla :D muchas gracias,