Un ROV con mando de PS2

Un saludo a todos

Como indica el titulo de la publicación estoy haciendo un proyecto de robot, que es un ROV, Remote Operate Vehicle, o en castellano, Vehículo Controlado Remotamente, con la particularidad de que este tipo de robot, son sumergibles, llevo bastante tiempo con el proyecto, empece en el 2.016, a dar mis primeros pasos con Arduino, y estudiando proyectos similares como el de homebuiltrovs, y el proyecto de http: //www.techmonkeybusiness.com/tag/rov.html.

Me he atascado varias veces, y he salido de esos atascos como he podido, la mayor parte de las veces buscando en Internet, otras veces preguntando en foros especializados, como [http: //www.homebuiltrovs.com/rovforum/](http://http: //www.homebuiltrovs.com/rovforum/), foro especializado en este tipo de vehículos, y https: //www.cambatronics.com/foro/, foro de proyectos de electrónica y programación, aplicada a diversos proyectos, y que me han ayudado bastante a solucionar algunas dudas sobre el proyecto.

Pero ahora estoy atascado de verdad, y necesito ayuda más específica sobre la programación de Arduino.

También comentaros que mis conocimientos de electrónica y programación son bastante limitados, soy un simple aficionado autodidacta.

Ahora paso a explicar el proyecto que pretendo realizar

La idea es que con 2 Arduinos Mega 2560, uno dentro del ROV llamado Esclavo, y otro en superficie llamado Maestro, y un mando de PS2, controle los movimientos de ROV, y que en una pantalla Nextion de 5 pulgadas del tipo Básica, me muestre los datos de los distintos sensores que tengo pinchados en el Arduino Esclavo.

Esta sería la definición básica del proyecto.

Ahora viene la definición extensa y detallada del proyecto.

El Arduino Mega 2560, lo conocéis de sobra.

El mando de la PS2, creo que también, estoy utilizando el mando inalámbrico con su Shield de control

Y la biblioteca de Bill Porter PSXLib, conocida por muchos de vosotros, que adjuntare en esta publicación, junto con todas las que he utilizado para el proyecto.

Ahora paso a enumerar los sensores que estoy utilizando, son de lo mas normalito, pero para este proyecto creo que son los adecuados por su relación calidad precio
Tengo pinchados 3 sensores de temperatura y humedad DHT22, conocidos por todos los que habéis trasteado un poco con Arduino.

También estoy utilizando un sensor de temperatura DS18B20, con su encapsulado metálico, y conectado mediante una resistencia de 4,7 kΩ, de una manera muy parecida a esta.

También estoy utilizando un sensor de presión HK3025 5MP, como este de la foto, que definitivamente tendrán que ser 2, uno para que me marque la presión interior del ROV, e intentar que no reviente, y otro que me marque la presión exterior para saber a qué profundidad se encuentra el ROV.

A demás estoy utilizando un sensor de infrarrojos E18D80NK, como este

También un modulo de relé para encender un foco, que posteriormente serán 2 focos, pero de momento para las pruebas con uno que funcione me vale, en el montaje definitivo, no sé si pondré 2 relés, uno para foco, o si me podre arreglar con un solo relé para los dos focos, eso se verá en un futuro no muy lejano

Dos motores sin escobillas, con su variador de velocidad, que por lo que he podido comprobar en diversas páginas de Internet, se controlan igual que un servo, esto en principio no tiene mayor problema de control
Y como no un servo que me moverá un eje donde estarán colocados los motores, y se moverá según las necesidades hacia arriba y hacia abajo para hundir el ROV, o sacarlo a la superficie

También tengo conectado un giroscopio GY 5121 MPU6050, para que me marque las inclinaciones del ROV, sobre los ejes de los tres planos X, Y, Z, para saber en qué posición se encuentra el ROV

La corriente de momento la estoy sacando de una fuente ATX de PC, para no gastar baterías con las pruebas del proyecto, y los cables están conectados a una placa de alimentación de Arduino llamada YFRobot

Y por supuesto que en el montaje eléctrico todas las masas están conectadas entre sí, tanto las de las pistas de la protoboard, como las GND de los Arduinos, y los cables negros, Negativos de la fuente de PC

Para la transmisión de los datos entre un Arduino y otro, de momento, como lo tengo todo encima de la mesa, con dos cables de puente del tipo dupont, de momento me puede servir, pero luego esa transmisión se hará con un cable de red CAT5, de 100 metros, que ya conseguí en su momento y que está esperando que lo utilice.

Para la transmisión de video en directo no voy a complicarme la vida, voy a utilizar una Raspberry Pi3 +, una cámara USB, y un ordenador portátil.
El sistema de video funciona de la siguiente manera.
A la Raspberry Pi3 +, se le conecta una cámara de video por USB, se inicia la Raspberry y directamente desde el ordenador, con un programa que se llama VLC media player, se le manda reproducir una dirección web, que es la dirección ip de la Raspberry, y ya estás viendo el video en el ordenador.
Lo único que hay que hacerle a la Raspberry es cargar el sistema operativo, actualizar todo, y que te enseñe su dirección ip, no me he complicado con el lenguaje de programación, solo he seguido el tutorial de inicio de la página oficial de Raspbery. Ya tengo bastantes problemas de programación con un solo idioma el C++, de Arduino, como para encima aprender el otro de la Raspberry, el Python.

Bueno hasta aquí la exposición del proyecto, espero haberme explicado lo suficiente como para que entendáis la idea y podáis ayudarme.

Ahora empiezo a explicar el problema que tengo.

Hasta ahora, he ido incorporando sensor a sensor, de uno en uno, primero haciendo la conexión solo del sensor nuevo en una placa y en un programa nuevo.
Después lo he conectado en un Arduino, y mediante la Comunicación Serie, por los pines RX y TX, a otro Arduino, para comprobar que el montaje funciona, y que puedo ver los datos a través del Monitor Serie.
Y luego incorporándolo al programa donde están el resto de instrucciones, tanto en el Arduino Maestro, como en el Esclavo, y conectándolo en su sitio, para comprobar que funciona.

Esto me ha ido funcionando bien, hasta que de repente ha dejado de funcionar, sin que pueda encontrar una explicación coherente al porque del fallo.
De pronto ha dejado de reaccionar a las órdenes del mando de la PS2, y no es porque las baterías del mando estén gastadas, como alguno me puede indicar, ha sido al incorporar el giroscopio, y creo que hay alguna orden que está interfiriendo en el programa, y no encuentro cual es, en principio no hay ningún pin de Arduino que en el programa haga dos funciones, he comprobado la instalación eléctrica del circuito varias veces y creo poder asegurar que no hay ningún fallo de conexión, me inclino mas a un problema de programación.
Con el programa del Esclavo, si puedo ver los datos en el Monitor Serie, y son bastante coherentes, me da la temperatura de los 4 sensores, la humedad de los tres DHT22, me marca el voltaje de la batería.
Pero el sensor de infrarrojos no marca bien, aleatoriamente marca la proximidad de un objeto o no, sin que se corte la luz del sensor.
Y los datos del giroscopio no varían según la inclinación, están fijos en un número.
Y el monitor Serie del Maestro, va a su aire, o no marca nada, o solo imprime las líneas de texto sin ningún valor, o muestra datos aleatorios de los sensores y el fallo de alguno de ellos.
Ya he probado a cambiar los dos Arduinos, y a cambiar el mando, por si fuese algún fallo de estos, pero nada no consigo arreglarlo.
Adjunto los dos programas, todas las librerías utilizadas, el boceto de Frizting de las conexiones, y un pdf, de cómo se verá en un futuro espero que no muy lejano, el diseño de la pantalla Nextion, y por supuesto me ofrezco a aclarar cualquier duda que tengáis sobre el proyecto y que no haya explicado bien en este

Un saludo a todos

01 foto mando PS2 y shield.jpg

03 DS18B20.jpg

05 Sensor Presion 5v.jpg

06 E18-D80nk sensor infrarojo.jpg

01 Prueba Pantalla.pdf (389 KB)

Programas Arduino.zip (11.9 KB)

Librerias.zip (396 KB)

ARCHIVO FRITZING.zip (42.7 KB)

01 foto mando PS2 y shield.jpg

03 DS18B20.jpg

05 Sensor Presion 5v.jpg

06 E18-D80nk sensor infrarojo.jpg

Fotos Sensores.zip (788 KB)

Por favor, lee las normas del foro porque acabo de editar varios enlaces en tu presentación y espero no tener que hacerlo en adelante. Mira como se postean códigos, enlaces e imágenes.

Yo lo que te recomiendo es siempre probar las cosas por separado.
MPU6050 corriendo algun ejemplo de la librería funciona?
Los demás igual

Si haces eso luego vuelves a integrar el código y debe salir funcionando.
Luego miro el código pero lo mejor es tratar las cosas por separado.

Lo primero pedir disculpas porque haya tenido que editar los enlaces, al leer otros comentarios publicados en el foro y ver que el enlace a las tiendas se separaba con un espacio, creía que era la forma correcta de publicarlos, no se preocupe que si tengo que publicar otro enlace lo haré de la forma correcta.

También quiero darle las gracias por su tiempo e interés en mi proyecto.

Quiero comentarle, que cualquier sensor lo he implementado de la misma manera, primero lo he probado en una placa de prototipos con un Arduino, y el programa de este sensor solo, para comprobar el funcionamiento del programa y del sensor. Después se ha incorporado en el programa del Arduino que llamo Esclavo, que es el que va dentro del vehículo, y se encarga del control del ROV y de los sensores, y cuando me ha funcionado bien he pasado al siguiente paso que es la incorporación de la lectura de los datos del sensor en el programa del otro Arduino, el llamado Maestro, que es el que se encuentra al lado del operador del ROV y se encarga del control del vehículo.

Como he intentado explicar en mi anterior publicación, todo este proceso, los sensores y el giroscopio, han estado funcionando bien, hasta el momento que sin ninguna explicación lógica ha dejado de funcionar, y no encuentro el porqué.

He repasado la instalación eléctrica 3 veces, sin encontrar ningún error, he repasado el código 3 veces linea a linea, por si me hubiese equivocado en alguna de ellas, y en la medida de mis posibilidades, no he encontrado ningún error, esto no quiere decir que no lo haya, solo que yo no lo he visto.

Y ese ha sido el motivo de pedir ayuda en este foro, por aquello de que 4 ojos ven mas que 2, me ha pasado en alguna ocasión, que el código no me compilaba, por la falta o la sobra de algún signo de abre o cierra llave { }, o de abre o cierra paréntesis ( ), y darme varios errores confusos de compilación, pero ahora no es el caso, porque el código compila sin problemas.

Eso me hace pensar que puede ser, que haya alguna orden incompatible con otra, pero mis pocos conocimientos de programación me impiden localizar el error, pero también me hace pensar, que si hubiese ordenes incompatibles, el montaje no hubiese funcionado desde el principio, y no que SI ha funcionado durante un tiempo, y de repente ha dejado de funcionar.

Muchas gracias por su tiempo

Un saludo.

Bueno, ahora que esta claro, tengo una pregunta:
Porque usas DHT22 en un ROV para medir la humedad dentro del ROV en diferentes cámaras?
Me resulta raro su uso como sensor de humedad dentro de un ROV, de todos modos no dices de que tamaño será tu ROV, tal vez la dimensión lo requiera.
Voy a suponer que estuviera de acuerdo. Como crees que una microfuga o sea.. un ingreso minimo de agua en un recinto pudiera ser detectado por dicho sensor. La verdad no me lo he preguntado. Tu lo has probado?

Luego miraré tu código y te daré mis impresiones o criticas constructivas.

Gracias por su tiempo.

Según el diseño que pretendo realizar, si hay 3 cámaras o espacios separados.

  • El casco principal, donde va el Arduino llamado Esclavo, las baterías, los dos sensores de presión uno externo y otro interno, la cámara de vídeo, y uno de los sensores DHT22, para que me informe de la temperatura y humedad de este casco, el giroscopio, los ESC de los motores, el sensor de infrarrojos, y el sensor de temperatura externa DS18B20, y alguna cosa mas que seguro se me olvida.

  • Y dos tubos paralelos a este principal, donde irán los motores con su salida para la hélice, por una punta, y en la otra punta se instalaran los focos que iluminan la parte delantera del vehículo.

Lo del tema de que si el DHT22 sea capaz de detectar la micro fuga de agua, por cambio de grados de humedad, yo también tengo mis dudas, pero lo he visto implantado en otros proyectos, y dicen que funcionan, yo no lo tengo tan claro.
Con el DHT22, pretendo mas que nada, controlar la temperatura dentro de los espacios descritos antes, porque al ser un vehículo sumergible y estar toda la electrónica y motores encerrada en unos tubos supuestamente herméticos, no hay aire nuevo en circulación, como en en un coche por ejemplo, para refrigerar la electrónica, por eso quiero implantar un sistema de refrigeración, para que cuando la temperatura pase de un rango de 40º C, se encienda una bomba de agua y mediante un circuito de gómas de silicona, que pasaran por debajo y al lado de la electrónica, se refrigere todo el sistema, para evitar sobrecalentamientos, a demás los ESC y los motores serán de los utilizados en los modelos de barcos que van refrigerados con un circuito de agua

En cuanto a la detección de fugas de agua, creo que sera mejor incorporar un sensor como el EL0485, utilizado para medir la humedad de las macetas, por ejemplo.

Las dimensiones del ROV pretendo que sean, 50 cm de largo x 40 cm de ancho x 30 cm de alto, por lo menos esas son las dimensiones del casco + los tubos de los motores que estoy preparando, a falta de concretar los espacios utilizados por la electrónica y los sensores, que de momento por las pruebas que he realzado si me sirven, estoy usando trozos de tubo de PVC, del utilizado en los desagües de fontanería, de 125 mm de diámetro, para el cuerpo del ROV, y trozos de tubo de PVC de 50 mm de diámetro, para los cuerpos de los motores, con pared de 3 mm de grueso.

Precisamente he publicado mi proyecto para eso, para que me digáis vuestras impresiones, que me digáis los posibles fallos que veáis, y a ser posible, las posibles soluciones que veis los demás.

Un saludo.

Circuito de refrigeracion.jpg
Circuito de Refrigeración

ROV de RC Cordoba1.jpg
ROV de RC Cordoba

ROV de RC Cordoba 2.jpg
ROV de RC Cordoba

sensor EL0485.jpg
Sensor EL0485

Circuito de refrigeracion.jpg

ROV de RC Cordoba1.jpg

ROV de RC Cordoba 2.jpg

sensor EL0485.jpg

Moderador:
Necesito que las fotos se vean directamente y detengas el uso de subir cosas via zip a menos que no haya mas remedio. Se hace mas simple ver directamente las cosas y considera que lo que es importante para ti para los demas es un archivo basura (sin ofender) que si uno se distrae queda ahi ocupando lugar.
Entonces, fotos tienen un procedimiento para hacerlas visibles. Enlaces, lo mismo. Códigos mayores a 9k se adjuntan pero menores se deben visualizar.
Hagamos mas amena el dialogo para todos.

Yo espero a que dichas fotos < 2MB esten visibles para responderte.

Respondo a tu consulta
El ROV parece ser algo grande para una etapa prototipo. Te aconsejo que lo tomes con calma.
Bien, si se usan DHT22 observemos como se comportan. OJo con el DHT22 que hemos visto que ultimamente luego de un tiempo fallan. Claro que el fallo ocurre cuando esta mucho tiempo funcionando y en tu caso ese tiempo esta limitado por autonomía de las baterías.
Asi que ATENCION a los DHT22 por si se comportan mal.
Otra cosa.
Coloca los 3 sensores mas el DS18B20 en una prueba de calibración que asegure que esten midiendo mas o menos similares y en caso de discrepancias, intenta ajustar sus curvas para tener lecturas similares.
He visto hasta 12 grados de diferencia entre un DS18B20 y un DHT22. No me preguntes por que. Mis DS18B20 son viejos, de cuando recién aparecieron. Ahora compré una serie de 10 nuevos que no he probado.

Una simple prueba de 0 a 40 o 50 grados será suficiente. Imagina una especia de recinto cerrado, coloca los 4 sensores, ponlos a medir.. y loggea sus datos. Usa una resistencia calefactora para ir subiendo la temperatura. O a la inversa, calientas y miras la curva de temperatura cuando se enfríe la cámara. Ese proceso será mas lento que el de calentamiento.

Si los 4 sensores trabajan similares tu evaluarás si vale la pena corregirlos o no, de lo contrario es posible ajustarlos via recta o en el peor caso algun polinomio.

Muchas gracias por su tiempo.

Lamento la reseña que me ha tenido que hacer con respecto a las fotos, pero solo veo en las instrucciones del foro, como adjuntar las fotos de Internet, pero no encuentro instrucciones de como adjuntar las fotos que tengo en el ordenador, no las tengo alojadas en ningún servidor, están en el disco duro, y no encuentro instrucciones de como adjuntar las fotos desde el PC. Al abrir el icono de adjuntar fotos directamente me pide la URL de la foto.

La referencia que me hace a las dimensiones del ROV, encima de la mesa de trabajo, pues si es un trasto bastante grande, pero en el exterior se reducen considerablemente las dimensiones, lo quiero para explorar un lago cercano, y esas dimensiones no son mayores de las de cualquier otro ROV, de los que se pueden ver en la red, tipo Percha de Mar, Homebuilt ROV, Open ROV, u otros similares.

Lo de la calma, ya lo asimile hace tiempo, llevo desde el 2.016 con el proyecto y no tengo prisa por acabarlo, lo que si tengo son ganas de verlo en funcionamiento.

En cuanto a la prueba de los sensores de temperatura, como los tengo conectados en una placa de prototipos, encima de la mesa de trabajo, ya he podido ver los datos de temperatura, a distintas horas del día, con el cambio de temperatura ambiente en la habitación de trabajo, y de momento si funcionan, siendo mas precisas las lecturas de los datos del DS18B20, que las temperaturas de los DHT22, hay entre 1 y 3 grados de diferencia de un tipo de sensor a otro, a la misma hora, por ejemplo, las temperaturas tienen unos valores como estos

..........................mañana..................tarde...............noche
DHT22..................10..........................19....................15
DS18B20.............8/10.....................18/20................14/16

Que coinciden mas o menos con la temperatura de un termómetro de mercurio que tengo en la habitación, no los he sometido todavía a temperaturas extremas artificialmente, pero no tardare en hacerles la prueba que me comenta.

Muchas gracias y un saludo.

No entiendo esto

..........................mañana..................tarde...............noche
DHT22..................10..........................19....................15
DS18B20.............8/10.....................18/20................14/16

DHT22 entrega valores con 0.1°C y el DS18B20 con 12bits de modo que mas allá del error lo hace también con 0.1°C

Entonces debo entender que a la mañana el DHT22 dice 10.0 grados y el DS18B20 8 a 10°C? como puede variar asi?

Te aclaro que estoy intentando colaborar y entenderte. Mi DS18B20 no se comporta como el tuyo De hecho lo que indicas de 2/3°C es mucho mejor y es mas esperable que lo que yo he medido.
En mi caso como la falla es general, simplemente le sume la diferencia y estan mas o menos parejos dentro de 0.5°C

NOTA: te envié privado con instrucciones para las imágenes adjuntas.

Muchas gracias por su tiempo y su paciencia.

Gracias por las instrucciones de las fotos, he conseguido editar las publicaciones y adjuntar las fotos que se vean, no me ha sido fácil, pero lo he conseguido.

A lo que se refiere a las mediciones de los sensores de temperatura, es que he comprobado que el DS18B20, es mucho mas preciso que el DHT22, ajustándose mucho más a las mediciones del termómetro de mercurio, mientras que al DHT22, le cuesta mas tiempo modificar el dato de la temperatura, tanto en ascenso, como en descenso de la temperatura ambiente, esa "tabla de mediciones", quiere decir que en un minuto, el DS18B20, es capaz de medir las variaciones de la temperatura de la habitación, casi inmediatamente, y por eso varia el valor de 8ºC a 10ºC, progresivamente, en el momento que entro en la habitación, levanto la persiana de la ventana, le da la luz del sol, y enciendo una fuente de calor, para calentar la habitación, digamos que marca la diferencia de la temperatura según se produce, y al DHT22, le cuesta mucho mas tiempo detectar esos cambios de temperatura.
Como me siento en la silla de trabajo, muy cerca de la placa de prototipos, no voy a decir que el DS18B20, note mi presencia, ni mi temperatura corporal, y reaccione a ellas, pero casi.

A lo que me refiero es que mientras el DS18B20, ha modificado la lectura en esos 2ºC, el DHT22, no se ha inmutado.

Un saludo.

A lo que me refiero es que mientras el DS18B20, ha modificado la lectura en esos 2ºC, el DHT22, no se ha inmutado.

Que raro lo que dices, pero bueno, es tema de otro debate y aquí lo que interesa es el ROV.

Avancemos. Supuestamente los sensores funcionan bien.
Veamos con problemas de ambos sensores.

DHT22 necesita 2 segundos para entregar un dato
DS18B20 a 12bits necesita 750 mseg para hacer lo mismo.
Si eso no lo consideraste, te comento que puede ser un buen dolor de cabeza.

Como siempre nosotros llegamos tarde y alguien ya lo hizo por nosotros. Existen librerías NON BLocking que justamente no nos dejan esperando como si fuera un delay() y permiten que Arduino trabaje y cuando esta completa la lectura esta puede presentarse.
Asi que luego te pasaré librerías que mejoraran esta cuestión que tal vez desconocías.

Si son 3 DHT22, hablas de casi 6 segundos mas 750 mseg del DS18B20 estamos en 7 segundos

Dime si algo asi no te esta ocurriendo?

Gracias por su tiempo.

Con los sensores de temperatura no tengo problema, si tengo conectado por el USB, al Arduino Esclavo, que es al que están pinchados los sensores, puedo ver en el Monitor Serie los datos de temperatura de los 4 sensores, y de humedad de los 3 DHT22, estos sensores son los que menos problemas me han dado.

Con el sensor que si tengo problemas es con el de infrarrojos E18D80NK, este sensor va por libre, tan pronto me marca bien, como falla la lectura en el Monitor Serie.

También me falla el giroscopio, que esta fijo en una lectura, independientemente de hacia donde lo mueva .

Y el mayor problema me lo da la transmisión de datos de un Arduino a otro, no se por qué, si tengo suerte, y conecto el Arduino Maestro por USB al ordenador, y abro el Monitor Serie, hay veces que si puedo ver los datos de las lecturas de los sensores de temperatura y humedad, pero el sensor de infrarrojos va loco cambiando aleatoria mente de estado, detecta o no detecta objeto, sin que haya nada que corte el paso de la luz del sensor.

Si no tengo suerte, solo me imprime las frases que acompañan a los datos, pero todos los datos se quedan marcando 0.0

Y el que mas fallos da es el mando de la PS2, tan pronto tarda mucho y me hace caso al pulsar los botones, como que no me hace caso a nada independientemente del tiempo que pase.

Creo que el programa no es tan grande, ni tan complicado como para que el Arduino valla forzado al controlar y enviar los datos de los sensores, y recibir las ordenes del mando, no voy a decir que tenga que ser instantáneo, pero si bastante rápido.

Lo que no entiendo es porque falla unas veces todo, y otras veces algunas cosas.

También quisiera comentarle que ya he cambiado los Arduinos, los sensores, y el mando, por si acaso alguno de los componentes se hubiera estropeado.

Cuando lea el programa del Arduino Esclavo, observara que dentro del Void loopDHT22, hay una orden para que en vez de hacer las lecturas a su velocidad normal, solo haga 1 lectura por segundo.

int intervaloMedidas = 1000; // hace que solo se lean los valores 1 vez por segundo
int auxMillis = 0; // Indica el valor del intervalo de tiempo

Esta orden la puse precisamente para evitar que el sensor trabajase demasiado rápido, y de tiempo al Arduino a continuar ejecutando el resto del programa, hasta la próxima lectura de datos, y también en previsión de poner la pantalla Nextion en su momento. Pero la Nextion será otra batalla aparte

Muchas gracias, un saludo.

Espero que pueda ampliarme la información de esas librerías a las que hace referencia en su comentario, ya le digo que los sensores de temperatura, son los que menos problemas me están dando, pero por si acaso.

Un saludo.

Intente descomprimir el archivo .Zip con el programa, para revisarlo, pero me da error.
¿Podrías cargarlos como simples .ino?
Saludos

Gracias por su tiempo, voy a intentar subir los códigos.

No me deja adjuntarlos como código, los adjunto como .ino

El código del Arduino llamado Maestro, el que esta al lado del operador, y que recibe los datos de los sensores, y manda las ordenes del mando de PS2

El código del Arduino llamado Esclavo, es el que controla los sensores, los motores, recibe las ordenes del mando de PS2, y manda los datos de los sensores al otro Arduino

Muchas gracias

01_Maestro_22_03_2020_con_mando_Inalambrico.ino (16.3 KB)

02_Esclavo_22_03_2020_con_mando_Inalambrico.ino (19.1 KB)

Mirando por encima el código del esclavo enseguida me surgió una pregunta ¿Por que utilizas directamente la comunicación I2C? Cuando es mas sencillo utilizar una librería para el sensor.

Gracias por su tiempo.

Creo que no me he explicado bien, le comento.

El programa llamado 01_Maestro_22_03_2020_con_mando_Inalambrico, es el programa del Arduino que esta en la superficie, al lado del operador del vehículo, y ese programa solo tiene 2 librerías,

#include <PS2X_lib.h> // Libreia PS2 de Bill Porter
#include <EasyTransfer.h> // Libreria Easy Transfer de Bill Porter

La primera librería es la del mando de la PS2, y la segunda librería es la de la comunicación en serie, este programa controla el mando de la PS2, manda las ordenes del mando al otro Arduino, y recibe los datos de los sensores, no controla ningún sensor, ni tiene ningún sensor conectado, solo el mando de la PS2.

En el otro programa llamado 02_Esclavo_22_03_2020_con_mando_Inalambrico, que es el del Arduino llamado Esclavo, que es el que va dentro del vehículo, es donde están las librerías de los distintos sensores, porque en este Arduino, SI están conectados los sensores, y es el que los controla y manda los datos al otro Arduino llamado Maestro, y en este si que estan las librerias de los distintos sensores.

// se ponen todas las librerias juntas
#include <Wire.h>               // libreria i2c para el Giroscopio
#include <Servo.h>              // libreria para gestionar los servos y los ESC
#include <EasyTransfer.h>       // libreria Easy Transfer de Bill Porter
#include <Adafruit_Sensor.h>    // libreria para gestionar el sensor de temperatura DHT22
#include "DHT.h"                // libreria para el sensor DHT 22
#include <OneWire.h>            // libreria para el sensor de temperatura DS18B20
#include <DallasTemperature.h>  // Libreria para el sensor de temperatura DS18B20

Son dos Arduinos con dos programas distintos

Muchas gracias.

Tal vez yo no fui claro, en el programa del esclavo utilizas las propiedades de la librería Wire, y utilizas esta librería para comunicarte con el MPU, pero es mas sencillo, y con menos posibilidades de error, utilizar una librería especializada para manejos de MPU Como

Gracias por su tiempo.

Tiene razón, si hay una librería especifica para un sensor, siempre es mejor usar esa librería que no usar una librería genérica.

Ese trozo del código lo vi en una pagina que utilizaban el giroscopio GY MPU6050, para usarlo en un dron, y como era la manera mas corta y sencilla de usar ese giroscopio, en su momento pensé que seria mejor usarla, pero ya veo que no.

Usare la librería que usted me indica, en vez de la que puse en el código.

Muchas gracias

Estuve analizando tus programas y creo que el problema es que colapsa las comunicaciones. En el esclavo estas enviando la información que te interesa mediante los paquetes de "Easy Transfer", pero al mismo tiempo estas enviando un montón de serialprint que al maestro no le interesan y que supongo que están allí para depurar el programa cuando esta conectada al PC.
Como tienes dos megas la solución es fácil, conectalos entre si, con el segundo puerto serie que disponen los megas y saca los paquetes de "Easy Transfer" por el y conserva los serial print para depuración por USB. Ademas deberías temporizar los paquetes que salen del esclavo, el arduino tiene la capacidad de saturar el puerto serie.

Muchas gracias por su tiempo.

Si efectivamente hay dos tipos, o grupos de datos, en el programa del Arduino Esclavo, uno de ellos son los datos que quiero que se manden al otro Arduino, mediante el paquete de "Easy_Transfer", y el otro grupo, es el que quiero que se vean en el Monitor Serie del ordenador, para comprobar el funcionamiento y la lectura de los sensores y posteriormente esos datos, también se tienen que ver en una pantalla Nextion, conectada al Arduino Maestro.

Si he entendido a lo que se refiere, me esta indicando que tengo que separar los datos que quiero que se vean en el Monitor Serie del Arduino Esclavo, en el ordenador, de los datos que quiero que se envíen al Arduino Maestro.

Por lo que he podido leer en Internet, el Arduino mega tiene 5 pares de pines utilizados como puertos serie

El par 0, el que se utiliza para el puerto USB, y no esta a disposición del usuario como pines

El par 1, los pines 0, RX, y 1, TX

El par 2, los pines 18, TX1 y 19, RX1

el par 3, los pines 16, TX2 y 17 RX2

el par 4, los pines 14 ,TX3 y 15 RX3

Entonces seria dejar los SerialPrint, sin tocar como están, para que salgan por el puerto USB, y de alguna manera asignar los pines, por ejemplo 14 y 15, para la transmisión de Easy_Transfer, mas o menos modificando el código así

EasyTransfer ETin=14, ETout=15;

O de esta otra manera seria mejor?

EasyTransfer ETin, ETout;
const int ETin = 14;
const int ETout = 15;

Donde ETin = 14, seria el pin de entrada de datos, y ETout = 15, seria el pin de salida de datos

Y así de esta manera conseguiré separar los datos que se deben ver en el ordenador, de los datos que se deben mandar al otro Arduino, para no colapsar la Comunicación Serie.

O directamente pinchar los dos Arduinos a los puertos 14 y 15.

Le ruego que me confirme cual de las tres seria la opción mejor, o si no vale ninguna, me indicase como se debe hacer.

Lo que no se a que se refiere es a

PeterKantTropus:
Ademas deberías temporizar los paquetes que salen del esclavo, el arduino tiene la capacidad de saturar el puerto serie.

Puede ser algo parecido a lo que hago con la lectura de los sensores DHT22

  int intervaloMedidas = 1000;        // hace que solo se lean los valores 1 vez por segundo
  int auxMillis = 0;                  // Indica el valor del intervalo de tiempo

Para que no este continuamente mandando paquetes de datos, si no cada cierto tiempo.

Pero no tengo ni idea de como hacerlo, o de que tipo de ordenes se debe utilizar.

Muchas Gracias.