You are on page 1of 13

Buscar

INICIO

OPE N SOU RC E

I MPRE SI N 3D

N OTI C I A S

Y OU TU BE

C U RSOS Y TA L L E RE S

Tutorial Arduino # 0003 Entrada Analgica y Salida PWM


19 nov 2011

A RDUINO UNO, ENT RA DA A NA LGICA , LED, PROY ECT O, PW M, REIST ENCIA , T UT ORIA L

FORO

34
by Pablo Murillo

# 0003 - Entrada Analgica y Salida


PWM
Bienvenidos a un nuevo tutorial bsico sobre Arduino con el que podremos exprimir al
mximo nuestro STARTER-KIT o LAB-KIT!.
Nivel: Bsico
Coste: < 25
Tiempo: 15

Parte 1: Qu vamos a hacer?


En este nuevo proyecto vamos a aprender utilizar las entradas analgicas de nuestro
pequeo Arduino Uno para utilizarla en dos ejemplos, primero variaremos la frecuencia de
parpadeo de un diodo LED con un potencimetro conectado a una entrada analgica y luego
utilizaremos el mismo circuito para realizar una modulacin 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:


1 x Arduino Uno
1 x Diodo Led
1 x Resistencia 470
1 x Potencimetro 1K
1 x Protoboard
1 x Juego de cables

Parte 2: Diseando 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 programacin, en cuanto a hardware
tenemos la novedad de este proyecto en el uso de un potencimetro combinado con una
entrada analgica, as que primero aclararemos unos conceptos.
Qu es un pot encimet ro?

Un potencimetro es una resistencia de tipo variable con tres patillas, entre las dos de sus extremos tendremos siempre una resistencia fija dada por del
valor mximo de nuestro potencimetro, pero entre cualquiera de esos extremos y la patilla central obtendremos la variacin de resistencia, tenis
disponible un tutorial sobre este componente AQUI.
En este proyecto, vamos a utilizar el potencimetro como un divisor de tensin, 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 tensin de salida regulable, esta
salida ser la que conectemos a Arduino y que variar de 0v a 5v dependiendo de la posicin de nuestro potencimetro.
Podemos ver la variacin de tensin en el siguiente video:

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

En cuanto a la salida, colocaremos la ya conocida configuracin de LED ms resistencia, pero deberemos tener algo en cuenta, para el primer ejemplo nos
dara igual la salida digital a elegir, pero para el segundo es necesario que seleccionemos una salida con PWM, si tenis un Arduino Uno, las salidas sern 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 ms que una seal 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 ms, nos servir el PWM, que emula una seal analgica a partir de una seal digital.
Las siglas PWM vienen de Pulse Width Modultation, o Modulacin de Ancho de Pulso.
Lo que hace este tipo de seal es emitir, en lugar de una seal continua en nuestra salida, emite una serie de pulsos que podremos variar su duracin
pero con una frecuencia constante de aproximadamente 490Hz, de manera que la tensin promedio resultante, es directamente proporcional a la
duracin de estos dentro del rango de nuestro periodo, es decir, cuanto ms juntos estn esos pulsos de +5v, mayor ser la tensin promedio de
nuestra salida, y cuanto ms distantes sean estos, menor ser dicha tensin:

Veamos un video del PWM en accin, observar como se corresponde la intensidad lumnica 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 seccin de programacin de este tutorial.
El montaje nos quedara as en nuestra protoboard:

Aqu podemos ver en detalle el esquema elctrico:

El circuito en si mismo es muy sencillo, pero en el apartado de programacin podremos ver la versatilidad del mismo para diferentes aplicaciones, as que
no esperemos ms
Part e 3: Programando

El primer ejemplo que vamos a tratar es la adquisicin de datos en la entrada analgica A0 para variar la frecuencia de parpadeo de un diodo LED
conectado a una salida digital cualquiera, veamos el cdigo 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 analgica
Funcionamiento de las entradas analgicas configurando
el pin analgico A0 para tomar datos de una seal.
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 pblico.
*/
int pinSensor = A0;
int pinLed = 9;
int valorSensor = 0;

// Entrada para el potencimetro.


// Seleccionamos pin para el Led.
// 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 instruccin:


1

analogRead(pinSensor)

Esta instruccin nos permite leer cualquier sensor que conectemos al pin analgico establecido en pinSensor, por defecto, nuestra placa Arduino nos
realizar una conversin analgico-digital para toda seal (40mA mximo) de 0v a 5v con una resolucin 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 tensin 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 quisiramos aumentar ms el tiempo de los intervalos podramos aplicar alguna operacin matemtica al valor de nuestro sensor,
por ejemplo, si aadiramos la lnea de cdigo que se puede observar debajo de la toma de datos del sensor obtendramos 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 cdigo para realizar un ejemplo diferente, en este proyecto, nuestro diodo LED variar su intensidad
lumnica en funcin del valor que est aportando el potencimetro a nuestra entrada analgica, esto es el llamado efecto fading (desvanecimiento), puede
observarse que se ha elegido la salida nmero 9, ya que esta s que es compatible con la opcin PWM como se explica algo ms arriba.
Veamos el cdigo al completo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/*
Tutorial Arduino # 0003 - Efecto Fading
En este tutorial, mostramos como se desvanece un LED
en funcin del valor recogido en un entrada analgica.
Este proyecto es de dominio pblico.
*/
int pinSensor = A0;
int pinLed = 9;
int valorSensor = 0;

// Entrada para el potencimetro.


// Seleccionamos pin para el Led.
// variable para el valor del sensor.

void setup() {
pinMode(pinLed, OUTPUT); // Establecemos el pin como salida.
}

18
19
20
21
22
23
24
25

void loop() {
// Leemos el valor del sensor y lo almacenamos:
valorSensor = analogRead(pinSensor);
// Establecemos el valor analgico para la salida PWM
analogWrite(pinLed, valorSensor / 4);
// Detenemos el programa durante 30 milisegundos:
delay(30);
}

Podemos observar una nueva instruccin:


1

analogWrite(pinLed, valorSensor / 4);

Esta ser la instruccin que nos permitir emular una seal analgica a partir de una digital en nuestros circuitos, como explicaba algo ms arriba.
El rango de salida de esta instruccin varia de 0 a 255, siendo 0 = 0v y 255 = 5v, por lo que es tan sencillo como introducir un valor determinado para
la tensin de salida que nosotros queramos conseguir, si quisiramos conseguir 2,5v el valor a asignar sera 127.
As que lo nico que debemos hacer es transformar mediante una simple operacin matemtica la seal tomada en nuestro potencimetro 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 deduccin, y la lnea de cdigo por si no cais en cuenta.
1

analogWrite(pinLed, valorSensor / 4);

Esta es una manera algo tosca para realizar esta conversin, ms adelante veremos como hay una instruccin que hace esto por nosotros.
Bueno, eso es todo por el momento!!
Si necesitis algn tipo de aclaracin no dudis en dejar un comentario!!
Hasta pronto!!!

Comprtelo:
Mename

Twitter 45

Facebook 52

Google

LinkedIn

Sobre el autor...
Pablo Murillo. Tcnico electrnico apasionado por la tecnologa y el mundo de la impresin 3D. Comprometido en difundir el
movimiento maker en cualquiera de sus vertientes. Fundador de Arduteka.com Colaborador en Arduino.cc

Comparte en tu red social!

34 Comments
Pingback: El Servomotor | ARDUINO ACADEMY

Gatoloco65

26 marzo, 2012 at 14:02

Responder

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

Gatoloco65

26 marzo, 2012 at 14:34

Responder

No comprenda, el delay(30); en el ejemplo Efecto Fading, pues si no colocaba esa declaracin aparentemente no ocurra nada; fui
aumentando poco a poco el tiempo y pude ver como empezaba a cambiar el comportamiento de lectura del sensor.

miguel

2 abril, 2012 at 6:13

Responder

super bueno los tutoriales muchas gracias


muchos exitos

Pingback: Arduteka Arduteka, tu espacio web donde aprender a realizar proyectos Arduino desde cero, tutoriales, noticias, componentes y mucho
ms!
Pingback: Comparative: Push Buttons, Arcade Buttons and Keypads
Pingback: Comparativa - Pulsadores para proyectos Arduteka
Pingback: Tutorial Arduino #0006 - El Chupitometro

Leandro

23 octubre, 2012 at 22:40

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

25 octubre, 2012 at 23:37

Responder

Hola!
chale un ojo a esto a ver si te sirve.
http://www.arduino.cc/es/Tutorial/KnockSensor
Un saludo!!

Leandro

2 noviembre, 2012 at 20:10

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!!!!!

nicko

27 octubre, 2012 at 0:11

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

Txibu

1 noviembre, 2012 at 23:06

Responder

Gracias por los tutoriales, sn geniales para inciarse. Una pregunta, al ser una resolucin de 10bits, 1024 posibles valores, el rango no sera
de 0 a 1023? Quiz se os haya colado un error en el artculo

Pablo Murillo

2 noviembre, 2012 at 10:21

Responder

Uf! Corregido! Muchas gracias por tu apreciacin!!

Pingback: Comparativa - El diodo LED Arduteka

juan carlos

18 noviembre, 2012 at 13:07

Responder

Genial. Un tutorial fantstico. Muchas gracias.

Pedro Aldo

5 diciembre, 2012 at 6:54

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

5 diciembre, 2012 at 11:26

Hola, en este tutorial se hace exactamente eso, no? Capturamos la variacin de tensin por una entrada analgica, y la mandamos a
una variable, luego esa variable ya la puedes tratar como tu quieras.

Claudia Pincheira

Responder

12 diciembre, 2012 at 17:16

Excelentes tutoriales! me han servido mucho para empezar a interactuar con mi placa Arduino.
Creo haber encontrado un typo en el artculo, cuando dices con una resolucin de 10 bit, lo que nos da 210 (1024) valores creo
que debe decir 2^10 y no 210.
Muchas gracias por los aportes! Estn buensimos!

Pablo Murillo

16 diciembre, 2012 at 13:19

Responder

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

Caresth

13 enero, 2013 at 16:15

Responder

A m tambin 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 patn, no entiendes pero sigues, a ver si luego lo pillas XD

Ludwing

13 febrero, 2013 at 3:43

Responder

Gracias!!!!!!

Antonio Ranea

15 febrero, 2013 at 10:09

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

15 febrero, 2013 at 11:45

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 ms que: Espera X milisegundos sin hacer nada.


Un saludo!!

lauranadelrio

17 febrero, 2013 at 10:26

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!!

Pablo Murillo

18 febrero, 2013 at 17:03

Responder

Hola!
chale un vistazo al tutorial sobre la protoboard!

http://www.arduteka.com/2011/11/tutorial-arduino-mi-primera-protoboard/
Un saludo!

RONAL JR.

19 febrero, 2013 at 3:03

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!!!

Pablo Murillo

21 marzo, 2013 at 13:50

Responder

Hola!
Psate por el foro http://www.arduteka.com/foro y all, entre todos, intentaremos solucionar tus dudas!
Un saludo!

jose

21 febrero, 2013 at 7:08

Responder

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

Pablo Murillo

21 marzo, 2013 at 13:51

Responder

Hola!
Psate por el foro http://www.arduteka.com/foro y all, entre todos, intentaremos solucionar tus dudas!
Un saludo!

Lpez

22 febrero, 2013 at 10:06

Responder

Hola! Muy buenos tutoriales, as parece fcil y todo. Slo 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 funcin setup y en cules no?

Pablo Murillo

21 marzo, 2013 at 13:47

Responder

Hola!
Psate por el foro http://www.arduteka.com/foro y all, entre todos, intentaremos solucionar tus dudas!
Un saludo!

Santi

24 febrero, 2013 at 4:39

Responder

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

Djanos un comentario!
Name *

Email *

Website

captcha

Anti-Spam *

Publicar comentario

Recibir un email con los siguientes comentarios a esta entrada.

Recibir un email con cada nuevo post.

Sitios de inters
Arduino.cc
Cursos y Talleres
Impresoras 3D y Escner 3D
Meneame
Sicnova 3D

Ar d u t e ka b y Ar d u t e ka is lice n s e d u n d e r a C r e at iv e C om m on s Re con ocim ie n t o- NoC om e r cial- C om p ar t ir I gu al 3. 0 Un p or t e d L ice n s e .


Acce s o

You might also like