Tutorial - Comunicación Maestro / Esclavo : Parte 4 (Comunicación I2C - Multivariable)

Para esta experiencia, realizaremos la lectura de dos potenciómetros que lo realizará un Arduino que tendrá la función de un nodo esclavo en una comunicación tipo I2C conectado a un Arduino que hará el papel de un maestro que hará una comunicación serial con una computadora que graficará el cambio de voltaje en el potenciómetro en tiempo real usando el Monitor Serial del Arduino IDE.

# PIN A0 : Arduino UNO del Esclavo => PIN CENTRAL : Potenciómetro 1
# PIN A1 : Arduino UNO del Esclavo => PIN CENTRAL : Potenciómetro 2
# GND : Arduino UNO del Maestro => EXTREMO : Potenciómetro 1 y 2 => GND : Arduino UNO del Esclavo
# 5V : Arduino UNO del Esclavo => EXTREMO : Potenciómetro 1 y 2
# PIN A4 (SDA) : Arduino UNO del Maestro => A4 (SDA) : Arduino UNO del Esclavo
# PIN A5 (SCL) : Arduino UNO del Maestro => A5 (SCL) : Arduino UNO del Esclavo


El programa usado para el Esclavo es el siguiente:
/*
   PROGRAMA DE PRUEBA DE COMUNICACION I2C A SERIAL MULTIVARIABLE
   (PROGRAMA PARA EL ESCLAVO)
     
   MAESTRO: Arduino UNO (1)
   ESCLAVO: Arduino UNO (2)
     
   CONEXION:
             A4 (Arduino UNO (1) / SDA - MAESTRO): A4 (Arduino UNO (2) / SDA - ESCLAVO)
             A5 (Arduino UNO (1) / SCL - MAESTRO): A5 (Arduino UNO (2) / SCL - ESCLAVO)
             Potenciometro 1: Pin A0 (Arduino UNO(2) - ESCLAVO) 
             Potenciometro 2: Pin A0 (Arduino UNO(2) - ESCLAVO)
             GND: Conectar los dos GND
             VCC: Conectar los dos 5V
     
   En el siguiente programa probaremos la comunicacion Maestro / Esclavo. El Maestro permite 
   la visualizacion de los datos obtenidos de leer los potenciometros que van conectados al Esclavo. 
     
   Para correr el programa se necesita la libreria Wire (Wire.h)
     
   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
*/
  
#include <Wire.h>  // Libreria de manejo de red I2C
  
int POT_1, POT_2;            // Variable de almacenamiento del porcentaje del potenciometro 1 y 2
String Pmod_1, Pmod_2, data; // Variable para configuracion y envio de datos 
  
void setup() {
  Wire.begin(1);             // Unirse a la red I2C (Esclavo con direccion "1")
  Wire.onRequest(escritura); // Registro de evento de la funcion "escritura"
  Serial.begin(9600);        // Inicio de comunicacion serial a 9600 bps
}
  
void loop() {
  POT_1 = map(analogRead(A0), 0, 1023, 0, 100); // Lee el valor del sensor (Rango de 0 a 100%)
  POT_2 = map(analogRead(A1), 0, 1023, 0, 100); // Lee el valor del sensor (Rango de 0 a 100%)

  // Visualizacion inicial de la data de los potenciometros leidos
  Serial.print("Potenciometro 1: "); Serial.print(POT_1);
  Serial.print(" :: Potenciometro 2: "); Serial.println(POT_2);

  Pmod_1 = String(POT_1, DEC); Pmod_2 = String(POT_2, DEC); // Conversion de los datos a Strings

  // Obtencion del tamano del dato convertido
  int Pmod_1_lon = Pmod_1.length(); 
  int Pmod_2_lon = Pmod_2.length();

  // NOTA: Se debe ajustar el tamano del dato de salida para que sea de 8 bytes
  while (Pmod_1_lon < 3){         // Ajuste del tamano del dato
    Pmod_1 = '0' + Pmod_1;        // Concatena un "0" adelante del dato
    Pmod_1_lon = Pmod_1.length(); // Realiza la operacion de obtencion de tamano nuevo del dato
  } 

  while (Pmod_2_lon < 3){         // Ajuste del tamano del dato
    Pmod_2 = '0' + Pmod_2;        // Concatena un "0" adelante del dato
    Pmod_2_lon = Pmod_2.length(); // Realiza la operacion de obtencion de tamano nuevo del dato
  } 
  
  data = Pmod_1 + ',' + Pmod_2 + ':'; // Construccion de la trama de salida
  
  Serial.print("Mensaje: "); Serial.println(data); // Visualizacion de la trama de salida
}
  
void escritura(){
  Wire.write(data.c_str()); // Envio de la trama de salida ajustada por I2C 
}
Al momento de abrir el Monitor Serial para observar como salen los datos podemos ver lo siguiente:


El programa usado para el Maestro es el siguiente:
/*
   PROGRAMA DE PRUEBA DE COMUNICACION ENTRE DOS PUNTOS: USO DE LA LIBRERIA WIRE
   (PROGRAMA PARA EL MAESTRO)
     
   MAESTRO: Arduino UNO (1)
   ESCLAVO: Arduino UNO (2)
     
   CONEXION:
             A4 (Arduino UNO (1) / SDA - MAESTRO): A4 (Arduino UNO (2) / SDA - ESCLAVO)
             A5 (Arduino UNO (1) / SCL - MAESTRO): A5 (Arduino UNO (2) / SCL - ESCLAVO)
             Potenciometro 1: Pin A0 (Arduino UNO(2) - ESCLAVO) 
             Potenciometro 2: Pin A0 (Arduino UNO(2) - ESCLAVO)
             GND: Conectar los dos GND
             VCC: Conectar los dos 5V
     
   En el siguiente programa probaremos la comunicacion Maestro / Esclavo. El Maestro permite 
   la visualizacion de los datos obtenidos de leer el potenciometro que va conectado al Esclavo.
     
   Para correr el programa se necesita la libreria Wire (Wire.h)
     
   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
*/
  
#include <Wire.h> // Libreria de manejo de red I2C
  
String POT;       // Variable de almacenamiento del valor leido del potenciometro
int p;            // Variable de almacenamiento de la posicion
int pot_1, pot_2; // Variables de almacenamiento de la lectura de potenciometros

void setup(){
  Wire.begin();        // Unirse a la red I2C (Maestro)
  Serial.begin(9600);  // Configuracion del puerto serial a 9600 baudios
}
  
void loop(){  
  Wire.requestFrom(1,8);             // Pedido de informacion del Esclavo 1 de 8 bytes
  while (Wire.available()) {         // Verificacion que el puerto serial virtual recibe datos                                      
    POT = Wire.readStringUntil(':'); // Lectura de datos del I2C hasta encontrar ":"
    delay(10);                       // Retraso de 10 ms para manejo de flujo de datos
   
    for (int i = 0; i < POT.length(); i++){  // Lectura desde la posicion 0 del string generado
      if (POT.substring(i, i+1) == ","){     // Separa el string hasta desde la posicion 0 hasta ","
        pot_1 = POT.substring(0, i).toInt(); // Toma la palabra hasta "," y lo convierte a integer
        p = i + 1;                           // Nueva posicion de lectura de la letra p + 1
      break;                                 // Salto cuando se encuentra ","
      }
    }
    Serial.print("Potenciometro 1: ");       // Valor del potenciometro por puerto serial
    Serial.println(pot_1);        

    for (int i = p; i <= POT.length(); i++){ // Lectura desde la posicion p del string generado
      pot_2 = POT.substring(p, i).toInt();   // Toma la palabra hasta "line feed" y lo convierte a integer
    } 
    Serial.print("Potenciometro 2: ");       // Valor del potenciometro por puerto serial
    Serial.println(pot_2);
  }
  delay(100);
}
Al momento de abrir el Monitor Serial para observar como salen los datos podemos ver lo siguiente:


Autor: 

No hay comentarios:

Publicar un comentario