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 Processing.
# PIN A0 : Arduino UNO del Esclavo => PIN CENTRAL : Potenciómetro 1
# PIN A1 : Arduino UNO del Esclavo => PIN CENTRAL : Potenciómetro 2
# 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 Maestro => EXTREMO : Potenciómetro 1 y 2 => 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:
El programa usado para Processing es el siguiente:
# 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 } String cabecera = "P"; // Cabecera de la trama data = cabecera + ',' + 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 (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. 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 String 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,10); // Pedido de informacion del Esclavo 1 de 10 byte while (Wire.available()) { // Verificacion que el puerto serial virtual recibe datos POT = Wire.readStringUntil(':'); // Lectura de datos del I2C hasta encontrar ":" POT = POT + ','; // Concatenamiento del dato con "," como sintaxis del dato de salida delay(10); // Retraso de 10 ms para manejo de flujo de datos Serial.println(POT); // Envio de datos arreglados } 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 CONEXION: Arduino (A0) : Pin central potenciometro 1 Arduino (GND): Pin extremo potenciometro 1 Arduino (5V) : Pin extremo potenciometro 1 Arduino (A1) : Pin central potenciometro 2 Arduino (GND): Pin extremo potenciometro 2 Arduino (5V) : Pin extremo potenciometro 2 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 cabecera = 'P'; // Cabecera de inicio de mensaje short LF = 10; // ASCII linefeed int POT_1, POT_2; // Variable de almacenamiento del potenciometro void setup() { size(100, 150); // 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() { String 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: "); print(mensaje); String [] data = mensaje.split(","); // Division del mensaje a partir de la coma "," if (data[0].charAt(0) == cabecera && 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++){ 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 } } 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 }El resultado es el siguiente:
Autor:
No hay comentarios:
Publicar un comentario