Bienvenido, Invitado
Nombre de Usuario: Contraseña: Recordarme

TEMA:

Un ROV de agua dulce, con mando de PS2 4 años 11 horas antes #1667

Oye que alegría, estamos ganado en calidad de miembros del foro, se han incorporado un Técnico Superior de Electrónica y Robótica Industrial, y un Técnico del CSIC, valla nivel.

Un saludo a todos.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Última Edición: por asesorplaza1.

Un ROV de agua dulce, con mando de PS2 3 años 11 meses antes #1683

Buenas tardes.

Estoy del mando hasta las narices, puede ser que esta tarde salga por la ventana.

Llevo ya 38 versiones o modificaciones del programa, y sigue sin funcionar correctamente, creo que el programa se ha mejorado bastante, pero sigue sin funcionar el dichoso mando.

Un saludo.
Adjuntos:

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Un ROV de agua dulce, con mando de PS2 3 años 11 meses antes #1727

Buenas noches.

Sigo peleándome con el mando, pero eso ya no es digno de mención.

Os escribo por dos motivos, uno, porque no me he olvidado de vosotros ni de vuestra ayuda, y el segundo, porque he echo, mejor dicho, me han hecho el ya amigo Bigbadbob, un descubrimiento que nos puede venir bien a todos.

Se trata de la macro (F("texto"))

Yo no sabia que existía, a lo mejor vosotros si, y no estoy descubriendo la pólvora, pero no lo he visto en ninguno de vuestros proyectos.

Resulta que con esta macro, si se define bien, los "Serial.print", o los "Serial.println" no ocupan memoria, y se ejecutan igualmente, yo he reducido la memoria ocupada por el programa de un 26%, a un 7%, que se dice pronto, sin quitar ningún "Serial.print".

Yo la he implementado de la siguiente manera, lo único con lo que hay que tener cuidado es que solo se puede utilizar para los textos fijos, NO se puede utilizar cuando se imprime el dato de un sensor que esta variando continuamente.

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

linea 154 del código Maestro

y luego en todos los "Serial.print" fijos

Serial.println (F("\n Controlador encontrado y configurado con exito"));

linea 273 del código, y siguientes.

Como podréis observar, el código ha cambiado bastante desde la ultima vez que lo publiqué.

Si queréis mas información sobre la macro (F("texto")), podéis buscarla en Internet, o mirar estos enlaces.

www.baldengineer.com/arduino-f-macro.html

heli.xbot.es/?p=519

arduino.stackexchange.com/questions/176/...ariables-in-a-string

donde explican el funcionamiento de la macro F mejor que yo

Un saludo.
Adjuntos:

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Última Edición: por asesorplaza1.

Un ROV de agua dulce, con mando de PS2 3 años 11 meses antes #1764

Buenas tardes.

Bueno, pues parece que esto va tomando forma, y he averiguado varias cosas.

Como ya os he comentado, estoy registrado en un foro de construcción de ROV, con proyectos similares al mío, y tengo un tema abierto en este enlace.

www.homebuiltrovs.com/rovforum/viewtopic.php?f=18&t=1908

Es un coñazo, tener que escribir las preguntas en Español, y luego traducirlas al Inglés, menos mal que lo hago con el traductor de BING, pero aun así, es un lio, porque traduce lo que quiere y como quiere, y tengo que estar traduciendo y volviendo a traducir las frases, para comprobar que tengan sentido, pero bueno, a pesar de las dificultades he conseguido varios progresos.

El Americano que me está ayudando, Bigbadbob, después de mucho comentar como mejorar el programa, ha llegado a la conclusión de que el Arduino se hace un lio al tener que utilizar los dos Puertos Serie, a la vez que el bus SPI para controlar el mando, por lo tanto la mejor solución a la que hemos llegado, es que hay que separar lo que hasta ahora tenía como “Código Maestro”, en dos partes y en dos Arduinos, una parte del código en un Arduino que solo controle el mando, y otra parte del código que controle los sensores y mande los datos, de momento al ordenador, y después a la pantalla Nextion, en otro programa y en otro Arduino.

Como no se puede utilizar la Comunicación Serie, con la impresión de datos y con el mando de la PS2, todo junto, en un mismo programa y en un solo Arduino, por lo tanto, tengo que utilizar tres Arduinos, dos en el puesto de control, y uno dentro del ROV, y a demás así es como lo tiene el montado, después de un montón de tiempo intentando hacerlo de otras formas, y no sacando nada diferente en claro.

El sistema funciona de la siguiente manera.

El Arduino que está dentro del ROV, controla los sensores y solo manda por el puerto TX los datos a un Arduino, que está en el puesto de control, que los recibe por el puerto RX, los interpreta y los manda a la pantalla.

A su vez el mismo Arduino que está dentro del ROV, por el puerto RX, solo recibe los datos del mando PS2, y ejecuta las ordenes del mando.

Es un poco más lioso pero es la única manera de que funcione, pongo una foto para que veáis que no es tan complicado como resulta explicarlo escribiendo.



La foto no es para ganar un premio Pulitzer, pero se ve lo que os quiero decir.

Un saludo
Adjuntos:

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Un ROV de agua dulce, con mando de PS2 3 años 5 meses antes #2063

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.
De momento he aparcado la idea del Americano de partir el programa en dos, y sigo con mi planteamiento inicial.
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.
#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:

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Un ROV de agua dulce, con mando de PS2 3 años 5 meses antes #2066

Ahi ahi, siempre hacia adelante.
El siguiente usuario dijo gracias: asesorplaza1

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.108 segundos
Gracias a Foro Kunena