Entrada Analogica y Salida PWM

En este nuevo proyecto vamos a aprender  utilizar las entradas analógicas de nuestro pequeño Arduino Uno para utilizarla en dos ejemplos, primero variaremos la frecuencia de parpadeo de un diodo LED con un potenciómetro conectado a una entrada analógica y luego utilizaremos el mismo circuito para realizar una modulación del ancho de un pulso en una salida digital (PWM).

En el siguiente video podemos ver el resultado final de los dos ejemplos…

Material necesario para este proyecto:

 

Parte2:DiseñandoelHardware…

En este proyecto Arduino vamos a realizar dos ejemplos con un mismo circuito, la diferencia entre ellos la observaremos es el apartado de programación, en cuanto a hardware tenemos la novedad de este proyecto en el uso de un potenciómetro combinado con una entrada analógica, así que primero aclararemos unos conceptos.

¿Qué es un potenciómetro?

Un potenciómetro es una resistencia de tipo variable con tres patillas, entre las dos de sus extremos tendremos siempre una resistencia fija dada por del valor máximo de nuestro potenciómetro, pero entre cualquiera de esos extremos y la patilla central obtendremos la variación de resistencia, tenéis disponible un tutorial sobre este componente AQUI.

En este proyecto, vamos a utilizar el potenciómetro como un divisor de tensión, primero veamos como se conecta para que esto sea posible.

Como podemos ver, debemos colocar uno de los extremos a masa, otro a +Vcc y nuestra patilla central será nuestra tensión de salida regulable, esta salida será la que conectemos a Arduino y que variará de 0v a 5v dependiendo de la posición de nuestro potenciómetro.

Podemos ver la variación de tensión en el siguiente video:

Si estamos utilizando un Arduino Uno, las entradas analógicas vienen identificadas desde A0 hasta A5 como podemos ver en la siguiente imagen:

En cuanto a la salida, colocaremos la ya conocida configuración de LED más resistencia, pero deberemos tener algo en cuenta, para el primer ejemplo nos daría igual la salida digital  a elegir, pero para el segundo es necesario que seleccionemos una salida con PWM, si tenéis un Arduino Uno, las salidas serán la 3, 5, 6, 9, 10 y 11 como se puede ver en la siguiente imagen:

Pero.. ¿Qué es el PWM?

A menudo necesitaremos algo más que una señal de 0 o 1 en nuestros proyectos, para variar la velocidad de giro de un motor, para variar la intensidad con la que luce un diodo, para transmitir los grados de giro de un servo, etc..

Para todo esto, y mucho más, nos servirá el PWM, que emula una señal analógica a partir de una señal digital.

Las siglas PWM vienen de Pulse Width Modultation, o Modulación de Ancho de Pulso.

Lo que hace este tipo de señal es emitir, en lugar de una señal continua en nuestra salida, emite una serie de pulsos que podremos variar su duración pero con una frecuencia constante de aproximadamente 490Hz, de manera que la tensión promedio resultante, es directamente proporcional a la duración de estos dentro del rango de nuestro periodo, es decir, cuanto más juntos estén esos pulsos de +5v, mayor será la tensión promedio de nuestra salida, y cuanto más distantes sean estos, menor será dicha tensión:

Veamos un video del PWM en acción, observar como se corresponde la intensidad lumínica del LED con el ancho de pulso observado en el osciloscopio:

La manera de controlar el nivel de salida en nuestro Arduino, la podremos ver en la sección de programación de este tutorial.

El montaje nos quedaría así en nuestra protoboard:

Aquí podemos ver en detalle el esquema eléctrico:

El circuito en si mismo es muy sencillo, pero en el apartado de programación podremos ver la versatilidad del mismo para diferentes aplicaciones, así que no esperemos más…

Parte 3: Programando…

El primer ejemplo que vamos a tratar es la adquisición de datos en la entrada analógica A0 para variar la frecuencia de parpadeo de un diodo LED conectado a una salida digital cualquiera, veamos el código al completo:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

/*

 Tutorial # 0003 Arduino Academy - Entrada analógica

 

 Funcionamiento de las entradas analógicas configurando

 el pin analógico A0 para tomar datos de una señal.

 Esta toma de datos es utilizada para variar la velocidad

 de parpadeo de un diodo LED conectado a la salida digital 9.

 

 Este proyecto es de dominio público.

 */

 

int pinSensor = A0;    // Entrada para el potenciómetro.

int pinLed = 9;        // Seleccionamos pin para el Led.

int valorSensor = 0;   // variable para el valor del sensor.

 

void setup() {

  // Declaramos el pin del Led como salida:

  pinMode(pinLed, OUTPUT);

}

 

void loop() {

  // Leemos el valor del sensor y lo almacenamos:

  valorSensor = analogRead(pinSensor);

  // encendemo el diodo LED:

  digitalWrite(pinLed, HIGH);

  // Detenemos el programa durante <valorSensor> milisegundos:

  delay(valorSensor);

  // Apagamos el diodo Led:

  digitalWrite(pinLed, LOW);

  // Detenemos el programa durante <valorSensor> milisegundos:

  delay(valorSensor);

}

En este programa tenemos como novedad la siguiente instrucción:

1

analogRead(pinSensor)

Esta instrucción nos permite leer cualquier sensor que conectemos al pin analógico establecido en “pinSensor”, por defecto, nuestra placa Arduino nos realizará una conversión analógico-digital para toda señal (40mA máximo) de 0v a 5v con una resolución de 10 bit, lo que nos da 210 (1024) valores de referencia para nuestro programa, siendo 0 en 0v y 1024 en +5v, en posteriores ejemplos veremos como ese rango de tensión en el que se realizan las mediciones se puede variar para que, por ejemplo, empiece a lanzarnos valores a partir de 2,2v.

Con esto, y observando un poco el programa, podemor ver que el intervalo entre encendido y apagado de nuestro diodo LED podrá variar entre 0 y 1024 milisegundos, si quisiéramos aumentar más el tiempo de los intervalos podríamos aplicar alguna operación matemática al valor de nuestro sensor, por ejemplo, si añadiéramos la línea de código que se puede observar debajo de la toma de datos del sensor obtendríamos un incremento del tiempo cuatro veces mayor:

1

2

3

// Leemos el valor del sensor y lo almacenamos:

valorSensor = analogRead(pinSensor);

valorSensor = valorSensor*4;

Sin variar el circuito, vamos a introducir un nuevo código para realizar un ejemplo diferente, en este proyecto, nuestro diodo LED variará su intensidad lumínica en función del valor que esté aportando el potenciómetro a nuestra entrada analógica, esto es el llamado efecto fading (desvanecimiento), puede observarse que se ha elegido la salida número 9, ya que esta sí que es compatible con la opción PWM como se explica algo más arriba.

Veamos el código al completo:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

/*

 Tutorial Arduino # 0003 - Efecto Fading

 

 En este tutorial, mostramos como se desvanece un LED

 en función del valor recogido en un entrada analógica.

 

 Este proyecto es de dominio público.

 */

 

int pinSensor = A0;    // Entrada para el potenciómetro.

int pinLed = 9;        // Seleccionamos pin para el Led.

int valorSensor = 0;   // variable para el valor del sensor.

 

void setup() {

  pinMode(pinLed, OUTPUT); // Establecemos el pin como salida.

}

 

void loop() {

  // Leemos el valor del sensor y lo almacenamos:

  valorSensor = analogRead(pinSensor);

  // Establecemos el valor analógico para la salida PWM

  analogWrite(pinLed, valorSensor / 4);

  // Detenemos el programa durante 30 milisegundos:

  delay(30);

}

Podemos observar una nueva instrucción:

1

analogWrite(pinLed, valorSensor / 4);

Esta será la instrucción que nos permitirá emular una señal analógica a partir de una digital en nuestros circuitos, como explicaba algo más arriba.

El rango de salida de esta instrucción varia de 0 a 255, siendo 0 = 0v y 255 = 5v, por lo que es tan sencillo como introducir un valor determinado para la tensión de salida que nosotros queramos conseguir, si quisiéramos conseguir 2,5v el valor a asignar sería 127.

Así que lo único que debemos hacer es transformar mediante una simple operación matemática la señal tomada en nuestro potenciómetro para adaptarla a nuestra salida PWM.

Como hemos visto en el ejemplo anterior, los niveles de entrada son de 0  a 1024, y si los niveles de salida, deben ser de 0 a 255… Os dejo a vosotros la deducción, y la línea de código por si no caéis en cuenta.

1

analogWrite(pinLed, valorSensor / 4);

Esta es una manera algo tosca para realizar esta conversión, más adelante veremos como hay una instrucción que hace esto por nosotros.