logo

Tutorial Arduino - Proyecto 0003


# 0003 - Entrada Analógica y Salida PWM

Bienvenidos a un nuevo tutorial básico sobre Arduino con el que podremos exprimir al máximo nuestro STARTER-KIT o LAB-KIT!.

  • Nivel: Básico
  • Coste: < 25 €
  • Tiempo: 15′

Parte 1: ¿Qué vamos a hacer?

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:

 

Parte 2: Diseñando el Hardware…

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:

/*
 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:

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 1023 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 1023 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:

  // 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:

/*
 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:

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 1023, 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.

 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.

Bueno, eso es todo por el momento!!

Si necesitáis algún tipo de aclaración no dudéis en dejar un comentario!!

Hasta pronto!!!

Pablo Murillo. Técnico electrónico apasionado por la tecnología y el mundo de la impresión 3D. Comprometido en difundir el movimiento maker en cualquiera de sus vertientes. Fundador de Arduteka.com Colaborador en Arduino.cc
  1. Pingback: El Servomotor | ARDUINO ACADEMY

  2. Gatoloco65 Responder

    Gracias por tan buenos tutoriales, me han ayudado a entender mejor y de una manera ordenada el funcionamiento y programación de la placa Arduino.

  3. Gatoloco65 Responder

    No comprendía, el delay(30); en el ejemplo “Efecto Fading”, pues si no colocaba esa declaración aparentemente no ocurría nada; fui aumentando poco a poco el tiempo y pude ver como empezaba a cambiar el comportamiento de lectura del sensor.

  4. miguel Responder

    super bueno los tutoriales muchas gracias
    muchos exitos :D

  5. Pingback: Arduteka » Arduteka, tu espacio web donde aprender a realizar proyectos Arduino desde cero, tutoriales, noticias, componentes y mucho más!

  6. Pingback: Comparative: Push Buttons, Arcade Buttons and Keypads

  7. Pingback: Comparativa - Pulsadores para proyectos » Arduteka

  8. Pingback: Tutorial Arduino #0006 - El Chupitometro

  9. Leandro Responder

    muy bueno el aporte gracias, tambienqueria saber si podes llegar a saber algo de conectar sensores piezoelectricos a la placa arduino como para fabricar una bateria electronica y si tendrias algun esquema de conexion muchisimas gracias y muy buenos aportes saludos

    • Pablo Murillo Responder

      Hola!

      Échale un ojo a esto a ver si te sirve.

      http://www.arduino.cc/es/Tutorial/KnockSensor

      Un saludo!!

      • Leandro Responder

        muchas gracias por la respuesta lo voy a probar.
        En lo que estoy trabado ahora es con el hit hat de la bateria electronica si alguien tendria algun esquema sencillo de como hacerlo me ayudaria mucho en mi proyecto saludos y muchas gracias!!!!!

  10. nicko Responder

    muy bueno siempre los tutos…. este en particular me abre una puerta para un proyecto que quiero empezar…. en cuanto tenga algo lo comparto. muchas gracias

  11. Txibu Responder

    Gracias por los tutoriales, són geniales para inciarse. Una pregunta, al ser una resolución de 10bits, 1024 posibles valores, el rango no sería de 0 a 1023? Quizá se os haya colado un error en el artículo

  12. Pingback: Comparativa - El diodo LED » Arduteka

  13. juan carlos Responder

    Genial. Un tutorial fantástico. Muchas gracias.

  14. Pedro Aldo Responder

    Hola que tal excelente tutorial me abrio el panorama, pero tengo una duda y problema, estoy trabajando con un cicuito de sensor infrarrojo y me arroja un valor maximo de 4V obviamente cuando coloco algo entre el led y el fotodetector el voltaje disminuye y necesito que Arduino me lea este voltaje para yo poder transferir a processing y ya mostrarlo mas graficamente. Pero no logro comprender como hacerlo, como logro que Arduino lea un valor de voltaje y lo conserve tal cual para yo llamarlo desde processing. Agradeceria tu respuesta. Saludos

    • Pablo Murillo Responder

      Hola, en este tutorial se hace exactamente eso, no? Capturamos la variación de tensión por una entrada analógica, y la mandamos a una variable, luego esa variable ya la puedes tratar como tu quieras.

  15. Claudia Pincheira Responder

    Excelentes tutoriales! me han servido mucho para empezar a interactuar con mi placa Arduino.
    Creo haber encontrado un typo en el artículo, cuando dices “…con una resolución de 10 bit, lo que nos da 210 (1024) valores…” creo que debe decir 2^10 y no 210.

    Muchas gracias por los aportes! Están buenísimos!

    • Pablo Murillo Responder

      Umm.. a mi me sale bien! Pero gracias!

      • Caresth Responder

        A mí también me sale 210 (W7, Firefox), le dí un par de vueltas y luego tiré para adelante y seguí leyendo. Es lo que tiene ser un poco patán, no entiendes pero sigues, a ver si luego lo pillas XD

  16. Ludwing Responder

    Gracias!!!!!!

  17. Antonio Ranea Responder

    Hola Pablo, lo primero que quiero es dar la gracias por las explicaciones sirven de mucha ayuda, yo soy un novato en esto y estoy empezando a realizar cosas con mi Mega 2560. El ejemplo de atenuar la intensidad me ha gustado una preguntilla por que se ponen los 30 milisegundos de retraso para que sirve este parametro, un saludo y gracias de antemano.

    • Pablo Murillo Responder

      Hola!

      Es simplemente para que la velocidad de cada ciclo (loop) se reduzca un poco, puedes probar a quitarlo y ver que pasa! ;)

      Un delay, no es más que: Espera X milisegundos sin hacer nada.

      Un saludo!!

  18. lauranadelrio Responder

    Buenos dias

    estoy intentando iniciarme en arduino,pero se ve que soy muy torpe,,sigo los manuales pero esque hay muchas que no entiendo como esto:

    http://www.arduteka.com/wp-content/uploads/2011/11/Proyecto-Arduino-0003-Protoboard.jpg

    veo la representacion,pero no entiendo como siguen los cables,,aparecen por un lado,,desaparecen,aparecen por otro lado,nose si son el mismo cable o esque hay que pinchar otro,,please una ayuda a esta aprendiz!!

  19. RONAL JR. Responder

    muy bueno el tutorial me sacaste de un apuro, oye amigo y cual es esa instruccion que mensionas para hacer la conversion en lo que se refiere a la salida PWM, te lo agradeceria mucho…..gracias!!!

  20. jose Responder

    cual es la otra instrucion que mencionas al final del articulo???

  21. López Responder

    Hola! Muy buenos tutoriales, así parece fácil y todo. Sólo hay una cosa que no me queda clara: en este programa inicializas el pinLed ”pinMode(pinLed, OUTPUT);” pero no el pinSensor. ¿En qué casos declaras un pin como input/output en la función setup y en cuáles no?

  22. Santi Responder

    Excelente. Muy claro para los que estamos empezando con esto. Gracias

Déjanos un comentario!

*

captcha *