Una forma de poder controlar varios controladores a la vez, es a través de la comunicación Maestro/Esclavo, el cual es un modelo de descripción de red. Uno de varios controladores actúa como Maestro, el cual cumple con las siguientes características:
# Establece el temporizado de la comunicación.
# Toma el control de la comunicación en su totalidad.
# Inicializa la comunicación.
Por su parte, el Esclavo presenta las siguientes características:
# No puede inicializar la comunicación.
# No puede comunicarse con otros Esclavos.
En una comunicación de Punto-a-Punto, todos los aparatos deben comportarse de manera igualitaria. Cualquier punto de la red tiene la atribución de inicializar la comunicación cuando un evento ocurre. De esta manera, el intercambio de datos dependerá de las conexiones de la misma red.
Las ventaja más resaltante de las redes de comunicación Punto-a-Punto es que todos los elementos de la red aumentan la cantidad de recursos, pero a medida que el número de puntos aumenta, al carga de comunicación también lo hace, y esto baja el rendimiento de la red.
COMUNICACIÓN MAESTRO / ESCLAVO USANDO TRES ARDUINOS Y LA PC
Una de las varias variantes que se pueden establecer en este tipo de comunicación, es establecer una red bidireccional (Emisión y recepción de datos) usando como enlace los puertos seriales cruzados de tres Arduinos. El Maestro en este caso es un Arduino MEGA 2560, que tiene la ventaja de poseer cuatro puertos seriales. Bajo la configuración deseada, se podrían conectar hasta tres arduinos a la vez y dejar el puerto serial principal para comunicarse con la computadora y programarlo.
Las conexiones que se deben realizar se pueden ver en la siguiente figura:
Las conexiones que se deben realizar se pueden ver en la siguiente figura:
# RX1 : Arduino Mega2560 del Maestro => TX : Arduino UNO del Esclavo 1
# TX1 : Arduino Mega2560 del Maestro => RX : Arduino UNO del Esclavo 1
# RX2 : Arduino Mega2560 del Maestro => TX : Arduino UNO del Esclavo 2
# TX2 : Arduino Mega2560 del Maestro => RX : Arduino UNO del Esclavo 2
# GND : Los dos GND deben estar conectados.
# 5V : Los dos 5V deben estar conectados
NOTA: Al momento de querer programar los Esclavos, estos deben tener desconectadas sus conexiones del puerto serial con el Maestro, en caso contrario, el programa no se podrá compilar y se establecerá un error en el IDE de Arduino.
PROGRAMA DE PRUEBA
Como prueba de comunicación, realizaremos un pequeño de ejercicio de envio y recepción de datos en el cual los dos esclavos se identificarán. Para ello, el siguiente procedimiento se debe cumplir:
# El Maestro al enviar la letra "a" ingresada por "Monitor Serial" de la PC y debe hacer que encienda el led del Pin 13 del "Esclavo 1", quien a su vez enviará el dato "A1" siendo "A" el puntero del mensaje y "1" el identificador del Esclavo. Al recibir dicho mensaje, en el Monitor Serial deberá aparecer "Esclavo id: 1", siendo el número quien identifique el Esclavo y que recibió el mensaje.
# El Maestro al enviar la letra "b" ingresada por "Monitor Serial"
de la PC y debe hacer que encienda el led del Pin 13 del "Esclavo 2", quien a su vez enviará el dato "A2" siendo "A" el puntero del mensaje
y "2" el identificador del Esclavo. Al recibir dicho mensaje, en el
Monitor Serial deberá aparecer "Esclavo id: 2", siendo el número quien
identifique el Esclavo y que recibió el mensaje.
El programa del Maestro es el siguiente:
El programa de los Esclavos es el siguiente:
Después de haber compilado y verificado que los esclavos tienen otra vez las conexiones de sus puertos conectados al maestro, procedemos a abrir el Monitor Serial. Al momento de abrirla aparecerá el siguiente mensaje:
Al ingresar la letra "a" y dar Enter se encenderá el led del Esclavo 1 y nos aparecerá el siguiente mensaje:
Al ingresar la letra "b" y dar Enter se encenderá el led del Esclavo 2 y nos aparecerá el siguiente mensaje:
NOTA: Al momento de ingresar "a" o "b" los leds de los Esclavos se mantedrán prendidos, para apagarlos se debe presionar el botón "Reset" de cada uno para poder regresar al estado inicial. Pero, la respuesta de identificación de cada uno de los Esclavos se puede recibir cada vez que se quiera.
CONSIDERACIONES FINALES
# Debemos darle un tiempo de retraso ("delay") entre cada proceso para este tipo de comunicación, que aumentará a medida que se añadan más subrutinas o se aumenten la cantidad de nodos. Esto en caso la comunicación sea bidireccional.
# Las pruebas se realizaron también a una distancia de 2 m de cable, por lo que es posible establecer nodos de 2 m de separación para este tipo de comunicación.
/* PROGRAMA DE COMUNICACION ENTRE DOS PUNTOS: MAESTRO - ESCLAVO POR CONEXION CRUZADA DE PUERTOS SERIALES (PROGRAMA PARA EL MAESTRO) MAESTRO: Arduino Mega2560 ESCLAVO1: Arduino UNO (1) ESCLAVO2: Arduino UNO (2) CONEXION: RX1(Arduino Mega2560 - Pin 19): TX (Arduino UNO (1) - Esclavo 1) TX1(Arduino Mega2560 - Pin 18): RX (Arduino UNO (1) - Esclavo 1) RX2(Arduino Mega2560 - Pin 17): TX (Arduino UNO (2) - Esclavo 2) TX2(Arduino Mega2560 - Pin 16): RX (Arduino UNO (2) - Esclavo 2) GND: Conectar los dos GND VCC: Conectar los dos 5V En el siguiente programa probaremos la comunicacion maestro esclavo usando al Arduino Mega como maestro y dos esclavos Arduino UNO. El Maestro envia una letra "a" para discriminar al primer esclavo para que encienda el led del PIN 13 y envie A1 para identificarse; de la misma manera, al enviar la letra "b" se discrimina el segundo esclavo para que encienda el led del PIN 13 y envie A2 NOTA: Para compilar el programa maestro verificar que en Herramientas la placa sea Arduino Mega2560 Autor: Renato H. http://beetlecraft.blogspot.pe/ El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor */ int id; // Variable del identificador del Esclavo 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 // Mensaje inicial en el monitor serial Serial.println("Envio de datos pueden ser de la siguiente manera: "); Serial.println("a: Para el esclavo 1"); Serial.println("b: Para el esclavo 2"); } void loop() { if (Serial.available()) { // Verificacion que el puerto serial recibe datos delay(10); identificacion_esclavo(); // Rutina de identificacion de esclavos 1 y 2 delay(100); // Tiempo de espera para la siguiente rutina mensaje_esclavo(); // Rutina de recepcion del mensaje del esclavo 1 o 2 delay(100); // Tiempo de espera para la siguiente rutina while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial } } void identificacion_esclavo(){ // RUTINA DE IDENTIFICACION DE ESCLAVOS 1 Y 2 // RUTINA DE IDENTIFICACION DEL ESCLAVO 1 while (Serial.peek() == 'a'){ // Discriminacion de la letra como diferenciador del esclavo Serial.println("Esperar..."); // Mensaje de espera por datos de verificacion Serial1.write('a'); // Redireccionamiento del mensaje al Esclavo 1 break; } // RUTINA DE IDENTIFICACION DEL ESCLAVO 2 while (Serial.peek() == 'b'){ // Discriminacion de la letra como diferenciador del esclavo Serial.println("Esperar..."); // Mensaje de espera por datos de verificacion Serial2.write('b'); // Redireccionamiento del mensaje al Esclavo 2 break; } } 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() == 'A'){ // 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; } }NOTA: Para poder compilar el programa del Maestro, debe verificarse que en "Herramientas" del IDE de Arduino se encuentre la placa "Arduino Mega2560"
El programa de los Esclavos es el siguiente:
/* PROGRAMA DE COMUNICACION ENTRE DOS PUNTOS: MAESTRO - ESCLAVO POR CONEXION CRUZADA DE PUERTOS SERIALES (PROGRAMA PARA EL ESCLAVO) MAESTRO: Arduino Mega2560 ESCLAVO1: Arduino UNO (1) ESCLAVO2: Arduino UNO (2) CONEXION: RX1(Arduino Mega2560 - Pin 19): TX (Arduino UNO (1) - Esclavo 1) TX1(Arduino Mega2560 - Pin 18): RX (Arduino UNO (1) - Esclavo 1) RX2(Arduino Mega2560 - Pin 17): TX (Arduino UNO (2) - Esclavo 2) TX2(Arduino Mega2560 - Pin 16): RX (Arduino UNO (2) - Esclavo 2) GND: Conectar los dos GND VCC: Conectar los dos 5V En el siguiente programa probaremos la comunicacion maestro esclavo usando al Arduino Mega como maestro y dos esclavos Arduino UNO. El Maestro envia una letra "a" para discriminar al primer esclavo para que encienda el led del PIN 13 y envie A1 para identificarse; de la misma manera, al enviar la letra "b" se discrimina el segundo esclavo para que encienda el led del PIN 13 y envie A2 NOTA: Para compilar el programa para el maestro verificar que en Herramientas la placa sea Arduino Mega2560 Al momento de compilar el programa a la placa, desconectar la conexion del puerto serial del Arduino UNO al puerto serial del Arduino Mega. Autor: Renato H. http://beetlecraft.blogspot.pe/ El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor */ 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(1); // Envio del numero de autentificacion del esclavo al Maestro // Cambiar Serial.print(1) por Serial.print(2) para el segundo esclavo break; } }NOTA: En el programa encontrarán una subrutina llamada "void identificacion()" que debe ser modificada de la siguiente manera para el caso del Esclavo 2
void identificacion(){ // RUTINA DE IDENTIFICACION FISICA Y AUTENTIFICACION while (Serial.peek() == 'b'){ // 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(2); // Envio del numero de autentificacion del esclavo al Maestro // Cambiar Serial.print(1) por Serial.print(2) para el segundo esclavo break; } }PRUEBA DEL PROGRAMA
Después de haber compilado y verificado que los esclavos tienen otra vez las conexiones de sus puertos conectados al maestro, procedemos a abrir el Monitor Serial. Al momento de abrirla aparecerá el siguiente mensaje:
Al ingresar la letra "a" y dar Enter se encenderá el led del Esclavo 1 y nos aparecerá el siguiente mensaje:
Al ingresar la letra "b" y dar Enter se encenderá el led del Esclavo 2 y nos aparecerá el siguiente mensaje:
NOTA: Al momento de ingresar "a" o "b" los leds de los Esclavos se mantedrán prendidos, para apagarlos se debe presionar el botón "Reset" de cada uno para poder regresar al estado inicial. Pero, la respuesta de identificación de cada uno de los Esclavos se puede recibir cada vez que se quiera.
CONSIDERACIONES FINALES
# Debemos darle un tiempo de retraso ("delay") entre cada proceso para este tipo de comunicación, que aumentará a medida que se añadan más subrutinas o se aumenten la cantidad de nodos. Esto en caso la comunicación sea bidireccional.
# Las pruebas se realizaron también a una distancia de 2 m de cable, por lo que es posible establecer nodos de 2 m de separación para este tipo de comunicación.
Autor:
Como puedo hacer que los 3 arduinos realicen cosa por medio del principal como un brazo robótico
ResponderEliminar