Tutorial - Comunicación serial: Parte 2 (Envío y recepción de datos) / Stream y Pull mode

Para el siguiente experimento simularemos un sistema Stream y Pull. Cuando usamos el modo Stream los datos de un potenciómetro y PWM se leerán en tiempo real, mientras podemos ingresar el valor de un PWM nuevo para ser enviado al Arduino. En caso del modo Pull, el dato del potenciómetro puede ser pedido cuando desee el usuario, y de la misma manera que con el PWM.

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 : Ánodo
# PIN A0 : Arduino UNO => Potenciómetro : Pin central
# 5V : Arduino UNO => Potenciómetro : Extremo
# GND : Arduino UNO => LED: Cátodo => Potenciómetro : Extremo


El programa usado para el Arduino es el que se muestra:
/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
   CONEXION:
             Arduino (D11) : Anodo del led (pin positivo)
             Arduino (GND) : Catodo del led (pin negativo), extremo del potenciometro
             Arduino (A0)  : Pin central del potenciometro
             Arduino (5V)  : Extremo del potenciometro
     
   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) y lee a la vez el potenciometro que va
   al pin A0 de Arduino y lo convierte de 0 a 5V. Con dos modos: Stream y pull mode

   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 = 11; // Variable asignada al pin led
int data, mod = 0, pwm = 0; // Variable de almacenamiento del dato por puerto serial, pwm y seleccion de modo
int det = 0; // Determinante para desentascamiento

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

  // Mensaje inicial 
  Serial.println("MODOS:");
  Serial.println("Stream mode: Ingresar 'S' ");
  Serial.println("             PWM: Ingresar 'pxxx' (xxx: valor de 0 a 100) ");
  Serial.println("Pull mode: Ingresar 'P' ");
  Serial.println("           Lectura potenciometro: Ingresar 'l' ");
  Serial.println("           PWM: Ingresar 'pxxx' (xxx: valor de 0 a 100) ");
}

void loop() {
  if(Serial.available()){  // Lectura del puerto mientras sigue abierto
    if (Serial.peek() == 'S'){ // Detecta la letra S para ingresar al modo Stream
      mod = 1; // Flag de seleccion de modo
      Serial.println("Stream mode..."); // Mensaje inicial
      delay(1000);
    }
    else if(Serial.peek() == 'P'){ // Detecta la letra P para ingresar al modo Pull
      mod = 2; // Flag de seleccion de modo
      Serial.println("Pull mode..."); // Mensaje inicial
      delay(1000);
    }
    while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial
  }

  modos(); // Ingreso a la funcion de modos
}

void modos(){ // Funcion de modos Stream y Pull
  switch (mod){
    case 1:             // Caso 1: Modo Stream
      while (mod == 1){ // Mantiene en el modo Stream
        envio_pwm();    // Funcion de lectura y envio de PWM
        lectura_pot();  // Funcion de lectura de potenciometro
        delay(500);

        // Lectura del valor de PWM y muestra en monitor serial
        Serial.print("PWM: "); Serial.println(pwm);

        if (Serial.peek() == 'P'){ // Deteccion de cambio a modo Pull
          mod = 2; // Flag de seleccion de modo
          Serial.println("Pull mode..."); // Mensaje inicial
          delay(1000);
        }

        desentascamiento(); // Algoritmo de desentascamiento
      }
    break;
    
    case 2:              // Caso 2: Modo Pull
       while (mod == 2){ // Mantiene en el modo Pull
         envio_pwm();    // Funcion de lectura y envio de PWM
         
         if (Serial.peek() == 'l'){ // Deteccion para funcion de lectura de potenciometro 
           lectura_pot(); // Funcion de lectura de potenciometro
           break;         // Salto para evitar bucle infinito
         }
         if (Serial.peek() == 'S'){ // Deteccion de cambio a modo Stream
           mod = 1; // Flag de seleccion de modo
           Serial.println("Stream mode..."); // Mensaje inicial
           delay(1000);
         }

         desentascamiento(); // Algoritmo de desentascamiento
       }
    break;
  }
}

void lectura_pot(){
  int pot = analogRead(A0);             // Lecutra del potenciometro
  float pot_mod = pot * (5.0 / 1023.0); // Conversion de 0 - 1023 bits a 0 - 5V en decimales
  
  // Muestra del potenciometro por pantalla
  Serial.print("Voltaje: "); 
  Serial.println(pot_mod); 
}

void envio_pwm(){
  if (Serial.peek() == 'p'){         // Deteccion de la letra p para ingresar valor de PWM
    data = Serial.parseInt();        // Extraccion del integer del dato leido
    pwm = map(data, 0, 100, 0, 255); // Cambio de formato del dato de 0 - 100%, a 0 - 255
  
    // Muestra del dato en pantalla
    Serial.print("Porcentaje: "); Serial.print(data); Serial.println(" %");
    Serial.print("PWM: "); Serial.println(pwm);
    
    analogWrite(led, pwm); // Salida PWM en el led de 0 a 255
  }
}

void desentascamiento(){ // Algoritmo de desentascamiento
  if (Serial.available() > 0){det++;} // Deteccion de caracteres en el buffer
    else {det = 0;}   // Reseteo del contador de deteccion
    while (det > 1) { // Limpieza del buffer por entascamiento
      Serial.read();  
      if (Serial.available() == 0){det = 0;} // Reseteo del contador de deteccion
    }  
}
Los resultados son los siguientes:












Autor: 

No hay comentarios:

Publicar un comentario