|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

___________________________

30.- Conectar dos Arduinos. Bus I2C.

Vamos a conectar entre sí dos Arduinos. Podemos conectar más, empleando la comunicación por Bus I2C.

Para trabajar con I2C necesitamos la librería Wire. Esta es la que he utilizado con el IDE 1.0.6: Wire.zip

La descomprimes y la copias en la carpeta libraries del Arduino.

__________________

1.- BUS I2C

La conexión I2C está formada por un Maestro que es el que realiza las peticiones a los Esclavos.

Y uno o varios Esclavos que le envían información al Maestro cuando éste lo requiere.

La conexion consta de tres cables: Serial Clock (SCL), Serial Data (SDA), Tensión positiva (Vcc) y masa (GND).

En este ejemplo se utiliza el ANALOG IN A4 como datos SDA y el ANALOG IN A5 como reloj SCL. Además conectamos las masas GND.

Este ejemplo está tomado de la web de Arduino.

______________________
2.- Conexiones

- En este ejemplo solo utilizo tres cables de conexión porque cada Arduino está conectado a un cable USB.
- Más adelante utilizaremos 4 cables de conexión y solo un USB para el Maestro.

En los Arduinos UNO y más recientes podemos utilizar los pines SCL y SDA en vez de los A4 y A5. De esta manera dejamos libres estos últimos por si queremos utilizarlos como ENTRADAS ANALÓGICAS.

___________________________________
3.- Códigos

- Para hacer las pruebas podemos conectar a la vez los dos Arduinos al mismo ordenador.
- Uno lo conectamos a un USB y el otro a otro USB.

- Abrimos un IDE y pegamos los dos códigos, recuerda que cada programa va en una carpeta distinta.

- Un Arduino estará conectado mediante USB a un puerto COM, por ejemplo COM4
- El otro Arduino estará conectado a otro USB y tendrá asignado otro COM, por ejemplo COM24

- En el mismo IDE podemos trabajar con los dos programas a la vez.

- Según estemos trabajando con el código del Maestro o con el del Esclavo, debemos marcar el COM4 o COM24.

- Cuando vayas a cargar los programas en el Arduino, marca también el COM correspondiente.

- Cuando queramos ver el resultado en el Serial Monitor, debemos marcar el COM del Maestro.

Código para el Maestro
#include <Wire.h>

void setup()
{
  Wire.begin();        // Conexión al Bus I2C
  Serial.begin(9600);  // Velocidad de conexión
}

void loop()
{
  Wire.requestFrom(2, 10);    // Le pide 10 bytes al Esclavo 2

  while(Wire.available())    // slave may send less than requested
  { 
    char c = Wire.read();   // Recibe byte a byte
    Serial.print(c);        // Presenta los caracteres en el Serial Monitor
  }
    Serial.println();       // Cámbia de línea en el Serial Monitor.
    delay(500);
}

Código para el Esclavo
#include <Wire.h>

void setup()
{
  Wire.begin(2);                // Este Esclavo es el número 2
  Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,
                                // realiza el requestEvent
}

void loop()
{
  delay(100);
}

// Esto es lo que envía cuando le hace la petición.
void requestEvent()
{
  Wire.write("Hola amigo"); // Envía 10 bytes                    
}

Esto saldrá en el Serial Monitor del Maestro.
Recuerda que debes estar configurado a 9600 baudios.

- ¡Lástima, no puedo hacer este montaje porque en este momento solo tengo un cable USB!

- Sí lo puedes hacer.

1.- Conecta el Arduino Esclavo al cable USB y al ordenador. Carga el programa del Esclavo en el Arduino Esclavo.
2.- Quita el cable USB del Esclavo y lo pones en el Arduino Maestro. Carga el programa del Maestro en el Arduino Maestro.

3.- Realiza esta conexión.

Es decir, cargamos en cada Arduino su respectivo programa y luego alimentamos el Esclavo con un cable positivo del Maestro.

__________________________

4.- Bus I2C con varios esclavos.

Podemos conectar varios Esclavos al Bus I2C. Cada Esclavo tendrá una dirección distinta (2, 3, 4, 5).

El Maestro le puede hacer peticiones a los Esclavos para que le envíen un datos.

Podemos alimentar a cada Esclavo llevando además la línea de alimentación positiva, como hemos visto en el dibujo anterior. Es decir, desde el lugar donde se encuentra el Maestro saldrían 4 líneas, la positiva, la negativa, la SCL y la SDA. Esta es una de las virtudes del bus I2C, que con 4 líneas podemos controlar muchos dispositivos.

Una vez cargado el programa, el primer Arduino tampoco necesitaría cable USB, en nuestro caso lo ponemos para consultar el Serial Monitor. Lo que sí necesitaría será alimentarlo con una pila o fuente de alimentación.

Este es un buen método para aprender el bus I2C.

En los Arduinos UNO y más recientes podemos utilizar los pines SCL y SDA en vez de los A4 y A5. De esta manera dejamos libres estos últimos por si queremos utilizarlos como ENTRADAS ANALÓGICAS.

- Para un mejor funcionamiento conecta dos resistencias de 4K7. Una de SCL a Vcc(5V) y otra de SDA a Vcc(5V). Esto es lo que se llama pull-up.

__________________________

4B.- Código con dos Esclavos.

- Realizo este montaje con tres Arduinos, uno de Maestro y dos de Esclavos. No le he puesto las resistencias de 4K7.

- Los Esclavos le enviarán al Maestro una información cuando éste se lo pida.

- Conecto por USB al Esclavo 2 y le cargo su código. Quito el cable USB.
- Conecto por USB al Esclavo 3 y le cargo su código. Quito el cable USB.
- Conecto por USB al Maestro y le cargo su código. Le dejo el cable USB.

- Cada vez que cambiamos de un Arduino a otro debemos modificar su puerto COM en Herramientas / Puerto Serial.

- En la foto de arriba se aprecia las conexiones. Los esclavos no tienen USB porque ya tienen cargado el programa y están alimentados con los cables rojo y negro que provienen del Maestro.
- El Maestro está conectado al USB para poder visualizar la información en el Serial Monitor, si no quisiéramos ver esa información, simplemente alimentaríamos al Maestro con una pila de 9V y lo independizamos del ordenador.

Código para el Maestro
#include <Wire.h>

void setup()
{
  Wire.begin();        // Conexión al Bus I2C
  Serial.begin(9600);  // Velocidad de conexión
}

void loop()
{
//////// Petición al Esclavo 2
  Wire.requestFrom(2, 17);    // Le pide 17 bytes al Esclavo 2

  while(Wire.available())    // slave may send less than requested
  { 
    char c = Wire.read();   // Recibe byte a byte
    Serial.print(c);        // Presenta los caracteres en el Serial Monitor
  }
    Serial.println();       // Cámbia de línea en el Serial Monitor.
    delay(500);
    
 //////// Petición al Esclavo 3
  Wire.requestFrom(3, 17);    // Le pide 17 bytes al Esclavo 3

  while(Wire.available())    // slave may send less than requested
  { 
    char c = Wire.read();   // Recibe byte a byte
    Serial.print(c);        // Presenta los caracteres en el Serial Monitor
  }
    Serial.println();       // Cámbia de línea en el Serial Monitor.
    delay(500);
    
}

Código para el Esclavo 2

#include <Wire.h>

void setup()
{
  Wire.begin(2);                // Este Esclavo es el número 2
  Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,
                                // realiza el requestEvent
}

void loop()
{
  delay(100);
}

// Esto es lo que envía cuando le hace la petición.
void requestEvent()
{
  Wire.write("Soy el Esclavo 2"); // Envía 17 bytes                    
}

Código para el Esclavo 3

#include <Wire.h>

void setup()
{
  Wire.begin(3);                // Este Esclavo es el número 3
  Wire.onRequest(requestEvent); // Cuando el Maestro le hace una petición,
                                // realiza el requestEvent
}

void loop()
{
  delay(100);
}

// Esto es lo que envía cuando le hace la petición.
void requestEvent()
{
  Wire.write("Soy el Esclavo 3"); // Envía 17 bytes                    
}

- Serial Monitor del Maestro:

 

- En el siguiente tutorial: 30B_conectar_arduinos_i2c.htm vamos a ver otro ejemplo.

______________________
5.- ¿Para qué sirve esto?

Imagínate que el Esclavo 2 tiene un sensor de luz, una LDR; cuando detecta un cierto nivel de luz activa una salida de su Arduino.

El Maestro está contínuamente consultado al Esclavo 2, si detecta que ha activado esa salida, le envía una orden al Esclavo 3. Imaginamos que en éste hay un relé y una lámpara que se encenderá cuando le de la orden el Maestro.

El bus I2C se utiliza mucho en domótica por ejemplo en los sistemas KNX.

______________________
6.- Aquí tienes un ejemplo con sensores de temperatura.

Fíjate que cada sensor tiene una dirección distinta.
Si los vas a comprar, uno debe ser TC74A0, otro TC74A1, otro TC74A2, otro TC74A3... cada uno que compres debe tener una dirección distinta.
No compres todos TC74A0, porque tendrán la misma dirección y no se podrá distinguir entre uno y otro.

http://www.electroschematics.com/9798/reading-temperatures-i2c-arduino/

______________________
7.- Direcciones de los Arduinos.

Con este programa puedes ver la dirección de los Esclavos I2C.

Establece el Serial Monitor en 115200 y lo consultas.

Código
#include <Wire.h>

void setup() {
  Serial.begin (115200);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

 

______________________________________
______________________________________
______________________________________
______________________________________

8.- Conectar dos Arduinos. Comunicación serie.

- Aquí tienes otra manera de conectar dos Arduinos.

- En este caso utiliza TX y RX.

- No necesita librería.

- http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communication

- Vamos a realizar esta conexión. He modificado un poco el código del programa "Recibe".

- Conecta los dos Arduinos de esta manera.

Realizamos este proceso:

1.- Quitamos los cables de TX y RX (deben estar quitados cuando cargamos el programa).

2.- Conectamos el cable USB al "Envía", ponemos el Puerto Serial a COM3, cargamos su programa.

3.- Quitamos el cable USB del "Envía" y lo ponemos en el "Recibe", ponemos el Puerto Serial a COM24, cargamos su programa.

4.- Conectamos los cables TX y RX como está en el gráfico.

5.- Dejamos el cable USB conectado al "Recibe". Vamos a su Serial Monitor.

Código para el Envía el COM4
//Sender Code

char str[4];

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

void loop() {
  int value=1234; //this would be much more exciting if it was a sensor value
  
  itoa(value, str, 10); //Turn value into a character array
  Serial.write(str, 4);
  Serial.println();
}

 

Código para el Recibe el COM25
//Receiver Code

char str[4];
int c;

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

void loop() {
  int i=0;

  if (Serial.available()) {
    delay(100); //allows all serial sent to be received together
    while(Serial.available() && i<4) {
      str[i++] = Serial.read();
    }
    str[i++]='\0';
  }
  if(i>0) {
    Serial.print(str);
    Serial.println();
    i=0;
  }
  }

______________________________________

9.- Conectar dos Arduinos. Comunicación serie. Otra forma.

- Aquí vamos a necesitar dos IDE de Arduino y dos cables USB.

- La ventaja de esta conexión es que el Arduino "Envía" deja libre su puerto serie TX-RX.

- Conecta los dos Arduinos de esta manera.

Realizamos este proceso:

1.- Quitamos los cables GND, TX y RX (deben estar quitados cuando cargamos el programa).

(NOTA: el número de puerto, en mi caso COM3 y COM24, depende de cada ordenador)

2.- Conectamos el cable USB al "Envía", ponemos el Puerto Serial a COM3, cargamos su programa.

3.- Sin quitar el cable USB del anterior, conectamos otro cable USB al "Recibe", abrimos otro IDE de Arduino, ponemos el Puerto Serial a COM24, cargamos su programa.

4.- Conectamos los cables GND, TX y RX como está en el gráfico. Los dos Arduinos alimentados con sus respectivos cables USB.

5.- Dejamos el cable USB conectado al "Recibe". Vamos a su Serial Monitor.

Código para el Envía el COM3
// Juan A. Villapando-
// kio4.com
// COM3

#include <SoftwareSerial.h>
SoftwareSerial monitorSerial(9, 8); // Aquí creamos el otro Serial
// el pin 9 de este irá al RX del otro
// el pin 8 de este irá al TX del otro

void setup() {
monitorSerial.begin(9600); // Velocidad para conectar con el otro
Serial.begin(9600); // Velocidad para mi propio Serial Monitor
}

void loop() {
monitorSerial.println("Soy el COM3 y le envio la informacion al otro");
Serial.println("Texto en mi propio Serial Monitor de COM3");
}


Código para el Recibe el COM24
// Juan A. Villapando-
// kio4.com // COM24 // el pin RX de este irá al 9 del otro
// el pin TX de este irá al 8 del otro void setup() {
}

void loop() {
}

- El COM3 escribirá en su Serial Monitor su mensaje y además le enviará al COM24 otro mensaje.

______________________________________

- Escribir en el Serial Monitor del COM3 y que aparezca en el COM24.

- Vamos a cambiar el código del COM3, recuerda que para cargar el código, debemos quitarle los cable que lo une al otro Arduino.

- Escribiremos una letra en el COM3 y aparecerá en los dos.

- Establecemos los dos Serial Monitor como "Retorno del carro"

Código para el Envía el COM3
// Juan A. Villapando-
// kio4.com
// COM3

char val;
#include <SoftwareSerial.h>
SoftwareSerial monitorSerial(9, 8);
// el pin 9 de este irá al RX del otro
// el pin 8 de este irá al TX del otro

void setup() {
monitorSerial.begin(9600); // Velocidad para conectar con el otro
Serial.begin(9600); // Velocidad para mi propio Serial Monitor
}

void loop() {

if(Serial.available() )
val = Serial.read();


monitorSerial.println(val);
Serial.println(val);
}

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información