Un ROV de agua dulce, con mando de PS2

Si te gustan los modelos Radio Control RC este es tu foro.
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas tardes.

Muchas gracias Alberto.
Como comprenderás, no puedo más que hacerte sugerencias de como lo haría yo.
Eso es lo que pretendo, que alguien me de alguna idea efectiva, para que los programas terminen de funcionar correctamente, aunque yo siga estrujándome la neurona, y buscando soluciones.

Siguiendo tus consejos, instale Atom y el complemento Platform-IO, y me registré en el foro de PIO, en este foro he podido aclarar algunos conceptos, y me he atascado en otras cosas.

Me han aclarado, por ejemplo, que la línea

for (int i = 0; i < 5; i++) {

Que me han dicho varias veces (no solo tú) que estorbaba en el código, porque repite lecturas, lo que realmente hace es cambiar el estado de Envío a Recepción cada 5 segundos, para mantener la comunicación entre los Arduinos, y que es una línea imprescindible para la comunicación con la librería EasyTransfer. Por lo tanto, no se puede quitar.

Me he atascado
Porque resulta que Platform-IO, ya no da soporte para Atom, ni para Arduino, que hay que utilizar Visual Estudio Code + PIO, es un editor parecido a Atom, pero que se está utilizando mas, y tiene más soporte.
También resulta que VSC + PIO, no dan soporte para Arduino, puesto que hay placas mucho más potentes, están usando los controladores Raspberry o ESP32.
He elegido usar ESP32, porque se programan igual que el Arduino, y a demás es compatible con el IDE Arduino, pero no tengo en este momento ninguna placa de esas, y me toca esperar a que me lleguen, para poder continuar depurando el código.

Este es el enlace a Platform-IO

https://community.platformio.org/t/un-r ... -rov/14157

Así que ahora estoy a la espera de que me lleguen las placas.

Me he tenido que abrir una cuenta en Github, para poder adjuntar el enlace a los códigos, en vez de adjuntar los programas, porque ahora tienen muchas líneas de comando, pero no son nada comparado como tienen que terminar, me falta poner todo lo de la pantalla Nextion, que son como unas 50 líneas mas en cada código, y si ahora mismo ya tengo problemas para adjuntarlos, por el tamaño, no te cuento, lo que me va a costar adjuntarlos después. Y he tenido que quitar los encabezados con la explicación de las actualizaciones, y poner las explicaciones en el fichero Readme.md

Este es el enlace a Github

https://github.com/asesorplaza1/Program ... -evoluci-n


Un saludo a tod@s.
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas noches
Como habéis podido observar llevo un tiempo sin escribir en este foro, y no es por falta de ganas, sino porque sigo dándole vueltas al proyecto a ver si consigo hacerlo funcionar, pero de momento no hay manera de que funcione correctamente.
Repasando las publicaciones anteriores, me he dado cuenta de que no puse como se hace un voltímetro con Arduino, para que nos de la información de la carga de la batería, así que aquí está el Voltímetro con Arduino.

https://arduparatodos.blogspot.com/2017 ... duino.html

Es mucho más fácil de lo que parece.

Un saludo a tod@
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas tardes.
Si alguien quiere darle una vuelta de tuerca a las posibilidades de Arduino, también se puede hacer un Amperímetro, para medir intensidad y consumo en los circuitos, os dejo el enlace a la pagina de Luis Llamas de como se hace.

https://www.luisllamas.es/arduino-inten ... co-acs712/

Un saludo.
Avatar de Usuario
carlosys
Administrador Web
Administrador Web
Mensajes: 2017
Registrado: Dom Ago 29, 2010 7:37 am
Ubicación: Tarragona
Contactar:

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

Mensaje por carlosys »

Este es uno de esos hilos que tengo guardado fuera del foro por todo lo que se comenta de Arduino. Es muy interesante y demuestra el potencial que tiene el "invento".

Seguiremos aprendiendo.... Yo estoy con otro proyecto que no tiene nada que ver con barcos (es más industrial) pero es igual de complicado cuando empiezas a pelear con los diferentes retos ya que muchos de los avances en un proyecto de arduino, pueden inutilizar los primeros pasos.

Gracias por compatir.

Saludos
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas tardes

Carlosys, y ¿ Como se pueden solucionar esas pegas que hacen que la parte del proyecto que antes funcionaban, ahora por "arte de magia", han dejado de funcionar?

Un saludo.
Avatar de Usuario
carlosys
Administrador Web
Administrador Web
Mensajes: 2017
Registrado: Dom Ago 29, 2010 7:37 am
Ubicación: Tarragona
Contactar:

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

Mensaje por carlosys »

asesorplaza1 escribió: Sab Oct 17, 2020 8:18 pm Buenas tardes

Carlosys, y ¿ Como se pueden solucionar esas pegas que hacen que la parte del proyecto que antes funcionaban, ahora por "arte de magia", han dejado de funcionar?

Un saludo.
Pues no queda otra que seguir investigando y rompiéndose la cabeza jeje
El problema de estas "plataformas" es que no solemos ser expertos en ellas (al menos yo) y empezamos la casa por el tejado. Una vez tenemos la funcionalidad más o menos operativa, empezamos con los detalles y aquí es donde surgen las sorpresas.

Es cuestión de experiencia, práctica y tirar de foros para ver si otros han tenido problemas similares y cómo los han resuelto.

Divertido cuando ves que vas resolviendo problemas y desesperante cuando no progresas y te dan ganas de tirar todo por la ventana :lol: :lol:

Saludos
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas tardes.

Algo así me temía, que es justo lo que estoy haciendo.

Un saludo.
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas noches.
Sigo sin olvidarme de vosotros, lo que pasa es que estoy liado con el dichoso ROV, y no me da tiempo para mucho mas.
He conseguido un nuevo avance, EL MANDO ME HACE CASO, aleluya, poco a poco voy consiguiendo cosas.
Si aprieto un botón se enciende un LED, si aprieto otro botón o el mismo se apaga el LED.
Si aprieto el botón R1 muevo un servo para un lado, si aprieto el botón R2 el servo se mueve hacia el otro lado.
Para mí es como si hubiese conseguido llegar a la luna, para los demás a lo mejor es algo obvio.
Os pongo el programa del mando solo.

Un saludo a todos.

Código: Seleccionar todo


#include "PS2X_lib.h"  //for v1.6
#include "Servo.h"

PS2X ps2x; // create PS2 Controller Class

Servo UpLServo;  //Create servo object representing up left ESC
Servo UpRServo;  //Create servo object representing up right ESC
Servo HorizLServo;  //Create servo object representing horiz left ESC
Servo HorizRServo;  //Create servo object representing horiz right ESC
Servo CamServo;  //Create servo object representing camera pitch

const int led1 = 30;

volatile boolean LEDHdlts;

int ForwardVal = 0;   // valor leído en palo PS2 derecho arriba/abajo
int YawLeftVal = 0;   // valor leído en palo PS2 derecho derecha/izquierda
int UpVal = 0;        // valor leído en palo PS2 izquierdo arriba/abajo
int RollLeftVal = 0;  // valor leído en palo PS2 izquierdo derecha/izquierda
int CamPitch = 90;

int upLraw = 0;  // Variables para transportar el valor actual de los datos a los ESC
int upRraw = 0;
int HLraw = 0;
int HRraw = 0;

int auxMillis = 0;
int intervaloEncendido = 1000;

void setup() {

  Serial.begin(9600);
  Serial.flush(); // Depura la informacion del puerto Serie

  // Configuracion de los pines y ajustes:  GamePad (clock, command, attention, data, Pressures?, Rumble?) verifica el error
  ps2x.config_gamepad(22, 23, 24, 25, true, true);

  pinMode(led1, OUTPUT); // Establece el pin del LED como salida

  UpLServo.attach(32);// attaches the Up left Servo to pin 5
  UpRServo.attach(34);// attaches the Up Right Servo to pin 6
  HorizLServo.attach(36);// attaches the Horizontal Left Servo to pin 7
  HorizRServo.attach(38);// attaches the Horizontal Right Servo to pin 8
  CamServo.attach(40);

}

void loop() {

  /*
    Debe leer el Gamepad para obtener nuevos valores
    Lea Gamepad y establezca valores de vibración
    ps2x.read_gamepad (motor pequeño encendido / apagado, mayor potencia del motor de 0 -22)
    Si no habilita la vibración, use ps2x.read_gamepad();  sin valores
    Deberias llamar por lo menos una vez a esto
  */

  ps2x.read_gamepad();   // Lee el controlador

  if (ps2x.Button(PSB_START)) {       // Sera verdadero cuando se presione el botón
    Serial.println(F("\n Botón Start esta siendo presionado"));
  }

  if (ps2x.Button(PSB_SELECT)) {
    Serial.println(F("\n Botón Select esta siendo presionado"));
  }

  if ( millis() - auxMillis > intervaloEncendido) {

    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:"));
    }

    if (ps2x.ButtonPressed(PSB_PAD_DOWN)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Botón izquierda abajo presinado:"));
    }

    if (ps2x.ButtonPressed(PSB_PAD_RIGHT)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Botón izquierda derecha presionado:"));
    }

    if (ps2x.ButtonPressed(PSB_PAD_LEFT)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Botón Izquierda Izquierda presionado:"));
    }

    if (ps2x.ButtonPressed(PSB_GREEN)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Triangulo presionado"));
    }

    if (ps2x.ButtonPressed(PSB_RED)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Circulo presionado"));
    }

    if (ps2x.ButtonPressed(PSB_PINK)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n Cuadrado presinado"));
    }

    if (ps2x.ButtonPressed(PSB_BLUE)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n X presionado"));
    }

    if (ps2x.ButtonPressed(PSB_L1)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n L1 presionado"));
    }

    if (ps2x.ButtonPressed(PSB_L2)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n L2 presionado"));
    }

    if (ps2x.ButtonPressed(PSB_L3)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n L3 presionado"));
    }

    if (ps2x.Button(PSB_R1)) {  // Será verdad mientras se mantenga pulsado el boton
      CamPitch = CamPitch + 1;
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n R1 presionado"));
    }

    if (ps2x.Button(PSB_R2)) {
      CamPitch = CamPitch - 1;
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n R2 presionado"));
    }

    if (ps2x.ButtonPressed(PSB_R3)) {
      LEDHdlts = !LEDHdlts;
      Serial.println(F("\n R3 presionado"));
    }

    ForwardVal = ps2x.Analog(PSS_RY);
    YawLeftVal = ps2x.Analog(PSS_RX);
    UpVal = ps2x.Analog(PSS_LY);
    RollLeftVal = ps2x.Analog(PSS_LX);

    upLraw = (128 - UpVal) + (128 - RollLeftVal) / 2; // esto será hasta un valor de 192
    upRraw = (128 - UpVal) - (128 - RollLeftVal) / 2; // esto será hasta un valor de 192
    HLraw = (128 - ForwardVal) + (128 - YawLeftVal); // esto será hasta un valor de 256
    HRraw = (128 - ForwardVal) - (128 - YawLeftVal); // esto será hasta un valor de 256

    // Scala los valores para que sean adecuados para los ESC y los servos
    upLraw = map(upLraw, -193, 193, 0, 179);
    upRraw = map(upRraw, -193, 198, 0, 179);
    HLraw = map(HLraw, -256, 256, 0, 179);
    HRraw = map(HRraw, -256, 256, 0, 179);

    // escribe el valor 0 en los servos

    UpLServo.write(upLraw);
    UpRServo.write(upRraw);
    HorizLServo.write(HLraw);
    HorizRServo.write(HRraw);

    CamPitch = constrain(CamPitch, 30, 149); //keep CamPitch within the 30 - 149 boundary
    CamServo.write(CamPitch);  //Move the camera servo

    digitalWrite(led1, LEDHdlts); // Enciende el Led Amarillo

  }
}

Adjuntos
02_Mando_PS2_Enciende_Led_ok.rar
(1.79 KiB) Descargado 84 veces
Avatar de Usuario
tsanshon
Colaborador
Colaborador
Mensajes: 169
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

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

Mensaje por tsanshon »

Hola.

Me encontré con este articulo sobre como programar código mas limpio de Luis Llamas por casualidad y me parece que describe perfectamente la problemática de la programación en Arduino y suscribo totalmente sus consejos.
Al menos en mi caso estoy en el grupo de los que ha empezado desde cero aprendiendo por su cuenta y hace lo que puede. A día de hoy, aunque he empezado a crear mis propias librerías para lo que le voy añadiendo a mi proyecto, tengo dos monstruos: El control remoto que tiene unas 3000 lineas de código y el control del barco con unas 2500 y depurar el código se vuelve una pesadilla cada vez que le añado algo.

https://www.luisllamas.es/4-consejos-pa ... n-arduino/


Espero que te sea de utilidad.

Alberto.
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

Buenas noches

Ya conocía el articulo de Luis Llamas, y como he escrito unas cuantas veces, no soy ninguna maravilla programando, que se puede mejorar, por supuesto, pero por lo menos funciona, que es lo que yo quería.

Gracias de todas formas.

Un saludo a todos.
Avatar de Usuario
tsanshon
Colaborador
Colaborador
Mensajes: 169
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

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

Mensaje por tsanshon »

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
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

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
Colaborador
Colaborador
Mensajes: 169
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

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

Mensaje por tsanshon »

Prueba a poner al final de setup()

delay(1000);
asesorplaza1
Colaborador
Colaborador
Mensajes: 209
Registrado: Jue Ene 24, 2019 6:51 am
Ubicación: Cuenca

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

Mensaje por asesorplaza1 »

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
Colaborador
Colaborador
Mensajes: 169
Registrado: Mié Jul 29, 2009 1:36 am
Ubicación: Bilbao

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

Mensaje por tsanshon »

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.
Responder