En este proyecto por primera vez vamos a utilizar los pines de entrada analógicos y los pines de salida PWM de nuestro Arduino.
¿Qué es PWM?
En términos muy sencillos un pin de entrada analógico es un pin que puede tomar cualquier valor entre un rango de tensiones por ejemplo en nuestro caso con el Arduino puede tomar cualquier valor entre 0V y 5V, podría ser 1,35V o 4,31V, etc., recordemos que los puertos digitales o valen 0V o valen 5V .
Ahora veamos el PWM, esto es modulación por ancho de pulsos (Pulse-width Modulation) y en términos muy sencillos es como controlamos la tensión de salida por un pulso.
El PWM es una técnica utilizada para codificar el nivel de una señal análoga en una digital, los computadores y microcontroladores no tienen salidas analógicas pero utilizando un «truco» en el cual activamos una salida digital durante un tiempo y luego se mantiene apagada el resto, esto nos da que el promedio de la tensión de salida, sera equivalente al valor que deseamos de forma analógica.
Vamos a hacer un poco mas prácticos, el Arduino maneja tensiones de salida en sus pines digitales de 5 voltios, si quisiéramos una tensión de 3V deberíamos encender la salida durante 60% con 5V y luego con 0V el 40% restante del tiempo. O si queremos 2,5V el Duty cylce dería del 50% on y 50% off, lo que nos daría un brillo medio en el caso del LED.
Los Arduino tienen varias salidas digitales marcadas con la virgulilla «~», lo que nos indican que son salidas PWM, estas salidas son salidas PWM con resolución de 8bits (256), es decir que puede tomar valores entre el 0 y el 255 para su Duty cycle.
Modelo | Pines |
UNO | 3,5,6,9,10,11 |
Mini | 3,5,6,9,10,11 |
Nano | 3,5,6,9,10,11 |
Mega | 2,3,4,5,6,7,8,9,10,11,12,13,44,45,46 |
Due | 2,3,4,5,6,7,8,9,10,11,12,13 |
Cómo lo dije en las publicaciones iniciales, no me voy a enfocar mucho en terminologías y conceptos avanzados en la electrónica, por lo que solo tocaré la superficie de estos mismos para poder tener un panorama general del funcionamiento del proyecto.
Componentes
- Arduino UNO o placa compatible
- Protoboard o placa de pruebas
- 1 LED
- 1 Resistencia de 220Ω
- Potenciómetro
- Cables o jumpers
En el diagrama anterior podemos ver claramente las conexiones que debemos hacer para nuestro proyecto , lo primero es tomar el potenciómetro y conectamos el primer pin al negativo del circuito, el segundo al pin A0 del Arduino, luego el tercer pin del potenciómetro al positivo.
Por último veremos la conexión de nuestro LED, lo primero es que conectamos la resistencia desde el cátodo hasta el GND del circuito y el ánodo al pin 11 del Arduino.
Código
int pinPotenciometro=0; int pinLed=9; int val=0; void setup() { pinMode(pinLed,OUTPUT); Serial.begin(9600); } void loop() { val=analogRead(pinPotenciometro); Serial.println(val); analogWrite(pinLed,val/4); delay(10); }
Explicación del código
El código anterior es realmente sencillo, no hay que incluir ninguna librería y declararemos las variables:
int pinPotenciometro=0; int pinLed=9; int val=0;
Al inicio del código comenzamos declarando 3 variables. La primera es pinPotenciometro=0
del tipo entero (int) la cual utilizaremos para definir que el pin de entrada analógica A0 es la que vamos a utilizar para capturar el valor del potenciómetro, luego pinLed=9
del tipo entero, que utilizaremos para definir el pin de salida que utilizará el led. Por último la variable val=0
de tipo entero, que utilizaremos más adelante para capturar el valor que nos entrega el potenciómetro, tengamos en cuenta que este valor irá del 0 al 1023.
Función setup()
pinMode(pinLed,OUTPUT); Serial.begin(9600);
Aquí vemos sólo dos líneas muy sencillas, primero vemos que declaramos el pinLed como un pin de salida con la línea pinMode(pinLed,OUTPUT)
y con Serial.begin(9600)
inicializamos el puerto serial con una velocidad de 9600 baudios, que utilizaremos mas adelante para ver el valor de captura del pin A0 a través del monitor serie.
Función loop()
val=analogRead(pinPotenciometro); Serial.println(val); analogWrite(pinLed,val/4); delay(10);
Tomamos la variable val y le asignamos el valor de la lectura del pin del potenciómetro val=analogRead(pinPotenciometro)
, luego imprimimos en el monitor serial el valor de la variable val Serial.println(val)
.
Para la siguiente línea tenemos que entender un par de factores, primero no olvidemos que la entrada analógica puede ir desde 0 hasta 1023, es decir un total de 1024 valores posibles y la salida PWM solo devuelve valores desde 0 hasta 255, es decir 256 valores, lo que es una cuarta parte de 1024, por lo que dividiremos el valor de captura del potenciómetro entre 4 y así lo asignaremos al pin del LED. Como lo vemos en analogWrite(pinLed,val/4)
. Por último hay una pausa 10 milisegundos antes de volver a comenzar el loop.
Resultado
Al mover el potenciómetro podremos ver cambios en la intensidad del brillo del LED y en el monitor serial podremos ver los valores que nos esta dando el potenciómetro, entre más alto el valor por el monitor serial, más alto será el brillo del LED,
Muy buena información, me ha ayudado a entender como sirve y sus funciones. Me gustaria saber más de las otras entradas y salidas (tanto digitales como analogicas)
Hola Ariadna.
La idea de las publicaciones es que las personas vayan aprendiendo sobre el uso de los diferentes pines que tiene el Arduino, como por ejemplo este proyecto 5 se aprende a manejar un pin que puede ser de entrada o salida digital y que a su vez sirve como salida PWM.
En el Arduino básicamente tienes pines digitales de entrada y salida, pines de entrada análogos (que también se pueden utilizar como pines digitales), algunos de estos pines tienen capacidades PWM. Pero el arduino puede usar esos pines con potocolos como el I2C, SPI, etc.
Si quieres ampliar alguno de esos conceptos, no dudes en preguntarme por este medio y te colaboro.