TEORÍA: PWM y analogWrite

En esta práctica vamos a aprender un comando nuevo («analogWrite») que nos vale para controlar de cierta manera los pines digitales marcados con el símbolo ~ (PWM). Todo ello nos valdrá para controlar un led RGB. Este led tiene 3 colores que podemos combinar para conseguir una gama muy amplia de colores.

PWM

La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.

Las salidas digitales de el Arduino sólo tienen dos opciones: encendido (HIGH) y apagado (LOW). Sin embargo, si los encendemos y apagamos por ciclos muy cortos, podemos conseguir que, mediante esta reducción del tiempo en que están encendidos (ciclo de trabajo), puedan hacer funcionar un led o un motor a un porcentaje de su capacidad total.

Resultado de imagen de pwm

analogWrite

Esta instrucción sirve para escribir un pseudo-valor analógico utilizando el procedimiento de modulación por ancho de pulso (PWM) a uno de los pines de Arduino marcados como PWM.

analogWrite(pin, valor);    // escribe 'valor' en el 'pin'
                            // definido como analógico

Si enviamos el valor 0 genera una salida de 0 voltios en el pin especificado; un valor de 255 genera una salida de 5 voltios de salida en el pin especificado. Para valores de entre 0 y 255, el pin saca tensiones entre 0 y 5 voltios – cuanto mayor sea el valor, más a menudo estará a HIGH (5 voltios). Teniendo en cuenta el concepto de señal PWM , por ejemplo, un valor de 64 equivaldrá a mantener 0 voltios de tres cuartas partes del tiempo y 5 voltios a una cuarta parte del tiempo; un valor de 128 equivaldrá a mantener la salida en 0 la mitad del tiempo y 5 voltios la otra mitad del tiempo, y un valor de 192 equivaldrá a mantener en la salida 0 voltios una cuarta parte del tiempo y de 5 voltios de tres cuartas partes del tiempo restante.

PRÁCTICA 1 (5PTS)

Este es el esquema de cableado.

Esta es la manera correcta de conectar el led: La patilla más larga al negro. Una vez conectada esa conecto el resto.

Resultado de imagen de rgb led

Y este es el código. Deberías poder ver como el LED cambia de color suavemente de uno a otro.

// Define Pins
#define RED 3
#define GREEN 5
#define BLUE 6

#define delayTime 10 // fading time between colors


void setup()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
digitalWrite(RED, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, HIGH);
}

// define variables
int redValue;
int greenValue;
int blueValue;


// main loop
void loop()
{
redValue = 255; // choose a value between 1 and 255 to change the color.
greenValue = 0;
blueValue = 0;

analogWrite(RED, 0);
delay(1000);

for(int i = 0; i < 255; i += 1) // fades out red bring green full when i=255
{
redValue -= 1;
greenValue += 1;
analogWrite(RED, 255 - redValue);
analogWrite(GREEN, 255 - greenValue);
delay(delayTime);
}

redValue = 0;
greenValue = 255;
blueValue = 0;

for(int i = 0; i < 255; i += 1) // fades out green bring blue full when i=255
{
greenValue -= 1;
blueValue += 1;
analogWrite(GREEN, 255 - greenValue);
analogWrite(BLUE, 255 - blueValue);
delay(delayTime);
}

redValue = 0;
greenValue = 0;
blueValue = 255;


for(int i = 0; i < 255; i += 1) // fades out blue bring red full when i=255
{
redValue += 1;
blueValue -= 1;
analogWrite(RED, 255 - redValue);
analogWrite(BLUE, 255 - blueValue);
delay(delayTime);
}
}





PRÁCTICA 2 (5PTS)

Debes modificar el programa que hay abajo para que funcione como un semáforo (ROJO luego VERDE y luego ÁMBAR), como en la práctica anterior pero sólo con un led que haga la función de los anteriores. Con el analogWrite tienes que dar una intensidad (de 0 a 255) a cada uno de los colores para conseguir el color objetivo, mezclándolos.

Por ejemplo: para conseguir el color amarillo debo poner el rojo y el verde al máximo (255) y el azul al mínimo (0). Puedes ampliar conocimientos sobre el sistema RGB aquí.

Para esto es importante que entiendas cómo funciona analogWrite sobre las clavijas que aceptan PWM.

En la siguiente plantilla se configura para que el LED luzca rojo (primer paso del semáforo)

// Defino los pines donde está conectado el led rgb
#define RED 3
#define GREEN 5
#define BLUE 6

// Defino los modos de los pines, todo output (de salida, son luces)
void setup()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
}

// loop principal. Lo único que he hecho es encender el rojo (255 valor máximo) y apagar los otros dos (0 valor mínimo). Ahora debes construir los siguientes estados (ámbar y rojo) y tiempos de espera
void loop()
{

analogWrite(GREEN,0);

analogWrite(BLUE, 0);

analogWrite(RED, 255);

delay(1000);

}

Práctica 4 – LED RGB, PWM y analogWrite

Deja una respuesta

Tu dirección de correo electrónico no será publicada.