domando ruedas locas

Muy buenas, tengo una rueda trifásica tipo scooter y un controlador genérico para la misma sin sensores hall que quiero manejar desde arduino con un joystick. Estoy en fase de pruebas y de compras tecnológicas, y si no afino bien el segundo item probablemente entraré en fase de divorcio con mi mujer, por eso apelo a la ayuda y experiencia del foro. Este es el controlador:

Intento explicarme:

Antecedentes:
el controlador, una vez alimentado con 24 V y conectadas las tres fases del motor, va perfecto siempre que sea manejado por el potenciómetro que el controlador lleva incorporado, en ese caso la rueda va como si fuera de Alonso. Cuando en vez de usar el potenciómetro uso la entrada pwm que trae el propio controlador y que manejo desde mi arduino, la rueda va pero ya no tan bien, gira mas o menos a la velocidad que debe pero con un pequeño margen de inestabilidad (acelera-desacelera, como si lo condujera mi mujer). El joystick-chan que tengo trabaja con tres potenciómetros dos de los cuales bailan un poco al arrojar resultados y el tercero directamente me da los número de la lotería, por lo que me he conformado trabajando en dos rangos de movimiento de la palanca que darán como salida velocidad uno o velocidad dos (algo mas rápida). Es decir el programa arduino detecta perfectamente que le estoy indicando velocidad uno o velocidad dos desde el joystick y la parte pwm de salida (aunque puede que me equivoque) creo que también va correctamente (no es la primera vez que la utilizo) me parece que el problema es del controlador que no va fino con pwm y no tiene datasheet (se lo he pedido al fabricante y me ha mandado una foto con un gato dorado).
Este es un fragmento del código que uso para incrementar el pwm y que no me ha dado problemas:

//adelante recto velocidad uno-------------------------------
     if((frenoreg == 0) && (x >= 400) && (x < 600) && (y >= 600) && (y < 1000)){
        //si venimos de velocidad uno no hará nada
        //while para ir incrementando paulatinamente la velocidad
        if (outputValue == 0){
          while (outputValue < 80){   //velocidad uno es 80
            analogWrite(pwmPin, outputValue);
            delay(10);  
            outputValue++;
        }}
        if (outputValue > 80){  //partimos de velocidad dos 
          while (outputValue > 80){  
            analogWrite(pwmPin, outputValue);
            delay(10);  
            outputValue--;
        }}
      //-----------------------------------------------------

¿Que quiero?:
dado que el potenciómeto incorporado en el controlador va muy bien, pretendo utilizarlo y manipularlo directamente desde mi arduino, para que así el controlador ponga la rueda en velocidad uno o dos de manera estable según le indique la entrada del joystick.

Duda:
sé que algunas de las opciones que tengo para manejar un potenciómetro desde arduino son 1) pwm + filtro, pero tengo entendido que para voltajes altos no es buena solución, 2) potenciómetro digital, al igual que antes he leido que no va para grandes cargas, y 3) DAC esa creo que es la única opción viable, pero necesitaría un DAC que pueda controlar desde arduino y que permita manejar en sus (por lo menos) dos salidas, dos o tres valores de voltaje entre 0 y 24 V.
¿Alguien conoce alguno o tiene experiencia con uno así? ¿Se me escapa alguna otra solución? Quisiera evaluar mis posibilidades antes de ponerme a comprar compulsivamente para nada, además de evitar un posible sartenazo (los importes de compra salen en el extracto de la tarjeta).

P.D:
es posible que metiéndome a variar la frecuencia del pwm (490 Hz) consiga alguna mejora en mi primer programa que usa pwm (me encantaría usar pwm) pero lo dudo, aunque no estoy seguro, no tiene pinta de ir por ahí la solución, también he cargado algún código de prueba únicamente con la instrucción analogWrite(pwmPin, 80) y persiste la inestabilidad por lo que deduzco que no es tema de programación sino de controlador. También podría optar por probar usar un controlador con sensores hall (la rueda los tiene) que en teoría responden mejor en la etapa de inicio de la rueda que el que yo tengo (por fuerza contraelectromotriz) pero el mío rompe la teoría y va perfecto al arranque. También podría directamente comprar un controlador mejor (duelen mucho) y ver si gestionan mejor el pwm (suponiendo que ese sea el problema). En definitiva estoy abierto a evaluar cualquier opción que me pueda sugerir la gente que sabe, incluida la de no comprar nada e irme de vacaciónes. Gracias.

Yo hice una silla eléctrica con dos ruedas de Hoverboard, era otro controlador y funciona con PWM y un joystick.
Pero aquí si no quieres complicarte puedes desoldar el potenciometro de la placa y sustituirlo por:

-Un joystick
-Un potenciometro lineal
-tres o mas botones pulsadores que determinen correspondientes resistencia (velocidades)

Digo

www.jopapa.me

Gracias Jopapa, desde que leí un trabajo de fin de carrera sobre hoverboard y arduino (ingeniería inversa para descifrar protocolos, compensacion de efecto péndulo, etc, etc) no paré de tener pesadillas, así que te felicito si te has animado con un hoverboard, a mi solo con oir el nombre me obliga a tomar un tranquimacid.

El joystick es casi el mismo que tengo, pero los potenciómetros que tiene vienen con Parkinson, sobre todo el de la palanca, solo con mirarlo fijo salta de 0 a 800 y a 20 y al infinito y mas allá. Sobre usar el potenciómetro lineal directamente, desvirtúa un poco mi idea de microcontrolarlo todo (tengo el sindrome de China). Lo de los botones pulsadores, directamente pensé hacer algo así habilitandolos desde arduino pero pierdo la aceleración progresiva además de ser muy ineficientes (esto último es un poco melodramático, tampoco pasaría nada). La verdad que tengo algunas funciones que no se pueden ejecutar en paralelo y me gustaría conseguir funcionar con pwm porque me permitiría hacer pasar todo por arduino y simplificar mucho, no es capricho. Así que si puedes pasarme el controlador que te dió buen resultado con pwm a lo mejor me sirve y te mencionaré en mis oraciones. Gracias otra vez.

Entonces no luches contra la corriente, busca potenciometros mejores. Que tal los joystick del mando de la Play?

Te dejo los datos "en bruto" de mi montaje por si te sirve.

El controlador era este

Espero te sirva

Gracias Surbyte, me encantaría robar una Play muy cercana a mí, pero mi prototipo es para usar por un minusválido y ese es un joystick dificil de manejar en esas circunstancias, me resigno a usar uno como el mío pero mas caro (ergo mas fiable).

Jopapa impresionante el trabajo, muy bueno, dan ganas de darse una vuelta por el centro. Te leí el pensamiento porque ese controlador con hall me está vieniendo de China (que gran nación) así que me alegro de saber que me va a funcionar. Mi prototipo tendrá movimiento de giro tipo tanque de guerra por lo que las ruedas se controlan diferenciadas, pero no será un problema, solo un poco mas de código. Gracias por los aportes.

Por que no colocas todo el código. Es mas probable que tengas problemas por estructuras bloqueantes. ¿usas Delays en el resto del código?
Saludos

NO se donde vives pero en mi pais en un sitio de ventas online se consiguen mandos PS2/PS3 para respuestos que tienen los joystick que buscas x precios irrisorios.

Solo para que veas, cuestan 10 y 15 veces mas pero este esta nuevo

Tambien estan los Joystick de Atari o de sega, tienes tantas opciones que no vale la pena ponerlo.

Solo lo comento como alternativas para probar. No los he usado como para garantizar establidad pero estamos de acuerdo que serán mejores que los que se venden para Arduino.

Gracias PeterKantTropus, no pongo el código simplemente porque está a medio hacer, no hay mucho mas que lo que puse. Estoy en fase de pruebas y estoy verificando el funcionamiento de los componentes. Entiendo tu duda sobre las estructuras bloqueantes (fue lo primero que me he planteado) pero seguro que no hay, no porque programe perfecto sino porque como comentaba, he hecho también un programa solo con la instrucción analogWrite(pwmPin, 80) en el bucle sin ninguna otra cosa mas y la rueda giraba pero el problema de la inestabilidad persistía, incluso probando con esa instrucción y un delay eterno el problema persiste, he hecho varias trazas por puerto serie y observo que el bucle no para, no hay bloqueos visibles (e invisibles lo dudo con una sola instrucción) pero gracias por la observación.

Gracias Surbyte, debo haberme explicado mal, sin dudas un mando Play tendrá una fiabilidad muy superior a la de mi joystick, pero me refería a que un minusválido con problemas motrices no puede manipular palancas pequeñas, tiene que ser algo robusto y seguro (hasta basto diría) la de atari a lo mejor puede servir, en su momento compré el joystick que tengo porque parecía robusto y por el tercer potenciómetro que incorpora en la palanca que me daba mas juego para incorporar otro tipo de frenado por ejemplo, pero esta claro que no acerté. Gracias por la data, vivo en España y sí tengo acceso a todo lo que me comentas, probaré palancas, atari incluida a ver que pasa (aunque si mal no recuerdo funcionan por contacto simple no con potenciómetros, no estoy seguro) aunque seguramente al final de todo tendré que terminar con una buena tipo la que manejan los carritos elevadores, están pensadas para el maltrato y son muy fiables.

Vere en primera instancia si pruebo un controlador decente como el que usó Jopapa y si responde bien al pwm ya habré ganado mucho para todo lo demas y me olvidaré por fin de la manipulación electrónica de potenciómetros. Tengo en unos días una reunión con un grupo de electrónicos especialistas en ruedas (yo soy especialista pero en ruedas de reconocimiento) a ver si me orientan, si me entero de algo que pueda servir de aporte lo pondré por aquí. Gracias.

benitoycam:
Gracias PeterKantTropus, no pongo el código simplemente porque está a medio hacer, no hay mucho mas que lo que puse. Estoy en fase de pruebas y estoy verificando el funcionamiento de los componentes. Entiendo tu duda sobre las estructuras bloqueantes (fue lo primero que me he planteado) pero seguro que no hay, no porque programe perfecto sino porque como comentaba, he hecho también un programa solo con la instrucción analogWrite(pwmPin, 80) en el bucle sin ninguna otra cosa mas y la rueda giraba pero el problema de la inestabilidad persistía, incluso probando con esa instrucción y un delay eterno el problema persiste, he hecho varias trazas por puerto serie y observo que el bucle no para, no hay bloqueos visibles (e invisibles lo dudo con una sola instrucción) pero gracias por la observación.

Nadie te va a criticar por un código a medio hacer, pero nos dificulta ayudarte, porque tenemos que adivinar. Por ejemplo no se que Arduino usas y al no tener el código, no puedo descartar lo obvio, como que utilices un pin incorrecto para generar PWM. Coloca el código simplificado y toda la información que puedas .
Saludos

Gracias por los comentarios PeterKantTropus disculpa por adelantado si no me explique bien, pero lo de no poner todo el código no es por temor a las críticas (si vieras como estoy vestido) es que de verdad no creí que fuera a aportar nada, el flujo no esta bien definido ni optimizado porque voy haciendo pruebas parciales sobre la marcha y lo tengo lleno de flags que ni yo mismo se para que son, sinceramente no se entendería gran cosa con todo ese masacote de momento inconsistente. Siempre intento ser exhaustivo desde un comienzo para acotar las respuestas (valoro el tiempo de los demás) por eso comenté desde el principio en el primer post, que un programa solo con la instrucción analogWrite(pwmPin, 80) tampoco funcionaba y a partir de ahí juzgué innecesario pegar mas código que el que puse. De todos modos seguramente no me explique bien en el primer post o me faltaron datos y no se me entendió lo del código, me tomo nota y lo replanteo de otra manera:

tengo un arduino mega 2560 y con éste código:

const int pwmPin = 2;  //el timer usado inhabilita 3 y 5
void setup() {  
   pinMode(pwmPin , OUTPUT);  //definir pin salida
}
void loop() {
   analogWrite(pwmPin, 80);
}

funciona mal la rueda.
Con este otro también:

const int pwmPin = 2;  //el timer usado inhabilita 3 y 5
void setup() {  
   pinMode(pwmPin , OUTPUT);  //definir pin salida
}
void loop() {
   analogWrite(pwmPin, 80);
   delay(50000);
}

Puede que me equivoque pero esto me hace pensar que no es un tema de código (ni de arduino) sino de controlador, aunque nunca se sabe dicen que los caminos de un microcontrolador son inescrutables.

Hi,
Pregunta: Porque ese delay de 50,000 = 5 segundos?

Nada importante tauro0221, los 50000 (50 segundos) es para evitar el bucle y verificar el funcionamiento sin entrar en el segundo ciclo, por supuesto que teóricamente no debería afectar absolutamente en nada el hecho de entrar en el segundo ciclo a la instrucción del pwm pero es por rizar el rizo, no sea que arduino chequee algo a escondidas y el loop produzca un retraso, como verás ya estoy en el último paso antes de pasar a las teorías sobrenaturales y las conspiraciones arduino-masonico-bolcheviques.

Hi,
Gracias, lo que pasa es que me estrano mucho el porque del delay porque cuando haces un pwm el se queda permanente con ese output hasta que no le mandes otro comando.

Viendo la foto de la placa que pusiste ¿cerraste el swich que esta indicado 0-5 V analog & PWM input?

Sí, con el jumper puesto trabaja el potenciómetro y sin el jumper trabaja pwm, de hecho alguna vez me olvidé de quitarlo y se autobloquea. Saldré de dudas sobre si es el controlador el problema, cuando me llegue el que a Jopapa le funcionó; me parece normal que un controlador genérico de 10 euros como el que tengo no pueda ser apto para todo tipo de ruedas, los algoritmos que gestionan la alimentación de los bobinados ya sea con retroalimentación hall o contraelectromotríz son muy complejos, hasta el grosor del hilo del bobinado influye. Yo estuve tentado en un primer momento de hacer mi propio algoritmo (la inocencia no conoce límites) pero investigando un poco me di cuenta que tenía que abandonar los opiáceos.

Hablamos del mimo jumper? No me refiiero al que esta al lado del potenciometro interno, que sirve para seleccionar si se utiliza ese potenciometro o la regleta. Me refiero el que en la foto aparece para soldar. Si esta abierto, se utiliza un control analógico, esta pensado para colocar un potenciometro externo ( 10 k generalmente) entre los terminales marcados como GNG, 0-5 v , 5 v y si esta cerrado se utiliza PWM y GND

No, ahí me perdí Peter, yo me refería al potenciómetro/regleta, el que vos me indicas nunca me imaginé que tendría que soldarlo, ¿es eso? ¿Hay que soldarlo? ¿Trae un jumper para potenciómetro/ regleta pero para potenciómetro/pwm tenés que esperar el envío armado con un soldador? Si van por ahí los tiros Peter voy a donar 500 jumpers a la embajada China y a vos te haré un monumento, dame un poco de luz.

Para que funcione como PWM tienes que cerrar con soldadura el punto marcado

EN los drivers es mas común comandarlos por potenciometros, por eso esa placa viene de fabrica para utilizar un potenciometro externo. Si optas por el menos común PWM, hay que soldar.