Comunicación entre dos arduinos.

Buen dia,
Tengo un proyecto para la facultad en el que tengo que programar en 2 placas arduino el juego simón vs, que deben contener 4 leds y 4 pulsadores cada placa. Además, entre ellas deben comunicarse para que ejecuten la misma secuencia, para ver cual ejecutó la secuencia con mi rapidez, para terminar la secuencia si uno de los dos no la sigue correctamente y para ver cual adquirió más puntos. La consulta es como hacer para que se comuniquen por puerto serie cumpliendo esas cuatro funciones y como hacer que las placas estén leyendo la información que le manda la otra placa en todo momento?
Agradezco desde ya al que me responda la pregunta!!

Hola, exactamente no se como hacerlo a nivel de programacion...pero si investigas sobre los puerto RX Y TX del Arduino seguro que lo solucionas, aparte tu programa no es muy complicado por lo que explicaste.

Hola, yo el programa para jugar al simón ya lo termine y como pasar los datos se como hacerlo, lo único que me falta es como hacer para que las placas esten leyendo los datos que envía la otra en todos momento, ya que si uno de los dos sigue mal la secuencia se tiene que terminar el juego para los 2. Mi código lo que hace es que la otra placa(la que no hizo mal la secuencia) sigue jugando hasta que termina la secuencia y recién ahí lee el dato que le envía la otra placa, esto ya lo busque en muchas partes y no lo logro encontrar.
Igual gracias por el aporte.

La tarea parece del mismo profesor ya que hace dias respondí lo mismo.

La comunicación serie es fácil.
RX de Arduino 1 con TX del Arduino 2
TX del Arduino 1 con RX del Arduino 2

Envias datos por Serial.print(dato) recibes con dato = Serial.read();

Ademas debes ver los ejemplos de comunicaciones del IDE.

Leer un pulsador hay muchos ejemplos y tutoriales. Mira los tutos del foro

Creo que la duda de matiasgf pasa mas por el tipo de red de intercambio de datos.

Sin duda la forma mas simple es utilizar una red cliente-servidor. Ahora bien, la forma mas fácil de plantearlo es que el arduino cliente contenga toda la programación del juego (para los dos jugadores) y el servidor solo aporte el estado de los pulsadores y prenda los leds según requerimiento del cliente.

Hola.
Entiendo que tu problema es el típico "cómo realizar varias tareas a la vez". Lo más probable es que tengas que replantear un poco tu estrategia general del juego, para que en todo momento se esté chequeando el puerto serie, a la par que se controla el juego.
Avanzaríamos más rápido si pusieras tu código para decirte cómo implementarlo. Recientemente un miembro de este foro hizo un código para recepción directa serial mediante interrupción. Ahora no tengo tiempo de buscarlo, pero ha sido no hace demasiado tiempo. No obstante, lo más rápido sería partir del código que ya tienes.
Saludos.

Yo nuevamente veo un planteamiento digamos LIVIANO del problema porque creo que somos 4 los que hemos opinado y todos aunque estemos mas o menos de acuerdo tenemos diferentes lecturas del problema.
Entonces sería bueno que el interesado intente detallarlo bien.
Si no sabe hacerlo que lo haga como le salga.
Supongamos que su primer post fue un borrador, entonces el segundo tendrá mejor color y asi se va filtrando lo que se busca.

Qué sabemos?

  1. Tenemos dos Arduinos con 4 teclas cada uno y 4 leds que juegan a Simon Dice.
  2. Deben en todo momento informar al otro de lo que está haciendo porque se trata de una competencia entre ambos.
  3. Hay que medir en cada arduino (en microsegundos diría) el tiempo que le llevó resolver la secuencia. Ese tiempo informarlo via serie ya que este proceso es mas lento se debe de algun modo resolverlo antes, no despues ni que un arduino resuelva el del otro. Si en cambio cuando A1 (arduino 1) compara el tiempo con A2 determinará que hacer. Supongamos que TA1 (tiempo A1) es mayor a TA2 entonces gana la prueba y le debe enviar un comando a A2 diciendo, completa la secuencia.
    Este proceso tambien determina quien lleva los puntos y los contadores de A1 y A2 se actualizarán.

Por cierto, no busques algo asi, porque esta es tarea de un profesor que intenta que desarrolles tu visión de la programación pero para eso debes aportar ideas y ponerlas en práctica.

No pienses en como programarlo, primero debes visualizar como lo harías tu jugando con un amigo con el que se pasan los datos. Y una vez entendido, lo plasmas en código.

const int botonRojo = A0;
const int botonAmarillo = A1;
const int botonVerde = A2;
const int botonAzul = A3;
int tiempo;
int pasos;
int nivel = 0;
bool listaRecibida = false;
bool perdiste = false;
int finBotones;
int inicioBotones;
int lista[99];
int botonPresionado;

void setup() {
pinMode(botonRojo, INPUT);
pinMode(botonAmarillo, INPUT);
pinMode(botonVerde, INPUT);
pinMode(botonAzul, INPUT);
pinMode(6, INPUT);
Serial1.begin(9600);
}

void loop() {
if (Serial1.available() > 0){
for (int i= 1; i <= 100; i++){
lista = Serial1.parseInt();

  • } *
  • if(Serial1.read() == 'E'){*
  • if (Serial1.available() > 0){*
  • nivel = Serial1.parseInt();*
  • }*
  • pasos = 1;*
  • inicioBotones = millis();*
  • while (pasos <= nivel){*
  • digitalRead(botonRojo);*
  • digitalRead(botonVerde);*
  • digitalRead(botonAmarillo);*
  • digitalRead(botonAzul);*
  • if (digitalRead(botonRojo) || digitalRead(botonVerde) || digitalRead(botonAmarillo) || digitalRead(botonAzul)){*
  • if (digitalRead(botonRojo)){*
  • botonPresionado = botonRojo;*
  • } else{*
  • if (digitalRead(botonVerde)){*
  • botonPresionado = botonVerde;*
  • } else{ *
  • if (digitalRead(botonAmarillo)){*
  • botonPresionado = botonAmarillo;*
  • } else{ *
  • if (digitalRead(botonAzul)){*
  • botonPresionado = botonAzul;*
  • }*
  • }*
  • }*
  • } *
  • if (lista[pasos] != botonPresionado){*
  • perdiste = true;*
  • nivel = 0;*
  • Serial1.write('P');*
  • } else{*
  • pasos++;*
  • }*
  • }*
  • if (Serial1.read() == 'P'){*
  • nivel = 0;*
  • }*
  • }*
  • finBotones = millis();*
  • if (!perdiste){*
  • tiempo = finBotones - inicioBotones;*
  • Serial1.write(tiempo);*
  • } *
  • } *
  • }*
    }

int puntosJugador1 = 0;
int puntosJugador2 = 0;
int nivel = 0;
int inicioJugador1;
int inicioJugador2;
bool encendido = false;
const int ledRojo = 13;
const int ledVerde = 12;
const int ledAmarillo = 11;
const int ledAzul = 10;
const int botonRojo = A0;
const int botonAmarillo = A1;
const int botonVerde = A2;
const int botonAzul = A3;
bool listaCreada = false;
int teclaEncendido;
int pasos = 1;
int botonPresionado;
bool perdiste = false;
bool perdioJ2 = false;
int inicioBotones;
int finBotones;
int lista[99];
int inicioSecuencia;
int tiempoJ1;
int tiempoJ2;

void setup() {
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledAzul, OUTPUT);
pinMode(5, OUTPUT);
pinMode(botonRojo, INPUT);
pinMode(botonVerde, INPUT);
pinMode(botonAmarillo, INPUT);
pinMode(botonAzul, INPUT);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
Serial1.begin(9600);
}

void loop() {
if (nivel == 0){
/while (!encendido){
if(digitalRead(botonRojo)==true){
encendido = true;
}
}
/
if (listaCreada == false){
for (int i = 1; i <= 100; i++) {
lista = random(10, 14);

  • }*
  • for (int i=1; i <= 100; i++){*
    _ Serial1.print(lista*);_
    _
    } _
    _
    listaCreada = true;_
    _
    }_
    _
    }*_

* if(listaCreada){*
* nivel++; *
* while (pasos <= nivel){*
* inicioSecuencia = millis();*
* if (millis()-inicioSecuencia >= 500){*
* digitalWrite(lista[pasos], HIGH);*
* pasos++;*
* }*
* }*

* }*
* pasos = 1;*
* Serial1.write('E');*
* Serial1.write(nivel);*
* inicioBotones = millis();*
* while (pasos <= nivel){*
* digitalRead(botonRojo);*
* digitalRead(botonVerde);*
* digitalRead(botonAmarillo);*
* digitalRead(botonAzul);*
* if (digitalRead(botonRojo) || digitalRead(botonVerde) || digitalRead(botonAmarillo) || digitalRead(botonAzul)){*
* if (digitalRead(botonRojo)){*
* botonPresionado = botonRojo;*
* } else{*
* if (digitalRead(botonVerde)){*
* botonPresionado = botonVerde;*
* } else{ *
* if (digitalRead(botonAmarillo)){*
* botonPresionado = botonAmarillo;*
* } else{ *
* if (digitalRead(botonAmarillo)){*
* botonPresionado = botonAmarillo;*
* }*
* }*
* }*
* } *
* if (lista[pasos] != botonPresionado){*
* perdiste = true;*
* nivel = 0;*
* Serial1.write('P'); *
* } else{*
* pasos++;*
* }*
* } *
* if (Serial1.read() == 'P'){*
* nivel = 0;*
* perdioJ2;*
* } *
* }*
* finBotones = millis();*
* if (!perdiste && !perdioJ2){*
* tiempoJ1 = finBotones - inicioBotones;*
* tiempoJ2 = Serial1.parseInt();*
* if (tiempoJ1 > tiempoJ2){*
* puntosJugador1++;*
* } else{*
* if (tiempoJ2 > tiempoJ1){*
* puntosJugador2++;*
* }*
* }*
* } else{*
* if (perdiste){*
* puntosJugador2 = puntosJugador2 + 5;*
* } else{*
* puntosJugador1 = puntosJugador1 + 5;*
* }*
* }*
* if (puntosJugador1 > puntosJugador2){*
* //Gano jugador 1*
* } else{*
* if (puntosJugador2 > puntosJugador1){*
* //Gano jugador 2*
* } else{*
* //Empate*
* }*
* } *
}

Esos son los codigos de las placas, el primero es del servidor y el segundo es del cliente, pero no me esta funcionando. Alguien podria fijarse y decirme porque es que no funciona??
Gracias

matiasgf:
Esos son los codigos de las placas, el primero es del servidor y el segundo es del cliente, pero no me esta funcionando. Alguien podria fijarse y decirme porque es que no funciona??
Gracias

Porfavor usa los tags adecuados para insertar codigo ,si no sabes como,lee las normas del foro.que es lo que no funciona?compila bien?compila pero no hace lo que quieres? Etc,etc
¿que placas estas usando?
Edito:

   if (listaCreada == false){
      for (int i = 1; i <= 100; i++) {
        lista = random(10, 14);
      }

Aqui te faltaria el elemento del array que supongo es i:

   if (listaCreada == false){
      for (int i = 1; i <= 100; i++) {
        lista[i] = random(10, 14);
      }

Y aqui igual:

void loop() {
  if (Serial1.available() > 0){
    for (int i= 1; i <= 100; i++){
      lista = Serial1.parseInt();
    }

Por :

void loop() {
  if (Serial1.available() > 0){
    for (int i= 1; i <= 100; i++){
      lista [i]= Serial1.parseInt();
    }

Y veo que algun sitio mas tambien lo haces,en resumen ,lista es un array y necesita el elemento del array al que te refieres: nombreVariable[indice]

sabes algo de programacion estructurada?

digitalRead(botonRojo);
    digitalRead(botonVerde);
    digitalRead(botonAmarillo);
    digitalRead(botonAzul);
    if (digitalRead(botonRojo) || digitalRead(botonVerde) || digitalRead(botonAmarillo) || digitalRead(botonAzul)){
      if (digitalRead(botonRojo)){
        botonPresionado = botonRojo;
      } else{
        if (digitalRead(botonVerde)){
          botonPresionado = botonVerde;
        } else{ 
          if (digitalRead(botonAmarillo)){
            botonPresionado = botonAmarillo;
          } else{ 
            if (digitalRead(botonAmarillo)){
              botonPresionado = botonAmarillo;
            }

esto duele de verlo nada mas

reemplaza eso por esto para que tu codigo sea mas entendible para ti primero

byte BotonPresionado()
{
   if (digitalRead(botonRojo))
     return 1;
   if (digitalRead(botonVerde))
     return 2;
   if (digitalRead(botonAmarillo))
     return 3;
   if (digitalRead(botonAzul))
     return 4;
} //se debe mejorar para evirar rebores agregando un pequeño delay(5)


switch case(BotonPresionado())
{
    case 1: 
           hago algo o llamo a otro procedimeinto
           break;
    case 2: 
           hago algo o llamo a otro procedimeinto
           break;
    case 3: 
           hago algo o llamo a otro procedimeinto
           break;
    case 4: 
           hago algo o llamo a otro procedimeinto
           break;
}

ordena, comprime y despues revisa