Tutorial - Comunicación serial: Parte 6 (Envío de datos) / multivariable, multifunción y formato fijo

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()", dirigida a 4 leds divididos en dos grupos que simulan dos funciones distintas o dos procesos distintos que corren de manera no paralela.

El dato de entrada se toma como un dato tipo char de tamaño 8. Este dato se transforma a String, luego se discrimina la letra inicial que identifica el proceso a realizar, este dato que se lee hasta el line feed (fin de linea). Luego se toma la posición inicial hasta una posición predeterminada al ser el formato fijo, por lo que las posiciones correspondientes a la lectura que van dirigidas al led 1 y 2 ya pueden ser divididos sin necesidad de tener un separador como una coma ",". El mismo proceso descrito, se hace para el caso de la función 2 o proceso "B". Las funciones están divididas usando la función "Switch".

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
# PIN D9 : Arduino UNO => Resistencia => LED 3 : Ánodo
# PIN D6 : Arduino UNO => Resistencia => LED 4 : Ánodo
# GND : Arduino UNO => LED 1, 2, 3 y 4: Cátodo


El programa usado para el Arduino es el que se muestra:
/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
   CONEXION:
             GRUPO 1
             Arduino (D11) : Catodo del led 1 
             Arduino (D10) : Catodo del led 2
             Arduino (GND): Anodo del led 1, 2

             GRUPO 2
             Arduino (D9) : Catodo del led 3 
             Arduino (D6) : Catodo del led 4
             Arduino (GND): Anodo del led 3, 4
             
   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: Aporcentaje_1porcentaje_2 como AXXXYYY
                     Bporcentaje_3porcentaje_4 como BXXXYYY

   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, led_3 = 10, led_4 = 9; // Variable asignada al pin led 1, 2, 3 y 4
char data[8]; // Variable asignada al dato leido de un tamano de 8


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

  // Mensaje inicial
  Serial.println("Ingresar el dato como:");
  Serial.println("Aporcentaje_1porcentaje_2 o Bporcentaje_3porcentaje_4");
  Serial.println("Formato: AXXXYYY");
  Serial.println("Ejemplo: A010100 (10% y 100%)");
}

void loop() {
  if(Serial.available() > 0){ // Lectura del puerto mientras sigue abierto
    
    Serial.readBytes(data, 7); // Lee solo un dato de tamano 7
    String data_mod(data);     // Convierte el dato de char a string
    
    Serial.print("Dato original: "); Serial.println(data);       // Muestra del dato original 
    Serial.print("Dato convertido: "); Serial.println(data_mod); // Muestra del dato convertido 
    
    int caso, pwm_1, pwm_2; // Variables de almacenamiento de pwm;
    
    // Discriminacion del caso 1 o 2
    if(data_mod.startsWith("A", 0)){ caso = 1; }
    if(data_mod.startsWith("B", 0)){ caso = 2; }

    switch (caso) { // Seleccion del caso 1 o 2
    case 1:
      for (int i = 1; i <= 4; i++){ pwm_1 = data_mod.substring(1, i).toInt(); } // Lectura del punto 0 a 3
      for (int i = 4; i <= 7; i++){ pwm_2 = data_mod.substring(4, i).toInt(); } // Lectura del punto 3 al final

      // 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(" %");

      // Cambio de formato del dato de 0 - 100%, a 0 - 255
      pwm_1 = map(pwm_1, 0, 100, 0, 255); pwm_2 = map(pwm_2, 0, 100, 0, 255); 

      // Muestra del dato en pantalla
      Serial.print("PWM 1: "); Serial.println(pwm_1);
      Serial.print("PWM 2: "); Serial.println(pwm_2);

      // Salida PWM en el led de 0 a 255
      analogWrite(led_1, pwm_1); analogWrite(led_2, pwm_2); 
    break;
    
    case 2:
      // Lectura y conversion del dato obtenido del porcentaje del pwm 1
      for (int i = 1; i <= 4; i++){ pwm_1 = data_mod.substring(1, i).toInt(); } // Lectura del punto 1 a 4
      for (int i = 4; i <= 7; i++){ pwm_2 = data_mod.substring(4, i).toInt(); } // Lectura del punto 4 al final

      // Muestra del dato del porcentaje de PWM 1 y 2
      Serial.print("Procentaje 3: "); Serial.print(pwm_1); Serial.println(" %");
      Serial.print("Procentaje 4: "); Serial.print(pwm_2); Serial.println(" %");

      // Cambio de formato del dato de 0 - 100%, a 0 - 255
      pwm_1 = map(pwm_1, 0, 100, 0, 255); pwm_2 = map(pwm_2, 0, 100, 0, 255); 

      // Muestra del dato en pantalla
      Serial.print("PWM 3: "); Serial.println(pwm_1);
      Serial.print("PWM 4: "); Serial.println(pwm_2);

      // Salida PWM en el led de 0 a 255
      analogWrite(led_3, pwm_1); analogWrite(led_4, pwm_2); 
    break;
    }
     
    while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial
  }
}
El resultado es el siguiente:





Autor: 

No hay comentarios:

Publicar un comentario