Para esta experiencia, realizaremos la lectura de dos potenciómetros conectados a dos Arduinos que tendrán la función de dos nodos esclavos 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 Processing.
# PIN A0 : Arduino UNO del Esclavo 1 => PIN CENTRAL : Potenciómetro 1
# PIN A1 : Arduino UNO del Esclavo 1 => PIN CENTRAL : Potenciómetro 2
# PIN A0 : Arduino UNO del Esclavo 2 => PIN CENTRAL : Potenciómetro 3
# PIN A1 : Arduino UNO del Esclavo 2 => PIN CENTRAL : Potenciómetro 4
# PIN A1 : Arduino UNO del Esclavo 1 => PIN CENTRAL : Potenciómetro 2
# PIN A0 : Arduino UNO del Esclavo 2 => PIN CENTRAL : Potenciómetro 3
# PIN A1 : Arduino UNO del Esclavo 2 => PIN CENTRAL : Potenciómetro 4
# GND : Arduino UNO del Maestro => EXTREMO : Potenciómetro 1, 2, 3 y 4 => GND : Arduino UNO del Esclavo 1 y 2
# 5V : Arduino UNO del Maestro => EXTREMO : Potenciómetro 1, 2, 3 y 4 => 5V : Arduino UNO del Esclavo 1 y 2
# PIN A4 (SDA) : Arduino UNO del Maestro => A4 (SDA) : Arduino UNO del Esclavo 1 y 2
# PIN A5 (SCL) : Arduino UNO del Maestro => A5 (SCL) : Arduino UNO del Esclavo 1 y 2
El programa usado para el Esclavo es el siguiente:
El programa usado para Processing es el siguiente:
El resultado es el siguiente:
# PIN A4 (SDA) : Arduino UNO del Maestro => A4 (SDA) : Arduino UNO del Esclavo 1 y 2
# PIN A5 (SCL) : Arduino UNO del Maestro => A5 (SCL) : Arduino UNO del Esclavo 1 y 2
El programa usado para el Esclavo es el siguiente:
/*
PROGRAMA DE PRUEBA DE COMUNICACION I2C A SERIAL MULTIVARIABLE Y MULTIESCLAVO
(PROGRAMA PARA EL ESCLAVO)
MAESTRO: Arduino UNO (1)
ESCLAVO: Arduino UNO (2)
ESCLAVO: Arduino UNO (3)
CONEXION:
A4 (Arduino UNO (1) / SDA - MAESTRO): A4 (Arduino UNO (2) / SDA - ESCLAVO): A4 (Arduino UNO (3) / SDA - ESCLAVO)
A5 (Arduino UNO (1) / SCL - MAESTRO): A5 (Arduino UNO (2) / SCL - ESCLAVO): A4 (Arduino UNO (3) / SCL - ESCLAVO)
Potenciometro 1: Pin A0 (Arduino UNO(2) - ESCLAVO)
Potenciometro 2: Pin A1 (Arduino UNO(2) - ESCLAVO)
Potenciometro 3: Pin A0 (Arduino UNO(3) - ESCLAVO)
Potenciometro 4: Pin A1 (Arduino UNO(3) - 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")
// cambiar por "2" para el segundo esclavo
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 I2C A SERIAL MULTIVARIABLE Y MULTIESCLAVO
(PROGRAMA PARA EL MAESTRO)
MAESTRO: Arduino UNO (1)
ESCLAVO: Arduino UNO (2)
ESCLAVO: Arduino UNO (3)
CONEXION:
A4 (Arduino UNO (1) / SDA - MAESTRO): A4 (Arduino UNO (2) / SDA - ESCLAVO): A4 (Arduino UNO (3) / SDA - ESCLAVO)
A5 (Arduino UNO (1) / SCL - MAESTRO): A5 (Arduino UNO (2) / SCL - ESCLAVO): A4 (Arduino UNO (3) / SCL - ESCLAVO)
Potenciometro 1: Pin A0 (Arduino UNO(2) - ESCLAVO)
Potenciometro 2: Pin A1 (Arduino UNO(2) - ESCLAVO)
Potenciometro 3: Pin A0 (Arduino UNO(3) - ESCLAVO)
Potenciometro 4: Pin A1 (Arduino UNO(3) - 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(){
for (int i = 1; i <= 2; i++){ // Eleccion del esclavo a leer datos
Wire.requestFrom(i,8); // Pedido de informacion del Esclavo 1 o 2 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 j = 0; j < POT.length(); j++){ // Lectura desde la posicion 0 del string generado
if (POT.substring(j, j+1) == ","){ // Separa el string hasta desde la posicion 0 hasta ","
pot_1 = POT.substring(0, j).toInt(); // Toma la palabra hasta "," y lo convierte a integer
p = j + 1; // Nueva posicion de lectura de la letra p + 1
break; // Salto cuando se encuentra ","
}
}
String pot_1_mod = String(pot_1); // Conversion del dato en string para enviar el mensaje
for (int j = p; j <= POT.length(); j++){ // Lectura desde la posicion p del string generado
pot_2 = POT.substring(p, j).toInt(); // Toma la palabra hasta "line feed" y lo convierte a integer
}
String pot_2_mod = String(pot_2); // Conversion del dato en string para enviar el mensaje
if (i == 1){ // Discriminacion del esclavo 1
String cabecera = String("A,"); // Creacion de la cabecera
String mensaje = cabecera + pot_1_mod + ',' + pot_2_mod + ','; // Construccion del mensaje de salida
Serial.print(mensaje); Serial.println(); // Envio del mensaje del esclavo 1
}
if (i == 2){ // Discriminacion del esclavo 2
String cabecera = String("B,"); // Creacion de la cabecera
String mensaje = cabecera + pot_1_mod + ',' + pot_2_mod + ','; // Construccion del mensaje de salida
Serial.print(mensaje); Serial.println(); // Envio del mensaje del esclavo 2
}
}
delay(100);
}
}
Al momento de abrir el Monitor Serial para observar como salen los datos podemos ver lo siguiente:
El programa usado para Processing es el siguiente:
/*
PROGRAMA DE PRUEBA DE COMUNICACION SERIAL CON MULTIVARIABLE Y MULTIESCLAVO
MAESTRO: Arduino UNO (1)
ESCLAVO: Arduino UNO (2)
ESCLAVO: Arduino UNO (3)
CONEXION:
A4 (Arduino UNO (1) / SDA - MAESTRO): A4 (Arduino UNO (2) / SDA - ESCLAVO): A4 (Arduino UNO (3) / SDA - ESCLAVO)
A5 (Arduino UNO (1) / SCL - MAESTRO): A5 (Arduino UNO (2) / SCL - ESCLAVO): A4 (Arduino UNO (3) / SCL - ESCLAVO)
Potenciometro 1: Pin A0 (Arduino UNO(2) - ESCLAVO)
Potenciometro 2: Pin A1 (Arduino UNO(2) - ESCLAVO)
Potenciometro 3: Pin A0 (Arduino UNO(3) - ESCLAVO)
Potenciometro 4: Pin A1 (Arduino UNO(3) - ESCLAVO)
GND: Conectar los dos GND
VCC: Conectar los dos 5V
El siguiente programa nos ayuda a realizar la lectura del voltaje de 2 potenciometro y mostrarlo por
puerto serial.
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.*; // Inicio de la comunicación serial
Serial puerto; // Crea el puerto serial
char cab_1 = 'A', cab_2 = 'B'; // Cabecera de inicio de mensaje del esclavo 1 y 2
short LF = 10; // ASCII linefeed
int POT_1, POT_2, POT_3, POT_4; // Variables de almacenamiento del potenciometro del esclavo 1 y 2
String mensaje; // Mensaje leido
void setup() {
size(100, 350); // Tamaño de la pantalla
// println(Serial.list());
String ArduinoPuerto = Serial.list()[0]; // Encuentra el primer puerto serial para iniciar la comunicacion
puerto = new Serial(this, ArduinoPuerto, 9600); // Inicio de la comunicacion con el primer puerto encontrado
}
void draw() {
mensaje = puerto.readStringUntil(LF); // Lee todo el mensaje hasta encontrar el linefeed
if (mensaje != null) { // Si el dato no es null
// Muestra en pantalla del mensaje original
print("Mensaje original: ");
println(mensaje);
lectura(); // Rutina de lectura de potenciometros
}
background(167); // Rellena el espacio de trabajo de color plomo
fill(0); // Llena el espacio del rectangulo dibujado en negro
rect(0, 0, POT_1, 50); // Dibujo del rectangulo 1
rect(0, 100, POT_2, 50); // Dibujo del rectangulo 2
rect(0, 200, POT_3, 50); // Dibujo del rectangulo 3
rect(0, 300, POT_4, 50); // Dibujo del rectangulo 4
}
void lectura(){ // Rutina de lectura de potenciometros
String [] data = mensaje.split(","); // Division del mensaje a partir de la coma ","
if (data[0].charAt(0) == cab_1 && data.length > 3){ // Verifica la cabecera y el tamaño del dato
// Lectura de los datos divididos
for (int i = 1; i < data.length - 1; i++){
// Escritura de los datos por puerto serial
print("Esclavo: 1 ");
println("Valor potenciometro " + i + ": " + data[i]);
POT_1 = Integer.parseInt(data[1]); // Conversion del dato 1 del String a Integer
POT_2 = Integer.parseInt(data[2]); // Convserion del dato 2 del String a Integer
}
println(); // Espacio de division para el siguiente mensaje
}
if (data[0].charAt(0) == cab_2 && data.length > 3){ // Verifica la cabecera y el tamaño del dato
// Lectura de los datos divididos
for (int i = 1; i < data.length - 1; i++){
// Escritura de los puertos por puerto serial
print("Esclavo: 2 ");
println("Valor potenciometro " + i + ": " + data[i]);
POT_3 = Integer.parseInt(data[1]); // Conversion del dato 1 del String a Integer
POT_4 = Integer.parseInt(data[2]); // Convserion del dato 2 del String a Integer
}
println(); // Espacio de division para el siguiente mensaje
}
}
Autor:






No hay comentarios:
Publicar un comentario