Un ROV de agua dulce, con mando de PS2

Si te gustan los modelos Radio Control RC este es tu foro.
Responder
Avatar de Usuario
tsanshon
PayPal
PayPal
Mensajes: 158
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por tsanshon » Jue Nov 26, 2020 8:44 pm

Hola.

Me he descargado tu proyecto (02_Mando_PS2_Enciende_Led_ok.ino) y le he echado un vistazo. Por lo que veo tanto el mando PS2 como los servos están conectados al mismo Arduino y todo funciona como has planeado. Una pregunta: Si mantienes un botón pulsado ¿Te aparece un chorreo de mensajes "Botón xxxx presionado:" o solo aparece una vez cuando lo pulsas y no vuelve a aparecer hasta que sueltas el botón y los presionas de nuevo?

Un saludo.

Alberto.



asesorplaza1
PayPal
PayPal
Mensajes: 152
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por asesorplaza1 » Vie Nov 27, 2020 6:43 pm

Buenas tardes

Gracias Alberto por tu interés hacia mi proyecto.

Dados los problemas que me estaba planteando el proyecto, decidí empezar solo con el mando para ver hasta donde podía llegar y que me funcionase correctamente, y si el mando (de momento) esta conectado solo a un Arduino, junto con los servos y los LED. Cuando esté seguro de que esto funciona correctamente, empezare a mandar las funciones de los botones al segundo Arduino.

Cuando pulsas y sueltas el botón solo aparece una vez el mensaje, si mantienes pulsado el botón es cuando sale el "chorreo" de mensajes.

Ahora no se por que, cuando enciendo el Arduino reacciona según le parece o le dé el aire, unas veces si funciona correctamente, y otras da una respuesta aleatoria que no es la correcta. Sigo buscando a ver que demonios pasa, y si soy capaz de sacar al "duende" de la electrónica de mi proyecto.

Un saludo a todos.



Avatar de Usuario
tsanshon
PayPal
PayPal
Mensajes: 158
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por tsanshon » Lun Nov 30, 2020 12:05 pm

Prueba a poner al final de setup()

delay(1000);



asesorplaza1
PayPal
PayPal
Mensajes: 152
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por asesorplaza1 » Lun Nov 30, 2020 11:59 pm

Muchas gracias Alberto

Se ha estabilizado todo, ya no me hace las cosas raras que hacia antes. Como suponía tenia que ser algún error tonto de programación, pero no era capaz de conseguir dar con el.

Pues algo parecido debe pasarle al programa completo del ROV, alguna tontería que no le deja funcionar todo lo bien que debería, pero no la encuentro, voy a probar a ponerle el delay(1000), a ver que pasa.

Muchas gracias y un saludo.



Avatar de Usuario
tsanshon
PayPal
PayPal
Mensajes: 158
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por tsanshon » Mar Dic 01, 2020 12:06 pm

Me alegro.

Ahora que se que estaba en lo cierto, te explico lo que pasaba: cuando enciendes el Arduino y el mando PS2 a la vez, unas veces el mando arrancaba antes que el Arduino y quedaba esperando ordenes de forma que todo funciona y otras veces el Arduino arranca antes, empieza a mandar ordenes al mando, y como el mando no ha terminado de arrancar, hace cosas raras.
El delay(1000) dentro de setup() hace que el arduino se detenga durante 1 segundo dando tiempo de sobra a que el mando arranque.

En tu código hay una linea (69) que hace algo parecido: if ( millis() - auxMillis > intervaloEncendido) { ... }
Las variables están definidas como sigue: int auxMillis = 0; int intervaloEncendido = 1000;
Es decir, el código dentro del "if" se ejecuta solamente cuando "millis()" es mayor que 1000 (ha pasado 1 segundo desde el arranque).
Entonces ¿porque no funciona como se espera? La respuesta es que hay código que envía ordenes al mando fuera de el "if" de la línea 69 por lo que se ejecuta continuamente desde el arranque. El código en cuestión es la línea 59 "ps2x.read_gamepad();". Si colocas esta línea dentro del "if" de la línea 69 también debería funcionar.

Sigues teniendo el problema del chorreo en el monitor serie cuando tienes pulsado un botón, esto puede provocar que el buffer del puerto serie se llene y el Arduino se cuelgue (lo se por propia experiencia).

Te recomiendo que te centres en hacer funcionar un solo botón del mando y elimines el resto del código, de esta forma pasarás de unas 200 lineas a unas 50 y aprendes lo mismo.

Un saludo.
Alberto.



asesorplaza1
PayPal
PayPal
Mensajes: 152
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por asesorplaza1 » Mar Dic 01, 2020 11:09 pm

Muchas gracias Alberto por tu tiempo.

He subido la línea de millis a justo debajo del void loop, y ahora funciona mucho mejor, esto ya es un proyecto que envía ordenes y se ejecutan.

Adjunto el código arreglado

Alberto agradezco mucho tu ayuda, pero me tienes que explicar como has llegado a estas conclusiones, necesito aprender, no que me lo hagas tú, una cosa es que me orientes, y otra que termines el proyecto. Pero, por favor, sigue dedicándole todo el tiempo que quieras.

Un saludo.
Adjuntos
02_Mando_PS2_Enciende_Led_ok.rar
(1.64 KiB) Descargado 10 veces



Avatar de Usuario
tsanshon
PayPal
PayPal
Mensajes: 158
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por tsanshon » Mié Dic 02, 2020 11:27 am

Hola.


El proceso que he seguido para analizar tu código ha sido mas o menos así:

Primero, reducirlo al caso mas sencillo posible:
Como el skech tiene cerca de 200 lineas, primero borro todo lo que no tiene que ver con los botones.
Hay un "if" para cada botón y todos hacen lo mismo, dejo el primero y borro los demás.
Ahora tengo unas 50 lineas, prácticamente se ve todo en una pantalla.

Lo siguiente es buscar información del código que no entiendo:
En este caso las funciones de la librería PS2X_LIB así que me voy al repositorio de github para ver el código https://github.com/simondlevy/PS2X_lib Por desgracia no entiendo gran cosa viendo el código y solamente han documentado los skeches de ejemplo "PS2X_Example_ArduinoMega.ino".
(Como información. La librería PS2X_lib no esta incluida en el gestor de librerías de Arduino en cambio PsxNewLib si y esta mucho mejor documentada.)

Por último reviso el código en el mismo orden el el que corre en Arduino:
El código encima de steup() y dentro setup() se ejecutan una vez cuando se enciende el Arduino o se pulsa el botón reset. El código dentro de loop() se ejecuta continuamente hasta que se apaga el Arduino.

La primera linea dentro de loop() es ps2x.read_gamepad(); Esta función se comunica con el mando para obtener el estado de los botones etc. Si analizamos la secuencia de encendido, casi inmediatamente después de encender el Arduino le estamos pidiendo datos al mando, si al mando no le ha dado tiempo a arrancar se puede dar la situación de inestabilidad que describías, la otra alternativa era un problema de hardware.
La solución mas sencilla era parar un tiempo el arranque del Arduino para dar tiempo a que el mando arranque, lo que se consigue con el delay() dentro de setup().

Si pruebas a hacer este proceso con el skech original, deberías acabar con unas 50 lineas haciendo que un botón del mando encienda y apague el led.

Veo que prácticamente todo el código esta copiado de otros sitios (lo que esta bien) pero esta escrito de una forma que lo hace poco legible. Podemos utilizar el skech con un solo botón como base de partida para hacerlo mas legible y de una forma que cuando añadas nuevas funcionalidades no interfieran con las que ya tenias funcionando.


Un saludo.
Alberto.



asesorplaza1
PayPal
PayPal
Mensajes: 152
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por asesorplaza1 » Mié Dic 02, 2020 10:15 pm

Muchas gracias Alberto.

Ahora lo tengo mucho más claro, más o menos los dos llegamos a la misma conclusión pero de manera diferente, intuía que no era problema del mando, puesto que he probado 3 mandos que tengo por aquí, y uno puede estar defectuoso pero los 3 no, por lo tanto no es problema del mando sino del código.
Como bien dices casi esta copiado de otros sitios, (solo la parte de identificación de los botones y parte de la funcionalidad de los servos) pero las funciones de los botones, que las he desarrollado yo como he podido, aplicando códigos de encender el LED con botones y mover el servo con botones, pero no he encontrado en ninguna parte (eso no quiere decir que no exista), ningún código que encienda y apague un LED con los botones del mando, y no he encontrado ningún código que moviese el servo con dos botones diferentes del mando.
La librería que comentas (PsxNewLib) no la conocía, voy a investigar más sobre ella, a ver si es más fácil de utilizar y de entender, porque como bien dices no hay mucha información sobre la librería PS2X, lo que hay en el programa es desarrollo mío, en lo que hay publicado sobre las funciones del mando solo utilizan unos pocos botones (2 o 3) y los palos, no todo el mando como quiero usar yo.
Y por lo que comentas es más lógica (pensar cómo hacerlo y dar con la solución) que programación.

Con esto que dices, es con lo que tengo que tener cuidado
“cuando añadas nuevas funcionalidades no interfieran con las que ya tenias funcionando”
Porque es un fastidio, que cada vez que añado algo se estropee lo anterior que ya funcionaba.

Un saludo y muchas gracias



Avatar de Usuario
tsanshon
PayPal
PayPal
Mensajes: 158
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por tsanshon » Jue Dic 03, 2020 10:39 am

Hola.

Hay cosas que podemos hacer para evitar que el código que añades interfiera con lo que ya tienes. Crear tus propias funciones y reducir al mínimo imprescindible las variables globales. En el enlace se explica cuales son las diferencias entre variables globales y locales.

https://www.arduino.cc/reference/en/lan ... ers/scope/


Pero esto es adelantarse, primero hacer el código más legible:

Un trozo del código de tu skech.

Código: Seleccionar todo

const int led1 = 30;
volatile boolean LEDHdlts;
El estándar de estilo recomienda escribir las constantes en MAYUSCULAS, las variables en camelCase empezando siempre en minúsculas.
https://www.arduino.cc/en/Reference/StyleGuide

Código: Seleccionar todo

const int LED_PIN_1= 30;
boolean ledState;
Un trozo del código de tu skech.

Código: Seleccionar todo

if (ps2x.ButtonPressed(PSB_PAD_UP))
    { // Sera verdad cuando se presione el botón, 1 vez ON / 1 vez OF
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Botón izquierda arriba presionado:"));
    }
    
    .
    .
    .
    .
        
    digitalWrite(led1, LEDHdlts); // Enciende el Led Amarillo
Este hace lo mismo, pero es mucho mas sencillo de entender.

Código: Seleccionar todo

// Será verdad cuando se presione el botón
    bool buttonPressed;
    buttonPressed = ps2x.ButtonPressed(PSB_PAD_UP);
    if ( buttonPressed == true)
    {
      Serial.println(F("\n Botón izquierda arriba presionado:"));
      if (ledState == true)
      {
        digitalWrite(LED_PIN_1, HIGH);
      }
      else
      {
        digitalWrite(LED_PIN_1, LOW);
      }
    }

Un saludo.
Alberto.



asesorplaza1
PayPal
PayPal
Mensajes: 152
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

Re: Un ROV de agua dulce, con mando de PS2

Mensaje por asesorplaza1 » Jue Dic 03, 2020 9:02 pm

Muchas gracias Alberto.

Voy a estudiar las paginas a las que haces referencia, y a hacer un programa mas sencillo (de momento) para implementar lo que dices.

Un saludo



Responder