Unidad 3, Práctica 5: Práctica Final, Comunicación de 1 Arduino maestro con 3 esclavos - gerardonavart/Sistemas-Programables GitHub Wiki
Práctica Final - Comunicación de un Arduino Maestro con 3 Esclavos
Sistemas Programables | Ingeniería en Sistemas Computacionales | Instituto Tecnológico Superior de Huichapan
Descripción
En esta práctica, aplicamos los conocimientos adquiridos durante la primera práctica de esta unidad, para poder comunicar un Arduino MEGA, que funcionaría como Maestro, con tres Arduino UNO, que funcionarían como Esclavos, utilizando la comunicación serial, aprovechando los 3 pares de puertos seriales en el Arduino MEGA.
La práctica funciona de la siguiente manera:
- El usuario pulsa un boton en la protoboard.
- Este envía una señal al Arduino MEGA, el cual, por su puerto serial, envía una señal de encendido a un Arduino UNO, previamente identificado por su numero de esclavo, para que encienda un Led en el pin 13 del mismo Arduino.
- Este Arduino UNO envía una señal de regreso de que el Led ha sido encendido al Arduino MEGA, y éste ultimo muestra el resultado en la consola del IDE de Arduino.
- Este proceso se replica en los otros esclavos conectados.
Objetivo
Probar el funcionamiento de la comunicación serial entre Arduinos.
Materiales
- Una placa protoboard
- Tres placas Arduino UNO
- Una placa Arduino MEGA
- Tres resistencias de 330 ohms.
- Tres pushbutton
- Tres Leds ultrabrillantes
- Cables de conexión rápida
- Cables para protoboard
Procedimiento
Diagrama de conexión
Código de Programación Maestro en Arduino MEGA
int id; // Variable del identificador del Esclavo
int p1 = 10;
int p2 = 9;
int p3 = 8;
int inicio1 = 0;
int inicio2 = 0;
int inicio3 = 0;
int controlA = 0;
int controlB = 0;
int controlC = 0;
int estadoA1 = 0;
int estadoB1 = 0;
int estadoA2 = 0;
int estadoB2 = 0;
int estadoA3 = 0;
int estadoB3 = 0;
void setup() {
Serial.begin(9600); // Configuracion del puerto serial de comunicacion con la PC
Serial1.begin(9600); // Configuracion del puerto serial de comunicacion con el ESCLAVO 1
Serial2.begin(9600); // Configuracion del puerto serial de comunicacion con el ESCLAVO 2
Serial3.begin(9600); // Configuracion del puerto serial de comunicacion con el ESCLAVO 3
// Mensaje inicial en el monitor serial
Serial.println("\tInstituto Tecnológico Superior de Huichapan | Ingeniería en Sistemas Computacionales");
Serial.println("\t\t\t\t7° Semestre | Sistemas Programables \n\n\t\t\tPráctica: Envío de datos seriales a través de Arduino\n");
Serial.println("Identificador de Arduinos:");
Serial.println(" - Zeus (Arduino Maestro) \n - Ares (Arduino 1) \n - Apolo (Arduino 2) \n - Atenea(Arduino 3)\n");
pinMode(p1,INPUT);
pinMode(p2,INPUT);
pinMode(p3,INPUT);
}
void loop() {
identificacion_esclavo();
mensaje_esclavo();
}
void identificacion_esclavo(){ // RUTINA DE IDENTIFICACION DE ESCLAVOS 1, 2 y 3
`estadoA1 = digitalRead(p1);`
`if(estadoA1 && estadoB1 == 0)`
`{`
`inicio1 = 1 - inicio1;`
`delay(100);`
`}`
`estadoB1 = estadoA1;`
`if(inicio1 == 0 && controlA == 1)`
`{`
`Serial1.write('a');`
`//Serial.println("Led Encendido en Ares (A1)\n");`
`controlA = 0;`
`}`
`else if(inicio1 == 1 && controlA == 0)`
`{`
`Serial1.write('A');`
`//Serial.println("Led Apagado en Ares (A1)\n");`
`controlA = 1;`
`}`
`estadoA2 = digitalRead(p2);`
`if(estadoA2 && estadoB2 == 0)`
`{`
`inicio2 = 1 - inicio2;`
`delay(100); `
`}`
`estadoB2 = estadoA2;`
`if(inicio2 == 0 && controlB == 1)`
`{`
`Serial2.write('b');`
`Serial.println("Led Encendido en Apolo (A2)\n");`
`controlB = 0;`
`}`
`else if(inicio2 == 1 && controlB == 0)`
`{`
`Serial2.write('B');`
`Serial.println("Led Apagado en Apolo (A2)\n");`
`controlB = 1;`
`}`
`estadoA3 = digitalRead(p3);`
`if(estadoA3 && estadoB3 == 0)`
`{`
`inicio3 = 1 - inicio3;`
`delay(100); `
`}`
`estadoB3 = estadoA3;`
`if(inicio3 == 0 && controlC == 1)`
`{`
`Serial3.write('c');`
`Serial.println("Led Encendido en Atenea (A3)\n");`
`controlC = 0;`
`}`
`else if(inicio3 == 1 && controlC == 0)`
`{`
`Serial3.write('C');`
`Serial.println("Led Apagado en Atenea (A3)\n");`
`controlC = 1;`
`}`
}
void mensaje_esclavo(){ // RUTINA DE ACREDITACION DE IDENTIFICACION
`// RUTINA DE ACREDITACION DEL ESCLAVO 1`
while (Serial1.peek() == 'A'){ // Discriminacion de la letra como diferenciador del esclavo
Serial1.read();
id = Serial1.parseInt(); // Extraccion de los numeros de las letras
Serial.print("Esclavo id: "); // Mensaje de acreditacion del esclavo
Serial.println(id); // Numero de identificacion del esclavo
break;
}
`// RUTINA DE ACREDITACION DEL ESCLAVO 2`
while (Serial2.peek() == 'B'){ // Discriminacion de la letra como diferenciador del esclavo
Serial2.read();
id = Serial2.parseInt(); // Extraccion de los numeros de las letras
Serial.print("Esclavo id: "); // Mensaje de acreditacion del esclavo
Serial.println(id); // Numero de identificacion del esclavo
break;
}
`// RUTINA DE ACREDITACION DEL ESCLAVO 3`
`while (Serial3.peek() == 'C'){ // Discriminacion de la letra como diferenciador del esclavo `
`Serial3.read(); `
`id = Serial3.parseInt(); // Extraccion de los numeros de las letras `
`Serial.print("Esclavo id: "); // Mensaje de acreditacion del esclavo`
`Serial.println(id); // Numero de identificacion del esclavo`
`break;`
}
}
Código de Programación Esclavo Arduino UNO
- El Código es similar en los tres esclavos, sólo cambia el identificador de cada uno.
const int led = 13;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600); // Configuracion del puerto serial de comunicacion con el ESCLAVO
}
void loop() {
if (Serial.available()) { // Verificacion que el puerto serial recibe datos
delay(10);
identificacion(); // Rutina de identificacion de esclavos 1 y 2
`while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial`
}
}
void identificacion(){
// RUTINA DE IDENTIFICACION FISICA Y AUTENTIFICACION
while (Serial.peek() == 'a'){ // Discriminacion de la letra de identificacion
// Cambiar 'a' por 'b' para el segundo esclavo
`digitalWrite(led, HIGH); // Encendido del LED del PIN 13`
`Serial.write('a'); // Envio de la letra de incio de trama de autentificacion`
`Serial.print('a'); // Envio del numero de autentificacion del esclavo al Maestro`
`// Cambiar Serial.print(1) por Serial.print(2) para el segundo esclavo `
`break;`
}
`// RUTINA DE IDENTIFICACION FISICA Y AUTENTIFICACION`
while (Serial.peek() == 'A'){ // Discriminacion de la letra de identificacion
// Cambiar 'a' por 'b' para el segundo esclavo
`digitalWrite(led, LOW); // Encendido del LED del PIN 13`
`Serial.write('A'); // Envio de la letra de incio de trama de autentificacion`
`Serial.print('A'); // Envio del numero de autentificacion del esclavo al Maestro`
`// Cambiar Serial.print(1) por Serial.print(2) para el segundo esclavo `
`break;`
}
}
Video en Youtube
Conexión de 4 Arduinos (Un maestro y tres esclavos) - Comunicación Serial