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

bueno bajo ese titulo se esconde algo simple:

tengo montado una especie de coche con 4 ruedas, dos traseras con motores independientes y dos delanteras sin traccion que lo unico que hacen es girar con un motor que hace las de volante.

lo que quiero montar y no consigo aclararme es con el sensor de rotacion, es leer los grados que estan giradas las ruedas y ponerlas rectas automaticamente.
supongo que seria algo asi como inicializando la posicion tope izquierda a 0, la posicion recta serian 45 y la tope derecha seran 90.
si al empezar el programa leo del sensor de rotacion 20, como es menor de 45 pues tendria que restar 45 - 20 = 25 y hacerlo girar en direccion Y. En caso de que sea mayor de 45 pues por ejemplo 60-45=15 y girar 15 en direccion -Y.

todo esto en cualquier lenguaje seria sencillisimo pero es que con esto de los cables y los simbolitos no me termino de aclarar jajaja

a ver si alguno sabe decirme como puedo hacerlo o guiarme un poco... que como me caliente le meto el firmware ese que deja programar en java y ala

pulipuli

Lo que yo haría (sin tener ni idea de como funciona el programejo :guino:) es primero girar las ruedas a la izquierda todo lo que puedan y leer el ángulo. Luego hacer lo propio hacia la derecha y leer el ángulo. Ya conocemos los topes, el centro estará a mitad de camino :guino: (aunque siempre habrá algún pequeño desvío... el autocentrado es un tema "delicado" :guino:)

Jafram

En cuanto al leguaje de los simbolitos, ¿a cual te refieres? Yo del de LEGO pase a los 3 días.

No solo puedes programar en Java. ¿Has visto las demás opciones?

jm

#3
Yo no tengo de este programa, ni sé como hacerlo. Pero no sería más fácil poner el 0 en el centro, osea, con las ruedas centradas y una vez que acabe de realizarse un grio de x grados, radianes, etc, volver a la posición inicial, osea, el 0 centrao :guino:
Como ya he dicho no idea, pero eso me parece que es más sencilo de programar, que "vuelva al inicio" que no ponerlo en 45 o 60.
Además, se podría hacer una especie de error de cero y cada que vez que se inicase el programa se ajuste automaticamente?, al estar centrado sería fácil, creo. Esto es una idea, pero me gustó asique te la digo.
A ver si lo consigues  :guino:

pulipuli

El problema, o al menos yo así lo entiendo, es como hacer que el bicho sepa él solito cual es el centro... una vez que lo sabe, el resto está hecho :guino: y le puedes llamar "como quieras" (obviamente lo más fácil es llamarle "0" pero si el lector te da una medida en esa posición habrá que trabajar con valores relativos, no absolutos)

Wendigo

la historia de esto es que no entiendo muy bien como funciona lo del reset del motor, porque haciendo una prueba que nada mas arrancar el programa lea la posición del motor y si es menor que cero, se mueva esa misma cantidad en la dirección Y, y si es mayor se mueva esa cantidad en dirección -Y, no funciona. No hace nada, y hasta que no toco yo el motor de direccion no funciona el motor, y ademas lo hace como  resistiéndose al movimiento que yo hago, entendiendo que siempre lee al encenderse, la posición inicial como CERO.

Realmente la "chica" creo que esta tanto en la forma de funcionar del lenguaje este de lego como en como funciona el reseteo y lectura inicial de los grados del motor.

Sino, no se me ocurre otra forma que almacenar en un fichero al finalizar el programa cual ha sido la posicion de parada, para al arrancarlo, leer ese fichero y colocarlo...
(esto se me ha ocurrido ahora mismo sobre la marcha xDD)

Jafram

Lo más sencillo es hacer una rutina que tome medidas (posición inicial y final de la dirección) y ejecutarla nada mas arrancar la maquina. Simple y directo.  ;D

*Rutina: https://es.wikipedia.org/wiki/Rutina

EL_HALCON_NEGRO

Si es que estos juguetes son más indomables por lo que veo desde mi ignorancia.

pulipuli

Al contrario, son mucho más dóciles... sólo hay que "saber decirles" lo que deben hacer :guino:

Wendigo

Cita de: Jafram en 05 de Marzo de 2007, 23:06:57 PM
Lo más sencillo es hacer una rutina que tome medidas (posición inicial y final de la dirección) y ejecutarla nada mas arrancar la maquina. Simple y directo.  ;D

*Rutina: https://es.wikipedia.org/wiki/Rutina

tomar medidas.. vale.. ¬¬ pero cual es esa posicion inicial y posicion final?
las direcciones tiene un tope impuesto fisicamente..

PD: lo de rutina me ha resultado gracioso.. dudo que alguien que use NXT no sepa lo que es una rutina xDDDD

salu2 hijos del lego

Jafram

#10
Cita de: Wendigo en 06 de Marzo de 2007, 16:53:55 PM
tomar medidas.. vale.. ¬¬ pero cual es esa posicion inicial y posicion final?
las direcciones tiene un tope impuesto fisicamente..

PD: lo de rutina me ha resultado gracioso.. dudo que alguien que use NXT no sepa lo que es una rutina xDDDD

salu2 hijos del lego


Los mensajes que escriba en este foro van en principio dirigidos a todo el foro, con lo cual intentare dar todas las referencias que pueda (aunque parezca gracioso). ::)

En cuanto a tomar medidas, te dejo pensándolo un poco mas,  ;D (Para que se debata un poquito) intenta pensar en la solución y cuéntanos. Si veo que no llegas a buen puerto, te dejo un par de soluciónes, pero me gustaría ver a donde llegamos antes  ;D (Me podría interesar)  :-\


jm

eso, eso, si lo consigues nos lo dices que yo no tengo ni idea de programar  ;D

Jetro

si sigues pensando...

no tengo un NXT, pero por lo que he leído los motores tienen un encoder, es decir deberían saber que están moviendose o no moviendose porque un obstáculo se lo impide. Hace algún tiempo escribí un programa muy sencillo en NQC para el Cybermaster con la misma idea: si las ruedas no giran a la velocidad esperada es que has topado con algo. De ese modo el encoder hacía las veces de un sensor de contacto (tipo parachoques). Si tienes curiosidad puedes encontrar el programa aqui: https://www.brickshelf.com/cgi-bin/gallery.cgi?f=234170

De la misma manera deberías poder escribir una rutina para calibrar la dirección. Haz girar la dirección hacía la derecha hasta encontrar el tope y pon en cero el encoder (o, si no se puede apunta el valor en una variable) Después gira a tope hacia la izquierda y apunta también ese dato. Ahora resta el primer dato del segundo (caso de no haberlo puesto en cero entonces) y divide entre dos. Ya tienes la posición central.

Wendigo

he tenido un poco apartado el tema porque he estado de obras en casa, he cambiado de curro y bueno.. ahora mismo la "columna de dirección" la he puesto para moverla facilmente manualmente. Lo que me interesa es lo que me has comentado de una rutina para saber en que momento se hace tope y no puede girar más, pues me sería muy muy util tanto para el calibrado como para simular un sensor de toque (aunque este sistema no funciona en mi suelo de parquet porque patina al llegar a una pared).

(un poco offtopic)
también me he encontrado con algo que será absurdo para vosotros que controláis mas, pero no conseguí hacer ejecutar en paralelo el sensor de distancia con los motores.. me explico.
1. compruebo distancia.
2. me muevo X segundos.
3. compruebo distancia.
4. me muevo X segundos.
....

esto se refleja con parones de 1 segundo cuando comprueba la distancia y golpeándose cuando antes de comprobar la distancia de nuevo se mueve X segundos, estando el obstáculo a X-Y segundos para X>Y. Debe ser una chorrada, que no termino de ver en el entorno pero no lo consigo.

a ver si ahora que curro mucho más cerca tengo más tiempo para pasarme y seguir dándole caña.

Jetro

Por desgracia no conozco el entorno de programación del NXT, pero la solución generica sería usar un 'loop' con 'while' (piensa en una rutina que se repite hasta que se cumple la condición puesta). Hay alguien allí que pueda precisar más?