Tutorial - Comunicación serial e I2C a la vez (Primera parte - Introducción)

Para esta experiencia, realizaremos la lectura de un potenciómetro 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.

# PIN A0 : Arduino UNO del Esclavo => PIN CENTRAL : Potenciómetro
# GND : Arduino UNO del Maestro => EXTREMO : Potenciómetro => GND : Arduino UNO del Esclavo
# 5V : Arduino UNO del Maestro => EXTREMO : Potenciómetro => 5V : Arduino UNO del Esclavo
# 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: (Para obtener más información sobre este programa entrar al siguiente link: "Comunicación maestro / esclavo: Parte 3 (Comunicación I2C - Introducción)")
/*
   PROGRAMA DE PRUEBA DE COMUNICACION ENTRE DOS PUNTOS: USO DE LA LIBRERIA WIRE
   (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: 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
 
int POT = A0;      // Pin de entrada de senal del potenciometro
int POT_valor = 0; // Variable de almacenamiento del porcentaje del potenciometro 
int porcentaje;    // Variable de conversion a porcentaje
 
void setup() {
  Wire.begin(1);             // Unirse a la red I2C (Esclavo con direccion "1")
  Wire.onRequest(escritura); // Registro de evento de la funcion "escritura"
}
 
void loop() {
  delay(100);
}
 
void escritura(){
  POT_valor = analogRead(POT);              // Lee el valor del sensor (Rango de 0 a 1023)
  porcentaje = map(POT_valor,0,1023,0,100); // Porcentaje del rango de 0 a 100%
                                            // 100 corresponde a 5V y 0 a 0V
  Wire.write(porcentaje);                   // Escritura por I2C del porcentaje de voltaje 
}
En caso del Maestro tenemos el siguiente programa: (Para obtener más información sobre este programa entrar al siguiente link: "Tercera parte: Comunicación serial con Arduino y Processing")
/*
   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: 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.
   Los datos se veran por medio de una interfaz en Processing. 
    
   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; // Variable de almacenamiento del valor leido del potenciometro
 
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,1);     // Pedido de informacion del Esclavo 1 de 1 byte
  while (Wire.available()) { // Verificacion que el puerto serial virtual recibe datos                                      
    POT = Wire.read();       // Lectura de datos del I2C
     
    // Mensaje de muestra del porcentaje del voltaje leido del potenciometro
    Serial.print('P');       // Cabecera de inicio de comunciacion serial
    Serial.write(lowByte(POT));      // Envia el byte bajo
    Serial.write(highByte(POT));     // Envia el byte alto                            
  }
  delay(100);
}
En caso del programa en Processing tenemos lo siguiente: (Para obtener más información sobre este programa entrar al siguiente link: "Tercera parte: Comunicación serial con Arduino y Processing")
/*
  PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
  
  CONEXION:
            Arduino (A0) : Pin central potenciometro
            Arduino (GND): Pin extremo potenciometro
            Arduino (5V) : Pin extremo potenciometro
 
 El siguiente programa nos ayuda a realizar la lectura del votlaje del potenciometro y mostrarlo por
 puerto serial para mostrarlo por Processing cambiando el ancho del rectangulo mostrado en pantalla.
 
 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
 */

import processing.serial.*; // Declaracion inicial para comunicacion serial

Serial Puerto;       // Crear el puerto serial
char cabecera = 'P'; // Letra asignada como cabecera del mensaje
int POT;             // Variable de lectura del puerto serial

void setup() {
  size(100, 100);                          // Porte de la pantalla
  Puerto = new Serial(this, "COM4", 9600); // Inicio de la comunicacion a 9600 bps del puerto COM4
}

void draw() {
  if ( Puerto.available() >= 3) {                 // Verifica que exista 3 bytes en el puerto serial
    if (Puerto.read() == cabecera) {              // Verifica que "P" sea la cabecera del mensaje
      POT = Puerto.read();                        // Lectura del puerto
      POT = Puerto.read() * 256 + POT;            // Conversion del mensaje de 16 bits a integer 
      println("Valor del potenciometro: " + POT); // Muestra el dato en el puerto serial
    }
  }

  // Dibujo del rectangulo
  background(167);      // Rellena el espacio de trabajo de color plomo
  fill(0);              // Llena el espacio del rectangulo dibujado en negro
  rect(0, 0, 100, POT); // Dibuja el rectangulo con los valores obtenidos de la lectura del puerto
}
Los resultados tomando sólo en cuenta el Monitor Serial del Arduino IDE se muestran a continuación:


Los resultados tomando el Processing se muestran a continuación:




Autor: 

No hay comentarios:

Publicar un comentario