Un ROV de agua dulce, con mando de PS2
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
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.
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 208 veces
Re: Un ROV de agua dulce, con mando de PS2
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.
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.
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
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
Un saludo y muchas gracias
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
Porque es un fastidio, que cada vez que añado algo se estropee lo anterior que ya funcionaba.“cuando añadas nuevas funcionalidades no interfieran con las que ya tenias funcionando”
Un saludo y muchas gracias
Re: Un ROV de agua dulce, con mando de PS2
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.
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
Un trozo del código de tu skech.
Este hace lo mismo, pero es mucho mas sencillo de entender.
Un saludo.
Alberto.
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;
https://www.arduino.cc/en/Reference/StyleGuide
Código: Seleccionar todo
const int LED_PIN_1= 30;
boolean ledState;
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
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.
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
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
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
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Muchas gracias Alberto
Las librerías a las que haces referencia, ya las había estudiado, y de ellas he ido sacando los “trozos” que me interesaban para hacer funcionar el mando.
Incluso he estado intentando hacer funcionar el LED como tú explicas en la última publicación, y no me daba resultado, solo funcionaba con un botón, cuando incluía mas botones y mas funciones dejaba de funcionar. Por eso tuve que usar el cambio de estado del LED con la línea
A demás de esas páginas que apuntas hay esta otra
https://github.com/Lynxmotion/Arduino-PS2X
Que explica cómo utilizar el mando de PS2 con el Arduino Mega 2560, que es el que yo estoy utilizando, usando los pines 22, 23, 24, 25, para que no haya conflicto con las comunicaciones, ni con el resto de funciones que hace el Arduino mientras está usando el mando. Por eso he llegado al trozo de código para encender el LED con 4 líneas, en vez de las 14 que necesitas tú, para encender el LED.
No digo que mi método sea mejor que el tuyo, si no que este tuyo ya lo he probado y para mas botones, no es el adecuado, porque el Arduino se lía y deja de funcionar.
Un saludo a todos.
Las librerías a las que haces referencia, ya las había estudiado, y de ellas he ido sacando los “trozos” que me interesaban para hacer funcionar el mando.
Incluso he estado intentando hacer funcionar el LED como tú explicas en la última publicación, y no me daba resultado, solo funcionaba con un botón, cuando incluía mas botones y mas funciones dejaba de funcionar. Por eso tuve que usar el cambio de estado del LED con la línea
Código: Seleccionar todo
LEDHdlts = !LEDHdlts;
https://github.com/Lynxmotion/Arduino-PS2X
Que explica cómo utilizar el mando de PS2 con el Arduino Mega 2560, que es el que yo estoy utilizando, usando los pines 22, 23, 24, 25, para que no haya conflicto con las comunicaciones, ni con el resto de funciones que hace el Arduino mientras está usando el mando. Por eso he llegado al trozo de código para encender el LED con 4 líneas, en vez de las 14 que necesitas tú, para encender el LED.
No digo que mi método sea mejor que el tuyo, si no que este tuyo ya lo he probado y para mas botones, no es el adecuado, porque el Arduino se lía y deja de funcionar.
Un saludo a todos.
- Adjuntos
-
- 02_Mando_PS2_Enciende_Led_ok.rar
- (1.63 KiB) Descargado 167 veces
Última edición por asesorplaza1 el Dom Dic 06, 2020 7:26 pm, editado 1 vez en total.
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Pongo el código para que no lo tengáis que descargar
Código: Seleccionar todo
#include "PS2X_lib.h" //for v1.6
#include "Servo.h"
PS2X ps2x; // Creamos un Controlador clase PS2
Servo UpLServo; // Creamos un objeto ESC arriba izquierda
Servo UpRServo; // Creamos un objeto ESC arriba derecha
Servo HorizLServo; // Creamos un objeto ESC horizontal izquierda
Servo HorizRServo; // Creamos un objeto ESC horizontal derecha
Servo CamServo; // Creamos un objeto servo para el pitch de la camara
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); // El servo arriba izquierda ataca en el pin 32
UpRServo.attach(34); // El servo arriba derecha ataca en el pin 34
HorizLServo.attach(36); // El servo horizontal izquierda ataca en el pin 36
HorizRServo.attach(38); // El servo horizontal derecha ataca en el pin 38
CamServo.attach(40); // El servo del pitch de la camara ataca en el pi 40
delay (1000);
}
void loop() {
if ( millis() - auxMillis > intervaloEncendido) {
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 (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); // mantiene el servo de la camara dentro del limite de 30 - 149
CamServo.write(CamPitch); // Mueve el servo de la camara
digitalWrite(led1, LEDHdlts); // Enciende el Led Amarillo
}
}
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Buenas noches.
He escrito el código como me dijo Tsanshon (Alberto), y como ya había comentado, con ese código el Arduino se lía y no obedece a las ordenes del mando completamente, mueve el servo cuando mantengo pulsados los botones R1 y R2, en el Monitor Serie escribe el botón que estoy pulsando, pero el led no se enciende ni se apaga.
Lo que si he conseguido con las recomendaciones de Alberto, es estabilizar las reacciones del mando y del Arduino, ahora me hace caso siempre, pero con mi código.
Adjunto los dos códigos, para que veáis las diferencias.
Un saludo.
He escrito el código como me dijo Tsanshon (Alberto), y como ya había comentado, con ese código el Arduino se lía y no obedece a las ordenes del mando completamente, mueve el servo cuando mantengo pulsados los botones R1 y R2, en el Monitor Serie escribe el botón que estoy pulsando, pero el led no se enciende ni se apaga.
Lo que si he conseguido con las recomendaciones de Alberto, es estabilizar las reacciones del mando y del Arduino, ahora me hace caso siempre, pero con mi código.
Adjunto los dos códigos, para que veáis las diferencias.
Un saludo.
- Adjuntos
-
- 02_Mando_PS2_Enciende_Led_ok.rar
- (1.66 KiB) Descargado 187 veces
-
- 02_PS2_Enciende_Led_Tsanshon.rar
- (1.73 KiB) Descargado 200 veces
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Este es el código como dice Alberto
Código: Seleccionar todo
#include "PS2X_lib.h" // para la v1.6
#include "Servo.h"
PS2X ps2x; // Creamos un Controlador clase PS2
Servo UpLServo; // Creamos un objeto ESC arriba izquierda
Servo UpRServo; // Creamos un objeto ESC arriba derecha
Servo HorizLServo; // Creamos un objeto ESC horizontal izquierda
Servo HorizRServo; // Creamos un objeto ESC horizontal derecha
Servo CamServo; // Creamos un objeto servo para el pitch de la camara
const int LED_PIN_1 = 30; // Creamos un LED Verde en el pin 30
boolean ledState; // Guarda el estado del LED on/of
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 CSraw = 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(LED_PIN_1, OUTPUT); // Establece el pin del LED como salida
UpLServo.attach(32); // El servo arriba izquierda ataca en el pin 32
UpRServo.attach(34); // El servo arriba derecha ataca en el pin 34
HorizLServo.attach(36); // El servo horizontal izquierda ataca en el pin 36
HorizRServo.attach(38); // El servo horizontal derecha ataca en el pin 38
CamServo.attach(40); // El servo del pitch de la camara ataca en el pi 40
delay (1000);
}
void loop() {
if ( millis() - auxMillis > intervaloEncendido) {
ps2x.read_gamepad(); // Lee el controlador
bool ButtonPressed; // Sera verdad cuando se presione el botón, 1 vez ON / 1 vez OF
bool Button; // Sera verdad mientras se mantenga el boton presionado
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"));
}
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);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_PAD_DOWN);
if (ButtonPressed == true)
{
Serial.println(F("\n Botón izquierda abajo presinado:"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite(LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_PAD_RIGHT);
if (ButtonPressed == true)
{
Serial.println(F("\n Botón izquierda derecha presionado:"));
if (ledState == true)
{
digitalWrite(LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_PAD_LEFT);
if (ButtonPressed == true)
{
Serial.println(F("\n Botón Izquierda Izquierda presionado:"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_GREEN);
if (ButtonPressed == true)
{
Serial.println(F("\n Triangulo presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_RED);
if (ButtonPressed == true)
{
Serial.println(F("\n Circulo presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_PINK);
if (ButtonPressed == true)
{
Serial.println(F("\n Cuadrado presinado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_BLUE);
if (ButtonPressed == true)
{
Serial.println(F("\n X presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_L1);
if (ButtonPressed == true)
{
Serial.println(F("\n L1 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_L2);
if (ButtonPressed == true)
{
Serial.println(F("\n L2 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_L3);
if (ButtonPressed == true)
{
Serial.println(F("\n L3 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
Button = ps2x.Button(PSB_R1);
if (Button == true)
{
CamPitch = CamPitch + 1;
Serial.println(F("\n R1 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
Button = ps2x.Button(PSB_R2);
if (Button == true)
{
CamPitch = CamPitch - 1;
Serial.println(F("\n R2 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
ButtonPressed = ps2x.ButtonPressed(PSB_R3);
if (ButtonPressed == true)
{
Serial.println(F("\n R3 presionado"));
if (ledState == true)
{
digitalWrite (LED_PIN_1, HIGH);
}
else
{
digitalWrite (LED_PIN_1, LOW);
}
}
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
// Escala 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); // mantiene el servo de la camara dentro del limite de 30 - 149
CamServo.write(CamPitch); // Mueve el servo de la camara
digitalWrite(LED_PIN_1, ledState); // Enciende el Led Verde
}
}
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Este es mi código
Código: Seleccionar todo
#include "PS2X_lib.h" //for v1.6
#include "Servo.h"
PS2X ps2x; // Creamos un Controlador clase PS2
Servo UpLServo; // Creamos un objeto ESC arriba izquierda
Servo UpRServo; // Creamos un objeto ESC arriba derecha
Servo HorizLServo; // Creamos un objeto ESC horizontal izquierda
Servo HorizRServo; // Creamos un objeto ESC horizontal derecha
Servo CamServo; // Creamos un objeto servo para el pitch de la camara
const int led1 = 30; // Creamos un LED Verde en el pin 30
volatile boolean LEDHdlts; // Cambia el estado del LED on/of
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); // El servo arriba izquierda ataca en el pin 32
UpRServo.attach(34); // El servo arriba derecha ataca en el pin 34
HorizLServo.attach(36); // El servo horizontal izquierda ataca en el pin 36
HorizRServo.attach(38); // El servo horizontal derecha ataca en el pin 38
CamServo.attach(40); // El servo del pitch de la camara ataca en el pi 40
delay (1000);
}
void loop() {
if ( millis() - auxMillis > intervaloEncendido) {
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 (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); // mantiene el servo de la camara dentro del limite de 30 - 149
CamServo.write(CamPitch); // Mueve el servo de la camara
digitalWrite(led1, LEDHdlts); // Enciende el Led Verde
}
}
-
- Colaborador
- Mensajes: 209
- Registrado: Jue Ene 24, 2019 6:51 am
- Ubicación: Cuenca
Re: Un ROV de agua dulce, con mando de PS2
Buenas tardes.
Tras pelearme mucho con el dichoso código, he conseguido hacerlo funcionar, ahora lo he separado en "pestañas" y es mas fácil de leer, no lo puedo adjuntar como código, así es que os adjunto el enlace a la pagina de Github.
https://github.com/asesorplaza1/Program ... -evolucion
Tengo que arreglar el archivo "léeme" para actualizarlo, pero los programas ya funcionan.
Ahora me queda ajustar los sensores para que me hagan una lectura real, tanto de la batería como de las distancias, peor ya funciona casi como debe, y conectar y soldar todo en una placa de electrónica, pero por lo menos ya me he desatascado, y eso me da ánimos para seguir con el proyecto.
Un saludo.
Tras pelearme mucho con el dichoso código, he conseguido hacerlo funcionar, ahora lo he separado en "pestañas" y es mas fácil de leer, no lo puedo adjuntar como código, así es que os adjunto el enlace a la pagina de Github.
https://github.com/asesorplaza1/Program ... -evolucion
Tengo que arreglar el archivo "léeme" para actualizarlo, pero los programas ya funcionan.
Ahora me queda ajustar los sensores para que me hagan una lectura real, tanto de la batería como de las distancias, peor ya funciona casi como debe, y conectar y soldar todo en una placa de electrónica, pero por lo menos ya me he desatascado, y eso me da ánimos para seguir con el proyecto.
Un saludo.
-
- Participativo
- Mensajes: 289
- Registrado: Dom Ago 23, 2015 12:32 pm
- Ubicación: madrid
Re: Un ROV de agua dulce, con mando de PS2
Increíble. Un trabajo de alta tecnología.
Me quito el sombrero.
Felicidades
Me quito el sombrero.
Felicidades