Tutorial - Comunicación serial: Séptima parte (Envío de datos)

Para el siguiente experimento, enviaremos un dato que varía entre 0 a 100 que corresponde de 0 a 100%, que es análogo de los 0 a 255 bits que maneja la salida PWM a través de la función "AnalogWrite()", y que se distingue en la intensidad de luz del led, siendo 0% un led apagado y 100% un led totalmente prendido.

Los únicos pines que pueden usar la función de salida PWM en el caso del Arduino UNO de manera nativa son:
# 11
# 10
# 9
# 6
# 5
# 3

La conexión es la siguiente:
# PIN D11 : Arduino UNO => Resistencia => LED 1: Ánodo
# PIN D10 : Arduino UNO => Resistencia => LED 2: Ánodo
# GND : Arduino UNO => LED 1 y 2: Cátodo


El programa en Arduino es el siguiente:
/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
   CONEXION:
             Arduino (D11) : Catodo del led 1 
             Arduino (D10) : Catodo del led 2
             Arduino (GND): Anodo del led 1, 2
     
   El siguiente programa nos ayuda a enviar una trama ingresada por puerto serial para ser leida por el 
   Arduino y ser convertida en el valor del PWM de 0 a 100% (0 - 255 bits)

   Formato del dato: porcentaje_1,porcentaje_2 como XXX,YYY

   NOTA: Los pienes que poseen salida PWM son 3, 5, 6, 9, 10 y 11

   Autor: Renato Hurtado
   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
*/

const int led_1 = 11, led_2 = 10; // Variable asignada al pin led 1 y 2
String data;                      // Variable asignada al dato obtenido

void setup() {
  pinMode(led_1, OUTPUT); // Configuracion del pin led 1 como salida
  pinMode(led_2, OUTPUT); // Configuracion del pin led 2 como salida
  Serial.begin(9600);     // Comunicacion serial a 9600 bps

  // Mensaje inicial
  Serial.println("Ingresar el dato como: porcentaje_1,porcentaje_2");
  Serial.println("Formato: XXX,YYY");
  Serial.println("Ejemplo: 10,100 (10% y 100%)");
}

void loop() {
  if(Serial.available() > 0){ // Lectura del puerto mientras sigue abierto
     data = Serial.readStringUntil('\n');                   // Lectura del dato hasta el line feed 
     Serial.print("Dato original: "); Serial.println(data); // Muestra del dato original
     
     int n, pwm_1, pwm_2; // Variables de almacenamiento de pwm y para algoritmo de lectura
     
     for (int i = 0; i <= data.length(); i++){ // Lectura total del tamano del dato
       if (data.substring(i, i+1) == ","){     // Lectura del dato hasta encontrar el caracter ","
         pwm_1 = data.substring(0, i).toInt(); // Conversion del dato obtenido del porcentaje del pwm 1
         n = i + 1;                            // Posicion de la letra final leida + 1
       }
     }

     // Lectura total del tamano del dato desde el ultimo punto
     for (int i = n; i <= data.length(); i++){ pwm_2 = data.substring(n, i).toInt(); }

     // Muestra del dato del porcentaje de PWM 1 y 2
     Serial.print("Procentaje 1: "); Serial.print(pwm_1); Serial.println(" %");
     Serial.print("Procentaje 2: "); Serial.print(pwm_2); Serial.println(" %");
     
     pwm_1 = map(pwm_1, 0, 100, 0, 255); // Cambio de formato del dato de 0 - 100%, a 0 - 255
     pwm_2 = map(pwm_2, 0, 100, 0, 255); // Cambio de formato del dato de 0 - 100%, a 0 - 255

     // Muestra del dato en pantalla
     Serial.print("PWM 1: "); Serial.println(pwm_1);
     Serial.print("PWM 2: "); Serial.println(pwm_2);
    
     analogWrite(led_1, pwm_1); // Salida PWM en el led de 0 a 255
     analogWrite(led_2, pwm_2); // Salida PWM en el led de 0 a 255
  }
}
El programa en Processing que vamos a probar es un sketch en el cual creamos dos campos de texto con un nombre dado "PWM 1 y 2", y detectamos el momento en el que se da un "enter". El valor ingresado se verá en el visualizador serial que posee Processing en la parte inferior de la pantalla del IDE y se enviará al Arduino para ser convertido en la señal PWM.

El programa en Processing es el siguiente:
/* 
   PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
   
   El siguiente programa nos ayuda a escribir un dato en un campo de texto correspondiente al PWM que
   va de 0 a 100 %, este va asignado al pin 11 y 10 del Arduino 
   
   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 controlP5.*; // Importacion del la libreria ControlP5
ControlP5 cp5;      // Creacion del objeto cp5

String[] cabeceraCT = {"PWM 1", "PWM 2"}; // Cabecera del campo de texto
String pwm_1 = "0", pwm_2 = "0", data; // Variable de almacenamiento del PWM
short LF = 10; // ASCII linefeed
int flag = 0;  // Flag discriminador

import processing.serial.*; //Inicio de la comunicación serial
Serial puerto;              // Crea el puerto serial

void setup() {
  size(200,200); // Tamano del canvas ancho, alto

  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
  
  PFont fuente = createFont("arial",20); // Tamano de la fuente

  cp5 = new ControlP5(this); // Inicializacion de la funcion cp5

  int y = 20, espaciamiento = 80; // Variables de almacenamiento de coordenada "y" y espaciamiento
  
  for(String nombre: cabeceraCT){    // Orden de campo de texto y cabecera
    cp5.addTextfield(nombre)         // Crea un campo de texto 
       .setPosition(20,y)            // Ubicacion del texto en coordenadas x, y
       .setSize(100,40)              // Tamano del campo de texto ancho, alto
       .setFont(fuente)              // Fuente del texto           
       .setColor(color(255,255,255)) // Color de la fuente r, g, b
       ;
    y += espaciamiento; // Espaciamiento para el siguiente campo de texto
  }
  textFont(fuente);
}

void draw() { 
  String mensaje = puerto.readStringUntil(LF); // Lee todo el mensaje hasta encontrar el linefeed
   
  if (mensaje != null) { // Si el dato no es null
    print(mensaje);      // Muestra en pantalla del mensaje original de Arduino
  }
  
  background(0); // Rellena el espacio de trabajo de color negro
} 

void controlEvent(ControlEvent evento) { // Control de evento de entrada de texto
  if(evento.getController().getName().equals("PWM 1") && flag == 0) { // Revisa si se ha ingresado un texto y apretado "enter"
    
    // Muestra nombre de la cabecera del campo de texto y el texto escrito 
    println("Texto introducido: '" + evento.getName()+"': " + evento.getStringValue());
    
    // Lectura del valor del PWM ingresado y muestra de PWM por monitor serial
    pwm_1 = evento.getController().getStringValue(); 
    
    flag = 1; // Flag de inicio de la siguiente funcion
  }

  if(evento.getController().getName().equals("PWM 2") && flag == 1) { // Revisa si se ha ingresado un texto y apretado "enter"
    
    // Muestra nombre de la cabecera del campo de texto y el texto escrito 
    println("Texto introducido: '" + evento.getName()+"': " + evento.getStringValue());
    
    // Lectura del valor del PWM ingresado y muestra de PWM por monitor serial
    pwm_2 = evento.getController().getStringValue();
    
    // Mensaje de confirmacion de envio del PWM
    println("PWM 1 enviado: " + pwm_1); println("PWM 2 enviado: " + pwm_2);
    data = pwm_1 + ',' + pwm_2; // Armado de la data de envio
    puerto.write(data);         // Escritura del valor del PWM (envio de data al Arduino)
    
    flag = 0; // Flag de inicio de la siguiente funcion
  }   
}
El resultado es el siguiente:




Autor: 

No hay comentarios:

Publicar un comentario