Go Down

Topic: Enviar datos de un arduino a otro (Read 2506 times) previous topic - next topic

Alex asturias

Hola buenas, me gustaria ver en un lcd ciertos valores de sensores que tiene 1 arduino que por tema de falta de pines no puedo conectar el lcd tb a esta placa asiq he decidido yusar uina segunda para el lcd y para futuras implementaciones que le ponga, pero el caso es que ahora con el codigo actual me envia los datos correctamente al puerto serie y desde el ordenador veo todo lo que necesito pero, como hago para que en vez de enviarlo por el purto de serie lo envie al otro arduino a traves de los pines tx y rx ? (no me kedan mas que esos pines libres) he visto por hay ejemplos de la conexion pero y ejemplos de como enviar datos que recibe la primera placa?

gracias.

Sergegsx

no tienes ni 1 pin libre? podrias usar newsoftwareserial y enviar por puerto de serie de un arduino a otro, si estan cerca.
si no te sobra ningun pin igual puedes pasar la funcion de 1 pin al segundo arduino y asi ya tendras uno libre.


josemanu

El Arduino emisor de datos lo desconectas del ordenador y lo conectas mediante los pines Rx y TX al Arduino con el LCD.

Recuerda cruzarlos y conectar también las masas.

Si ambas placas tienen libres los pines A5 y A4 también las puedes comunicar por I2C y puedes mantener la conexión al ordenador.
http://www.ardumania.es/

Iniciación

Alex asturias

respecto a las conexiones si se como es, de todas maneras no voi a tocar por usb ni ninguna otra manera esas placas programare los chips en casa con el arduino original y pal coche hare otro paperduino y asi en el coche dejo los 2 paperduinos y el original pa casa pero la cuestion a la que iba mi pregunta es como enviar la informacion ya que no tengo ni idea xq la informacion que pone la persona que ha creado la libreria easy transfer ta en ingles y no me entero de nada...

aver is alguien puede ponerme un ejemplo de como usarla  peor en espñaol por favor.

josemanu

http://www.ardumania.es/

Iniciación

Alex asturias

Gracias no recordaba que estuviese en la wiki, pues le dedicare mañana unas horas a entender como funcioan para saber como envio los datos que me interesen.

muchas gracias.

Alex asturias

he leido el serial y çme ha aclarado alguna cosa pero no pone realmente ningun ejemplo que  sirva para entender la comunicacion entre 2 arduinos.

serial.print(val) (enviaria desde la placa que tiene el valor que me interesa a la otra si pero como demonios le digo a la otra placa que lea ese valor y lo reenvie a la pantalla lcd?)

aver si podeis ponerme algun ejemplo de alguien que haya usado esta conexion para enviar y recibir datos por que sin un ejemplo no consigo entender como procesar esa informacion desde la segunda placa....

gracias

Sergegsx

Tienes q usar serial available y serial read, tienes ejemplos en ese link.

Alex asturias

seria asi?

PLACA 1: serial.print(val)

PLACA 2: serial.read(val)

no entiendo lo del avaliable ni lo del incoming byte, es decir nose si los necesito o bien si es obligado usarlos

chato_sat

La funcion Serial.available() devuelve el número de caracteres que hay en el puerto serie. Normalmente se hace lo siguiente:

if (Serial.available() > 0) { // Si hay datos en el puerto serie
  byte leido = Serial.read(); // Leemos un byte y lo almacenamos en leido.
}

La función read no tiene parámetros y devuelve un byte que es el byte leído. Con lo cuál si quieres leer más de un byte lo deberías hacer de la siguiente forma:

byte leido;
while (Serial.available() > 0) {
  leido = Serial.read();
  //Tratamos el byte leido, ya que al volver hacer la lectura este se nos machacará
}

Héchale un vistazo a http://arduino.cc/en/Serial/Read en el ejemplo que hay se ve muy claro el uso de estas funciones.

Saludos chato_sat.

Alex asturias

en concreto sera un 1 o un 0 lo que quiero enviar desde la placa 1 para indicar si esta un interruptor pulsado o no entonces con un byte me llega no?

seria asi entonces?:
PLACA 1: serial.print(val);
              serial.print(val2);
              serial.print(val3); y asi sucesivamente no?



PLACA 2: if (Serial.available() > 0) { // Si hay datos en el puerto serie
  byte leido = Serial.read(); // Leemos un byte y lo almacenamos en leido.
Y AKI ENVIARIA AL LCD EL VALOR DE LEIDO NO?
}

Alex asturias

onque me surge la duda de si tengo que almacenar en la placa que recibe los datos cada valor por separado para que los interprete cada uno en una linea o posicion en el lcd o si bien los va mostrando de uno en uno o como es el tema.

no es que no lea la wiki el leido la seccion serial entera varias veces pero realmente no resulta nada claro (al menos para mi) y por desgracia aun no dispongo de mas de 1 atmega para ir probando.

la parte de enviar creo que resulta bastante sencilla serial.print y lkuego entre parentesis cada valor que quiera enviar, pero el tema es a la hora de recibirlos en la otra placa si debo almacenar cada uno en una variable diferente y de ser asi como voi a diferenciarlos cuando llegen...

de verdad no hay ningun post en el que alguien haya usado 2 arduinos con esta  conexion para ver un ejemplo completo de como se envia y como se recibe que pueda echar un vistazo aver si doi entendido el tema de la recepcion de mensajes diferentes?

gracias y perdonar por mi poca agudeza... yo leo y leo pero no hay manera de que me aclare como tengo que recibir los datos aparte de que tengo que usar un serial.read

chato_sat


la parte de enviar creo que resulta bastante sencilla serial.print y lkuego entre parentesis cada valor que quiera enviar, pero el tema es a la hora de recibirlos en la otra placa si debo almacenar cada uno en una variable diferente y de ser asi como voi a diferenciarlos cuando llegen...


Sí, tienes que almacenarlos y luego darle el trato que quieras a esos valores, como por ejemplo ir displayándolos cada cierto tiempo.

Lo que debes hacer si vas a enviar varios valores es crear un protocolo de comunicación entre los 2 arduinos que se adapte a tus necesidades.

Un ejemplo de comunicación entre los dos arduinos puede ser:

-- placa2 -> placa1: Quiero la lectura del sensor x
-- placa1 -> placa2: La lectura es y

de este modo la placa2 inicia la comunicación haciendo una petición del valor del sensor x a la placa1, la cuál responderá con el valor de x.

Otro ejemplo de comunicación podría ser el siguiente:

-- placa1 -> placa2: El sensor x vale y

de este modo la placa2 puede recibir un comando en cualquier momento, con lo cuál tenemos siempre que estar leyendo del puerto serie por si nos llegan nuevos datos.

Ahora te voy a dar una posible implementación del segundo ejemplo:

Para la placa1:
Code: [Select]
int interruptor1 = 3; // Interruptor 1
int interruptor2 = 4; // Interruptor 2

void setup() {
pinMode(interruptor1, INPUT);
pinMode(interruptor2, INPUT);
Serial.begin(9600);
}

/* Función para leer el estado de un interruptor, devuelve 1
* si está activado y 0 si está desactivado */
byte leerEstadoInterruptor(int numInterruptor) {
  int aux;
  switch (numInterruptor) {
    case 1:
      aux = digitalRead(interruptor1);
      break;
    case 2:
      aux = digitalRead(interruptor2);
      break;
    default:;
  }
  if (aux == HIGH) {
    return 1;
  }
  return 0;
}

/* Función para enviar la lectura del sensor. Se envía primero
* un byte para indicar de que sensor se trata y después el
* valor del mismo */
void enviarLectura(int numSensor) {
  Serial.print(numSensor, BYTE); //Se envía en formato BYTE para que no haga
                                //la conversión a ASCII.
  Serial.print(leerEstadoInterruptor(numSensor)); //Enviamos el valor
                                                  //del sensor
}

void loop() {
 
  enviarLectura(1);
  enviarLectura(2);
  delay(1000);
 
}


Para la placa2:
Code: [Select]
int estadoInterruptor1;
int estadoInterruptor2;
int interruptorRecibido;

void setup() {
  Serial.begin(9600);
}

void recibirLectura() {
  if (Serial.available() > 0) {
    interruptorRecibido = Serial.read();
    switch (interruptorRecibido) {
      case 1:
        estadoInterruptor1 = Serial.read();
        break;
      case 2:
        estadoInterruptor2 = Serial.read();
        break;
      default:;
    }
  }
}

void loop() {
  recibirLectura();
}


Este ejemplo lo que hace es enviar cada 1 segundo el estado de 2 interruptores colocados en los pines 3 y 4. Para diferenciar de que interruptor se trata lo que hace es primero enviar un byte que indica el interruptor del que se trata y después envía otro byte con el estado del mismo.

Espero que te sirva de ayuda.

Saludos chato_sat

Alex asturias

Jolinmuchas gracias chato es lo que necesitaba con un ejemplo sencillo puedo entenderlo y luego ya adaptarlo a las necesidades personales pero sin un esquemilla como comienzo se me hace imposible por mucho que he leido la wiki con el tema de la libreria serial y sus distintas funciones, un saludo y muchas gracias por todo

Go Up