Por que conectar dous arduínos?
Imos conectar dous arduinos entre si para que funcionen de maneira sincronizada. Hai diversas ocasións nas que podemos necesitalo, pero vou resaltar dúas delas:
Programas en paralelo

[tecnoloxia.org By-SA]
Se usásemos un microprocesador (como no caso dun LEGO ou unha Raspberry Pi) isto non tería problema, pois permite a execución de varios programas de maneira simultánea.
Unha solución é utilizar dúas placas: unha se encarga do control do motor de apertura e peche da porta e outra das luces, son, alarma, etc., e sincronizamos os programas mediante o envío de mensaxes desde unha placa a outra.
Necesitamos moitos pins
As tarxetas Arduíno UNO teñen un número de entradas e saídas analóxicas e dixitais moi limitado, e para determinados proxectos pode ser preciso utilizar más. A maneira máis común de aumentar o número de entradas ou saídas é mediante a utilización de chips electrónicos que se encarguen da tarefa. Por exemplo, podemos utilizar un rexistro de desprazamento para o control dun display 7 segmentos, ou podemos usar un multiplexor para aumentar o número de entradas analóxicas.Sin embargo pode ser tamén interesante traballar na clase a conexión entre arduinos. Por exemplo, nun proxecto dun cruce de semáforos, un compoñente do equipo pódese encargar do control dos LEDs dos semáforos, outro da programación do contador e son dos pasos de peóns, e outro de programar nunha matriz de LEDs o boneco que se move cando o semáforo está verde. No canto de unificar todo iso nunha única placa (non nos chegarían os pins), facer de novo as conexións e unificar os programas nun programa global podemos facer que o programa de control dos semáforos envíe unha orde a outra placa para que active o contador e a matriz de LEDs cando sexa preciso.
Conexión serial:

[tecnoloxia.org By-SA]
Para poder establecer a comunicación serie entre dous arduínos requírense unha conexión Rx-RT cruzada e unir as masas:
- Para envío de datos do mestre ao escravo: Pin Tx do mestre co pin Rx do escravo.
- Para envío de datos do escravo ao mestre: Pin Tx do escravo co pin Rx do mestre.
- Unión das masas dos dispositivos.
A distancia máxima que soporta o bus serie depende da
velocidade de transmisión de datos pero aproximadamente a 9600 baudios podemos poñer unha distancia máxima de 15 metros.
Antes de subir el código a cada Arduíno cómpre desconectar os pins Rx e Tx, pois estes pins tamén son usados para comunicarse por USB e non poderiamos instalar o programa.
Prácticas:
Nos programas, para enviar e recibir datos utilízanse os mesmos comandos que utilizamos para comunicarnos coa consola serie: Serial.print(‘A’), Serial.available(), Serial.parseInt(), Serial.read(), etc.
1. Probamos
1. Probamos: Imos facer unha práctica sinxela para entender como hai que facer para enviar datos dunha placa a outra: Nun Arduíno conectamos un pulsador e noutro conectamos un LED. O LED debe cambiar de estado cada vez que prememos no pulsador.
Programa da placa mestra:|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Declaración de variables: int pulsador=2; int estado; // Configuración: void setup(){ Serial.begin(9600); // Inicia a comunicación serie while(!Serial); } // Programa: void loop() { estado=digitalRead(pulsador); if (estado==1){ while(digitalRead(pulsador)==1); // Agarda mentres o pulsador esta premido delay(20); // tempo para evitar o efecto rebote do pulsador Serial.print('A'); // Envía o dato A } } |
Programa da placa escrava:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// Declaración de variables: int led=13; int sinal; int estado=0; // variable na que almacenamos o estado do LED // Configuración: void setup(){ Serial.begin(9600); // Inicia a comunicación serie while(!Serial); pinMode (led, OUTPUT); digitalWrite(led, LOW); } // Programa: void loop(){ if (Serial.available()) { // Se recibe un dato sinal = Serial.read(); // Lemos o dato if (sinal == 'A') { // Se o dato é A cambiamos o estado do led if (estado==0) { digitalWrite(led, HIGH); estado=1; } else{ digitalWrite(led, LOW); estado=0; } } } } |
Lembra que se envías un número e non un carácter, para recibilo no canto de usar Serial.read() debes usar Serial.parseInt()
2. Movemento e luz
2. Movemento e luz: Agora imos facer que un servo se mova lentamente de o a 180º e despois en sentido contrario de forma cíclica. Cada vez que xira nun sentido escintila un LED verde, e cando xira en sentido contrario escintila un LED vermello.
Programa mestre:|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <Servo.h> // Declaración de variables: Servo meuservo; // poñémoslle nome ao servo: "meuservo" // Configuración: void setup(){ Serial.begin(9600); // Inicia a comunicación serie while(!Serial); meuservo.attach(6); // servo conectado no pin 6 } // Programa: void loop() { meuservo.write(0); // Parte da posición de 0º Serial.print('A'); // Envía o dato A for(int i=0;i<=180;i++){ meuservo.write(i); delay (20); } Serial.print('B'); // Envía o dato B for(int i=180;i>=0;i--){ meuservo.write(i); delay (20); } } |
Programa escravo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// Declaración de variables: int ledverde=12; int ledvermello=13; int sinal; // Configuración: void setup(){ Serial.begin(9600); // Inicia a comunicación serie while(!Serial); pinMode (ledverde, OUTPUT); pinMode (ledvermello, OUTPUT); } // Programa: void verde(){ digitalWrite(ledverde, HIGH); delay(100); digitalWrite(ledverde, LOW); delay(100); } void vermello(){ digitalWrite(ledvermello, HIGH); delay(100); digitalWrite(ledvermello, LOW); delay(100); } void loop(){ if(Serial.available()){ // Se hai un dato sinal = Serial.read(); // Lemos o dato Serial.print(sinal); if (sinal == 'A') { // Se o dato é 'A' while(!Serial.available()){ // executamos verde mentres non haxa un novo dato verde(); } } if (sinal == 'B'){ while(!Serial.available()){ vermello(); } } } } |
Prácticas:
- Outras accións: Engade á práctica “1. Probamos” outro botón, de xeito que cando o premamos envíe outro dato diferente, e que a placa escrava execute outra acción diferente (que o LED escintile, que soe unha melodía, etc.)
- Datos de volta: Nas anteriores prácticas o mestre funcionou como transmisor (Tx) e o escravo coma receptor (Rx). Fai agora que a segunda placa devolva un dato á primeira despois de executar un proceso, e que ao recibilo execute algunha acción.


