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

TEMA:

Un ROV de agua dulce, con mando de PS2 4 años 1 semana antes #1574

Bueno como tenia un poco de tiempo, he mirado las librerias y tu código:

Las librerias las tienes bien implantadas, con todos sus comandos.
Hay varios errores que te voy a ir contando, pero el error mas grande que tienes y creo que es por el cual no funciona, es el que te dije hace tiempo,
estas colapsando el puerto Serie.

Empecemos:

Código Master:

1.- Tienes en el Loop 15 sentencias if + todo el resto del programa, esto hará el código algo lento. Solución utiliza if anidados (esle if) (Busca en google y estudialo).
2.-Activas el Serial y Serial1, pero solo usas el Serial1 ( No lo entiendo).

Codigo Slave:

1.- Igual, activas los dos puertos y solo usas uno.

Creo que lo que has intentado hacer, pero te has liado, es usar dos puertos Serial del Mega, uno para mandar la estructura de los datos y otro para el puerto de depuración. Si es lo que querías hacer, es asín:

ETin.begin(details(rxdata), & Serial1);
ETout.begin(details(txdata), & Serial1);

Todos los demás lo mandarías por el Serial o sea todos los "Serial1.print" serian "Serial.print".
Después he visto que hay un DEBUG comentado, esto no es mala idea, dependiendo si es 0 o 1 te va imprimir o no.

Conclusión:
- Todos los Serial.print que tienes el el Slave no valen para nada, con lo cual, no es mala idea lo de los dos puertos Series, para que los datos los veas por el puerto de depuración, solo valen para eso, por que los datos de los sensores los estas mandando con su variables en la estructura que has creado.
- Todos los Serial.print del Master si te valdrán, dependiendo que uses después para ver los datos (LCD, Nextion, etc...)
- Cuanto mas sensores montes, mas colapso tendrás en el Serial. Estudia los if anidados, estudia millis y maquina de estado.
- Estudia mi código de la autocarabana, que tiene un montón de sensores y va muy bien, esta echo con maquina de estados.

Un Saludo
El siguiente usuario dijo gracias: asesorplaza1

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

Última Edición: por DEA.

Un ROV de agua dulce, con mando de PS2 4 años 1 semana antes #1575

Hombre DEA, cuanto te echaba de menos, gracias por tu tiempo

He estado ocupado con el dichoso código, y parece que se va arreglando, le he tenido que pedir ayuda a un buen amigo, Atilano Belinchon, que me ha aclarado bastantes fallos que tenía el programa, ahora no es que sea exquisito, pero por lo menos funciona, por lo que me ha dicho tengo que depurarlo bastante para que funcione bien, y con las explicaciones que me ha dado, he entendido perfectamente las modificaciones que hemos hecho del programa, así como las modificaciones que me quedan por hacer.

Le mande los códigos el Viernes, y hemos estado trabajando sobre ellos el Sábado y el Domingo, tanto por email, por teléfono, y por video conferencia, todo un despliegue de medios de aquella manera, un trabajo muy bien guiado por alguien que entiende de comunicaciones bastante más que yo.

Y ahora voy a contestar las publicaciones que habéis hecho en estos días.

Como bien dice DEA en la publicación # 1572, dada la cantidad de datos con los que ya estoy trabajando, necesito separar los datos que quiero ver en el Monitor Serie, del Arduino llamado “Esclavo” de los datos que quiero mandar al otro Arduino, por eso he habilitado el puerto “Serial1”, en los pines 18 y 19 de los dos Arduino Mega 2560, para que por este puerto se comuniquen los Arduinos entre sí, y dejar que los datos que quiero ver en el Monitor Serie del ordenador, vallan por el puerto “Serial”, USB, para comprobar que funciona el programa y ver los datos de los sensores del Arduino que tengo pinchado.

La repetición de lectura de las funciones, es una de las cosas que ya he arreglado, efectivamente, había unas ordenes que me repetían la lectura de los datos, que ya he corregido.

La velocidad del puerto, como sabéis se puede modificar, sin problemas, solo cambiando el valor que se pone en la línea de configuración, “ Serial.begin(57600) “, que ahora parece ser la indicada, pero como bien apunta DEA, puede ser excesiva para el buen funcionamiento del Arduino, al interactuar con la Nextion. Lo suyo es que ponga el valor de “Serial.begin(9600)”, para que todo funcione mejor.

En la publicación # 1573, me preguntas como tengo conectados los puertos serie, y ya publique anteriormente que los tengo cruzados, el TX de un Arduino con el RX del otro Arduino, y el RX de uno con el TX del otro.

En la publicación # 1574, me comentas que hay varios fallos, efectivamente, tenía muchos más, pero hay alguno que ya he arreglado.

Lo de las sentencias if todavía no está resuelto, pero será lo próximo que haga.

Activo los dos puertos y solo uso uno, eso ya lo he arreglado, era un problema de programación, me faltaban unas líneas que ya las he puesto.

ETin.begin(details(rxdata), & Serial1); // Comienza la recepción de datos a través de Serial, en los pines 18 y 19
ETout.begin(details(txdata), & Serial1); // Comienza el envío de datos a través de Serial, en los pines 18 y 19

Es una de las cosas que he arreglado con mi amigo Atilano Belinchon.

Todos los “Serial.print” que hay tanto en el “Maestro”, como en el “Esclavo”, de momento, son para comprobar que el programa funciona, en un futuro no muy lejano los comentare, para que no se ejecuten en el programa, y efectivamente, habrá algunos que los aprovechare para utilizarlos con la Nextion, pero de momento están para comprobar que el programa funciona.

Y a demás de todo eso, me faltaba crear la función de qué datos enviar de un Arduino a otro, con los “txdata.” y “rxdata.”, me faltaban más de la mitad, por eso no se enviaban los datos, y no los podía ver. Hasta ahora, generaba los datos con el trabajo de los sensores, los podía ver en el Monitor Serie, pero no tenia escrita la orden de mandar los datos al otro Arduino.

No tenían la culpa ni el giroscopio, ni el sensor de temperatura DS18B20, la tenía yo, porque me faltaban un montón de órdenes por escribir en el código.

Y por supuesto el dichoso giroscopio, resulta que depende de en qué tipo de Arduino lo quieras conectar, va de una manera u otra, en mi caso, para el Arduino Mega 2560, tiene que ir conectado de la siguiente manera para que funcione, con la dirección I2C 0x68, cero equis seis ocho.

VCC a + 5V
GND a GND -
SCL a SDA que hay encima del pin 13
SDA a SCL que hay encima del pin 13
AD0 a GND -

Y a demás configurar la dirección I2C, dentro del programa como 0x6B, si lo he puesto bien, cero equis seis Be, si no se pone así, no funciona

A demás con el código que le puesto al giroscopio también me da la temperatura, por lo tanto a partir de ahora, cuando este seguro de que todo funciona como es debido, posiblemente quitare algún sensor, porque si no, con la idea que tenía cuando empecé el proyecto, me voy a juntar con 3 sensores que me medirán la temperatura del interior del casco, temperatura del giroscopio, temperatura de DS18B20, y temperatura del DHT22, y con uno que me de la información me vale

Adjunto los códigos nuevos, ahora si envío y recibo datos, de un Arduino al otro.

Un saludo

PD. DEA, no te molestes (enfades), porque hayamos hecho el mismo trabajo los dos por distintos caminos, de hecho, me comentas cosas que no habíamos visto nosotros, muchas gracias
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 4 años 1 semana antes #1576

Solo me queda solucionar lo de la repetición de las sentencias "if", y resolver algunos problemas con el mando, para tener configurados todos los botones en los dos Arduinos, y así ya me podre dedicar a estudiar lo de la pantalla Nextion.

Un saludo a todos.

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

Un ROV de agua dulce, con mando de PS2 4 años 1 semana antes #1579

asesorplaza1 escribió: Y por supuesto el dichoso giroscopio, resulta que depende de en qué tipo de Arduino lo quieras conectar, va de una manera u otra, en mi caso, para el Arduino Mega 2560, tiene que ir conectado de la siguiente manera para que funcione, con la dirección I2C 0x68, cero equis seis ocho.

VCC a + 5V
GND a GND -
SCL a SDA que hay encima del pin 13
SDA a SCL que hay encima del pin 13
AD0 a GND -

Y a demás configurar la dirección I2C, dentro del programa como 0x6B, si lo he puesto bien, cero equis seis Be, si no se pone así, no funciona


No te preocupes yo no me enfado, de echo me alegro que lo estés solucionando.

Respecto al Inclinometro no se que me quieres decir con lo de la direccion 0x68 y la 0x6B, eso ya estaba implantado en el código que te pase,y también el registro en 0x3B, pero es lo mismo, solo que tu estas usando librerías, que yo ya las probé, ice un montón de pruebas con ellas y no terminaban de ir bien.Por eso decidí no usarlas, pero si a ti te funcionan perfecto.
Si miras el datesheet de sensor, veras que la dirección 0x68 se usa para hacer un reset del sensor y la 0x3B para iniciar la comunicación y ambas estan en mi codigo.

Tienes que estudiar un poco los códigos que vas cogiendo por internet, asi iras aprendiendo mucho. Te pongo el codigo del giroscopio que te envie y en rojo lo que dices de las direcciones:
#include <Wire.h>

double AcX,AcY,AcZ;
int Pitch, Roll;

#define MPU 0x68

void setup(){
Serial.begin(9600);
init_MPU(); // Inicializamos el MPU6050
}

void loop()
{
FunctionsMPU(); // Adquirimos los ejex AcX, AcY, AcZ.

Roll = FunctionsPitchRoll(AcX, AcZ, AcY); //Calculo del angulo del Roll
Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calculo del angulo del Pitch

Serial.print("Pitch: "); Serial.print(Pitch);
Serial.print("\t");
Serial.print("Roll: "); Serial.print(Roll);
Serial.print("\n");

}

void init_MPU(){
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // Seteamos a cero (wakes up - Despertamos el MPU-6050)
Wire.endTransmission(true);
delay(1000);
}

//Funcion para el calculo del angulo Pitch y Roll
double FunctionsPitchRoll(double A, double B, double C){
double DatoA, DatoB, Value;
DatoA = A;
DatoB = (B*B) + (C*C);
DatoB = sqrt(DatoB);

Value = atan2(DatoA, DatoB);
Value = Value * 180/3.14;

return (int)Value;
}

//Función para adquirir los ejes X, Y, Z del MPU6050
void FunctionsMPU(){
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Empezamos con el registro 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); // requerimos un total de 6 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}

asesorplaza1 escribió: La velocidad del puerto, como sabéis se puede modificar, sin problemas, solo cambiando el valor que se pone en la línea de configuración, “ Serial.begin(57600) “, que ahora parece ser la indicada, pero como bien apunta DEA, puede ser excesiva para el buen funcionamiento del Arduino, al interactuar con la Nextion. Lo suyo es que ponga el valor de “Serial.begin(9600)”, para que todo funcione mejor.


Respecto a esto del puerto serie, tu puede poner la Nextion a 57600 sin problemas. Ya cuando te pongas con ellas lo veras.
Bueno me alegro de que te valla funcionando.
El siguiente usuario dijo gracias: asesorplaza1

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

Última Edición: por DEA.

Un ROV de agua dulce, con mando de PS2 4 años 1 semana antes #1580

Gracias DEA por las aclaraciones.

Todavía me falta mucho para dejar el código de Arduino bien y que pueda trabajar con la suficiente soltura, como para interactuar con la Nextion, ágilmente y sin problemas.
Estudiare lo que comentas sobre los "if anidados", y me informare sobre lo de "la máquina de estados", para conseguir un programa mas ágil y ligero para el Arduino, y así dejar libres todos los recursos del Arduino que pueda, para que se relacione mejor con la Nextion.
Como puedes observar ya voy por la versión 21 del código, y aun le falta mucho, pero empujones como el de este fin de semana son los que me animan a seguir con el proyecto.

Un saludo.

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

Un ROV de agua dulce, con mando de PS2 4 años 1 semana antes #1593

Otro pequeño progreso.

El dichoso sensor de infrarrojos, no mandaba la información del cambio de estado al Arduino "Maestro", y he estado a puntito de tirarlo por la ventana, ya que el resto de los sensores si funcionan.
y como siempre era un problema de programación, si os fijáis en el ultimo código que he subido como "Maestro", en el bloque de la recepción de los datos del E18D80NK, la linea 419 pone

if ( digitalRead(rxdata.pinSensorE18D80NK))

y así no funciona, ¿por qué?, porque esta mal escrita, la traducción literalmente de la línea sería mas o menos así

" si se cumple la condición ( lectura digital ( recepción de dato . pinsensor E18D80NK ) ) "

y en este caso no hay lectura digital que valga, es un dato recibido, no leído directamente del sensor, por lo tanto la linea esta mal escrita, la forma correcta sería

if (rxdata.E18D80NK == 0) // Si la entrada del E18D80NK es baja, no hay ningún objeto

al corregirla, el sensor manda perfectamente el dato de cambio de estado de la señal, ahora a demás de compilar FUNCIONA.

poquito a poco voy desatascando el código, ya voy por la versión 22 del código, va a tener mas capítulos que la Biblia

Un saludo.
Adjuntos:

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

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