Hooolassss...
M42 vuelve a la carga :lengua:. El no tener apenas idea de programar, unido al tampoco tener mucha idea de física, no son obstáculos para mi: sigo empecinado en hacer cosas fuera de mi alcance, jojojojo... Bueno, para eso se supone que es el LEGO ¿No?
En fin, os cuento: la idea es montar y programar un coche dirigido desde un palo divertido (joystick). Para ello cuento con dos ladrillos NXT con sus correspondientes motores, sensores, etc. y un montón gordo de piezas Technic, de las que, la verdad, no creo que me hagan falta muchas (la intención es hacer algo mecánicamente sencillo, el tomate está en el programa). Como os digo, parto de casi cero, así que voy a ir haciendo cachos sueltos a ver si luego los puedo unir en algo que funcione. De momento he llegado a esto:
https://youtu.be/4mxGuGT8Y5w (https://youtu.be/4mxGuGT8Y5w)
El objetivo, aunque malamente, se cumple: le doy al mando hacia delante y los motores van hacia delante; suelto el mando y vuelve al "centro"; lo giro hacia atrás y los motores responden hacia atrás; y la pantalla me muestra el ángulo que he girado el mando y la potencia que estoy dando a los motores. Los problemas son los siguientes:
- No sé si se aprecia en el vídeo, pero la primera línea que muestra la pantalla, la de potencia, parpadea una cosa mala; vamos, que apenas se puede leer.
- El mando responde de manera completamente lineal, así que para obtener el 100% de la potencia hay que girarlo 100º. Me gustaría hacerlo progresivo, o al menos reducir el rango de funcionamiento; porque, aparte de ser inoperativo, la forma del motor impide girar la palanca hacia atrás lo suficiente para llegar al máximo.
- Cuando retorna al centro el mando es impreciso, no se queda parado sino que empieza a oscilar de un lado a otro. Si manualmente lo consigues parar en el punto cero sí se queda quieto, pero es bastante complicado. Además es algo que va sumando errores, y como se puede ver el punto de referencia se desplaza poco a poco hacia un lado.
Os adjunto el programa, por si queréis aportar algo a la causa.
Mecanicamente puedes reducir el tamaño de la manivela para poder hacer el giro 100% hacia atras... Pero es ineficaz.
Sobre la programacion... :unas:
Pero es un proyecto interesante que voy a seguir. A ver si finalmente le doy algun uso a mi abandonado NXT. :)
De hecho para ir probando he anclado la pieza de palanca por el centro, en luga de por un extremo. Pero no es solución, luego a la hora de montar algo medianamente cómodo hay que reducir el rango, sí o sí.
Ah, antes de que alguien me diga lo buenos que son RobotC, NXC, FlánaganC, BananaC, LejOS, CeRcA y demás :travieso:... Bueno, mi idea por el momento (y soy muuuuuy cabezóta) es funcionar con el NXT-G: he visto cosas muy interesantes hechas con este lenguaje, así que no creo que sea problema; aparte de que me da muuuuucha pereza andar instalando nada nuevo (repito, por el momento). Con esto os ahorro el esfuerzo de escribir tal comentario (quede claro que esto es una aclaración, y también aclarar que es en tono de broma, claro... :tomatazo:)
Iré publicando aquí los progresos (o no), para todo el que le interese :guino:
Que tienen mas fuerza los motores que enseñas, o los servomotores del EV3 ? simple curiosidad...
Pues la verdad... ni idea. No tengo EV3, y creo que va a tardar un tiempo :triste:
El nuevo va a 175 rpm, y pesa 82 g mientras que los datos del antiguo son 170 y 80 respectivamente.
Lo saque de aqui: https://www.philohome.com/motors/motorcomp.htm (https://www.philohome.com/motors/motorcomp.htm)
Gracias, el de las revoluciones es un dato interesante :contento:
Bueno, pues a ver si te puedo ayudar en alguna cosilla. Lo primero decir que no tengo claro qué quieres hacer exactamente, es decir, no tengo claro qué es eso de "un mando proporcional", así que quizás meta la pata en alguna sugerencia, pero ya me vas corrigiendo.
Relacionado con esto: ¿para qué quieres que el joystick vuelva al centro? Es más sencillo que el motor avance tanto más rápido cuanto más lejos del centro esté el mando y que, finalizado el movimiento, lo devuelvas tú mismo al centro. Que el mando vuelva por si solo al centro complica el programa.
Más cosas: los programas con instrucciones en paralelo son para programar sucesos que ocurren a la vez. Por ejemplo, un jueguecito de marcianos y, en paralelo, la puntuación en la parte superior. En tu caso, creo que puede ir todo en una línea: mueves el joystick y (a continuación) se mueve el motor y el valor se presenta en pantalla. De esta forma, no hay proceso en paralelo.
La cosa es por tanto dejar solo un bucle, el de arriba, y quitar lo de abajo. Lees primero el giro del motor C tal como tienes en el programa y presentas ese valor en pantalla. Luego, en el bloque "Switch", mueves los motores AB en función del valor leído. Supongo que habrá que sustituir los 3 iconos "Move C" que pones en el programa por "Move AB".
Una forma de corregir el temblor del mando es usar en la parte superior de tu programa un bloque "Range" en lugar de el bloque "Igual". Lo programas como "Inside Range" con valores -5 y +5 o similares. Si el valor está entre -5 y +5, que se pare, tal como ya pone en el programa. Prueba los valores que mejor se ajusten.
Lo último: para corregir el parpadeo del valor de giro en pantalla puedes dejar un único bloque "Display". Te está parpadeando porque al poner 2 iconos de este tipo y ambos (imagino) con la pestaña de "Clear" activada, está constantemente borrando y actualizando la pantalla. Si dejas un solo icono de estos (¿para qué necesitas 2?), imagino que desaparecerá el problema.
Con esto ya tienes para probar cosas un ratillo. Desde luego que no tienen porqué funcionar, son solo ideas que se me han ocurrido pero que no he probado. Ya me cuentas si me he explicado más o menos y, sobre ello, seguimos probando cosas. Suerte. :muyfeliz:
Hola, y muchas gracias por la respuesta.
Voy por partes:
- El témino proporcional se refiere exactamente a eso que comentas: cuanto más avanzas el mando, más rápido giran los motores. Es como las emisoras RC de toda la vida. Y siguiendo por ahí, tanto éstas (salvo el mando de acelerador de las de aviación) como los joysticks llevan muelles que devuelven las palancas al centro por sí solas, para que no tengas que estar volviendo tú, que es impreciso y te lleva trabajo. Además, en un futuro me gustaría añadir retroalimentación al mando, para que haga fuerza según lo que el vehículo se encuentre; aunque es un poco ambicioso, si al menos comienzo con esto ya llevo algo avanzado (creo).
- Lo he programado en paralelo fundamentalmente porque voy probando cosas en programas más pequeños, separados, y luego las junto todas. Pero es verdad, no tiene porqué ser en paralelo. Supongo que esa manera de programar hace bajar el rendimiento de alguna manera, por eso no me lo recomiendas ¿Es así? Voy a probar a dejarlo en una sola línea y os cuento. Los bloques Mover C son para devolver el mando al centro.
- Ya probé el bloque de rango, y al principio parecía que coregía el problema, pero luego empezó a fallar por motivos que aún desconozco y no solo vibraba sino que la oscilación iba aumentando de manera alarmante hasta volverse completamente loco en apenas un minuto de funcionamiento :superfeliz:.
- El parpadeo se corrige desactivando la opción "borrar", es cierto (acabo de probarlo), pero eso nos lleva a otro problema: la línea de texto es iempre igual, pero el número va cambiando; si en cada ciclo no borro la pantalla... acabo teniendo los valores 0100 fijos. De todas formas es cierto que no es necesario tanto texto, realmente los puse ahí para ver los datos mientras ejecutaba el programa e ir depurándolo.
Sigo dándole caña ¡Hasta luego!
Pues no me preguntéis porqué, pero con una sola línea (os dejo un par de ejemplos) no funciona. En el momento en el que lo divido en dos (tercer ejemplo) ya chuta :triste:
Sigo pegándome con mostrar los valores en pantalla.
ok, perfecto, queda claro lo del mando proporcional. :muyfeliz:
Lo de devolver el mando al centro me complica la programación un poco. Quizás una opción sea hacer que se mueva sin retorno y, una vez conseguido, lo complicas con el retorno al centro. Es solo una idea que quizás te ayude a entender mejor todo.
Lo de la programación en paralelo, más que bajar el rendimiento, creo que complica la programación y puede dar lugar a errores. Como no soy programador no me atrevo a sentenciar ciertas cosas, pero creo que no toca ahí al no ser realmente un proceso paralelo.
Estoy casi seguro que el bloque rango es la solución a eso. Quizás cambiando los valores de los extremos. Lo único que me hace dudar es que en tu programa hay una especie de "bucle infinito": lees el ángulo y con ese ángulo mueves el motor, que modifica el ángulo y entonces se mueve el motor que modifica el ángulo que mueve el motor que modifica... y así siempre. Quizás es problema sea ese, que no para nunca. Por eso te proponía sustituir el Move C por Move AB, para evitar ese ciclo.
El problema del solapamiento del texto es muy fácil de resolver. Usa esto: un bloque "Number to Text" seguido de uno "Text":
(https://www.nxtorm.es/objetos2/tester%203.jpg)
El bloque "Text" sirve para unir en la misma línea varios textos y/o números. En su panel de configuración verás que pone A, B y C. Prueba a poner
A -----> Escribe "Grados:"
B -----> Valor de los grados a representar (vía cable).
C -----> Escribe " ", es decir, 4 o 5 espacios en blanco. Así taparás cada vez el resultado anterior y no dejarás ningún número al final.
Respecto a los programas que propones, y por lanzar una piedra ya que no lo tengo montado y no puedo probar, creo que haría lo siguiente: coges tu primer programa y quitas el Move AB del inicio. Y luego cada uno de los 3 Move C del Switch los cambias por Move AB. A ver qué ocurre así. :confundido: Ah, y no olvides el "Range" en lugar del "Igual".
Si el 3er ejemplo te funciona, mete el display en la parte de arriba con el "Number to Text" seguido de uno "Text" con un cable conectado al "Sensor de rotación" del motor C y sin la pestaña "Clear" activada. Estoy por montar uno y probar... :feliz:
Monta, monta... :aplauso:
Lo del bloque "Número a texto" para evitar el parpadeo y el solapamiento de datos era evidente, voy a buscar algún polvorón sobrante de navidades porque mi cerebro pide azucar, jojojojo...
Veamos, intento explicarte el programa:
- La primera línea únicamente devuelve la palanca al centro:
* Leo el sensor de rotación y escribo dos variables, una numérica con el ángulo y otra lógica con el sentido (esto lo hice porque meter cables de datos dentro de las bifurcaciones acababa dando problemas en el software de programación, pero podría hacerse más simple, ya que, si nada cascaba, una vez en el ladrillo funcionaba bien).
* Una vez tengo los datos en la mano comparo el ángulo con el cero, o bien con el intervalo adecuado, como sugieres (al principio funcionó con el rango 0 a 3, pero llegué a usar hasta 0 a 10 cuando empezó a dar problemas y nada); hay que aclarar que el sensor solo nos da el valor en positivo, generando un "Verdadero o Falso" para el sentido de la rotación, que escribimos en la variable lógica.
* Al lío con los famosos bloques "Mover C": bifurco, y si el ángulo se halla dentro del intervalo elegido, freno el motor mando, si no lo está, vuelvo a bifurcar, compruebo en que sentido ha girado y decido si moverlo al contrario el ángulo desviado.
- La segunda es la que mueve los motores (creo que finalmente será uno solo, pero de momento ahí están) de tracción, a partir de la entrada que generamos con el motor mando; simplemente con leer el sensor de rotación y pasar el dato a la potencia del bloque "Mover" esa parte ya funciona.
Escribir viene bien, creo que he dado con algo que corregiría el fallo del rango. Voy a probar y vuelvo volandoooooo...
Cita de: M42 en 14 de Enero de 2014, 00:22:36 AM
Monta, monta... :aplauso:
ummm, estoy a ná, solo me falta despegarme del sofá y un poquito más de tiempo. :feliz:
Cita de: M42 en 14 de Enero de 2014, 00:22:36 AM[...] hay que aclarar que el sensor solo nos da el valor en positivo, generando un "Verdadero o Falso" para el sentido de la rotación, que escribimos en la variable lógica.
¿seguro? Mete un "Sensor de rotación" programado como "Reset" nada más empezar el programa y fuera del bucle. Esto resetea el contador de grados para que empieces siempre en cero y, si no recuerdo mal, se obtenían valores tanto positivos como negativos. Me suena incluso que en alguna ocasión tuve que usar la función de "Valor Absoluto" y meter el sentido de giro con una variable lógica, tal como has hecho tú.
Cita de: M42 en 14 de Enero de 2014, 00:22:36 AMVoy a probar y vuelvo volandoooooo...
¿Y bien? :muyfeliz:
Por cierto, has probado esta opción:
Cita de: nxtorm en 13 de Enero de 2014, 23:52:36 PM
Respecto a los programas que propones [...] creo que haría lo siguiente: coges tu primer programa y quitas el Move AB del inicio. Y luego cada uno de los 3 Move C del Switch los cambias por Move AB. A ver qué ocurre así. Ah, y no olvides el "Range" en lugar del "Igual".
Se fuerte: el poder del sofá es grande, pero con una buena estrategia es posible zafarse de él :superfeliz:
El reinicio del contador fuera del bucle lo he tenido en versiones anteriores del programa, y la verdad... yo no noto diferencia alguna (cosa que me resulta bastante curiosa, la verdad :asombro: :confundido:)*. Si te fijas en la casilla de retroacción, que te da el valor del sensor en tiempo real en el software, siempre retorna un valor positivo, pero lo pone en negro o en rojo según el sentido sea hacia delante o hacia atrás. Según la documentación del NXT-G el valor puede estar entre 0º y dosmil y oico millones de grados, pero siempre en positivo, junto a la señal lógica para el sentido.
* Supongo, ahora que lo pienso, que al inicio del primer bucle el contador está a cero por defecto, y por eso funciona bien con o sin reseteo inicial. Cuando la función principal esté lista meteré un menú de arranque del mando en el que se pueda ajustar el punto central a voluntad, eso sí; y también me gustaría poder programar la sensibilidad haca cada lado, pero eso va a ser para nota :E.
La "genial idea" se me fue casi como vino, es de esas que pasan volando y si no las pillas en el momento... se diluyen :triste:
Probé el cambiar el igual por un rango, y más o menos parece que funciona. Los problemas llegan cuando intento pasar de un 20% de potencia en el retorno de los motores, con el igual, con el rango o con lo que sea. Ahora mismo, según escribo, se me acaba de ocurrir relacionar la potencia del retorno con el ángulo girado: así el mando se endurecería al alejarse del centro pero iría frenando al acercarse, para no pasarse de largo el punto de frenado. El cambiar los bloques "Mover C" para mover A y B no es operativo, perdería el retorno de la palanca.
Ayer me entretuve más con el apartádo físico que con el lógico, al ver que no daba con la clave para el mando de dirección (se ve que faltaron polvorones :triste:). Tengo un primer prototipo del que os dejo unas fotillos. Por supuesto, por ahora estamos muuuuuy muy lejos de molar en la puerta de una disco :facepalm: :disimulo:, pero al menos sirve para ver que la disposición de los elementos que imaginé es viable.
¡Hasta luego!
Cita de: M42 en 15 de Enero de 2014, 11:37:21 AM
el poder del sofá es grande, pero con una buena estrategia es posible zafarse de él
Pásate el programa, porfa.
Cita de: M42 en 15 de Enero de 2014, 11:37:21 AM
[...] Si te fijas en la casilla de retroacción, que te da el valor del sensor en tiempo real en el software, siempre retorna un valor positivo, pero lo pone en negro o en rojo según el sentido sea hacia delante o hacia atrás.
* Supongo, ahora que lo pienso, que al inicio del primer bucle el contador está a cero por defecto, y por eso funciona bien con o sin reseteo inicial.
Todo cierto. No se dónde leí eso que dices, que al inicio de los programas, las variables se resetean. Aun así, yo tengo la costumbre de iniciarlos escribiendo las variables =0, reseteando los ángulos de giro, etc. No es mala costumbre.
Cita de: M42 en 15 de Enero de 2014, 11:37:21 AM
El cambiar los bloques "Mover C" para mover A y B no es operativo, perdería el retorno de la palanca.
Esa era la idea. :travieso: Estoy casi seguro que el retorno de la palanca al cero vía programación (en lugar de mecánicamente) es la fuente de los problemas.
Al mover el motor, modificas los grados que inmediatamente vuelves a leer para volver a mover el motor. Creo que en ese bucle está el problema. Además: ¿Cómo sabe el programa cuándo quieres volver al centro y cuándo quieres mantener el avance? Mientras mantienes el avance lo que estás haciendo en realidad es forzar al motor y eso no es bueno: el software tira la palanca al cero y tú tiras la palanca hacia adelante.
Aun así, intentaba razonar algún programa para devolver la palanca al centro sin forzar motores (intercalando algún bloque de espera o algo así entre cada lectura y movimiento del motor) pero de momento nada. Ahora mismo ando un poco fundido. Cualquier opción con retorno por software me da la impresión que fuerza los motores, y alguna forma habrá. Lo ideal sería un retorno físico con muelle (amortiguador), pero si se me ocurre algo por soft, ya te cuento, que ando espesito, no se si se nota...
Por cierto, el vehículo superchulo! :sonrisa:
Señoras y señores, niños y niñas, ha llegado la hora de presentarles... ¡Al Espantomóvil! :cejitas: :asombro: :facepalm:. Bueno, el pobre ha salido feorro, pero a su favor hay que decir que respecto al prototipo ha reducido componentes en la transmisión y reforzado la caja de engranajes, de manera que ya casi no saltan piñones :tomatazo: :lengua:. Y sí, lo habéis adivinado: lo que está al lado es un muelle hecho de papel :chulo:. Ahora toca montar un mando que sea medio cómodo, para manejarlo.
Ahí va también el programa, para todos los interesados. De momento solo es el mando del acelerador, el resto de funciones y la comunicación por Bluetooth se irán añadiendo. Efectivamente, asumo que estoy forzando los motores del mando; pero tampoco voy a darle un uso intensivo, el objetivo es que funcione y ya.
El acelerador más o menos funciona, voy a ver si me lío un rato con la dirección, que no consigo dar con la tecla.
¡Buenas noches!
Pues tiene un aire "retro" que me mola mucho. Parece un coche de aquellos de los autos locos :muyfeliz:
El programa aun no lo he visto.
Que rapido avanza el proyecto M42! Se nota que te interesa mucho!!!
A ver como acaba :contento:
¡Lo que se nota es que estoy en el paro, juassssss!
Precisamente en "The wacky races" es donde aparecía el Espantomóvil, nxtorm :guino:
Sigo atascado en el mando de dirección, no sé ni por dónde pillarlo. Si mañana no sale algo me daré el finde de descanso.
Una semana atascado en lo mismo, brrrrrr...
Veamos: necesito hacer girar un motor con la potencia constante y durante los grados que yo le indico girando a mano otro motor, y cuando acabo, parar. O soy muy gañán o con un sencillo programa como el que adjunto debería ser suficiente: leo grados, leo dirección, los enchufo a las correspondientes tomas "duración" y "dirección" de un bloque "Motor" y éste debería hacerme caso ¿no? Pues no. Simplemente me sirve para que el motor gire a un lado o al otro, o se pare en el cero.
En fin, sigo atascado, pero no paro de hacer fuerza :guino:
Pues nada, atascado continuo. A ratos tengo la sensación de que o yo soy muy bruto, o este invento hace lo que le da la gana... :lengua:. He estdo trasteando con programas de nxtprograms.com (https://www.nxtprograms.com) y cuando cargo los originales todo va como la seda; los copio a mano bloque a bloque y... ¡No funcionan bien! ¿Tendré algún poltergeist rondando por el taller? :travieso:
Para ir avanzando al menos por algún lado he estado liado con el mando. Os dejo algunas fotos:
(https://farm8.staticflickr.com/7344/12155120955_2ed2687bc8.jpg) (https://farm3.staticflickr.com/2826/12155797596_3668771b60.jpg)
(https://farm4.staticflickr.com/3749/12155794116_cfd1299229.jpg) (https://farm4.staticflickr.com/3704/12155789976_5e50aff2fa.jpg)
(https://farm8.staticflickr.com/7372/12155520284_20767a4c0d.jpg) (https://farm6.staticflickr.com/5525/12155516804_13ed115843.jpg)
También estoy dando algún toque al vehículo, porque no termina de ir fino.
ups, M42, no te había visto. Ya hubiera contestado algo :facepalm:
De todas formas, así sin ver el programa... Lo que si te puedo decir es que la "fuente" (nxtprograms) es muy buena. Revisa bien dónde has conectado los motores. A veces el motor A lo metes en C y no funciona nada.
Y respecto al mando, yo probaría a meter las lecturas del servomotor en una variable y luego, desde la variable mover al motor. A veces aclara las cosas y hace que puedas entender mejor el programa. Pero como podrás observar, son solo un par de piedras. Suerte, sigue contando.