En este artículo vamos a ver como utilizar una salida PWM con arduino para cuando necesitemos una salida analógica en nuestro proyecto.
En la publicación anterior, aprendimos a usar las entradas analógicas con arduino y a leer un potenciómetro.
Hay ocasiones en el diseño de un proyecto, que no tenemos suficiente con una salida digital en la que estamos limitados a dos estados lógicos 1 ó 0 . Con este tipo de salidas podremos controlar el encendido o apagado de el circuito conectado a la salida pero… ¿Que hacemos si tenemos que controlar el brillo de un LED o la velocidad de un motor?
Para estos casos, tenemos las salidas PWM.
Como funcionan las salidas PWM con Arduino.
Tenemos que tener en cuenta que las salidas PWM en arduino son una aproximación o emulación de una salida analógica real. La mayoría de los sistemas digitales de coste económico como es el caso de Arduino, no pueden generar una salida analógica real ya que incorporar esta característica encarecería el microprocesador.
Para poder disponer de una salida analógica, usamos una digital y la hacemos trabajar de manera que nos haga una aproximación de una analógica. El sistema consiste en realizar una variación del estado de esa salida entre 0 y 1 muy rápido y además, controlar el tiempo que permanece en estado alto o 5V. De esta manera, al controlar el tiempo que tenemos la salida activa o a 0, nos dará un termino promedio a lo largo del tiempo que será la tensión analógica que pretendemos tener en esa salida.
En conclusión, una salida PWM (Pulse Whith Modulation) o modulación por ancho de pulso, consiste en una señal de una determinada frecuencia (normalmente 490 Hz), a la que modificamos su ciclo de trabajo (tiempo que permanece en estado 1) y tenerla a 0 el resto, para que la media de voltaje a lo largo del tiempo nos de el valor que buscamos.
En el esquema podemos ver la señal PWM en 3 ciclos de trabajo distintos (Duty Cycle) 10%, 50% y 90%. Como se puede ver, la frecuencia de la señal es la misma (tiempo entre pulsos), pero la anchura del pulso Dutty cycle, la podemos cambiar y por lo tanto la tensión media de la salida será la representada por la línea roja.
Control de intensidad de un led con salida PWM.
Bueno, después de la teoría pasemos a la práctica con un sencillo montaje:
Aprovecharemos el montaje del potenciómetro del articulo anterior y le añadiremos un led a la salida 9 de nuestro arduino que esta marcada como PWM
Observar que no todas las salidas tienen la opción de usarse como PWM, el arduino tiene 6 y todas están marcadas con el símbolo ∼ en la placa.
El proyecto quedará así:
El funcionamiento consiste en regular la intensidad de iluminación del led conectado al pin 9, mediante el giro del potenciómetro conectado a la entrada analógica A0. Simultáneamente podremos ver los valores leídos y enviados a través del puerto serie.
El programa que tendremos que cargar en el arduino, lo encontraremos en los ejemplos: Archivos-Ejemplos-03.Analog-AnalogInOutSerial
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* Analog input, analog output, serial output Reads an analog input pin, maps the result to a range from 0 to 255 and uses the result to set the pulsewidth modulation (PWM) of an output pin. Also prints the results to the serial monitor. The circuit: * potentiometer connected to analog pin 0. Center pin of the potentiometer goes to the analog pin. side pins of the potentiometer go to +5V and ground * LED connected from digital pin 9 to ground created 29 Dec. 2008 modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. */ // These constants won't change. They're used to give names // to the pins used: const int analogInPin = A0; // Analog input pin that the potentiometer is attached to const int analogOutPin = 9; // Analog output pin that the LED is attached to int sensorValue = 0; // value read from the pot int outputValue = 0; // value output to the PWM (analog out) void setup() { // initialize serial communications at 9600 bps: Serial.begin(9600); } void loop() { // read the analog in value: sensorValue = analogRead(analogInPin); // map it to the range of the analog out: outputValue = map(sensorValue, 0, 1023, 0, 255); // change the analog out value: analogWrite(analogOutPin, outputValue); // print the results to the serial monitor: Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output = "); Serial.println(outputValue); // wait 2 milliseconds before the next loop // for the analog-to-digital converter to settle // after the last reading: delay(2); } |
Para usar la salida PWM, usaremos la instrucción analogWrite(Pin,valor)
El valor que podemos mandar a la salida tiene que ser un número entre 0-255. Por lo tanto tenemos 255 niveles diferentes que podemos escribir en el pin 9.
La lectura del potenciómetro conectado a A0 nos dará un valor entre 0-1023 ya que la entrada analógica tiene mas resolución.
Será necesario hacer una adaptación (mapeado) de la entrada a la salida y esto lo haremos con la instrucción map(valor, fromLow, fromHigh,toLow,toHigh)
Como vemos en la línea 39, adaptamos la variable leída del potenciómetro, sensorValue, que tenia valores en el rango 0-1023, a valores entre 0-255 y los guardamos en outputValue, para poderlos sacar en el pin 9.
Igualmente enviamos los valores por el puerto serie para poder verlos en la ventana del monitor serie.
Como veis, las salidas PWM con arduino son muy útiles y necesarias cuando necesitamos regular el funcionamiento de algo conectado a nuestras salidas, haciendo variar la tensión de la misma.
Puedes ir a este enlace para conseguir todos los componentes necesarios, arduino y otras herramientas para poder montar este y otros muchos proyectos que publicaré en futuros artículos.
Próximamente publicaré un articulo donde es fundamental el uso de las señales PWM, el control de servos.
Hasta luego…

Recibe los artículos directamente en tu email el día de la publicación.
Garantía 100% libre de spam.
What’s up, yes this article is truly good and I have learned lot of things from it concerning blogging.
thanks.
You’re welcome Beatrice
Hola Paco.
Estoy con el capitulo «PWM con Arduino. Salidas analógicas.» intentando controlar aquel LED.
¿que resistencia hay que usar? he probado varias pero no me va.
Un saludo
Hola Pascal:
Con una resistencia de 220 a 500 ohm. te irá bien, a mas resistencia menos luminosidad.
como harías (programa arduino)para controlar (velocidad) efecto desvanecimiento y aumento (progresivo) del brillo de un led…,gracias
Hola Daniel:
yo lo plantearía con un bucle en el que la variable que uses sea outputValue y el bucle vaya de 0 a 255 así la intensidad del led irá aumentando hasta el máximo (intercala un delay porque sino lo hará demasiado rápido). A continuación programas otro bucle igual pero que empiece en 255 hasta 0 para apagarlo.
Un saludo.