Los pines digitales PWM (Pulse width modulation) de Arduino nos permiten enviar señales eléctricas mediante la modulación de pulsos, es decir, que podemos digamos “controlar” el voltaje que se envía a través de éstos.
Para entender el concepto de mejor manera veremos un ejemplo en el que controlaremos la intensidad del brillo de un led.
Antes que nada debemos saber reconocer los pines y esto lo hacemos mediantes el símbolo “~” que tienen a su izquierda tal y como se muestra en la imagen principal del post.
Como hemos visto en tutoriales pasados es posible encender un led con solo darle la instrucción “digitalWrite” con un estado de “HIGH” y apagarlo con un estado de “LOW”, esto sucede ya que cuando enviamos los estados HIGH Y LOW se realiza un envío de pulsos con señales de 5V y 0V respectivamente razón por la cual se encendía o se apagaba el led.
Lo interesante de los pines PWM es que podemos enviar señales intermedias entre 0v y 5v a través de una escala entre 0-255 tal y como veremos a continuación:
Conexión:
Código:
const int led=3;
void setup(){
pinMode(led, OUTPUT);
}
void loop(){
analogWrite(led, 0);
delay(1000);
analogWrite(led, 50);
delay(1000);
analogWrite(led, 150);
delay(1000);
analogWrite(led, 200);
delay(1000);
analogWrite(led, 255);
delay(1000);
}
En el código como funciones nuevas solo tenemos a “analogWrite” la cual solo necesita dos parámetros, uno el pin al que está conectado nuestro dispositivo (un led en nuestro caso) y como segundo un número entre 0 y 255 que representa la señal de voltaje a enviar como mencionaba anteriormente.
Resultado Final:
Efecto FadeIn
Tras ser posible el envío de señales eléctricas con valores intermedios podemos lograr un efecto conocido como “FadeIn” usando un par de bucles “for”.
En un bucle pasamos de 0 a 255 cada 20 milisegundos (para lograr apreciar el cambio) y otro en el que pasamos de 255 a 0 también cada 20 milisegundos.
Código:
const int led=3;
int brillo;
void setup(){
pinMode(led, OUTPUT);
}
void loop(){
for(brillo=0;brillo<256;brillo++){
analogWrite(led, brillo);
delay(20);
}
for(brillo=255;brillo>0;brillo--){
analogWrite(led, brillo);
delay(20);
}
}