You are on page 1of 126

Mdulo 8

ARDUINO: La tecnologa al alcance de todos

open source

Con ms de
80 ejemplos !!

INGENIERIA DE MICROSISTEMAS
PROGRAMADOS S.L.
C/ Alda. Mazarredo N 47 - 1 Dpto. 2
48009 BILBAO - BIZKAIA
Tel/Fax: 94 4230651
email: info@microcontroladores.com
www.microcontroladores.com

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

INDICE GENERAL
TEMA1: El Universo ARDUINO
1.- INTRODUCCIN
2.- HERRAMIENTAS HARDWARE PARA ARDUINO
2-1 Tarjetas de control ARDUINO
2-2 Los Shields o tarjetas de aplicacin
3.- HERRAMIENTAS SOFTWARE PARA ARDUINO
4.- EL EQUIPO DE PRCTICAS
4-1 El controlador Arduino NANO
4-2 El Laboratorio Universal Trainer
4-3 Instalacin / Configuracin del software

TEMA 2: Las entradas y salidas Digitales


1.- INTRODUCCIN
2.- ENTRADAS DIGITALES
3.- SALIDAS DIGITALES
4.- INSTRUCCIONES PARA EL CONTROL DE LAS E/S DIGITALES
4-1 Funcin: pinMode()
4-2 Funcin: digitalRead()
4-3 Funcin: digitalWrite()
5.- EL PRIMER EJEMPLO: FUNCIN SI
5-1 Montaje prctico
5-2 El programa Funcin SI
5-3 Grabacin del programa
5-4 Comprobacin
5-5 Trabajo personal
6.- PRINCIPALES FUNCIONES LGICAS
6-1 Funcin lgica NO
6-2 Funcin lgica Y
6-3 Funcin lgica O
7.- FUNCIONES LGICAS DERIVADAS
7-1 Funcin NO-Y
7-2 Funcin NO-O
7-3 Funcin Exclusiva-O
7-4 Funcin NO-Exclusiva-O
8.- LOS PUERTOS
8-1 Ejemplo: Leer_Puerto
8-2 Ejemplo: Calculadora_Binaria

TEMA 3: Temporizaciones, expresiones y sonido


1.- INTRODUCCIN

i-1

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

2.- FUNCIONES DE TEMPORIZACIN


2-1 Funcin: delayMicroseconds()
2-2 Funcin: delay()
3.-EJEMPLO: INTERMITENCIA
3-1 Trabajo personal
4.- MAS EJEMPLOS
4-1 Ejemplo: Faro
4-1-1 Trabajo personal
4-2 Ejemplo: Juego_de_luces
4-2-1 Trabajo personal
4-3 Ejemplo: Semforo_V1
5.- EXPRESIONES
5-1 Constantes
5-2 Variables
5-2-1 Tipos de variables
5-3 Operaciones
6.- SONIDO; Ejemplo: Tonos V1
6-1 Funciones de sonido
6-1-1 Funcin: tone()
6-1-2 Funcin noTone()
6-2 Ejemplo: Tonos_V2
6-3 Ejemplo: Tonos_V3
6-4 Ejemplo: Tonos_V4
6-5 Ejemplo: Melodias
6-6 Ejemplo: Semforo_V2

TEMA 4: Toma de decisiones y sentencias de control


1.- INTRODUCCIN
1-1 Operadores de comparacin
1-2 Operadores booleanos
2.- FUNCIN: IF(.)
2-1 Ejemplo: Timbre
3.- FUNCIN: IF(.) ELSE
3-1 Ejemplo: Juego_de_luces_V2
3-2 Ejemplo: Semforo_V3
4.- FUNCIN: FOR(.)
4-1 Operadores compuestos
4-2 Ejemplo: Faro_V2
4-3 Ejemplo: Semforo_V4
4-4 Ejemplo: Rfagas
5.- FUNCIN: WHILE()
5-1 Ejemplo: Timbre_V2
5-2 Ejemplo: Contador
5-3 Ejemplo: Contador_V2
6.- FUNCIN: SWITCH() / CASE
6-1 Ejemplo: Decodificador

i-2

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

6-1-1 Trabajo personal


6-2 Ejemplo: Juego_de_luces_V3
6-3 Ejemplo: Decodificado_ BCD_7_segmentos
6-3-1 Trabajo personal
6-4 Ejemplo: Dcada
6-4-1 Trabajo personal
6-5 Ejemplo: Dado_Electrnico
7.- OTRAS FUNCIONES DE CONTROL
7-1 Funcin: dowhile()
7-2 Funcin: break
7-3 Funcin: return()
7-4 Funcin: goto

TEMA 5: Las seales PWM y el control de servos


1.- INTRODUCCIN
1-1 Para qu sirven las seales PWM?
1-2 Funcin: analogWrite()
2.- USANDO LAS SEALES PWM
2-1 Ejemplo: PWM
2-2 Ejemplo: Efectos
2-3 Ejemplo: Luces_Aleatorias
2-4 Ejemplo: Regulacin
3.- SERVOMOTORES
3-1 Conexin de servos
3-2 La librera servo.h
3-2-1 Funcin: #include
3-2-2 Funcin: attach()
3-2-3 Funcin: writeMicroseconds()
3-2-4 Funcin: write()
3-2-5 Funcin: read()
3-2-6 Funcin: attached()
3-2-7 Funcin: detach()
4.- USANDO LOS SERVOS
4-1 Ejemplo: Servo
4-2 Ejemplo: Servo_V2
4-3 Ejemplo: Servo_V3
4-4 Ejemplo: Servo_Control

TEMA 6: Las comunicaciones


1.- NTRODUCCIN
2.- LA COMUNICACIN SERIE
2-1 Tipos de comunicacin serie
2-2 La comunicacin serie tipo UART
3.- ESTABLECIENDO LA COMUNICACIN
3-1 Funcin: Serial.begin()
3-2 Funcin: Serial.end()
4.- TRANSMISIN DE DATOS
4-1 Funcin: Serial.print()

i-3

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

4-2 Funcin: Serial.println()


4-3 Ejemplos de transmisin
4-3-1 Ejemplo: Saludos
4-3-2 Ejemplo: Nmeros
4-3-3 Ejemplo: Monitor_Remoto
5.- RECEPCIN DE DATOS
5-1 Funcin: Sertal.available()
5-2 Funcin: Serial.read()
5-3 Funcin: Serial.parseint()
5-4 Funcin: Seral.parsefloat()
5-5 Ejemplos de recepcin
5-5-1 Ejemplo: Control_Remoto
5-5-2 Ejemplo: Calculadora
5-5-3 Ejemplo: Potencia_PWM
5-5-4 Ejemplo: Servo_Control_Remoto
6.- MS EJEMPLOS
6-1 Funciones matemticas
6-1-1 Ejemplo: Min_Max
6-1-2 Ejemplo: Absoluto
6-1-3 Ejemplo: Potencia
6-1-4 Ejemplo: Raz
6-1-5 Ejemplo: Trigonometra
6-2 Funciones avanzadas
6-2-1 Ejemplo: Tiempo_On
6-2-2 Ejemplo: Eiempo_On_V2
6-2-3 Ejemplo: Medir_Pulso
6-2-4 Ejemplo: Frecuencmetro
6-2-5 Ejemplop: Tiempo_:de_Activacin
7.- MS FUNCIONES PARA LAS COMUNICACIONES
7-1 Funcin: Serial.find()
7-2 Funcin: Serial.findUntil()
7-3 Funcin: Serial.peek()
7-4 Funcin: Serial.readBytes()
7-5 Funcin: Serial.readBytesUntil()
7-6 Funcin: Serial.setTimeout()
7-7 Funcin: Serial.write()
7-8 Funcin: serialEvent()

TEMA 7: Las seales analgicas


1.- INTRODUCCIN
2.- CONVERSIN DIGITAL
3.- FUNCIONES DEL LENGUAJE ARDUINO
3-1 Funcin: analogReference()
3-2 Funcin: analogRead()
3-2 Funcin: map()
4.- PERIFRICOS ANALOGICOS
4-1 El potencimetro
4-1-1 Ejemplo: Conversin_AD
4-1-2 Ejemplo: Umbrales
4-1-3 Ejemplo: Comparador_Analgico

i-4

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

4-1-4 Ejemplo: Control_de_Brillo


4-1-5 Ejemplo: Generador_BF
4-2 El sensor de luz
4-2-1 Ejemplo: Fotmetro
4-2-2 Ejemplo: Control_de_Alumbrado
4-2-3 Ejemplo: Regulacin_de_Luz
4-3 El sensor de temperatura
4-3-1 Ejemplo: Temperatura
4-3-2 Ejemplo: Climatizador

TEMA 8: La pantalla LCD


1.- INTRODUCCIN
2.- LA PANTALLA LCD
3.- FUNCIONES PARA EL CONTROL DE UNA LCD
3-1 Funcin: LiquidCrystal()
3-2 Funcin: begin()
3-3 Funcin: setCursor()
3-4 Funcin: home()
3-5 Funcin: clear()
3-6 Funcin: write()
3-7 Funcin: print()
3-8 Funcin: cursor()
3-9 Funcin: noCursor()
3-10 Funcin: blink()
3-11 Funcin: noBlink()
3-12 Funcin: noDisplay()
3-13 Funcin: display()
3-14 Funcin: scrollDisplayLeft()
3-15 Funcin: scrollDisplayRight()
3-16 Funcin: leftToRight()
3-17 Funcin: rightToLeft()
3-18 Funcin: autoscroll()
3-19 Funcin: noAutoscroll()
3-20 Funcin: createChar()
4.- EJEMPLOS DE CONTROL DE UNA PANTALLA LCD
4-1 Ejemplo: HolaMundo
4-2 Ejemplo: Display
4-3 Ejemplo: Cursor
4-4 Ejemplo: Blink
4-5 Ejemplo: DireccinTexto
4-6 Ejemplo: Scroll
4-7 Ejemplo: Autoscroll
4-8 Ejemplo: CaracteresPersonalizados
4-9 Ejemplo: SerialDisplay
5.- TRABAJO PERSONAL

i-5

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

RELACION DE MATERIALES
La siguiente relacin se corresponde con los materiales y accesorios necesarios para realizar todos
los ejercicios y experimentos propuestos en el presente mdulo 8. Se supone al lector en posesin del
entrenador UNIVERSAL TRAINER en cualquiera de sus versiones V1, V2 o V3.

Entrenador UNIVERSAL TRAINER (no includo)


Controlador Arduino NANO
Cable USB tipo A a mini B
Cable rgido de conexin de 0
Altavoz de 8 y 0.5 W
Servo estndar Futaba FP-S3003
Pantalla LCD 16 x 2
Foto transistor BPW40
Sensor de temperatura LM35DZ
Tira de pines macho / macho paso 2.54
Resistencia de carbn de 4K7, W
Resistencia de carbn de 10K, W
Resistencia de carbn de 100K, W
CD-ROM con manual de usuario, documentacin tcnica, ejemplos y herramientas de programacin

i-6

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

BIBLIOGRAFIA Y DIRECCIONES DE INTERS

ARDUINO:la tecnologa al alcance de todos. Editorial: Creaciones Copyright. Autor: Mikel Etxebarria
Isuskiza. La obra se puede considerar como un complemento al contenido del presente mdulo de
prcticas. Propone una importante coleccin de ejemplos que se resuelven con materiales y
componentes muy econmicos.

www.microcontroladores.com Es la direccin de la pgina web de Ingeniera de Microsistemas


Programados S.L. En ella puedes encontrar gran cantidad de productos relacionados con la electrnica y
los micro controladores, as como abundante informacin tcnica.

www.arduino.cc Es la pgina oficial de la organizacin de Arduino. En ella encontrars todos los


productos originales de Arduino, informacin tcnica, descargas de las herramientas y manual de
referencia del lenguaje de programacin de Arduino.

www.arduino.cc/es Es la versin en caastellano de la pgina anterior. Es probable que no est


totalmente actualizada.

i-7

ARDUINO: La tecnologa al alcance de todos


INDICE GENERAL
www.microcontroladores.com

i-8

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

TEMA 1: El Universo ARDUINO


1.- INTRODUCCIN
Hasta no hace demasiado tiempo, el diseo y desarrollo de aplicaciones y proyectos basados en
microcontroladores, estaba reservado a personal cualificado y con unos determinados conocimientos tcnicos
tanto en electrnica como en programacin. Las herramientas necesarias para acometer esos proyectos se
dividen en dos grandes grupos:

Herramientas hardware. Consisten en diferentes tipos de tarjetas sobre las cuales se


desarrolla y montan los circuitos electrnicos necesarios. Aqu tambin se incluyen los
equipos e instrumentos que ayudan a poner a punto nuestros programas: emuladores,
depuradores, grabadores, instrumentos de medida, etc
Herramientas software. Es un conjunto de aplicaciones que facilitan el desarrollo de
nuestros programas. Es decir, se tratan de programas que nos ayudan a programar.
Podemos citar a los editores de texto que emplearemos para escribir un programa, los
simuladores, los intrpretes y los compiladores del lenguaje de programacin que estemos
empleando.

Todas ellas tienen un coste bastante elevado que no est al alcance de todos. nicamente las
Escuelas de formacin profesional, Ingenieras, Universidades, as como empresas de diseo, montaje,
investigacin y desarrollo (I+D) o similares, se lo pueden permitir.
Afortunadamente a da de hoy esto ya no tiene porqu ser as necesariamente. Gracias a plataformas
como ARDUINO es posible acercar el mundo de la tecnologa a todas las personas, empezando por
estudiantes de Enseanza Secundaria Obligatoria (ESO), bachiller, y mdulos profesionales, como a todo tipo
de aficionados a la misma.
ARDUINO es una palabra de origen Germnico que se podra traducir como El que ayuda a los
amigos. All por el ao 2005, en el instituto Italiano de Diseo Interactivo (IVRA), se rene un equipo de
profesores y alumnos, procedentes de diferentes disciplinas, y liderados por Massimo Banzi, David Cuartielles,
Tom Igoe, Gianluca Martino, David Mellis y Nicholas Zambetti.
Apuestan por desarrollar una tarjeta electrnica sencilla y de muy bajo precio, que pueda ser utilizada
en cualquier tipo de proyecto y en cualquiera de las diferentes disciplinas y reas del conocimiento. Que tenga
un lenguaje de programacin sencillo y fcil de aprender y, sobre todo, accesible y abierta a todo el mundo!.
Esto es ARDUINO.
Este mdulo que tienes entre manos pretende acercarte a la tecnologa. Para ello, en Ingeniera de
Microsistemas Programados (MSE), hemos diseado un buen nmero de ejemplos de programacin que
trataremos de presentar de forma ordenada y progresiva. Se trata de que t, querido lector, puedas aprender a
utilizar la plataforma ARDUINO y su programacin de una forma amena y eminentemente prctica.
Lo hemos dividido en una serie de temas que te van a permitir estudiar, analizar y utilizar los mltiples
recursos internos de que consta un controlador como ARDUINO. Al mismo tiempo, vas aprendiendo las
sentencias y funciones ms importantes de que consta su lenguaje de programacin. Ten en cuenta que todo
lo que aprendas sobre los recursos internos y el lenguaje de programacin (muy similar al lenguaje C), lo
podrs utilizar en un futuro no muy lejano sobre controladores ms potentes como los utilizados en
aplicaciones comerciales e industriales.
2.- HERRAMIENTAS HARDWARE PARA ARDUINO
ARDUINO es bsicamente una tarjeta electrnica. Con el paso del tiempo se han desarrollado
diferentes modelos que se diferencian en su aspecto y prestaciones. Aunque el lenguaje de programacin es
similar para todas ellas, cada uno elige la que mejor se adapte a sus necesidades. En cualquier caso
recordemos que todas ellas son abiertas, por lo que se pueden obtener sus esquemas y toda la informacin

1-1

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

tcnica disponible sobre las mismas. Vamos a echar un vistazo a las ms representativas y a sus
caractersticas ms relevantes.

2.1 Tarjetas de control ARDUINO


La figura 1-1 muestra la tarjeta ARDUINO UNO.
Probablemente es la ms utilizada y desciende
directamente de la mtica ARDUINO DIECIMILA, que
apareci all por el ao 2005.
Es una tarjeta muy sencilla, econmica y fcil de
conseguir. A travs de un puerto USB se conecta con el
PC, desde donde se realiza la grabacin de los programas
de aplicacin. Mediante unos sencillos conectores se
accede a las diferentes lneas de E/S del controlador. Con
unos cables podemos conectar con los perifricos que
deseemos gobernar: sensores, interruptores, leds,
displays y un largo etctera.
Figura 1-1. La tarjeta ARDUINO UNO

Por otra parte, en la fotografa de la figura 1-2,


tenemos la tarjeta de control ARDUINO
MEGA2560. Se puede considerar como la
hermana mayor. Salta a la vista su mayor
tamao ya que dispone de un elevado nmero
de lneas de E/S, lo que permite controlar un
gran nmero de perifricos. De la mitad a la
derecha aproximadamente se puede apreciar
la extensin de los conectores de E/S,
respecto a los de la tarjeta ARDUINO UNO.
Figura 1-2. La tarjeta ARDUINO MEGA 2560
En la figura 1-3 tenemos otro modelo de tarjeta de control, la ARDUINO NANO. Se trata de una versin
miniaturizada y mejorada de la tarjeta ARDUINO UNO. Viene encapsulada en un formato DIL de 0.6 con 30
pines distribuidos en dos filas de 15 pines, y unas
dimensiones de tan solo 0.73 x 1.70 (18.5 mm x
43.1). Este modelo se puede insertar directamente
sobre un zcalo, una tarjeta impresa o un mdulo
board para el montaje sin soldadura, y conectar con
los perifricos que vamos a gobernar en la aplicacin.
ES LA QUE VAMOS A EMPLEAR EN EL
PRESENTE MDULO DE PRCTICAS !!
Figura 1-3. La tarjeta de control ARDUINO NANO
Aunque hemos mostrado las tres tarjetas de control ms utilizadas, al menos hoy en da, basta con que
visites la pgina oficial de ARDUINO (www.arduino.cc), para que veas la variedad de tarjetas ARDUINO
existentes. Adems de por su aspecto, las tarjetas se diferencian en sus prestaciones y caractersticas. En la
siguiente tabla se hace una breve comparacin de las caractersticas ms relevantes de los tres modelos de
tarjetas de control de ARDUINO que acabamos de presentar.

1-2

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

CONCEPTO
Tipo de Controlador
Tensin de alimentacin
Alimentacin interna de trabajo
Velocidad
Patillas de E/S digital
Entradas analgicas
Corriente en cada patilla de E/S
Salidas PWM
Memoria FLASH de programa
Ocupado por el bootloader
Memoria RAM de datos
Memoria EEPROM de datos

UNO
ATmega328
7-12V
5V
16MHz
14
6
40mA
6
32KB
0.5KB
2KB
1KB

MEGA 2560
ATmega2560
7-12VC
5V
16MHz
54
16
40mA
15
256KB
8KB
8KB
4KB

NANO
ATmega328
7-12V
5V
16MHz
14
8
40mA
6
32KB
2KB
2K
1KB

2-2 Los Shields o tarjetas de aplicacin


Como ocurre con cualquier otro sistema, las diferentes tarjetas de control de ARDUINO no sirven de
gran cosa si no les conectamos los perifricos que vamos a gobernar: sensores, interruptores, indicadores,
altavoces, motores, displays, pantallas, rels, vlvulas y un sinfn de dispositivos diferentes.
Algunos perifricos son de uso tan comn y tan extendido, que muchas empresas fabrican las tarjetas
que los contienen. Reciben el nombre de Shields, y se pueden conectar o pinchar directamente sobre las
tarjetas de control ARDUINO UNO, MEGA 2560, o cualquiera que
sea compatible.
En la figura 1-4 se muestra el shield ARDUINO BASIC I/O.
Est desarrollado, fabricado y comercializado por Ingeniera de
Microsistemas Programados. Se trata de un circuito puramente
didctico. Contiene unos perifricos muy bsicos y sencillos: leds,
pulsadores, altavoz, potencimetros, y sensores de luz, de infra rojos
y de temperatura. La idea es que se puedan conectar directamente
con las lneas de E/S de las tarjetas de control ARDUINO UNO o
MEGA 2560. Basta con insertar esta tarjeta sobre la de control. El
alumno se centra en la programacin y se olvida de realizar
conexiones elctricas. Los perifricos ya estn conectados.
Figura 1-4. El Shield ARDUINO BASIC I/O
La fotografa de la figura 1-5 muestra un ejemplo de aplicacin.
El Shield BASIC I/O est insertado sobre la tarjeta de control
ARDUINO UNO. Esta contiene un programa que controla el
encendido de un led a partir de un pulsador. Debemos saber
que, si mediante un programa somos capaces de leer el estado
de una entrada (p.e. un pulsador), tambin seremos capaces
de lee un sensor, un final de carrera, un detector, etc..
Igualmente, si somos capaces de controlar el encendido de un
led, tambin podremos actuar sobre un motor, un rel, una
vlvula, una seal acstica de alarma, etc En resumidas
cuentas, mediante el Shield BASIC I/O tenemos una forma muy
econmica y sencilla de probar nuestros programas y simular
situaciones reales.
Figura 1-5. Ejemplo de aplicacin

1-3

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Aunque no se trata de un Shield propiamente dicho, otra forma de conectar perifricos a nuestra tarjeta
de control ARDUINO para probar los programas, es mediante el uso de entrenadores de electrnica de
propsito general, como puede ser el de la figura 1-6.
Se trata de nuestro Universal Trainer V3. Contiene
una serie de valiosos perifricos tales como leds,
interruptores, displays, etc y, lo que es ms importante,
una amplia zona para el montaje sin soldadura de cualquier
circuito electrnico. Tambin dispone de tensiones de
alimentacin, generador de funciones y mucho ms.
Es el equipo que vamos a usar en los ejemplos que
proponemos en el presente mdulo de prcticas !!

NOTA: Los ejemplos propuestos tambin se pueden


realizar por todos aquellos usuarios que dispongan de
las versiones anteriores, la V1 y la V2, del entrenador
Universal Trainer.

Figura 1-6. El entrenador Universal Trainer V3


Como ya se ha comentado anteriormente, dada su
popularidad y su uso extendido, podemos encontrar numerosos
shields de propsito especfico como los mostrados en la figura
1-7. De entre los muchos disponibles en el mercado, cabe
destacar los shields para el control de rels y de motores,
shields con interfaces a Ethernet, WiFi, y Bluetooth, shileds para
el control de pantallas grficas y de texto, robots y muchos ms.
Incluso podemos encontrar shields universales para la
construccin de prototipos. Consisten en unas tarjetas impresas
que se insertan sobre las tarjetas ARDUINO de control y donde
cada cual puede cablear la electrnica que necesite en un
momento dado.
Figura 1-7. Shields de propsito general

3- HERRAMIENTAS SOFTWARE PARA ARDUINO


ARDUINO es un controlador al que debemos programar para que realice una determinada tarea. Para
ello necesitamos una serie de herramientas software que nos permitan y faciliten la programacin. Una de esas
herramientas es el propio lenguaje que vamos a emplear en el diseo de nuestros programas.
Recibe el nombre de Lenguaje ARDUINO y se trata de un lenguaje expresamente diseado para
poder ser usado por personas que no tengan grandes conocimientos de programacin. Recordemos que
ARDUINO pretende ser una plataforma que acerque la tecnologa a todos los niveles y que nos aliente y nos
siembre el gusanillo de la programacin. Es un lenguaje de alto nivel similar en funciones y estructuras al
lenguaje C, muy utilizado en el mbito profesional. Todo lo que aqu aprendas, lo podrs usar en un
futuro !!
El lenguaje ARDUINO, como todos los lenguajes (incluidos los humanos), est en constante evolucin.
Con el tiempo van apareciendo nuevas expresiones, reglas y sentencias. En este mdulo de prcticas vamos a
construir nuestros programas y ejemplos usando las funciones principales. Ya tendrs tiempo de ir
profundizando conforme vayas adquiriendo ms conocimientos. No olvides que el lenguaje de programacin
ARDUINO es libre !!.

1-4

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Otra herramienta software que necesitamos es la conocida como Entorno de trabajo de ARDUINO
tambin conocido como IDE. Es una aplicacin que se ejecuta en nuestro PC y la podemos conseguir, de
forma gratuita, para los sistemas operativos Windows, Mac OS X y Linux. Con ella podemos escribir nuestros
programas, verificarlos, guardarlos en un archivo, recuperarlos y grabarlos fsicamente sobre la memoria
FLASH de programa del controlador ARDUINO. La figura 1-8 muestra el aspecto del IDE de ARDUINO.

Figura 1-8. El entorno de trabajo IDE de ARDUINO


Vemos una ventana sobre la cual escribiremos nuestro programa empleando el lenguaje ARDUINO. En
el argot de ARDUINO los programas reciben el nombre de Sketch. Mediante una serie de opciones y botones
podremos:

Escribir y editar nuestro programa.


Guardar en un archivo nuestro programa.
Recuperar nuestro programa o Sketch desde un archivo.
Verificar que nuestro programa est escrito correctamente segn las reglas del lenguaje ARDUINO.
Esto implica que el IDE de ARDUINO Incluye al propio lenguaje ARDUINO !!

1-5

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Grabar el programa o Sketch en la memoria de programa tipo FLASH del controlador.


Establecer preferencias de trabajo.
Seleccionar el tipo de tarjeta con la que estamos trabajando: ARDUINO UNO, MEGA 2560, NANO, etc.
Seleccionar el canal de comunicaciones entre el ordenador y la tarjeta ARDUINO.
Y mucho ms.

Una vez ms tenemos que repetir que el entorno IDE de trabajo de ARDUINO, y el lenguaje de
programacin que incluye, son totalmente gratuitos y estn disponibles en la pgina web oficial:
www.arduino.cc. Te lo puedes descargar libremente para los sistemas operativos Windows, Mac OS X y Linux.
Es ms, recomendamos que peridicamente visites el sitio con objeto de descargar la ltima versin disponible.
4.- EL EQUIPO DE PRCTICAS
Vamos a ir describiendo el equipo que necesitamos para poder realizar los mltiples ejemplos de
programacin que vamos a proponer en el presente mdulo de prcticas.
4.1 El controlador ARDUINO NANO
Es el que vamos a utilizar en todos los ejemplos. En la figura 1-9 tenemos la distribucin de las patillas
de la tarjeta de control ARDUINO NANO. Te recomendamos que la tengas siempre a mano. Observa que todas
ellas tienen una, dos e incluso tres funciones diferentes que se pueden configurar por programa. Por ejemplo,
la patilla 9 se puede emplear como lnea digital de entrada o salida (E/S) o bien como salida de seal PWM. Tal
y como se aprecia en la imagen, la patilla 1 es la primera del ngulo superior izquierdo. Se van contando de
forma correlativa en sentido contrario a las agujas del reloj.

Figura 1-9. Patillaje del ARDUINO NANO


En la tabla siguiente se detalla la funcin de cada una de ellas.

1-6

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

FUNCION
D0 D13

DESCRIPCIN
Entradas o salidas digitales. Permiten leer o sacar niveles lgicos: 1 = tensin
(5V); 0 = No tensin (0V)l La lnea 13 est conectada a un led situado en la
propia tarjeta.
TX/RX
Seales de transmisin (TX) y recepcin (RX) en las comunicaciones serie tipo
USART.
RESET
Entradas para reiniciar el sistema. Es activa por nivel 0 y estn tambin
conectadas con el pulsador que hay en la propia tarjeta.
GND
Entradas de tierra de alimentacin
INT0 / INT1 Entradas de interrupcin externa. Se pueden configurar por programa para que
sean activas por nivel 0, o por flanco ascendente o descendente o por cambio
de estado lgico.
PWM
Salidas de seal modulada en anchura (PWM)
SDA / SCL Seales para la comunicacin serie tipo I2C. Esta comunicacin se gestiona
mediante las funciones incluidas en la librera Wire
SS / MOSI Seales para la comunicacin serie tipo SPI. Esta comunicacin se gestiona
MISO / SCK mediante las funciones incluidas en la librera SPI
AREF
Entrada de tensin de referencia para los convertidores analgico / digital
A0 A7
Entradas analgicas al convertidor. Este tiene una resolucin de 10 bits por lo
que proporciona una escala de 1024 valores diferentes.
3V3
Salida de 3.3V.
+5V
Entrada / Salida de la tensin interna de trabajo, estabilizada a 5V
VIN
Entrada de tensin de alimentacin. Puede estar comprendida entre 6 y 20V
como mximo.
U1

Simplemente representamos el nmero de cada una de las patillas y la


funcin principal de las mismas: D0 - D13 (E/S digitales), A0 A7 (entradas
analgicas), RESET, GND, 3V3, AREF, +5V y VIN. Hay que remitirse a la figura 1-9
anterior para conocer el resto de funciones que pueden estar asociadas a alguna de
esas patillas.

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

ARDUINO NANO

En lo sucesivo, con el fin de simplificar los esquemas elctricos de los


ejemplos propuestos, el smbolo de la tarjeta ARDUINO NANO lo vamos a
representar como se muestra en la figura 1-10.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Figura 1-10. Smbolo elctrico de ARDUINO NANO

4.2 El Laboratorio Universal Trainer V3


Lo presentamos en la figura 1-6 anterior. Se trata de un laboratorio de propsito general para trabajar el
aspecto prctico de la electrnica en sus diferentes especialidades: semiconductores, digital, analgica, micro
programable, etc Nos aprovecharemos de los recursos que dispone para trabajar con nuestro ARDUINO
NANO:

Entradas y salidas digitales mediante interruptores y leds.


Displays de 7 segmentos.
Entradas analgicas.
Zumbador
Fuentes de alimentacin con diferentes tensiones de salida.
Generador lgico con seales de onda cuadrada de diferentes frecuencias.

1-7

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Adems, dispone de una amplia zona para el montaje sin soldadura. Esto nos permite insertar la tarjeta
de control ARDUINO NANO, as como montar todos los circuitos elctricos que necesitemos para llevar a cabo
todo tipo de pruebas y experimentos.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

En primer lugar vamos a montar el circuito del esquema de la figura 1-11.


Simplemente consiste en insertar ARDUINO NANO sobre el mdulo board del
entrenador, y alimentarlo con la tensin de +5V que ste nos proporciona. El
montaje es comn a todos los que iremos haciendo en las sucesivas prcticas.
Aunque tenemos dos patillas, la 4 y la 29, por las que podemos aplicar la
seal GND de alimentacin, basta con que usemos una de ellas. En este caso
empleamos la patilla 4. La patilla 27 la conectamos con la tensin de alimentacin
+5Vcc. Tanto GND como +5Vcc nos la suministra el entrenador Universal Trainer
V3
Figura 1-11. Alimentando a ARDUINO NANO

En la fotografa de la figura 1-12 podemos apreciar el montaje prctico sobre el entrenador.

Figura 1-12. Montaje de ARDUINO NANO sobre el Universal Trainer V3


La tarjeta de control ARDUINO NANO se inserta a la derecha del mdulo board del entrenador. De esta
forma se hace ms fcil su conexin con el PC, a travs del conector mini USB. Tambin disponemos de una
amplia zona para el montaje de los circuitos y accesorios que precisemos en las diferentes prcticas.
Como se muestra en la figura, empleamos tres cables para la alimentacin de +5Vcc (rojos), y otros
tres para la alimentacin GND (negros). Ambas alimentaciones las suministra el entrenador Universat Trainer
V3. Al conectar el entrenador se ilumina un led azul que indica la correcta alimentacin de la NANO. Tambin
es posible que el led rojo, conectado con D13, parpadee. Esto es porque la NANO suele venir con un programa
de test.
IMPORTANTE: Aunque en este documento, todos los ejemplos se desarrollan sobre el entrenador
Universal Trainer V3, tambin es posible hacerlo sobre las versiones anteriores, la V1 y la V2, de dicho
entrenador.

1-8

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

4.3 Instalacin / Configuracin del software


En el momento de escribir este documento, la ltima versin disponible de las herramientas software
de Arduino, el entorno IDE de trabajo y el lenguaje de programacin, es la 1.0.5. Se puede descargar de forma
gratuita desde:

www.arduino.cc/en/Main/Software
Recomendamos visitar este sitio con cierta frecuencia para obtener la ltima versin ms actualizada.
Al seleccionar la versin Arduino 1.0.5 (o la que sea), tenemos la opcin de elegir para qu sistema
operativo la deseamos: Windows, Mac OS X y Linux. En nuestro caso vamos a trabajar con Windows. Aunque
todos los ejemplos los hemos realizado bajo W XP, tambin los hemos probado bajo W 7 y W8 de 64 bits.
Funciona todo correctamente.
En la versin 1.0.5 se puede descargar un nico archivo ejecutable de instalacin llamado arduino1.0.5-windows.exe y que tambin lo adjuntamos en el CDROM que acompaa a este mdulo de prcticas. Al
ejecutarlo, automticamente se instala el entorno de trabajo (IDE), el lenguaje, los archivos auxiliares y los
drivers. Basta con ir aceptando las diferentes preguntas que se realizan durante el proceso de instalacin.
En el escritorio aparecer un icono de acceso directo. Al hacer doble click sobre l, se abre la ventana
de trabajo de Arduino, como la mostrada en la figura 1-13.

Figura 1-13. El entorno IDE de trabajo de Arduino

1-9

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Se trata de un entorno muy sencillo. La mayor parte de tareas las podemos realizar mediante los
botones: verificar, grabar, nuevo, cargar y salvar Sketchs. El rea destinada a la escritura de los programas o
sketchs se comporta como un editor de textos convencional.
Las opciones del men principal permiten realizar las tpicas operaciones de Windows relacionadas con
los Archivos (Archivo), Edicin de textos (Editar), Programas (Sketch), Seleccin de herramientas y
configuracin (Herramientas) y opciones de ayuda (Ayuda).
Una de las primeras tareas a realizar es seleccionar con qu tipo de tarjeta de control vamos a trabajar.
En nuestra caso, como se muestra en la figura 1-14, seleccionamos: Herramientas Tarjeta Arduino
Nano w/ Atmega328

Figura 1-14. Seleccin de la tarjeta de control Arduino NANO


Ahora podemos conectar la tarjeta Arduino NANO en uno de los puertos USB de nuestro PC. En
pantalla nos aparece un globo indicando que se ha detectado un nuevo dispositivo USB, concretamente el
ARDUINO NANO. Transcurrido un cierto tiempo el sistema nos informa de que el dispositivo est instalado y
listo para usarse.

1 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Cuando se conecta la tarjeta NANO y se instala sobre un puerto USB, se crea un canal serie virtual
COMx. El siguiente paso es establecer la comunicacin entre el entorno de trabajo IDE y dicho canal serie
COMx. Para ello seleccionamos: Herramientas Puerto Serial COMx, como se muestra en la figura 1-15.

Figura 1-15. Seleccin del canal serie COMx de comunicaciones


Es posible que en nuestro PC tengamos ms de un canal serie COM. Si deseamos conocer en cul de
ellos qued instalado nuestra tarjeta controladora Arduina NANO cuando la conectamos al puerto USB,
podemos recurrir al administrador de dispositivos de Windows:
InicioPanel de controlSistemaHardwareAdministrador de dispositivosPuertos (COM & LPT)
Como se muestra en la figura 1-16, el puerto serie virtual se asign, en nuestro caso, al COM23.

Figura 1-16. Asignacin del puerto COM

1 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 1: El Universo ARDUINO
www.microcontroladores.com

Por fin! ya tenemos todo lo necesario para empezar a trabajar. Podemos hacer un pequeo programa,
a modo de test, para comprobar el correcto funcionamiento de todo el sistema. Puede servir como ejemplo el
que se muestra en la figura 1-17 que, como todos los dems ejemplos, se incluye en el CDROM que acompaa
al mdulo de prcticas.

Figura 1-17. Programa de test


Aunque el programa del ejemplo es muy sencillo, no te preocupes si no consigues entenderlo en su
totalidad. Simplemente lo transfieres, mediante el botn Cargar, a la tarjeta de control Arduino NANO.
Observa que el led rojo se enciende y apaga a intervalos de un segundo.
Puedes hacer tambin la siguiente comprobacin. Desconecta el cable USB de la tarjeta Arduino
NANO. Desconecta la alimentacin del entrenador y la vuelves a conectar. El led sigue realizando la secuencia
de intermitencia. Esto demuestra que, una vez has transferido un programa a la tarjeta, este permanece en ella
indefinidamente, Arduino NANO es independiente del PC.
Ya ests listo para empezar a realizar los mltiples ejemplos que vamos a ir proponiendo. En Ingeniera
de Microsistemas creemos que te vas a divertir, al mismo tiempo que te vas introduciendo en la tecnologa y la
programacin. Esperamos que te enganches.

1 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

TEMA 2: Las entradas y salidas Digitales


1.- INTRODUCCIN
En el mundo digital todas las cosas u objetos se contemplan como si nicamente pudieran tener dos
estados diferentes y opuestos. A esto se le conoce como estados binarios. Por ejemplo, una bombilla puede
estar encendida o apagada, pero nunca se pueden dar ambas situaciones al mismo tiempo. Ejemplos como
este podemos poner muchos:

Un interruptor o un pulsador puede estar accionado o no, pero no ambas cosas al mismo tiempo
El motor est girando (no importa a qu velocidad) o puede estar parado.
La sirena de una alarma est activada o no lo est.
Un rel puede estar activado o no, lo mismo que por ejemplo, una electro vlvula.
Podemos tener pulsada una tecla del teclado de nuestro ordenador, o no tenerla.
Un sensor detecta la presencia de un objeto o su ausencia.
Tu mismo, puedes rer o llorar, vivir o morir, pero nunca ambas cosas al mismo tiempo.

El concepto de todo o nada, activado o desactivado, cerrado o abierto, pulsado o no


pulsado, tiene una relacin directa con la electricidad. Efectivamente, la bombilla est activada cuando se le
aplica tensin (+V), y desactivada cuando no se le aplica tensin (0V). Cuando un interruptor est abierto
decimos que corta la tensin (0V), sin embargo cuando est cerrado, deja pasar la tensin (+V).
Al objeto de abreviar se definen dos estados o niveles lgicos diferentes:

nivel 1 cuando hay tensin (+V). Tambin se le denomina nivel alto, high, ON o, simplemente, 1
nivel 0 cuando no hay tensin (0V). Tambin se le denomina nivel bajo, low, OFF o,
simplemente, 0

Quiz a partir de este momento entiendas un poquito ms el funcionamiento del programa de Test que
viste en el tema anterior. Al led conectado en la patilla D13 de E/S se le aplicaba un nivel alto (HIGH) y se
iluminaba. Luego se le aplicaba nivel bajo (LOW) y se apagaba. El proceso se repeta de forma indefinida con
un intervalo de tiempo de 1 segundo para cada caso.
En la figura 2-1 tenemos una representacin
grfica de una seal digital o binaria. El eje
vertical representa la tensin (+V). No importa su
valor, aunque en los equipos digitales actuales es
frecuente que sea de 5V o de 3.3V. Un 0
equivale a 0V y un nivel 1 equivale a tensin y
se representa mediante una lnea horizontal por
encima de la lnea que representa el nivel 0. A
esta grfica se le llama Diagrama de tiempos
Figura 2-1. Representacin de una seal digital
El eje horizontal representa el tiempo T. Muestra el intervalo de tiempo en que la seal digital
permanece a 0, luego a 1 y vuelta a valer 0. Ahora fjate en el diagrama de tiempos de la figura 2-2.
Representa a tres seales digitales de otros tantos dispositivos: un interruptor, un motor y una bombilla.
Observndolo con atencin podemos decir que:

El interruptor est abierto (sin accionar) durante un segundo. Luego se cierra (acciona) durante otro
segundo. Se abre durante tres segundos y, finalmente, se cierra durante dos.
El motor est parado durante dos segundos, en movimiento durante cuatro y parado durante uno.
La bombilla se apaga y enciende a intervalos de un segundo. Te suena?

2-1

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

Figura 1-2. Anlisis de tres seales digitales

2.- ENTRADAS DIGITALES


Son seales binarias que se introducen al controlador (p.e. a la tarjeta Arduino NANO) a travs de
determinadas patillas, y procedentes de determinados perifricos de entrada como pueden ser interruptores,
pulsadores, sensores, detectores, teclados, etcSea cual sea el perifrico empleado, solo puede introducir
seales con niveles lgicos binarios: 0 (no tensin) o 1 (tensin).
Los pulsadores y/o interruptores son los perifricos de
entrada ms utilizados y sencillos que existen. En la figura 2-3 se
muestra un posible esquema elctrico de conexin entre un
pulsador y una lnea de entrada del controlador.
Cuando el pulsador est sin accionar, la seal S suministra
un nivel lgico 0 (0V) a la entrada del controlador. Cuando se
pulsa introduce un nivel lgico 1 (+5V). Se dice de este circuito
que trabaja con lgica positiva. Si NO se acciona se introduce un
nivel 0, y si se acciona se introduce un nivel 1 al controlador.

Figura 2-3. Pulsador de entrada con lgica positiva

Otra forma de circuito es la mostrada en la figura 2-4. Cuando el


pulsador est sin accionar, la seal S suministra un nivel lgico 1
de +5V a la entrada del controlador. Cuando se pulsa introduce un
nivel lgico 0.Se dice que este nuevo circuito trabaja con lgica
negativa o invertida. Si NO se acciona introduce un nivel 1, si
se acciona introduce un nivel 0 al controlador. Funciona
justamente al revs que el anterior.

Figura 2-4. Pulsador de entrada con lgica negativa

2-2

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

No importa cul de los dos circuitos empleemos. Lo realmente importante es saber cmo leer la entrada
del controlador a la que est conectado ese pulsador, e interpretar correctamente el valor binario ledo.
3.- SALIDAS DIGITALES
Son seales binarias de nivel 0 (no tensin) o de nivel 1 (tensin) que, es esta ocasin, proporciona
el controlador por algunas de sus patillas. En esas patillas conectamos los perifricos de salida que vamos a
gobernar tales como: bombillas, rels, motores, vlvulas, alarmas, etc.. El controlador puede por tanto
activarlos o desactivarlos.
Uno de los perifricos de salida ms sencillos y econmicos son los llamados diodos Led. Son
pequeos dispositivos que cuando se activan emiten luz. El led tiene dos patillas: nodo (A) y ctodo (K). Para
que se ilumine es necesario aplicarles una tensin de polarizacin directa. Se consigue cuando el nodo (A)
es positivo respecto al ctodo (K). Los hay de diferentes formas, tamaos y colores y se emplean mucho como
pilotos de sealizacin o indicadores.
En la figura 2-5 se muestra el esquema elctrico necesario para
conectar una patilla de salida del controlador, a uno de estos leds. Cuando
la seal S de salida est a nivel 0 (0V), el diodo led se apaga. Su nodo
queda con 0V, al igual que el ctodo. Cuando la seal de S salida est a
nivel 1 (+5V), el led se ilumina. Su nodo ahora es positivo respecto al
ctodo.
Se dice de este circuito que trabaja con lgica positiva. Si el
controlador saca un 0 el led se apaga, si saca un 1 el led se enciende.
Figura 2-5. Control de un led de salida con lgica positiva

Otra forma de controlar a un led es mediante el circuito de la


figura 2-6. Cuando la seal S que saca el controlador por una de sus
patillas de salida es de nivel 1 (+5V), el led se apaga ya que tanto el
nodo como el ctodo tienen la misma tensin (+5V). Cuando la seal S
de salida est a nivel 0 (0V), el led se ilumina. En esta ocasin el nodo
es positivo (+5V) respecto al ctodo.
Este circuito trabaja con lgica negativa o invertida. Si el
controlador saca un 0 el led se enciende, si saca un 1 el led se apaga.
Funciona justo al contrario que el circuito anterior.

Figura 2-6. Control de un led de salida con lgica negativa

Nuevamente no es importante cul de los dos circuitos empleemos. Lo que realmente importa es saber
qu hay que hacer para que el controlador saque por sus patillas de salida, cualquiera de los dos
niveles lgicos.
RECORDAR: Lo mismo que leemos el estado de un pulsador, podemos leer el estado de una tecla, un
interruptor, un sensor, un final de carrera, etc Igualmente, si que somos capaces de activar o desactivar un
led, podremos activar o desactivar un rel, un motor, una vlvula, etc..
IMPORTANTE. La corriente que es capaz de entregar un controlador por cualquiera de sus patillas de salida,
es limitada. En el caso de Arduino NANO es una corriente de 40mA, suficiente para activar directamente leds o
cargas de consumo similar. Si se quiere controlar dispositivos con un mayor consumo, las lneas de salida
deben conectarse a circuitos que amplifiquen en corriente y/o en tensin la seal. De no hacerlo es muy posible
que estropeemos el controlador.

2-3

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

4.- INSTRUCCIONES PARA EL CONTROL DE LA E/S DIGITALES


Ya va siendo hora de que estudiemos las funciones del lenguaje Arduino encargadas de controlar las
lneas de entrada o salida (E/S) de nuestra tarjeta Arduino NANO. Fundamentalmente son tres y muy sencillas:
4-1 Funcin pinMode()
Configura una lnea digital (patillas D0 - D13) para que acte como entrada o como salida.
Normalmente se suele poner al principio de un programa. Por defecto, al iniciar el sistema, todas las lneas de
E/S quedan configuradas como entradas.
Sintaxis:
pinMode(pin,modo)
pin:
Expresa el nmero de la patilla de E/S que vamos a configurar (D0-D13)
modo: Establece si acta como entrada (INPUT) o salida (OUTPUT)
Ejemplos:
pinMode(6,OUTPUT);
pinMode(13,OUTPUT);
pinMode(3,INPUT);

//La lnea D6 se configura como salida digital


//La lnea D13 se configura como salida digital
//La lnea D3 se configura como entrada. Es opcional

4-2 Funcin digitalRead()


Lee y devuelve el estado (1 o 0, HIGH o LOW) de cualquiera de las patillas digitales.
Sintaxis:
digitalRead(pin)
pin:

Expresa el nmero de la patilla que vamos leer (D0-D13)

Ejemplos;
V=digitalRead(6);
V=digitalRead(3);

//Lee el estado actual de la patilla digital D6 y lo guarda en la variable V.


//Lee el estado actual de la patilla digital D3 y lo guarda en la variable V.

4-3 Funcin digitalWrite()


Escribe o saca por una patilla digital de salida el valor binario 1 o 0, HIGH o LOW.
Sintaxis:
digitalWrite(pin,valor)
pin:
valor:

Expresa el nmero de la patilla de salida sobre la que vamos a escribir.


Indica el valor de salida: HIGH =1, o bien LOW = 0.

Ejemplos
digitalWrite(6,HIGH);
digitalWrite(13,LOW);
digitalWrite(6,digitalRead(3));

//La salida D6 se pone a nivel 1 (+5V)


//La salida D13 se pone a nivel 0 (0V)
//Lee el valor de la entrada D3 y lo saca por la salida D6

2-4

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

5.- EL PRIMER EJEMPLO: FUNCION SI


Manos a la obra! Vamos a resolver ntegramente nuestro primer proyecto al que llamaremos Funcin
SI. Ser una cosa muy sencilla pero que nos permitir utilizar las tres funciones anteriores y observar el
aspecto general de un programa escrito en el lenguaje Arduino.

5-1 Montaje prctico

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

Se trata de leer el estado lgico de un interruptor conectado con la


entrada D3, y reflejarlo sobre un led conectado con la salida D2. SI el interruptor
vale 1, el led tambin valdr 1. SI el interruptor vale 0, el led tambin valdr
0. Fjate en el esquema elctrico de conexiones de la figura 2-7.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Vamos a usar el entrenador Universal Trainer V3 (o el V1 / V2) que,


como ya sabemos, dispone de mltiples dispositivos de prueba. Conectamos el
led S0 con la seal D2 de la tarjeta Arduino NANO (patilla 5). El interruptor E0 lo
conectamos con la seal D3 (patilla 6).
Suponemos que la tarjeta de control Arduino NANO est insertada sobre
el mdulo board del entrenador, y alimentada debidamente como ya se explic
en el tema anterior.

S0

E0

Figura 2-7. Esquema elctrico para el primer ejemplo


La fotografa de la figura 2-8 muestra el montaje prctico realizado sobre el entrenador. Procura
emplear cablecillos de diferentes colores para, por ejemplo, distinguir entre las entradas y las salidas.

Figura 2-8. Montaje prctico

2-5

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

5.2 El programa Funcin_SI


En primer lugar vamos a ver qu aspecto tiene un programa escrito en el lenguaje Arduino, sobre su
entorno IDE de trabaja. Observa la figura 2-9.

Figura 2-9. Aspecto de un programa en el lenguaje Arduino


Vallamos por partes. Ya ves que hemos dividido la pantalla de trabajo en tres secciones. Vamos a
detallarlas.
Seccin 1
Aunque no solemos hacerlo por pura pereza, es una muy buena prctica documentar los programas.
Los comentarios sirven para informar de quien es el autor, la empresa, versin del programa, fecha de creacin
y todo aquello que se considere oportuno. Tambin se puede indicar qu herramientas hardware o software se
necesitan para ejecutar el programa y, lo ms importante, explicar brevemente qu es lo que hace.

2-6

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

Podemos escribir cualquier tipo de texto siempre y cuando vaya encerrado entre los signos /* */.
Tambin se puede documentar cada sentencia o grupo de sentencias del programa, para explicar qu es lo
que hacen. Se suele hacer mediante textos sencillos que van precedidos de los signos //.
En, general podemos poner cualquier texto en cualquier lugar del programa. Si es un texto de varias
lneas, se encierra entre /* . */, y si es de una nica lnea, suele ir precedido de //.
Seccin 2
En el lenguaje Arduino es necesario incluir la funcin setup(). Normalmente suele ir al principio del
programa. Todas las sentencias que estn incluidas dentro de las llaves, se ejecutan una nica vez, al iniciar el
sistema. Por este motivo aqu suelen ponerse las funciones de configuracin, como por ejemplo:
void setup()
{
pinMode( 2 , OUTPUT );
}
La seal D2 queda configurada como salida y no es muy probable que esta situacin cambie a lo largo
de un mismo programa. Puedes poner cualquier tipo de funcin, pero recuerda: slo se ejecutan una vez. En
ocasiones quiz no necesites configurar nada. En este caso, aunque vaca, tambin es necesario ponerla:
void Setup()
{
}
Seccin 3
Esta funcin tambin es imprescindible y contiene el cuerpo principal de nuestro programa. Todas las
funciones que lo componen deben estar cerradas entre las llaves. En nuestro ejemplo:
Void loop()
{
digitalWrite( 2, digitalRead(3));
}
Todas las funciones que estn incluidas entre las llaves {} se ejecutan de forma indefinida, desde
la primera a la ltima y de nuevo la primera. En nuestro ejemplo, la lectura de la entrada D3 y la escritura sobre
la salida D2, se ejecutan constantemente a la velocidad propia del controlador.
En otros lenguajes de alto nivel como el C, est funcin tambin es imprescindible y suele recibir el
nombre de main().
5-3 Grabacin del programa
Una vez tenemos escrito nuestro programa, el siguiente paso es transferirlo a la memoria Flash del
controlador. Es una tarea muy sencilla. Basta con pulsar el botn Cargar del entorno de trabajo IDE de
Arduino. Transcurrido un cierto tiempo, nos aparecer un mensaje de Carga terminada, as como un resumen
de la memoria que consume nuestro programa sobre el total disponible. Ver de nuevo la figura 2-9.
Es importante que sepas que, una vez que cargas un programa en el controlador, este se mantiene por
tiempo indefinido aunque desconectes la alimentacin. La nica forma de borrarlo es cargando otro programa
nuevo.

2-7

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

5-4 Comprobacin
Es el ltimo paso. Es la hora de comprobar si todo, tanto el hardware como el software, funciona
correctamente. Nuestro actual ejemplo es muy sencillo de verificar. Basta que introduzcas un nivel 1 con el
interruptor E0 (interruptor hacia arriba). El led S0 se debe iluminar. Cuando introduces un nivel 0 (interruptor
E0 hacia abajo), el led se apaga.
Debes tener en cuenta que a la velocidad que el controlador ejecuta nuestro programa, cualquier
cambio que se produzca en la entrada D3 (interruptor E0), repercute inmediatamente sobre la salida D2 (Led
S0).
En este instante seguro que te ests cuestionando si es necesario utilizar un controlador para iluminar
una simple bombilla mediante un interruptor. Tiempo al tiempo, ya se irn complicando los programas e irs
viendo las casi infinitas posibilidades que posee.
5.5 Trabajo personal
No te limites a comprobar el funcionamiento de los ejemplos que te vamos a ir proponiendo. Casi
seguro que funcionan. Lo interesante sera que, adems de estudiarlos, los modifiques a tu gusto y los adaptes
a tus necesidades con objeto de que vayas cogiendo el hbito de la programacin.
Por ejemplo, puedes modificar tanto el esquema elctrico como el programa anterior para controlar el
encendido de varios leds mediante varios interruptores.
Te propongo controlar cuatro leds de salida conectados con las seales D2, D3, D3 y D4, mediante 4
interruptores conectados con las seales D5, D6, D7 y D8 del controlador. Dibuja a continuacin el esquema
elctrico y escribe el programa correspondiente.

2-8

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

6.- PRINCIPALES FUNCIONES LOGICAS


En el mundo digital es muy frecuente hacer ciertas operaciones llamadas Funciones lgicas.
Realmente, el ejemplo anterior responda a una de ellas: la funcin SI. En la figura 2-10 su resume el
funcionamiento.
La tabla de la verdad resume el valor
binario de la salida S, en funcin del
valor binario de la entrada E. Es muy
sencillo. Si E=0 S=0, si E=1 S=1.
Tambin se representa el diagrama de
tiempos. Si lo miras con cuidado vers
que equivale a la tabla de la verdad. Por
ltimo se muestra el smbolo elctrico
que se emplea para esta funcin.
Figura 2-10 La funcin lgica SI
El funcionamiento del programa Funcin_SI del ejemplo anterior responda exactamente a esta tabla
de la verdad. Tambin podemos establecer la ecuacin lgica para esta funcin:

=
6-1 Funcin lgica NO
Se trata de lo contrario a la funcin SI. Tambin se le suele llamar funcin NOT. En la figura 2-11 se
resume su funcionamiento.
La salida S es lo contrario de la entrada
E. Si E=0 S=1 y si E=1 S=0. Analiza
la tabla de la verdad y el correspondiente
diagrama de tiempos.
Figura 2-11. La funcin NOT

El smbolo ! se emplea para expresar la funcin NO al escribir nuestros programas. Dicha funcin
responde a la siguiente ecuacin lgica:

=
Estudia el siguiente programa, Funcin_NO. Lo escribes y lo grabas.
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, ! digitalRead(3)); //D2 e la funcin NO con D3
}
Comprueba que cuando el interruptor E0 est a 0 (hacia abajo), el led S0 est
Comprueba que cuando el interruptor E0 est a 1 (hacia arriba), el led S0 est
Cul es la diferencia con respecto al ejemplo previo? ..
.

2-9

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

6-2 Funcin lgica Y


Se le conoce tambin como funcin
AND y su funcionamiento se resume
en la figura 2-12. La salida S es 1
cuando las entradas E1 y E2 tambin
estn a nivel 1. Emplearemos el
smbolo & en nuestros programas y
se dice que realiza un producto lgico.
Su ecuacin responde a:

+5Vcc

La patilla 5 de la tarjeta de control Arduino NANO se corresponde con la seal


D2 y se conecta con el led S0 del entrenador.

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Realizar el montaje representado en el esquema elctrico de la figura 213. Este mismo montaje lo vamos a emplear en los siguientes ejemplos con los
que vamos a finalizar el presente tema.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Figura 2-12. La funcin Y (AND)

Las patillas 6 y 7 corresponden a las seales D3 y D4 y se conectan con los


interruptores E2 y E1 del entrenador Universal Trainer.
S0

E2

E1

Figura 2-13. Esquema para experimentar con las funciones lgicas

La fotografa de la figura 2-14 muestra el montaje prctico sobre el entrenador.

Figura 2-14. Montaje prctico

Aqu tienes el programa de ejemplo Funcin_AND. Lo estudias, lo escribes y lo grabas sobre la


tarjeta controladora Arduino NANO.

2 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, digitalRead(3) & digitalRead(4)); //Funcin AND entre D3 y D4
}
Comprueba que si cualquier entrada est a 0, la salida se mantiene a nivel lgico.
La salida es de nivel lgico cuando ambas entradas estn a nivel ..

6-3 Funcin O
Tambin se le conoce como funcin OR
y su funcionamiento se representa en la
figura 2-15. La salida S es 1 cuando
cualquiera de las entradas E1 o E2, o
ambas, estn a nivel 1. Emplearemos el
smbolo | en nuestros programas y se
dice que realiza la suma lgica (que no
aritmtica). Su ecuacin responde a:

Figura 2-15. La funcin o (OR)


Emplearemos el mismo esquema elctrico y el mismo montaje prctico que se mostraba en las figuras
2-13 y 2-14.
Analiza y escribe el ejemplo Funcion_OR que se muestra a continuacin. Grbalo y verifica su
funcionamiento.
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, digitalRead(3) | digitalRead(4)); //Funcin OR entre D3 y D4
}
Comprueba que la salida es 0 cuando las entradas estn a nivel .
Si cualquiera de las entradas est a 1, la salida queda a nivel ..
La salida es 1 cuando ambas entradas estn a nivel lgico ..

2 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

7.- FUNCIONES LOGICAS DERIVADAS


Como consecuencia de combinar entre s las funciones lgicas anteriores, podemos obtener otras
funciones lgicas derivadas. Vamos a estudiarlas a continuacin.
7-1 Funcin NO-Y
Tambin se le conoce como
funcin NAND y es consecuencia de
combinar una funcin AND y una
funcin NOT. Su funcionamiento se
representa en la figura 2-16. La salida S
es 1 cuando cualquiera de las
entradas E1 o E2, o ambas, estn a
nivel 0. Su ecuacin responde a:

Figura 2-16. Funcin NAND

Se trata de una funcin AND (&) a cuya salida se le aplica una funcin NOT (!). El programa
Funcin_NAND puede ser algo as como esto.
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, ! (digitalRead(3) & digitalRead(4))); //Funcin NAND entre D3 y D4
}
Observa con cuidado los parntesis. Siempre se ejecutan las funciones que estn en los parntesis
ms internos. En este caso se leen las entradas D3 y D4 y se realiza la funcin AND (&) con ellas. A
continuacin, con el resultado obtenido, se realiza la funcin NOT (!) y el resultado se escribe sobre la salida
D2. Escribe y carga el programa sobre la tarjeta Arduino NANO. Comprueba el funcionamiento.
7-2 Funcin NO-O
Tambin se le conoce como
funcin NOR y es consecuencia de
combinar una funcin OR y una funcin
NOT. Su funcionamiento se representa
en la figura 2-17. La salida S es 1
cuando las entradas E1 y E2 estn a
nivel 0. Su ecuacin responde a:

Figura 2-17. Funcin NOR


Se trata de una funcin OR (|) a cuya salida se le aplica una funcin NOT (!). Realiza una suma lgica
(que no aritmtica) invertida. El programa Funcin_NOR que resuelve esta ecuacin puede ser el siguiente.

2 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, ! (digitalRead(3) | digitalRead(4))); //Funcin NOR entre D3 y D4
}
Observa con cuidado los parntesis. Siempre se ejecutan las funciones que estn en los parntesis
ms internos. En este caso se leen las entradas D3 y D4 y se realiza la funcin OR (|) con ellas. A
continuacin, con el resultado obtenido, se realiza la funcin NOT (!) y el resultado final se escribe sobre la
salida D2. Escribe y carga el programa, y comprueba el funcionamiento.
7-3 Funcin Exclusiva-O
Tambin se le conoce como
funcin EOR o bien XOR y es
consecuencia de combinar funciones AND,
OR y NOT. Su funcionamiento se
representa en la figura 2-18. La salida S es
1 cuando el nmero de las entradas E1 y
E2 que valen 1 es impar. Su ecuacin
responde a:

=(

)+(

)
Figura 2-18. La funcin XOR

Una funcin AND realiza el producto lgico de las entradas E1 invertida y E2. Otra funcin AND realiza
el producto de E1 y E2 invertida. Con el resultado de ambas funciones AND se realiza una suma lgica (que no
aritmtica) mediante una funcin OR que ofrece el resultado final. Fjate en los parntesis del programa de
ejemplo Funcin_XOR, que resuelve la ecuacin.
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, (( ! digitalRead(3) & digitalRead(4)) | (digitalRead(3) & ! digitalRead(4)))); //Funcin XOR
}
Lee e invierte (!) el estado de la entrada D3 y realiza la funcin AND (&) con D4. Luego lee e invierte (!)
D4 y realiza la funcin AND (&) con D3. Con los resultados de ambas funciones AND se realiza una funcin OR
(|), cuyo resultado final se escribe sobre la salida D2.

2 - 13

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

7-4 Funcin NO-Exclusiva-O


Tambin se le conoce como
funcin XNOR y es consecuencia de
combinar funciones AND, OR y NOT. Su
funcionamiento se representa en la
figura 2-19. La salida S es 1 cuando el
nmero de las entradas E1 y E2 que
valen 1 es par, lo contrario de la
funcin XOR. Su ecuacin responde a:

=(

Figura 2-19. La funcin XNOR


Una funcin AND realiza el producto lgico de las entradas E1 invertida y E2. Otra funcin AND realiza
el producto de E1 y E2 invertida. Con el resultado de ambas funciones AND se realiza una suma lgica (que no
aritmtica) mediante una funcin OR. El resultado de esta funcin OR se invierte para obtener el resultado final.
Fjate en los parntesis del programa de ejemplo Funcin_XNOR, que resuelve la ecuacin.
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2, ! (( ! digitalRead(3) & digitalRead(4)) | (digitalRead(3) & ! digitalRead(4))));
XNOR entre D3 y D4
}

//Funcin

Lee e invierte (!) el estado de la entrada D3 y realiza la funcin AND (&) con D4. Luego lee e invierte (!)
D4 y realiza la funcin AND (&) con D3. Con los resultados de ambas funciones AND se realiza una funcin OR
(|). El resultado de esta funcin OR se vuelve a invertir (!) para obtener el resultado final que se escribe sobre la
salida D2.
8.- LOS PUERTOS
Hasta el momento, todas las lneas de entrada o salida de nuestro controlador Arduino NANO, se han
manipulado de forma individual. Mediante las sentencias pinMode(), digitalRead() y digitalWrite() podemos
configurar, leer y escribir cualquiera de las 14 lneas de E/S digitales numeradas de la D0 a la D13.
Es una forma muy sencilla de controlar ciertos perifricos como pueden ser pulsadores, interruptores,
leds, rels, etc, pero SIEMPRE de forma individual. Se lee o se escribe sobre una determinada lnea, valores
de un nico bit: el 0 o el 1.
Sin embargo, hay ocasiones en que necesitaremos poder leer o escribir en algn perifrico, varios bits
AL MISMO TIEMPO: una pantalla, un display de 7 segmentos o, por ejemplo, un conjunto de rels que deben
reaccionar al unsono. Hacerlo mediante las funciones que conocemos no es recomendable ya que solo
pueden manipular un bit cada vez.
En primer lugar debemos saber que todas las lneas del
Arduino NANO se distribuyen o agrupan en lo que se
denominan Puertos. Cada puerto tiene 8 bits. La figura 2-20
nos muestra qu puertos tenemos y qu lneas de E/S los
forman.
Figura 2-20. Los puertos de E/S

2 - 14

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

De las 14 lneas de E/S que dispone Arduino NANO, 8 de ellas se encuentran en el Puerto D. Se trata
de las lneas digitales D0-D7 y se encuentran en las patillas 1, 2, 5, 6, 7, 8, 9 y 10 del controlador
respectivamente. Las 6 patillas de E/S restantes se encuentran en el Puerto B. Corresponden a las lneas
digitales D8-D13 y se encuentran en las patillas 11 a la 16. Se recomienda repasar la figura 1-9.
Los 8 bits del Puerto C se corresponden con las 8 entradas analgicas A0-A7. Se corresponden con las
patillas 19-26 respectivamente. Se recomienda repasar la figura 1-9.
A partir de este momento, si conseguimos leer o escribir en cualquiera de esos puertos, estaremos
haciendo transferencias de datos de 8 bits simultneamente, y no de un solo bit como lo hemos venido
haciendo hasta ahora.
Cada puerto se controla mediante 3 registros a travs de los cuales podemos configurarlo como
entrada o salida, leer un valor de 8 bits procedentes de las patillas de un puerto de entrada o escribir un valor
de 8 bits sobre las patillas de un puerto de salida. La siguiente tabla resume dichos registros.
PUERTO

REGISTRO
DDRD

PUERTO D
PORTD
PIND
DDRB
PUERTO B
PORTB
PINB
DDRC
PUERTO C
PORTC
PINC

DESCRIPCION
Registro para la configuracin de las lneas D0-D7 como entrada o como
salida. Un bit 1 configura una patilla como salida, un 0 como entrada. Es
de lectura/escritura.
Registro de salida de datos. Lo que en l se almacene sale por las patillas
de salida D0-D7. Es de lectura/escritura.
Registro de entrada de datos. El valor presente en las patillas de entrada
D0-D7 se puede leer desde este registro. Es de solo lectura.
Registro para la configuracin de las lneas D8-D13 como entrada o como
salida. Un bit 1 configura la patilla como salida, un 0 como entrada. Es
de lectura/escritura.
Registro de salida de datos. Lo que en l se almacene sale por las patillas
de salida D8-D13. Es de lectura/escritura.
Registro de entrada de datos. El valor presente en las patillas de entrada
D8-D13 se puede leer desde este registro. Es de solo lectura.
Registro para la configuracin de las lneas A0-A7 como entrada o como
salida. Un bit 1 configura la patilla como salida, un 0 como entrada. Es
de lectura/escritura.
Registro de salida de datos. Lo que en l se almacene sale por las patillas
de salida A0-A7. Es de lectura/escritura.
Registro de entrada de datos. El valor presente en las patillas de entrada
A0-A7 se puede leer desde este registro. Es de solo lectura.

El lenguaje de programacin Arduino permite manejar esos registros en forma de variables. Podemos
leer el valor que contienen en un momento dado y tambin escribir nuevos valores en ellos. Un ejemplo vale
ms que mil palabras.
Ejemplos:
DDRD = B00001111;

Escribe el valor binario (B) sobre el registro DDRD. Esto configura las lneas D0-D3
como salida y las lneas D4-D7 como entradas.
PORTD = B00000110; Saca el valor binario por las lneas de salida D0-D3. D1 y D2 se ponen a nivel 1; D0 y
D3 se ponen a nivel 0.
DDRB = 0;
Las lneas D8-D13 del Puerto B se configuran como entradas.
A = PINB;
La variable A se carga con el valor presente en las lneas de entrada del Puerto B
Ya ves que es muy sencillo. Basta con expresar qu valores quieres almacenar en cada registro para
que puedas, bien configurarlo, o bien sacar un determinado valor por sus correspondientes patillas. Dicho valor
lo puedes expresar en binario (B00001111), en hexadecimal (0xF) o bien en decimal (15). Todos ellos son
equivalentes. La opcin en binario es especialmente til en estos casos.

2 - 15

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

NOTA:
El uso de esta tcnica nos permite actuar simultneamente sobre varias lneas de entrada o salida, pero
puede provocar ciertos problemas. Ten en cuenta que algunas lneas tienen otras funciones. Por ejemplo, D0
y D1 pueden ser usadas como recepcin (Rx) y transmisin (Tx) en serie. D5 y D6 pueden ser salidas PWM,
la lnea D4 puede ser la seal SDA en comunicaciones I2C, etc Estas funciones son gestionadas por
ciertas sentencias del propio lenguaje Arduino. Ahora bien, si cambiamos sus configuraciones esas
sentencias pueden no funcionar correctamente.
Si no es estrictamente necesario, es mejor usar las sentencias pinMode(), digitalRead() y digitalWrite() ya
conocidas.
8-1 Ejemplo: Leer_Puerto
+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Observa el esquema del montaje de la figura 2-21. Tenemos 4


interruptores, E3:E0, conectados con las lneas D11:D8
respectivamente. Estas se encuentran en el Puerto B y habr que
configurarlas como entradas. Tambin se emplean los leds S3:S0 del
laboratorio Universal Trainer, que se conectan con las lneas D3:D0
respectivamente. Estas se encuentran en el Puerto D y habr que
configurarlas como salidas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

E3

S3

S2

S0

S1

E2

El programa lee simultneamente el estado lgico de los 4


interruptores de entrada y lo saca simultneamente por los 4 leds de
salida. Si un interruptor cualquiera, por ejemplo E2, est a nivel 1, el
led correspondiente, S2, se ilumina. Si el interruptor est a 0, el led
se apaga.

E1
E0

Figura 2-21. Esquema de montaje

Ahora echemos un vistazo al programa Leer_Puerto.


void setup()
{
DDRD = B00001111;
DDRB = 0;
}
void loop()
{
PORTD = PINB;
}

//D3:D0 salidas
//D11:D8 entradas

//Lee las entradas D11:D8 y lo guarda en las salidas D3:D0

En la funcin void setup() configuramos las entradas y salidas. En DDRD se configura que las lneas
D3:D0 actan como salidas. En DDRB se configuran todas las lneas como entradas. Aunque en este caso slo
se emplean las lneas D11:D8, siempre es recomendable configurar tambin como entradas, aquellas lneas
que no se usen.
La funcin void loop() es el programa principal. Simplemente carga en PORTD (salidas D3:D0) el
resultado de leer PINB (entradas D11:D8). Tanto la lectura de las cuatro entradas como la escritura sobre las
cuatro salidas se hace simultneamente.
Si hubiramos empleado las sentencias digitalRead() y digitalWrite() el programa hubiera sido bastante
ms largo y menos eficiente. Tendramos que hacer tantas lecturas y escrituras como lneas queramos
explorar. Adems, esas lecturas y escrituras se haran de una en una, no de forma simultnea.

2 - 16

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

8-2 Ejemplo: Calculadora_Binaria

Realiza el montaje correspondiente al esquema de la figura 222. Los interruptores E3:E0 se conectan con las lneas
D11:D8 respectivamente. Se configurarn como entradas.
Con ellos vamos a introducir, a modo de dato variable, un
nmero binario de 4 bits que puede ir desde 0000 (0) hasta
1111 (15).

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

E3

Los 8 leds S7:S0 del laboratorio Universal Trainer se


conectan con las lneas D7:D0 que se configuran como
salidas. En estos leds vamos a visualizar, en binario, el
resultado de realizar diferentes operaciones aritmticas entre
el valor binario introducido por los interruptores, y diferentes
constantes establecidas en el programa.

E2
E1

S7

S6

S5

S4

S3

S2

S0

S1

E0

Por ejemplo, si con los interruptores introducimos en


binario el valor 1001 (9), y le sumamos la constante 0101 (5),
el resultado que veremos en los leds ser 00001110 (14).

Figura 2-22. Esquema de la Calculadora_Binaria

Miremos el cuerpo principal del programa:


void loop()
{
PORTD = (PINB & B00001111) + 5; //Suma 5 al valor de las entradas D11:D8
}
Al leer el Puerto B (PINB) se obtiene el estado lgico de TODAS sus lneas de entrada (que son 6). Sin
embargo en este ejemplo solo nos interesa el estado de las lneas D11:D8 (las 4 de menos peso), a las que
hemos conectado los 4 interruptores. Para evitar leer valores impredecibles en las lneas no conectadas, es
muy frecuente emplear una funcin lgica, en este ejemplo la funcin AND, con objeto de descartarlas (PINB &
B00001111). El resultado de la lectura de esas entradas siempre ser B0000XXXX.
Modifica convenientemente el programa para realizar las operaciones que se proponen en la siguiente
tabla. Anota en ella los diferentes resultados de salida.
OPERACION

Sumar 9

Restar 3

Multiplicar 13

Dividir 4

ENTRADA
E3:E0
DECIMAL
1001
9
0010
2
1111
15
0110
6
1111
15
0010
2
0110
5
1111
15
1000
8
0110
6
1100
12
1000
8

SALIDA
S7:S0
DECIMAL

2 - 17

ARDUINO: La tecnologa al alcance de todos


TEMA 2: Las entradas y salidas Digitales
www.microcontroladores.com

2 - 18

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

TEMA 3: Temporizaciones, expresiones y sonido,

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

De momento nicamente vamos a emplear el led S0 del entrenador,


que lo conectaremos con la seal D2 (patilla 5) del controlador Arduino NANO.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

Es posible que hasta este momento no te hayas dado cuenta de la gran


velocidad a la que trabajan los controladores. Nuestro Arduino NANO no poda
ser menos. Monta el circuito de prueba segn el esquema mostrado en la figura
3-1.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

1.- INTRODUCCIN

S0

Figura 3-1. Esquema del circuito de prueba


A continuacin analiza el siguiente programa, lo escribes, lo grabas y lo pruebas:
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2,HIGH);
digitalWrite(2,LOW);
}

//La salida D2 se pone a "1"


//La salida D2 se pone a "0"

Es muy sencillo. La salida D2 se pone a nivel 1 (el led S0 se enciende) y luego la salida D2 se pone a
nivel 0 (el led S0 se apaga). Ambas funciones estn dentro de la funcin principal void loop(), por lo que se
ejecutan de forma indefinida y el led se estar apagando y encendiendo constantemente.
Ahora bien, cmo ves el led S0 de salida? Lo ves permanentemente encendido. Por qu? Porque a
la velocidad que trabaja el controlador, el encendido y apagado es tan rpido que la retina de nuestros ojos ve
al led siempre encendido. Es una sensacin ptica! El led s que se apaga, pero no lo vemos.
Un controlador como el Arduino NANO es capaz de ejecutar cientos de miles de instrucciones por
segundo. Es una velocidad tan rpida que, en ocasiones, vamos a tener que obligarle a que realice ciclos de
espera o temporizaciones.
2.- FUNCIONES DE TEMPORIZACION
Una funcin de temporizacin en un programa, detiene la ejecucin del mismo durante un determinado
tiempo. El tiempo que deseamos perder se puede expresar en microsegundos o en milisegundos. El lenguaje
Arduino de programacin dispone de dos funciones para ello.
2-1 Funcin delayMicroseconds()
Realiza una temporizacin de tantos microsegundos (S) como se indiquen. Recuerda que: 1 segundo
= 1000 mS, y 1 mS = 1000 S. As que: 1 segundo = 1.000.000 S.
Sintaxis:
delayMicroseconds(n)

3-1

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

n:

Expresa el nmero de microsegundos que se desea temporizar. Se trata de un nmero entero (16 bits)
sin signo (unsigned int). Actualmente el nmero ms grande que se puede indicar para realizar una
temporizacin con precisin es de 16.383 (aproximadamente 16 mS). Esto puede variar en futuras
versiones del lenguaje. Para realizar temporizaciones mayores se recomienda emplear la funcin
delay().

Ejemplos:
A=100;
delayMicroseconds(A);
delayMicroseconds(1000);

//Temporiza 100 S = 0.1 mS = 0.0001 segundos


//Temporiza 1000 S = 1 mS = 0,001 segundos

2-2 Funcin delay()


Realiza una temporizacin de tantos milisegundos (mS) como se indiquen. Recuerda que: 1 segundo =
1000 mS, y 1 mS = 1000 S.
Sintaxis:
delay(n)
n:

Expresa el nmero de milisegundos que se desea temporizar. Se trata de un nmero que puede ser un
entero largo (32 bits) sin signo (unsigned long). Un nmero entero largo, con sus 32 bits, ocupa 4
32
bytes y puede representar un valor desde 0 hasta 4.294.967.295 (2 -1).

Ejemplos:
A=100;
delay(A);
delay(1000);
delay(60000);

//Temporiza 100 mS = 0,1 segundo


//Temporiza 1000 mS = 1 segundo
//Temporiza 60000 mS = 60 segundos = 1 minuto

3.- EJEMPLO: INTERMITENCIA


El programa Intermitencia es una versin mejorada del ejemplo anterior. Observa que se intercala
una temporizacin cada vez que se enciende o apaga el led. Se parece al programa Test que vimos en el
Tema 1.
int Tiempo=1000;

//Variable con el valor de la temporizacin

void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2,HIGH);
delay(Tiempo);
digitalWrite(2,LOW);
delay(Tiempo);
}

//La salida D2 se pone a "1"


//Temporiza
//La salida D2 se pone a "0"
//Temporiza

Cuando lo cargues sobre el controlador Arduino NANO, ahora s que puedes apreciar perfectamente
que el led se enciende y apaga a intervalos de un segundo.

3-2

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

El ejemplo crea una variable, Tiempo, a la que se le carga con el valor de temporizacin deseado, en
este caso 1000 mS = 1 seg. El valor de esa variable se puede modificar para hacer una intermitencia ms o
menos rpida. Cada vez que se cambie, debes volver a cargar el programa sobre el controlador.
3-1 Trabajo personal
Puedes modificar el valor de la variable Tiempo tanto como desees. Proponemos que lo vayas
reduciendo de forma sucesiva hasta que no se aprecie la intermitencia del led. Anota aqu el valor de Tiempo
a partir del cual el led lo ves permanentemente iluminado.
Valor: .
4.- MAS EJEMPLOS
Mediante una serie de ejemplos, vamos a seguir jugando con las temporizaciones. Puedes usar tu
imaginacin para realizar programas cada vez ms complejos y llamativos.
4-1 El Faro
Se trata de un ejemplo muy sencillo que trata de simular el funcionamiento de un faro o baliza que
seala su posicin, mediante una serie de destellos regulares. En el ejemplo se producen tres destellos rpidos
seguidos de una pausa de 1.5 segundos.
4-1-1 Trabajo personal

Modificar los tiempos de los destellos y de la pausa.


Hacer un programa con una secuencia de cinco destellos.

Ms adelante aprenders funciones y tcnicas de programacin que te permitirn escribir este mismo
programa con muchas menos instrucciones, haciendo que sea ms ptimo y consuma menos memoria del
controlador.
4-2 Juego de luces

S2
S1
S0

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

El programa enciende secuencialmente, de derecha a


izquierda, desde S0 a S3, cada uno de los leds, dando una
sensacin de movimiento. Ver el montaje en la figura 3-3.

S3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Otro sencillo y vistoso ejemplo. Se trata de hacer un


juego de luces. Vamos a emplear cuatro leds del entrenador,
S3:S0, que se conectan respectivamente con las salidas D2:D5
de nuestro controlador, tal y como se muestra en el esquema
de la figura 3-2.

Figura 3-2. Esquema del Juego de luces

Figura 3-3. Montaje prctico

3-3

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

4-2-1 Trabajo personal

Vara la temporizacin al objeto de variar el efecto de movimiento de las luces.


Modifica el programa para que el movimiento sea ahora de izquierda a derecha.
Ms difcil todava: combina ambos movimientos. Es decir desplaza de izquierda a derecha y
seguidamente de derecha a izquierda.

4-3 Semforo V1

El pulsador E10 se conecta con la entrada de


RESET. Se emplea para iniciar la secuencia de
funcionamiento del semforo.

VERDE S2
AMBAR S1
ROJO S0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

ARDUINO NANO

El led S2 se conecta con la seal D2 y emula a la


luz verde. El led S1 se conecta con D3 y emula a la luz
mbar. S0 se conecta con D4 y emula a la luz roja.

E10
RESET

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Es la primera versin de un programa que trata de


emular el funcionamiento de un semforo. El esquema de
conexiones se muestra en la figura 3-4.

Figura 3-4. Esquema del semforo.

Se recomienda grabar el programa antes de conectar el pulsador RESET en la patilla 3


Si te fijas en el programa vers un detalle importante. Todas las funciones que lo componen estn
incluidas en la funcin void setup(). Esto quiere decir que slo se van a ejecutar una nica vez: cada vez que
se reinicie el sistema. Por su parte, la funcin void loop() est vaca. No contiene ninguna instruccin para
ejecutar. Cuando el controlador entra en ella, se queda sin hacer nada en un bucle infinito. En otras palabras,
la secuencia del semforo slo se produce cuando pulses el botn RESET de reinicio.
4-3-1 Trabajo personal

Modifica los tiempos en que cada luz permanece encendida y/o apagada.
Si te fijas en un semforo convencional, vers que antes de que la luz verde pase a mbar, y la
mbar pase a roja, ambas luces realizan una serie de destellos de aviso. Date prisa!

5.- EXPRESIONES
A estas alturas habrs observado que las instrucciones que hemos visto hasta el momento, y la
mayora de las instrucciones del lenguaje Arduino, necesitan uno o ms parmetros u operandos para su
correcto funcionamiento. Estos van cerrados entre parntesis y separados por ,. De momento hemos
estudiado:

pinMode (pin, modo)


digitalRead (pin)
digitalWriyte (pin,valor)
delay (tiempo)
delayMicroseconds (tiempo)

Hay que indicar n de patilla y si es entrada o salida


Hay que indicar n de patilla a leer
Hay que indicar n de patilla y valor a sacar por ella
Indicamos el tiempo en milisegundos que deseamos temporizar
Indicamos el tiempo en microsegundos que deseamos temporizar

Esos parmetros los podemos indicar de diferentes formas. Es ms, algunas de ellas ya las hemos
usado en los diferentes programas de ejemplo propuestos.
Llamaremos Expresin a la forma en que vamos a indicar esos parmetros. Bsicamente
utilizaremos tres formas:

3-4

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

Constante:
El valor del parmetro se proporciona directamente en la propia funcin. Por ejemplo:
delay(1000). Temporiza directamente 1000 mili segundos.

Variable:
El valor del parmetro est previamente definido y guardado en una variable. Por
ejemplo: delay(Tiempo). El valor a temporizar est guardado en la variable Tiempo y el controlador
debe ir a buscarlo.

Operacin:
El valor del parmetro se obtiene como consecuencia de realizar cualquier tipo de
operacin aritmtico/lgica entre variables y/o constantes. Por ejemplo: delay((Tiempo+1000)/3).
Temporiza tantos milisegundos como resulten de calcular el valor de la variable Tiempo ms 1000 y
todo ello dividido entre 3.

No se puede decir cul de estas formas de expresar los parmetros o datos es la mejor. Las
usaremos en cada caso segn mejor nos convenga.
5-1 Constantes
Cuando en un programa se utiliza un valor que siempre es fijo y nunca vara, se emplea como un dato
constante. Si en un momento dado tienes que realizar una temporizacin que siempre es igual, por ejemplo
de 1 segundo, emplears delay(1000).
El controlador ejecuta esa instruccin siempre con el mismo parmetro (1000). NO se puede variar
dinmicamente durante la ejecucin del programa. La nica forma de cambiarlo es modificando el programa
y grabndolo nuevamente en la memoria del controlador.
Otro ejemplo. Imagina que debes realizar un programa para calcular la longitud de una circunferencia
en funcin de un dimetro dado. La ecuacin a resolver sera: = , donde:
l = El resultado con la longitud de la circunferencia calculada
d = Dimetro de esa circunferencia
= el valor 3.1416
A la vista del ejemplo t mismo puedes responder:
Qu dato es constante? .. y cul es variable? .
Los datos constantes forman parte del propio programa y se encuentran como parmetros en las
propias instrucciones o funciones del mismo. Se guardan por tanto en la memoria FLASH de programa del
controlador. Se trata de una memoria NO VOLATIL de slo lectura. No se puede modificar (salvo cuando se
graba el programa) y su contenido se mantiene incluso cuando se desconecta la alimentacin.
En algunos de los ejemplos que ya hemos hecho se han empleado palabras como: HIGH o LOW,
INPUT u OUTPUT o TRUE o FALSE. Son palabras clave del lenguaje Arduino tratadas como constantes.
5-2 Variables
Las variables son espacios de memoria RAM que se reservan
para guardar datos. Cmo se muestra en la figura 3-5, te las puedes
imaginar como un conjunto de recipientes donde podemos guardar
informacin de diferente tipo para usarla posteriormente cuando nos
haga falta. La memoria RAM es una memoria que se puede leer y
escribir tantas veces como necesitemos. Su contenido SI se puede
modificar dinmicamente durante la ejecucin de un programa. Es voltil
y toda su informacin desaparece cuando falta la tensin general de
alimentacin.
Figura 3-5. Variables

3-5

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

Como ya hemos hecho en alguno de los ejemplos anteriores, las variables han de ser declaradas
previamente para luego poder ser utilizadas, segn la siguiente sintaxis:
tipo nombre = valor
tipo:

Establece qu tipo de informacin va a contener la variable. Puede ser nmeros, letras o textos.

nombre:

Es el nombre que vamos a asignar a la variable y con el que la vamos referenciar en lo sucesivo a
lo largo del programa. Lo ideal es que se empleen nombres no muy largos y que recuerden un
poco su contenido. El nombre de una variable debe empezar siempre por una letra, no por un
nmero y no debe contener espacios en blanco.

valor:

Es el valor que metemos en la variable o recipiente. Es opcional. Podemos crear una variable
vaca, sin introducir ninguna informacin en su interior. Simplemente le hacemos una reserva en la
memoria RAM del controlador para cuando la necesitemos.
La siguiente tabla resume algunos de los tipos ms corrientes para la declaracin de variables.
TIPO
char

BYTES
1

byte o
unsigned char
int

unsigned int o
word
long

unsigned long

float

DESCRIPCION
Almacena un valor del tipo carcter (8 bits)
que debe ir entre comilla simple (). Es con
signo y codifica nmeros del rango -128 a
+127
Almacena un nmero de 8 bits sin signo del
8
rango 0 a 255 (2 -1)
Es el tipo por defecto. Almacena un nmero
de 16 bits con signo en el rango de -32768 a
+32767.
Almacena un nmero de 16 bits sin signo
16
con un rango de 0 a 65535 (2 -1)
Almacena un nmero de 32 bits con signo en
el rango de -2.147.483.648 a +2.147.483.647
Almacena un nmero de 32 bits sin signo
32
con un rango de 0 a 4.294.967.295 (2 -1)
Almacena un nmero de 32 bits en coma
+38
flotante con un mximo de 3.4028235 y un
-38
mnimo de 3.4028235

EJEMPLOS
char opcin = 1
char letra = A

byte C = 23
byte resultado = C + 18
int C = 2453
int valor = C * 10
unsigned int valor = 12000 * 3
word valor = 12000 * 3
long Contador = -123456789
unsigned long Velocidad_Luz
= 299792468
float PI = 3.1416
float L = 4 * PI

En funcin del tipo de variable que vayamos a crear, debemos saber que se consume una mayor o
menor cantidad de memoria RAM. Es conveniente definir adecuadamente una variable segn el tipo de
informacin que vaya a contener. Por ejemplo, una variable tipo long consume 4 bytes de memoria RAM. Su
uso es bastante poco recomendable si la informacin que va a contener es, supongamos, de tipo byte. La
memoria RAM es limitada y un uso inadecuado de variables la puede terminar agotando.
Por otra parte si se declara una variable de, por
ejemplo tipo byte, y se introduce un valor superior a 255,
dicha variable se desbordar, perdindose parte de la
informacin. Es algo parecido a lo que le pasar al
cuentakilmetros de la figura 3-6. Cuando se desborde
vuelve otra vez a 0.

Figura 3-6. Desbordamiento de un cuentakilmetros


Por ejemplo, imagina que a una variable tipo byte que contiene el valor 253, se le suma 6. El
resultado debiera ser 259, sin embargo vemos que es 3. Por qu? Porque en una variable tipo byte el valor
8
mximo que cabe es de 0 a 255 (2 -1). Luego se desborda, vuelve a 0 y empieza de nuevo.

3-6

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

Otro tipo de variables son los llamados Arrays. Un array es una coleccin de variables de cualquiera
de los posibles tipos estudiados. Para acceder a una variable en particular dentro de una coleccin, se debe
indicar el ndice de la misma. Mira estos ejemplos:

int Tabla[4]
Crea un array llamado Tabla capaz de almacenar 4 nmeros de tipo
int. Ocupa por tanto 8 bytes de la memoria RAM. Ver la figura 3-7
Figura 3-7. Array de 4 celdas

int Tabla[ ]={5678,750,1234}


Crea el array Tabla y almacena los valores indicados, quedando
como se muestra en la figura 3-8.
Figura 3-8. El array Tabla

int Suma = Tabla[0] + Tabla[2]


Extrae del array Tabla el valor de su variable 0 (5678) y el de su variable 2 (1234). Hace la suma y
almacena el resultado (6912) en la variable Suma

unsigned int Valores[12]


Crea un array llamado Valores con capacidad para 12 variables de tipo entero sin signo. Ocupa 24
bytes de memoria RAM en total.

Valores[4] = 12345
En la variable 4 del array Valores se introduce el nmero 12345

char Texto[8] = ARDUINO


Crea un array de tipo carcter llamado Texto. Ocupa 8 bytes de RAM
y se almacena la cadena ARDUINO\o (\o es el cdigo Null de
control). Ver la figura 3-9.
Figura 3-9. Un array de texto

char Letra=Texto[2]
Extrae la variable 2 del array Texto (letra D) y la almacena sobre la variable Letra

5-2-1 Tipos de variables


Segn el lugar del programa donde declares las variables,
estas pueden ser globales o bien locales. Esta distincin
puede ser importante cuando empieces a desarrollar
programas de cierta complejidad y tamao.
Globales: Son las variables que se declaran o definen fuera
de todas las funciones que haya en el programa, incluidas las
funciones void setup() y void loop(). En el ejemplo que se
muestra en la figura 3-10, las variables Dato y Resultado
son globales. Pueden ser usadas por cualquiera de las
funciones existentes en el programa.
Locales: Son variables que nicamente pueden ser usadas o
vistas dentro de la funcin en donde se crearon. Se evita as
que una variable que se declara en una funcin, pueda ser
utilizada por otra funcin distinta a ella (excepto que sea una
variable global).
Figura 3-10. Variables globales y locales

3-7

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

Una vez que finaliza la ejecucin de una funcin, todas sus variables locales desaparecen hasta que
volvamos a usarla. Segn la figura, en la funcin Mi_funcin_1(), las variables Tiempo, Hora y
Resultado son locales. Observa las variables locales del resto de las funciones de la figura 3-10 de ejemplo.
5-3 Operaciones
Como ya habrs adivinado, tanto los parmetros que acompaan a las sentencias del lenguaje
Arduino, como los valores que cargamos en las variables, pueden obtenerse como resultado de hacer todo
tipo de operaciones aritmticas entre variables y/o constantes.
Las operaciones matemticas clsicas son:
=
+
*
/
%

Asignacin
Suma
Resta
Multiplicacin
Divisin
Mdulo (el resto de una divisin entre dos nmeros enteros)

Al igual que cuando operamos nosotros, cualquier expresin se calcula de izquierda a derecha. La
multiplicacin y la divisin tienen prioridad sobre la suma y la resta. Se pueden usar los parntesis para
establecer la prioridad deseada en la operacin. Mira estos ejemplos:

3 +5 2 = 6
20 - 2 * 3 = 14 y no 54
(20-2) * 3 = 54 y no 14
20 / 2 * 3 = 30
24 / (2 * 3) = 4

(12 2) + 5 * 3 = 25 y no 45
((12 2) + 5) * 3 = 45 y no 25
13 % 4 = 1
7%5=2
5%5=0

Teniendo en cuenta todo lo visto en esta seccin, a partir de ahora podrs determinar los parmetros
que usan las funciones del lenguaje Arduino, de una forma mucho ms flexible y potente. Fjate en los
siguientes ejemplos y trata de responder a las preguntas.
byte Luz = 3;
pinMode(Luz+1,OUTPUT);
digitalRead(Luz);
digitalWrite((1+Luz)*2,HIGH);
Qu patilla se configura como salida?.
Qu patilla se lee?
Qu patilla se pone a nivel 1?.
byte A = 250;
byte B;
byte C;
unsigned int D;
A = A + 3;
B = (A-200) * 2 / 4;
C = A * 2 + 20;
D = (A * 100) % 2;
A = .; B = ..; C = .; D = ..
byte A=10;
delay((A+2) * 1000 / 5):
La temporizacin realizada es de .

3-8

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

6.- SONIDO
Aprovechando que ya sabemos manejar las entradas y salidas digitales, es el momento de ver cmo
podemos generar sonido con nuestro controlador Arduino NANO. Al fin y al cabo una seal de sonido no es
otra cosa que una seal elctrica que vara a una determinada frecuencia produciendo diferentes tonos. Mira
la figura 3-11.

Figura 3-11. Seal de diferentes frecuencias y tonos


Esta seal la podemos aplicar a un transductor como puede ser un altavoz. Este traduce la seal
elctrica en una serie de movimientos mecnicos que producen cambios de presin, vibraciones u ondas en
el aire, llegando as hasta nuestro odo. El odo humano es capaz de percibir y escuchar vibraciones que van
desde los 20Hz (Hertzios) has los 20000Hz (o 20KHz).
Las vibraciones por debajo de los 20Hz reciben el nombre de infrasonidos, y por encima de los
20KHz, ultrasonidos. Tericamente el odo humano no es capaz de percibir ninguno de esos sonidos,
aunque algunos animales s.
Segn la figura anterior, vamos a generar seales audibles compuestas de niveles lgicos: 1 y 0.
Esto ya lo sabemos hacer. Solo nos queda por calcular la frecuencia que deseamos para esa seal. Es fcil:
1. A partir de la frecuencia F deseada (por ejemplo 1000Hz), calculamos lo que debe durar un ciclo. Un
ciclo es la parte que se repite de la seal (nivel 1 y nivel 0). Tambin se le llama periodo o T.
=

= .

2. Ahora calculamos el semiperiodo S, o lo que es igual, el tiempo que la seal va a estar a nivel 1 y a
nivel 0.
=

= .

= .

Observa el siguiente programa, Tonos_1, y vers que no tiene mayor dificultad. Estamos aplicando
todo lo que hemos aprendido hasta el momento:
float F=1000;
float C=1/F;
unsigned long T=C*1000000;
unsigned long S=T/2;

//Valor de la frecuencia deseada (F)


//Calcula la duracin del ciclo en segundos
//Calcula el periodo T en microsegundos
//Calcula el valor del semiperiodo (S)

Creamos diferentes variables. F contiene la frecuencia de la seal sonora deseada. En C se


calcula la duracin del ciclo o periodo en segundos, segn la frmula anterior. En T tenemos la duracin del
ciclo o periodo convertida en microsegundos. Finalmente, la variable S se carga con la duracin del
semiperiodo. Todas estas variables estn fuera de las funciones void setup() y void loop(), por lo que son
variables globales.

3-9

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

Por lo dems, el cuerpo principal del programa no nos ensea nada nuevo:
void loop()
{
digitalWrite(12,HIGH);
delayMicroseconds(S);
digitalWrite(12,LOW);
delayMicroseconds(S);
}

//El altavoz se activa


//Temporiza
//El altavoz se desactiva
//Temporiza

La salida digital 12 se pone a 1, se temporiza segn el valor calculado para el semiperiodo (S), se
pone a nivel 0 y se vuelve a temporizar segn S.
Para probar este ejemplo necesitamos del altavoz que se incluye en el presente
mdulo. Como se muestra en la figura 3-12, le vamos a colocar o soldar dos cablecillos
que nos permitan a su vez conectarlo con la tarjeta de control Arduino NANO.
Figura 3-12. El altavoz
+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Ahora
veamos
el
esquema elctrico de
conexiones
que
se
muestra en la figura 3-13.
Uno de los cablecillos del
altavoz se conecta con la
patilla D12 de la tarjeta
Arduino NANO. Por esta
patilla vamos a sacar la
seal sonora. El otro de
los cablecillos del altavoz
se conecta con la seal
GND de alimentacin.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Figura 3-13. Esquema elctrico del ejemplo


La fotografa de la figura 3-14 muestra el montaje prctico sobre el
entrenador Universal Trainer.
Figura 3-14. Montaje prctico
Prueba a variar la frecuencia modificando en el programa el valor de la variable F. Oirs sonidos con
diferentes tonos. A frecuencia bajas, tonos graves; a frecuencias altas, tonos agudos. Tambin puedes hacer
un anlisis de tus propias capacidades auditivas. Completa la siguiente tabla.
Frecuencia (F)
Periodo (T)
Semiperiodo (S)
Lo oyes? (SI/NO)

20 Hz

200 Hz

1 KHz

4 KHz

10 KHz

15 KHz

18 KHz

20 KHz

6-1 Sentencias de sonido


Como no poda ser menos, el lenguaje de programacin Arduino dispone de sus propias funciones o
instrucciones para generar todo tipo de sonidos. Esto facilita enormemente la programacin ya que no
tendremos que calcular ni periodos ni semiperiodos para una frecuencia deseada. Lo har el propio lenguaje.

3 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

6-1-1 Funcin tone()


Genera una seal de onda cuadrada con la frecuencia y la duracin deseada. La frecuencia mnima
que puede generar es de 31Hz. La seal de salida es simtrica. El nivel 1 dura lo mismo que el nivel 0.
Sintaxis:
tone(pin,frecuencia,duracin)
pin:
frecuencia:
duracin:

Indica la patilla por donde va generarse la seal audible.


Valor entero sin signo que expresa, en hertzios (Hz), la frecuencia de la seal
Valor entero sin signo que expresa, en milisegundos, la duracin del tono. Es opcional. Si no
se indica la salida de la seal o el tono se mantiene permanentemente hasta que se ejecute la
funcin noTone().

Ejemplos:
tone(12,1000,1000);
tone(3, A + 100,300);
tone(6,2500);

Genera una seal o tono de 1000Hz durante 1 segundo por la patilla 12


Genera una seal cuya frecuencia resulta de sumar el contenido de la variable A
con 100, por la patilla 3. La duracin del tono es de 300mS (0.3s).
Genera una seal de 2500 Hz por la patilla 6 de forma permanente hasta que se
ejecute la funcin noTone().

6-1-2 Funcin noTone()


Detiene la generacin de la seal audible producida por la ltima funcin tone() ejecutada en el
programa.
Sintaxis:
noTone(pin)
pin:

Indica la patilla por donde se est generando la seal audible que se desea detener.

Ejemplo:
tone(6,2500);
noTone(6);

Genera una seal audible permanente de 2500Hz por la patilla 6


Interrumpe la seal audible que sale por la patilla 6

6-2 Ejemplo: Tonos_V2


Graba y prueba el funcionamiento del programa Tonos_V2. Se comporta exactamente igual que el
programa Tonos_V1 del ejemplo anterior, pero estars de acuerdo en que es mucho ms sencillo:
void loop()
{
tone(12,F);
}

//Genera una seal de frecuencia F por la patilla 12

No solo eso, tambin es mucho ms eficiente. Efectivamente, en el programa Tonos_V1, mientras


el controlador est temporizando para activar o desactivar la patilla por donde sale la seal audible (la 12),
NO PUEDE ESTAR HACIENDO NINGUNA OTRA TAREA! Sin embargo, si empleamos la funcin tone(), el
controlador realiza los ajustes internos necesarios para sacar la seal deseada y a continuacin contina
ejecutando las instrucciones de nuestro programa.

3 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

6-3 Ejemplo: Tonos_V3


Vamos ahora con el ejemplo Tonos_V3 para corroborar lo que acabamos de decir. En la funcin
void setup() se ha incluido la funcin tone(12,F). Sabemos por tanto que solo se ejecuta una vez y el
controlador queda ajustado para producir permanentemente una seal audible por la patilla 12.
Por su parte, la funcin principal void loop() se limita a activar y
desactivar la salida D2 con un intervalo de 0.3 segundos. Monta el
circuito mostrado en el esquema de la figura 3-15. Una vez que
grabes el programa, comprueba que el tono de 1KHz se mantiene
a pesar de que el controlador est metido en un bucle infinito,
activando/desactivando la salida D2, donde hemos conectado el
led S0 del entrenador.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Seras capaz de hacer lo mismo pero usando la tcnica


empleada en el programa Tonos_V1?

Figura 3-15. El ejemplo Tonos_V3


S0

6-4 Ejemplo: Tonos_V4

+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Otro ejemplo de uso de la funcin tone(). Se trata


de sacar una seal acstica de aviso cada vez que se
reinicie el sistema activando la seal RESET. Se generan
tres tonos de diferentes frecuencias y duracin.

Figura 3-16. Esquema del ejemplo Tonos_V4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Monta el circuito del esquema de la figura 3-16. Se


recomienda que el pulsador E10 lo conectes con la entrada
de RESET (patilla 3) despus de grabar el programa, para
evitar problemas de transferencia entre el PC y la tarjeta de
control Arduino NANO.

E10

RESET

6-5 Ejemplo: Melodas


Naturalmente, con la funcin tone() del lenguaje Arduino tambin puedes crear tus propias melodas.
Este ejemplo te lo demostrar. Ten en cuenta que a cada nota musical le corresponde una frecuencia. Si
sabes solfeo te basta con buscar la relacin entre las notas de la partitura con sus correspondientes
frecuencias, para poder as reproducir una meloda.
Segn el sistema latino de notacin musical, las notas bsicas son siete: do, re, mi, fa, sol, la, si. En
el sistema ingls de notacin, tambin denominado denominacin literal, se corresponden con C, D, E, F,
G, A, B respectivamente. A partir de ellas se obtienen los sostenidos, bemoles y una combinacin de todos
ellos.
Adems de las notas (o frecuencias), en una meloda tambin se debe establecer la duracin de cada
una as como el intervalo entre una nota y la siguiente. La duracin se suele establecer en 1/4, 1/8, etc de
segundo, es decir: 1000 mS / 4, 1000 mS / 8, etc La duracin de una nota se puede establecer en la misma
funcin tone().
El intervalo entre una nota y la siguiente suele ser un 30% de la duracin de la misma. Dichos
intervalos se pueden conseguir fcilmente mediante la funcin delay().

3 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

El programa del ejemplo reproduce 8 conocidas notas. Todas ellas, salvo en frecuencia, duracin e
intervalo, son similares. Observa las funciones tone() y delay() de la primera nota. Se corresponde con la nota
C4 (262Hz), con una duracin de 250 mS y un intervalo de espera del 30% de la duracin (325 mS).
Te sirve el mismo circuito de la figura 3-16. Acurdate de grabar el programa antes de conectar el
pulsador E10 con la seal de RESET (patilla 3).
6-6 Ejemplo Semforo_V2
Aqu tienes una segunda versin mejorada del ejemplo del semforo, el Semforo_V2.
Aprovechando lo que ya sabemos sobre el sonido, el programa emula el funcionamiento de un semforo con
seales acsticas para invidentes. La secuencia se inicia al activar la seal de RESET. El encendido
secuencial de las diferentes luces va acompaado de sus correspondientes seales acsticas de aviso.
Si te fijas, todas las instrucciones del programa se encuentran incluidas en la funcin void setup(),
por lo que nicamente se ejecutan tras reiniciar el sistema mediante el RESET. El programa te puede parecer
largo pero no complicado. Con lo que sabemos de momento es lo nico que podemos hacer. En el prximo
tema vamos a estudiar y a emplear sentencias de control. Con ellas vamos a poder hacer programas mucho
ms cortos y eficientes. Tiempo al tiempo.
En la figura 3-17 se muestra el esquema de conexiones para este ejemplo. No hay mucho que
explicar ya que es similar al empleado en ejemplos anteriores. Recuerda que es aconsejable grabar el
programa antes de conectar el pulsador E10 con la entrada RESET (patilla 3).
E10
RESET

ROJO1 S0

ARDUINO NANO

AMBAR1 S1

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

VERDE1 S2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Figura 3-17. Esquema para el Semforo_V2

3 - 13

ARDUINO: La tecnologa al alcance de todos


TEMA 3: Temporizaciones, expresiones y sonido
www.microcontroladores.com

3 - 14

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

TEMA 4: Toma de decisiones y sentencias de control:


1.- INTRODUCCIN
Los seres humanos somos capaces de analizar nuestro entorno y situacin y, en funcin de nuestros
intereses, sentimientos, capacidad, intuicin, obligacin, etc, tomamos decisiones que nos llevan a realizar
una tarea u otra con mayor o menor xito.
Los programas que hemos desarrollado hasta el momento eran programas muy secuenciales. Las
instrucciones se van ejecutando una tras otra, desde la primera hasta la ltima y sin ninguna otra
consideracin.
Sin embargo Arduino, al igual que cualquier otro controlador, tambin tiene capacidad de tomar
decisiones y ejecutar los programas o tareas apropiadas en caso. Ahora bien, Arduino no tiene sentimientos, ni
intuicin, ni tan siquiera es inteligente. Es una mquina que solo sabe manejar nmeros, y como tal, sus
decisiones se toman en base a ellos: clculos aritmticos/lgicos, comparaciones entre nmeros, estados de
las seales digitales de entrada, valores analgicos ledos de un sensor, etc
1-1 Operadores de comparacin
Ya sabemos que Arduino puede realizar operaciones aritmticas como sumar y restar diferentes
nmeros o datos que podemos expresar en forma de constantes, variables o combinacin de ambas cosas.
Tambin puede hacer comparaciones entre datos o entre los resultados que ofrecen a su vez otras funciones.
Los operadores de comparacin, as como los smbolos que los representan, son los siguientes:

Igualdad (==)
Distinto de (=)
Menor que (<)
Mayor que (>)
Menor o igual que (<=)
Mayor o igual que (>=)

Como resultado de una comparacin, sea del tipo que sea, solo se obtienen dos resultados posibles:
verdadero (true) o falso (false). Mira y analiza los siguientes ejemplos:
Suponiendo que
char Letra = J;
byte A = 13;
int B = 12345;
float PI = 3.1416;
Entonces
Letra == J
Letra = Q
18 < A
A == 8 + 5
B >= A
PI * 2 > 8.16
B 1000 <= A * 12
digitalRead(4) == 1
est a 1)

//Verdad
//Verdad
//Falso
//Verdad
//Verdad
//Falso
//Falso
//Verdad (si la entrada 4

Ahora t
A + B == 12357
B < A * 1000
A <= 13
A * 2 >= 25
Letra > K
Letra < K

//.
//.
//.
//.
//.
//.

4-1

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

1-2 Operadores booleanos


Incluso es posible relacionar entre s varias de las comparaciones o expresiones anteriores. Para ello,
Arduino dispone de tres operadores lgicos o booleanos que, seguro que te recuerdan algo. Aqu los tienes
junto con los smbolos que los representan:

Y (&&)
O (||)
NO ()

De igual forma, como consecuencia de relacionar dos o ms expresiones mediante estos operadores
lgicos, tambin se generan dos posibles resultados: verdadero (true) o falso (false). Observa los siguientes
ejemplos. Cada expresin que relacionamos va encerrada entre parntesis para evitar errores.
(Letra == X) && (A > 10)
(A == 10+3) && (B >= 12345) && (Letra = Q)
(B > 12300) || (PI = 3.1412)
(A == B) || (A > 10 + 4)
(A == B)
(digitalRead(4) == 1) && (digitalRead(8)==1)

//Falso
//Verdad
//Verdad
//Falso
//Verdad
//Verdad si ambas entradas (D4 y D8) est a nivel 1

2.- SENTENCIA IF ( )
Es la sentencia de control ms elemental. Permite evaluar y tomar
decisiones en base a expresiones como las que acabamos de ver. En
informtica, en los esquemas conocidos como diagramas de flujo, es muy
frecuente emplear smbolos como el mostrado en la figura 4-1, que representa a
una toma de decisin. El controlador evala la expresin. Si es verdadera
ejecuta todas las instrucciones que se encuentren cerradas entre las llaves { }.
Si resulta ser falsa no se ejecutan y el programa sigue su curso.
Figura 4-1. Sentencia if ()
Debemos recordar que una expresin puede estar formada por operaciones aritmticas entre
constantes y/o variables relacionadas entre s por operadores de comparacin, que a su vez, se relacionan
mediante operadores lgicos o booleanos. Repasa los ejemplos anteriores.
Sintaxis:
if(expresin)
{
.
.
}
expresin:

Establece la condicin que Arduino debe evaluar. Puede ser la comparacin entre datos
constantes y/o variables. Puede haber una o ms comparaciones relacionadas entre s
mediante los operadores lgicos. Tambin se pueden comparar los resultados obtenidos al
ejecutar operaciones aritmticas u otras funciones del propio lenguaje Arduino.

llaves:

Como en un bocadillo, encierran las sentencias que el controlador debe ejecutar en caso de
que se cumpla la condicin (true). No hacen falta si nicamente se va a ejecutar una instruccin
o sentencia.

4-2

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

2-1 Ejemplo: Timbre

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Veamos un ejemplo muy sencillo que ilustra perfectamente


el funcionamiento de la funcin if(). Se trata de emular un
timbre electrnico que se activa al accionar un pulsador. El
esquema de la figura 4-2 muestra el montaje a realizar
sobre el entrenador Universal Trainer.
El pulsador E10 se conecta con la entrada D2 (patilla 5) del
controlador. Este pulsador trabaja con lgica inversa. En
reposo proporciona nivel 1 y cuando se acciona nivel 0.
El altavoz se conecta con la salida D12 como en anteriores
ejemplos.

E10

Figura 4-2. El ejemplo Timbre

TIMBRE

void loop()
{
if(digitalRead(2)==0)
{
tone(12,400);
delay(300);
tone(12,300,300);
}
}

//Si la entrada D2 est a "0" ...


//Genera una frecuencia de 400Hz...
//... durante 0.3"
//Genera una frecuencia de 300Hz durante 0.3"

Si la entrada D2 est a nivel 0 (true) se generan los dos tonos que simulan el timbre. Uno es de
400Hz y el otro de 300Hz. Ambos tienen una duracin de 0.3 s.
Si la entrada D2 est a nivel 1, la condicin no se cumple (false) y las instrucciones encerradas entre
las llaves no se ejecutan.
Consejo: Cuando emplees sentencias condicionales en tus programas, es una buena costumbre alinear las
llaves de forma que se vea claramente el emparejamiento de la que abre, con la llave que cierra. En el ejemplo
se distingue claramente las llaves que abren y cierran la funcin void loop() principal, y las que corresponden a
las de la funcin if().

3.- SENTENCIA IF( ) ELSE


Se trata de otra sentencia de control que se derivada de la sentencia if() anterior. Permite establecer
claramente qu hacer si no se cumple la condicin (else). La figura 4-3 puede ayudar a entender su
funcionamiento.
Se evala la expresin o condicin. Si sta se cumple (true),
se ejecutan todas las sentencias encerradas entre las llaves: igual que
en la funcin if(). Si la condicin NO se cumple (false), se ejecutan
todas las instrucciones cerradas entre las llaves que siguen a la
palabra else (sino).
Una vez ejecutas las instrucciones en cualquiera de los dos
casos, la ejecucin del programa continua su curso.
Figura 4-3. Sentencia if () else

4-3

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

Sintaxis:
if(expresin)
{
.
.
}
else
{
.
.
}
expresin:

Establece la condicin que Arduino debe evaluar. Puede ser la comparacin entre datos
constantes y/o variables. Puede haber una o ms comparaciones relacionadas entre s
mediante los operadores lgicos. Tambin se pueden comparar los resultados obtenidos al
ejecutar operaciones aritmticas u otras funciones del lenguaje Arduino.

llaves:

Engloban a todas las sentencias que el controlador debe ejecutar tanto en caso de que se
cumpla la condicin (if), como si no se cumple (else). Las llaves no hacen falta si nicamente
se necesita ejecutar una instruccin en cada caso, por ejemplo:
if (A > 13)
A = A + 25;
else
A = B;

3-1 Ejemplo: Juego de luces_V2

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

El programa puede parecerte largo, pero sin embargo es muy sencillo.


Mediante la sentencia if(!digitalRead(2)) se lee y evala el estado de la
entrada digital D2 (interruptor E0). Mediante el uso de las llaves queda bien
claro qu instrucciones se ejecutan si se cumple la condicin (interruptor =
0), y cules en caso contrario else (interruptor = 1).

S0

S1

S2

S3

E0

Una nueva versin del juego de luces que hicimos en el tema anterior.
Mediante un interruptor se controla si el desplazamiento es a la izquierda o
a la derecha. La figura 4-4 muestra el esquema de conexiones. Los leds de
salida S3:S0 se conectan con las lneas D3:D6 respectivamente. El
interruptor de entrada E0 se conecta con la lnea D2. Cuando est a nivel
0 las luces se encienden describiendo una secuencia de derecha a
izquierda. Si el interruptor est a nivel 1 la secuencia de encendido es de
izquierda a derecha.

Figura 4-4. Esquema para el programa Juego de luces _V2

3-2 Ejemplo: Semforo_V3


En la figura 4-5 se muestra el esquema para una nueva versin del ejemplo del semforo,
Semforo_V3.
Las lneas D3:D5 actan como salidas y se conectan con los leds S2:S0 que simulan las luces verde,
mbar y roja del semforo respectivamente.
El pulsador E10 del entrenador Universal Trainer se conecta con la lnea D2 que acta como entrada.
El pulsador es accionado por el peatn cada vez que desea cruzar la va.

4-4

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Transcurrido un tiempo de 2 segundos, la luz roja se apaga


y comienza la secuencia. Se enciende la luz verde y se generan
unos tonos de 1000 Hz, con una duracin de 0.5 y una cadencia
de 1.1 entre tono y tono. A continuacin se enciende la luz mbar
y se generan unos tonos de 1000 Hz, con una duracin de 0.4 y
una cadencia de 0.7. Son tonos ms breves y rpidos para darle
al peatn la sensacin de que debe darse prisa al cruzar.
Finalmente, se enciende la luz roja con un tono permanente de 2
segundos. Finaliza el tono pero la luz roja se mantiene encendida
hasta iniciar una nueva secuencia.

ROJO2 S0

Figura 4-5. Esquema del Semforo_V3

AMBAR2 S1

E10
PASAR

VERDE2 S2

En el programa se distingue claramente qu instrucciones


se ejecutan si NO se pulsa E10 (else). Se enciende la luz roja y se
apagan las otras dos. En el instante que se detecta la pulsacin de
E10 (if) se inicia la secuencia de funcionamiento.

4.- SENTENCIA FOR()


En cuanto veamos esta sentencia, inmediatamente le buscars utilidad en alguno de los programas
que hemos visto anteriormente, con objeto de hacerlo ms pequeo y eficiente.
Se trata de una sentencia para realizar bucles controlados. Un bucle es un conjunto de instrucciones
cuya ejecucin se repetir un nmero determinado de veces.
Sintaxis:
for(inicio; condicin; modificador)
{
.
.
}
inicio:

Es una expresin que permite cargar una variable con un valor inicial. Solo se ejecuta una vez,
al principio del bucle.

condicin:

Es una expresin condicional. Si se cumple la condicin (true), se ejecutan todas las


instrucciones o sentencias del bucle. Si no se cumple la condicin (false), el bucle finaliza y la
ejecucin del programa sigue su curso. Esta expresin se evala cada vez que se repite el
bucle.

modificador:

Es una expresin que permite modificar el valor de la variable con objeto de alcanzar la
condicin. Este modificador se ejecuta cada vez que se repite el bucle.

llaves:

Encierran, a modo de bocadillo, a todas las instrucciones que forman el bucle y que deben
ejecutarse un nmero determinado de veces.

Ejemplo:
for(byte N = 1; N < 5; N=N+1)
{
.
.
}

4-5

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

Una imagen vale ms que mil palabras. Observa el diagrama de flujo de la figura
4-6. Se declara la variable N, de tipo byte, y se le carga con el valor inicial 1
(byte N = 1). Se evala y, si es menor que 5 (N < 5), se ejecutan todas las
sentencias cerradas entre las llaves. El valor de la variable N se modifica
automticamente y, en este caso, se incrementa en una unidad (N = N + 1).
Vuelve a repetirse la evaluacin de la condicin. Si es cierta se vuelven a ejecutar
las sentencias y el proceso se repite hasta que la condicin sea falsa. En el
ejemplo de la figura, las sentencias encerradas entre las llaves se ejecutan 4
veces: mientras N sea menor de 5.
Figura 4-6. Esquema de funcionamiento de un bucle for()

Para establecer el inicio, la condicin y el modificador de cualquier bucle for(), se pueden emplear todo
tipo de expresiones aritmticas, booleanas o lgicas y de comparacin entre variables y/o constantes. Por
ejemplo:
int A = 5;
for(byte N=A+3); N <= A*2+8; N=N+3)
{
.
}
Cul es el valor inicial del bucle?..
Y el valor final?
En cunto se incrementa cada vez?
Cuntas veces se repite el bucle?
4-1 Operadores compuestos
En ocasiones realizamos operaciones sencillas con una variable, cuyo resultado va a parar a esa
misma variable. Para ello existen los llamados operadores compuestos que simplifican esas expresiones:
Operador
++
-+=
-=
*=
/=

Operacin
Incrementa una unidad
Decrementa una unidad
Suma
Resta
Producto
Divisin

Ejemplo
X ++
Y -X += Y
X -= 3
X *= Y
X /= 5

Equivale a
X=X+1
Y=Y-1
X=X+Y
X=X-3
X=X*Y
X=X/5

Son muy utilizados en los modificadores de la sentencia for(): for(byte N=1; N<5; N++)

Figura 4-7. Baliza de sealizacin

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

Aqu tienes una versin muy mejorada del programa Faro del tema
anterior, el programa Faro_V2. El funcionamiento de ambos programas es
idntico. Consiste en hacer una baliza que parpadea tres veces seguidas
cada 1.5 segundos. En esta ocasin empleamos la sentencia for(). Si
comparas este programa con su primera versin, observars que hay una
gran diferencia en su tamao. Ocupa menos memoria y es por tanto ms
eficiente. Es un buen ejemplo bsico de aplicacin de la sentencia for().

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Monta el circuito segn el esquema de la figura 4-7. Se trata de un


simple led, el S0, conectado con la lnea D2 del controlador.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

4-2 Ejemplo: Faro_V2

S0

4-6

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

4-3 Ejemplo: Semforo_V4


Ya tenemos la ltima y definitiva versin del ejemplo del semforo, el Semforo_V4. Su circuito es el
mismo que el del esquema de la figura 4-5, y tiene idntico funcionamiento que el ejemplo Semforo_V3. Si
comparas ambos observars que el empleo de la funcin for() reduce notablemente el tamao del programa,
ocupa menos memoria del controlador y es por tanto ms eficiente.
4-4 Ejemplo: Rfagas

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Se trata de emitir dos rfagas luminosas sobre los leds S1 y S0 conectados con
las seales D3 y D4 respectivamente. La secuencia se inicia al pulsar E10
conectado con la lnea D2 del controlador. Ver el esquema de la figura 4-8.
Cada vez que se produce una rfaga de 5 destellos en el led S1, se produce un
destello en el led S0. La secuencia finaliza cuando se hayan producido 6 de
estos destellos en S1.

S0

E10
INICIO

S1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Los bucles for() se pueden anidar. Esto es, dentro de un bucle for() puede haber
uno o ms bucles for(), y dentro de cada uno de estos, puede haber otros y as
sucesivamente. Este programa es una pequea demostracin de anidamiento de
dos bucles.

Figura 4-8. Circuito del programa Rfagas


Observa el cuerpo principal del programa.

void loop()
{
if(!digitalRead(2))
{
for(byte A=1; A<=6;A++)
{
for(byte B=1;B<=5;B++)
{
digitalWrite(3,HIGH);
delay(80);
digitalWrite(3,LOW);
delay(100);
}
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,LOW);
delay(120);
}
}
}

//Si la entrada D2 es verdad (nivel "0") ...


//Mientras A <= 6
//Mientras B <= 5 ...
//Activa el led S1
//Temporiza
//Desactiva el led S1
//Temporiza
//Activa el led S0
//Temporiza
//Desactiva el led S0
//Temporiza

Dentro de la funcin if(), si se cumple que la entrada D2 est a activada (0), se encuentran dos bucles
for(). El ms interno se controla desde la variable B que evoluciona desde 1 hasta 5. Produce una rfaga de 5
destellos en el led S1 conectado a la lnea D3.
El bucle for() externo se controla mediante la variable A que evoluciona desde 1 hasta 6. Envuelve al
bucle for() interno, por lo que este se repite 6 veces. Por cada una de ellas el led S0 conectado en la lnea D4
produce un destello.

4-7

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

Cuando se anidan dos o ms bucles for(), se resuelve primero el ms interno siguiendo en orden hasta
resolver, por ltimo, el bucle ms externo.
5.- SENTENCIA WHILE()
Es una variante de la sentencia for(), y tambin se emplea para realizar bucles en donde un conjunto
de instrucciones se ejecutan un nmero determinado de veces.
Sintaxis:
while (condicin)
{
.
.
}
condicin:

Es una expresin condicional. Mientras la condicin sea cierta (true) se ejecutan las sentencias
del bucle. En caso contrario el bucle finaliza.

llaves:

Encierran a todas las sentencias que forman el bucle y que se ejecutarn siempre que la
condicin sea cierta (true). Si nicamente se debe ejecutar una instruccin, no es necesario
cerrarla entre llaves. Si la sentencia while() finaliza con ; se ejecuta as misma mientras se d
la condicin.

5-1 Ejemplo: Timbre_V2


Vamos a emplear el mismo circuito que el mostrado en el esquema de la figura 4-2. El cuerpo principal
del programa se muestra a continuacin:
void loop()
{
while(digitalRead(2));
while(! digitalRead(2));
tone(12,400);
delay(300);
tone(12,300,300);
}

//Esperar mientras D2=1


//Esperar mientras D2=0
//Genera una frecuencia de 400Hz...
//... durante 0.3"
//Genera una frecuencia de 300Hz durante 0.3"

Ambas funciones while() finalizan con ;. La primera se ejecuta constantemente mientras la entrada D2
est a nivel 1 (pulsador S0 sin accionar). La segunda while() se ejecuta constantemente mientras la entrada
D2 est a nivel 0 (pulsador S0 accionado).
En otras palabras, el programa espera a que accionemos el pulsador (nivel 0) y luego lo soltemos
(nivel 1), para ejecutar el tono de nuestro timbre. Hay que hacer ambas cosas: pulsar y soltar.
Conviene recordar que los pulsadores del laboratorio Universal Trainer trabajan con lgica invertida. Si
no se accionan ofrecen un nivel 1. Cuando se accionan ofrecen un nivel 0.
5-2 Ejemplo: Contador
Un ejemplo prctico. Deseamos un sistema que cuente un nmero de piezas, por ejemplo 10, y genere
una seal sonora de aviso. El pulsador E10 del laboratorio simula a un sensor que detecta las piezas, se
conecta con la lnea de entrada D2.
El altavoz se conecta con la salida D12 y emite un tono de 1KHz durante 1 segundo cada vez que se
detecta el paso de las 10 piezas (10 pulsaciones en E10). Se emplea por tanto el mismo esquema de montaje
que el mostrado en la figura 4-2.

4-8

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

Void loop()
{
byte Contador=1;
while (Contador <=10)
{
while(digitalRead(2));
while(!digitalRead(2));
Contador++;
}

//Contador =1
//Mientras el contador no llegue a 10 ...
//Esperar mientras D2 vale "1"
//Esperar mientras D2 vale "0"
//Pulso recibido, Contador+1

//Se han recibido los 10 impulsos. Se genera la seal acstica


tone(12,1000,1000);
//Tono de 1Khz durante 1 segundo
}
Se inicia la variable Contador con el valor 1. Mientras dicha variable sea menor de 10, se ejecuta un
bucle while() formado por tres instrucciones. La primera de ellas espera mientras la entrada D2 (pulsador E10)
est a nivel 1. La segunda espera mientras la entrada D2 est a 0. Cuando se haya cumplido ambas
condiciones (el pulsador se accione y se suelte), se ejecuta la tercera instruccin: incrementar la variable
Contador en una unidad. Cuando la variable Contador alcance el valor 10, el bucle finaliza y se ejecuta la
instruccin tone().
5-3 Ejemplo: Contador_V2
Quiz hayas observado en el ejemplo anterior que en ocasiones, en lugar de contar 10 impulsos,
cuenta menos. No es que el programa est mal diseado, es un problema debido al conocido efecto rebote
tpico de los dispositivos electromecnicos como son los pulsadores e interruptores.
Estos dispositivos se basan en una laminilla metlica que conecta o no dos
terminales elctricos. Cada vez que se accionan es posible que esa laminilla rebote
sobre los terminales durante un cierto tiempo hasta que se estabilizan. Realmente se
pueden producir varios pulsos. Mira la figura 4-9.
Aunque realicemos una nica pulsacin, la seal elctrica que aplicamos al
controlador est formada por varios pulsos. El tiempo que tarda en estabilizarse la
laminilla del pulsador depende de la calidad del mismo y puede cifrarse en unos
cuantos milisegundos. A pesar de ello, como nuestro Arduino es mucho ms rpido, y
detecta todos esos pulsos. Es decir, una nica pulsacin por parte nuestra puede ser
interpretada como uno, dos o ms pulsos por parte de Arduino.

Figura 4-9. El efecto rebote


Una forma de evitarlos es intercalar una pequea temporizacin. Observa la modificacin que hemos
hecho en el ejemplo Contador_V2.
while(digitalRead(2));
delay(50);
while(!digitalRead(2));
delay(50);

//Esperar mientras D2 vale "1"


//Temporiza 50mS (anti rebotes)
//Esperar mientras D2 vale "0"
//Temporiza 50mS (anti rebotes)

Cuando se detecta un cambio de estado en el pulsador, se temporiza 50mS antes de esperar al


siguiente cambio de estado. Se evitan as los rebotes que pudiera haber durante ese lapsus de tiempo.

4-9

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

6.- SENTENCIA SWITCH() / CASE


Al igual que la sentencia if(), la sentencia switch() controla el flujo de un programa haciendo que se
ejecuten unas instrucciones u otras en funcin de determinadas condiciones. En el caso de la sentencia
switch() se compara el valor de una variable con el valor indicado en mltiples sentencias case. Cuando
coincide con una de ellas, se ejecutan las instrucciones correspondientes.
La palabra clave break finaliza la sentencia switch() y normalmente se usa al final de cada caso o
case.
Sintaxis:
switch(var)
{
case 1:
.
.
break;
case n:
..
break;
default:
.
}
var:

Es la variable cuyo contenido se va a comparar con los valores indicados en los diferentes
case.
Establecen todos los valores (1-n) con los que se va a comparar el contenido de la variable
var. Cuando coincide con uno de ellos, se ejecutan todas las instrucciones comprendidas
entre ese case y la expresin break.
Es opcional. Si se usa, en caso de que no haya ninguna case que coincida con el valor de la
variable var, se ejecutan todas sus instrucciones.

case:

default:

6-1 Ejemplo Decodificador


El decodificador es un circuito muy empleado en sistemas de control digital. Bsicamente se trata de
un circuito que a partir de un cdigo binario de entrada, genera un cdigo binario de salida. En nuestro caso se
trata de un decodificador de 2 x 4 (2 entradas y 4 salidas).
Realiza el montaje correspondiente al esquema de la figura 4-10.
Emplea dos interruptores, E1:E0 conectados con las lneas D9:D8
respectivamente. Con ellos podemos generar 4 combinaciones
2
posibles de entrada en nuestro decodificador (2 ).

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Los leds S3:S0 del laboratorio se conectan con las lneas D3:D0 que
se configuran como salidas. Su valor depender de las entradas de
acuerdo a la siguiente tabla de la verdad:
ENTRADAS
SALIDAS
E1
E0
S3
S2
S1
S0
0
0
0
0
0
0
0
1
1
1
1
1
1
0
1
0
1
0
1
1
0
1
0
1

S3

S2

S0

S1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

E1
E0

Figura 4-10. Decodificador de 2 x 4

4 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

Echemos un vistazo al programa Decodificador.


void loop()
{
A = PINB & B00000011;
switch(A)
{
case 0:
PORTD = 0;
break;
case 1:
PORTD = B00001111;
break;
case 2:
PORTD = B00001010;
break;
default:
PORTD = B00000101;
}
}

//Lee el valor de E1 y E0

//Si vale 00 (0)


//Saca 0000
//Si vale 01 (1)
//Saca 1111
//Si vale 10 (2)
//Saca 1010
//Entonces vale 11 (3)
//Saca 0101

Se lee el Puerto B (PINB) y se hace la funcin AND con los dos bits de menos peso (& B00000011). El
valor que se deposita en la variable A solo puede ser 00 (0), o 01 (1), o 10 (2) o bien 11 (3). La funcin
switch(A) compara la variable con los posibles casos expuestos (case). Si es 0, por el Puerto D se saca el valor
0 (PORTD = 0,); si es 1, se saca el valor 1111; si es 2, se saca el valor 1010 y, por ltimo, si no es ninguno de
esos tres, por defecto se saca el valor 0101.
6.1.1 Trabajo personal
Un tipo de decodificador muy empleado es el llamado decodificador selector. Por cada cdigo de
entrada solo se debe activar una y solo una salida. Responde a la siguiente tabla de la verdad:
ENTRADAS
E1
E0
0
0
0
1
1
0
1
1

S3
0
0
0
1

SALIDAS
S2
S1
0
0
0
1
1
0
0
0

S0
1
0
0
0

Modifica el programa anterior para resolver este caso.


6-2 Ejemplo: Juego de luces_V3
Con el mismo esquema de la figura 4-10 anterior, este ejemplo propone realizar cuatro juegos
diferentes de luces. Cada juego se selecciona mediante los dos interruptores E1:E0 conectados a las lneas
D9:D8 de entrada.
El programa se presta a muchas modificaciones: chale imaginacin. Puedes modificar los tiempos y
las secuencias. Incluso puedes emplear ms seales de entrada y salida para realizar secuencias ms
complejas y llamativas.

4 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

6-3 Ejemplo: Decodificador BCD 7 segmentos


Hablando de decodificadores, otro muy utilizado en los circuitos digitales es el llamado BCD a 7
segmentos. Se trata de un circuito capaz de controlar el clsico dgito numrico o display como el mostrado en
la figura 4-11.
Un display de 7 segmentos consiste en un conjunto de 8 diodos
led distribuidos estratgicamente y llamados a, b, c, d, e, f, g y dp
(punto decimal). Segn qu diodos se iluminen, podemos representar
cualquier nmero y tambin algunas letras y smbolos.
En el entrenador Universal Trainer disponemos de tres displays
idnticos llamados de nodo comn (AC). El nodo es comn a todos
sus leds y se conecta con la tensin positiva de alimentacin (o a nivel
1). El control individual de cada segmento o led se realiza aplicando
un nivel lgico 0 a su respectivo ctodo.
En nuestro ejemplo esos ctodos los vamos a conectar a las
lneas D7:D0 del Puerto D del controlador Arduino NANO.

Figura 4-11. El display de nodo comn


Basta con sacar por ese Puerto D las combinaciones binarias que iluminen los leds necesarios para
representar un nmero, letra o smbolo. La siguiente tabla representa las combinaciones binarias que han de
aplicarse para visualizar los nmero 0 al 9 y las letras A a la F, suponiendo que el punto decimal (dp) est
desactivado. Recordemos que los leds del display de la Universal Trainer se activan al aplicarles un nivel 0.
ENTRADAS
DIGITO BIN. DEC.
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D7
(dp)
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

D6
(g)
1
1
0
0
0
0
0
1
0
0
0
0
1
0
0
0

D5
(f)
0
1
1
1
0
0
0
1
0
0
0
0
0
1
0
0

D4
(e)
0
1
0
1
1
1
0
1
0
1
0
0
0
0
0
0

D3
(d)
0
1
0
0
1
0
0
1
0
1
1
0
0
0
0
1

SALIDAS
D2 D1
(c) (b)
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
1
1
1
0
0
1
1
1
1

D0 HEX. DEC.
(a)
0
0xC0
192
1
0xF9
249
0
0xA4
164
0
0xB0
176
1
0x99
153
0
0x92
146
0
0x82
130
0
0xF8
248
0
0x80
128
0
0x98
152
0
0x88
136
1
0x83
131
0
0xC6
198
1
0xA1
161
0
0x86
134
0
0x8E
142

Monta el circuito de la figura 4-12. De los tres displays disponibles en el entrenador Universal Trainer,
vamos a emplear el de la derecha. Representa a las unidades y se identifica como dgito AC3. Como es de
nodo comn, su patilla AC3 se conecta con +5Vcc de alimentacin. Los 7 segmentos (a-g) y el punto decimal
(dp) se conectan con las lneas D0-D7 del Puerto D, que se configuran como salidas.
Los interruptores E3:E0 se conectan con las lneas D11:D8 del Puerto B que se configuran como
entradas. Mediante esos interruptores se introducen los cdigos binarios para cada dgito o smbolo que
queremos visualizar.

4 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

11
7
4
2
1
10
5
3

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

AC3

a
b
c
d
e
f
g
dp

E3

AC2
9

12

AC1

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

E2
E1
+5Vcc

E0

Figura 4-12. Esquema del decodificador BCD a 7 segmentos


IMPORTANTE! Las lneas D0 y D1 del controlador Arduino NANO tambin se emplean como seales Rx y Tx
durante la transferencia o carga de un programa. Se recomienda conectarlas a los segmentos del display una
vez que se haya grabado el programa.
El programa Decodificador_BCD_7_segmentos resuelve los requisitos de la tabla anterior, mediante
el empleo de la sentencia switch() / case que estamos estudiando en estos momentos. Aunque ms largo, su
funcionamiento es muy similar al de los dos ejemplos anteriores. Leemos el estado de los cuatro interruptores
4
E3:E0. Estos nos proporcionan un nmero comprendido entre 0 y 15 (2 ). Mediante switch(A) / case se
determina cul es y por el Puerto D se saca la combinacin binaria necesaria segn la tabla anterior, para que
se iluminen los segmentos apropiados del display.
void loop()
{
A = PINB & B00001111;
switch(A)
{
case 0:
PORTD = B11000000;
break;
case 1:
PORTD = B11111001;
break;
..
..

//Lee el valor de E3:E0

//Si vale 0000 (0)


//Saca 11000000
//Si vale 0001 (1)
//Saca 11111001

El ejemplo sin embargo, no es un programa realmente eficiente. Lo hemos resuelto con las funciones
switch() / case porque es lo que tocaba. Tambin se puede resolver mediante el empleo de Arrays como se
estudi en el tema anterior. Echa un vistazo al ejemplo Decodificador_BCD_7_segmentos_V2 que
proponemos.
En primer lugar se crea un Array de tipo byte llamado Display. Contiene, en decimal, los 16 valores
posibles que hay que sacar a los segmentos. Para obtener cualquiera de ellos basta con indicar en qu
posicin dentro del Array se encuentra. Por ejemplo, Display[4] contiene el valor 153, que es precisamente al
valor que hay que sacar a los segmentos para que visualicen el dgito 4.
byte Display[16]={192,249,164,176,153,146,130,248,
128,152,136,131,198,161,134,142};

//Valores de salida

4 - 13

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

El programa principal es muy sencillo:


void loop()
{
A = PINB & B00001111;
PORTD = Display[A];
}

//Lee el valor de E3:E0


//Saca el valor de salida

Se lee el valor que proporcionan los interruptores de entrada E3:E0. Este valor estar comprendido
entre 0 y 15 y se emplea como ndice del Array para obtener el valor de salida (PORTD=Display[A]).
Qu diferencia de programa! La conclusin que debes de sacar de todo esto es que un mismo
programa se puede resolver de varias formas diferentes. El lenguaje Arduino nos proporciona las sentencias y
recursos necesarios para que, usados debidamente, podamos hacer programas muy eficientes. Es cuestin de
tiempo y prctica.
6.3.1 Trabajo personal
Completa la siguiente tabla con objeto de visualizar en el display ciertos smbolos y/o letras que t
mismo vas a disear. Luego modificas adecuadamente el programa para visualizarlos en funcin del valor que
introduces con los interruptores de entrada.
ENTRADAS
SIMBOLO BIN. DEC.
=

P
r
t
u
g
H
i
J
L
n

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

SALIDAS
D7 D6 D5 D4 D3 D2 D1 D0 HEX.
(dp) (g) (f) (e) (d) (c) (b) (a)

DEC.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

6-4 Ejemplo: Dcada


Otro programa de carcter eminentemente prctico. Se trata de un dispositivo digital capaz de contar,
de 0 a 9, el nmero de pulsos que se le aplican. Recibe el nombre de Dcada y su esquema de montaje se
muestra en la figura 4-13.
Los segmentos del display se conectan con las lneas D0:D7 del controlador, como en el ejemplo
anterior. El display visualizar el nmero de pulsos aplicados.
El pulsador E10 del entrenador Universal Trainer se conecta con la lnea D8 que acta como entrada.
Con este pulsador vamos introduciendo los pulsos a contar.

4 - 14

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

11
7
4
2
1
10
5
3

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

AC3

a
b
c
d
e
f
g
dp

AC2
9

12

AC1

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

E10
+5Vcc

Figura 4-13. Esquema de la dcada


La fotografa de la figura 4-14 muestra el montaje prctico.
6.4.1 Trabajo personal
Una vez que grabes y pruebes el programa, puedes usar el generador lgico del entrenador, para aplicar los
pulsos a contar en lugar del pulsador.
Para empezar retiras la conexin del pulsador E10 y conectas la patilla D8 con la salida del generador. Modifica
el programa y anula las dos funciones delay() que eliminaban los rebotes. El generador est libre de ellos.
Vuelve a grabar el programa recin modificado.
A continuacin selecciona una muy baja frecuencia de onda
cuadrada, por ejemplo 1Hz. Vers cmo la cuenta avanza
automticamente desde 0 hasta 9 y empieza de nuevo con 0.
Aumenta la frecuencia del generador. La cuenta ser cada vez
ms rpida. Si sigues aumentando la frecuencia de conteo,
llegar un momento en que se visualizar el nmero 8 con los 7
segmentos iluminados. Esto es debido a la ya mencionada
sensacin ptica que provoca la retina de nuestros ojos.

Figura 4-14. Montaje prctico de la dcada

6-5 Ejemplo: Dado_Electrnico


Un ejemplo de carcter ldico. Se trata de emular un dado electrnico que visualice sobre el display un
nmero aleatorio entre 1 y 6. Aprovechamos la ocasin para estudiar dos nuevas funciones del lenguaje
Arduino.
Funcin random()
Genera y nos devuelve un nmero aleatorio de entre una gran secuencia de nmeros.
Sintaxis:
random(min,max)

4 - 15

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

min:

Establece el valor mnimo del nmero aleatorio que nos va a devolver. Es opcional. Si no se indica el
valor mnimo ser 0.

max:

Establece el valor mximo del nmero aleatorio.

Ejemplo:
A = random (1,6);

//Devuelve un nmero aleatorio comprendido entre 1 y 6

Funcin randomSeed()
El sistema que emplea Arduino para generar nmero aleatorios, consiste en una secuencia muy larga
de nmeros diferentes, pero siempre es la misma secuencia. Los nmeros son por tanto pseudo-aleatorios.
Con el empleo de esta sentencia se inicia internamente el sistema generador, hacindole empezar en un punto
arbitrario de la secuencia.
Sintaxis:
randomSeed(int o long)
int o long:

Es un valor cualquiera, bien sea entero (16 bits), o entero largo (32 bits). Se emplea como
semilla con la que se inicia el sistema generador de nmeros aleatorios.

Ejemplo:
randomSeed(33);

//La semilla para una nueva generacin de nmeros es 33

Monta el circuito segn el esquema de la figura 4-13 anterior. Una vez que cargues el programa,
comprueba su funcionamiento. Inicialmente el display aparece apagado con el punto decimal (dp) iluminado.
Est a la espera de recibir un pulso por D8, e iniciar la jugada.
Se obtiene un nmero comprendido entre 1 y 6 que se visualiza sobre el display durante 2 segundos.
Luego este se apaga y comienza una nueva partida.

7.- OTRAS SENTENCIAS DE CONTROL


Hemos visto las sentencias o funciones de control ms importantes y utilizadas. De todas formas el
lenguaje Arduino dispone de alguna ms. Su empleo queda a criterio del programador.

7-1 Funcin do while()


Esta sentencia es muy similar a la sentencia while() ya estudiada. La diferencia es que la condicin
para repetir o no el bucle se establece al final del mismo, no al principio.
Sintaxis:
do
{

} while(condicin);
condicin:

Es una expresin condicional. Mientras la condicin sea cierta (true) se ejecutan las sentencias
del bucle, las comprendidas entre do y while(). En caso contrario el bucle finaliza.

4 - 16

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

llaves:

Encierran a todas las sentencias que forman el bucle y que se ejecutarn un determinado
nmero de veces mientras la condicin sea cierta (true).

7-2 Funcin break


Esta funcin es una forma de finalizar o romper cualquier bucle fo(), while() o dowhile() aunque no
se d la condicin establecida. Tambin la hemos usado para salir o finalizar la funcin switch() / case.
Sintaxis:
break;

7-3 Funcin return


Retorna o finaliza cualquier funcin creada por el usuario. Si se desea puede devolver un valor al
programa que hizo uso o llam a esa funcin.
Sintaxis:
return
rteturn valor;
valor:

Es el valor que devuelve la funcin en su retorno. Es opcional y puede ser una variable o una
constante.

7-4 Funcin goto


Traslada, de forma incondicional, la ejecucin al punto del programa indicado.
Sintaxis:
prueba:

goto prueba;

//Salta incondicionalmente al punto del programa en el que se encuentre la etiqueta indicada.

4 - 17

ARDUINO: La tecnologa al alcance de todos


TEMA 4: Toma de decisiones y sentencias de control
www.microcontroladores.com

4 - 18

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

TEMA 5: Las seales PWM y el control de servos


1.- INTRODUCCIN
En el Tema 1 se explic que algunas de las 14 patillas de entrada o salida digitales que dispone la
tarjeta Arduino NANO, podan actuar como salidas de seales del tipo PWM. Concretamente son 6 patillas: D3,
D5, D6, D9, D10 y D11. Consulta la figura 1-9.
La abreviatura PWM viene de Pulse Width Modulation o, lo que es lo mismo, Modulacin de
anchura del pulso. Se trata de una seal peridica de una determinada frecuencia F pero asimtrica: la
duracin del semiperiodo positivo (el nivel 1), es diferente a la duracin del nivel 0, y adems se puede
variar dentro de los lmites de la duracin del periodo T.
La figura 5-1 muestra un ejemplo de seal de onda cuadrada
con una frecuencia de F de 500 Hz. Su periodo T tiene una duracin
de 2 mS (T=1/F). En este caso el nivel 1 de la seal dura 1 mS, lo
mismo que el nivel 0. Se trata por tanto de una seal simtrica. El
tiempo en que la seal vale 1 se le denomina ciclo til. En el
ejemplo de la figura su valor es del 50% (1 mS) respecto al valor total
del periodo (2 mS). Se dice que es una seal PWM al 50 %.
Figura 5-1. Seal PWM al 50%
La figura 5-2 muestra una secuencia de cuatro seales PWM: A, B, C y D. Todas tienen en comn el
mismo periodo T de 2 mS o, lo que es lo mismo, una frecuencia de 500 Hz. Sin embargo la duracin del nivel
1, es decir del ciclo til, vara.

Figura 5-2. Seales PWM


La seal A tiene un ciclo til del 0%. Durante la duracin total del periodo T, los 2 mS, la seal
permanece a nivel 0. La seal B se corresponde con una seal PWM cuyo ciclo til es del 25% de la
duracin del periodo. Esto es, el nivel 1 se mantiene durante 0.5 mS y el nivel 0 los 1.5 mS restantes del
periodo (75%).

5-1

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

La seal C representa una seal PWM cuyo ciclo til es el 75% de la duracin total del periodo. El
nivel 1 dura 1.5 mS y el nivel 0 los 0.5 mS restantes (25%).
Por ltimo, la seal D representa a una seal cuyo ciclo til es del 100% de la duracin del periodo. El
nivel 1 dura los mismos 2 mS.
La mayor parte de los controladores actuales, entre los que se encuentra nuestro Arduino NANO,
integran la electrnica necesaria para generar, si se desea, una o varias seales PWM por algunas de sus
patillas. En nuestro caso esas patillas son: D3, D5, D6, D9, D10 y D11. Cuando se habilitan, la frecuencia F
de las seales es fija. Para las patillas D5 y D6 es aproximadamente de 980 Hz (T=1mS) y de 490 Hz (T=2
mS) para el resto.
1-1 Para qu sirven las seales?
Las seales PWM se pueden usar para controlar y regular la potencia que aplicamos a ciertos
perifricos de salida como puede ser un led, un motor, un servo, etc, ya que podemos ajustar la duracin o
el tiempo en que se mantiene el nivel 1 (ciclo til), en cada periodo.
Imagina una seal PWM aplicada a un led. Si el ciclo
til fuera del 100% (figura 5-2-D), al led le estaramos
aplicando un nivel 1 constantemente. Brillar a la mxima
potencia. Si la seal PWM aplicada fuera del 50%, como se
muestra en la figura 5-3, la mitad del tiempo estara encendido
y la otra mitad apagado. El led brillar a la mitad de su
potencia.
Figura 5-3. Seal PWM al 50%
Segn este razonamiento, si se le aplica una seal con un ciclo til del 25% (figura 5-2-B), el led
brillar la parte de su potencia. Si la seal fuera del 75% (figura 5-2-C), brillar las partes de su potencia.
Con una seal PWM del 0% (figura 5-2-A), el led se apagar. Tenemos por tanto un rango que va del 0%
hasta el 100% de la seal PWM para ajustar el brillo deseado.
De la misma manera que podemos regular el brillo de un led o de una lmpara, tambin podemos
regular la velocidad a la que gira un motor o el posicionamiento de un servo. El principio es el mismo.
1-2 Funcin analogWrite()
Permite determinar la duracin de la anchura del pulso o el ciclo til de una seal PWM de salida.
Sintaxis:
analogWrite(pin,valor)
pin:

Es la patilla por donde se va a generar la seal PWM. En el controlador Arduino NANO puede ser 3,
5, 6, 9, 10 u 11.

valor:

Es el valor que determina la duracin del ciclo til. Est comprendido entre 0 y 255, donde 0
corresponde con un ciclo til del 0% de duracin, y 255 con un ciclo til del 100%.

Ejemplo:
analogWrite(6,127);

//Salida de una seal PWM del 50% sobre la patilla 6

La patilla elegida para sacar la seal PWM no necesita ser configurada como salida. La propia funcin
analogWrite() lo hace automticamente. La seal PWM de salida se mantiene indefinidamente hasta que
indiquemos un ciclo til de valor diferente o bien se ejecute una funcin del tipo digitalRead() o digitalWrite()
sobre esa misma patilla. En este caso la salida de seal PWM se anula.

5-2

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

2.- USANDO LAS SEALES PWM

Es el ejemplo ms sencillo que se puede realizar. Monta el circuito


mostrado en el esquema de la figura 5-4.
El led S0 del entrenador Universal Trainer se conecta con la patilla D6
del controlador Arduino NANO. Esta patilla se emplear como salida PWM y
nos permitir controlar la potencia que se aplica al led, regulando as su brillo.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

2-1 Ejemplo: PWM

+5Vcc

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Vamos a realizar una serie de ejemplos que permitan sacar una o


varias seales PWM por algunas de las patillas disponibles al efecto: D3, D5,
D6, D9, D10 y D11.

Figura 5-4. Seal PWM

S0

Echemos un vistazo al programa. Empieza declarando dos variables. En la variable Potencia


indicamos la potencia que deseamos, o lo que es igual, la duracin del ciclo til. En el ejemplo es del 25%. En
la variable Ciclo se almacena un valor comprendido entre 0 y 255, calculado a partir de la potencia indicada.
byte Potencia=25;
int Ciclo=(Potencia*255)/100;

//Expresar aqu el % de la potencia deseada


//Calcula el ciclo til entre 0 y 255

La funcin void setup() est vaca. En este caso no vamos a configurar nada, pero es obligatorio
poner la funcin.
El programa principal es muy sencillo. La sentencia analogWrite() configura a la patilla D6 como
salida y genera por ella una seal PWM cuyo valor depende de la variable Ciclo que, a su vez, se obtiene a
partir de la variable Potencia. Luego el programa queda en un bucle infinito mediante la funcin while(1);.
void loop()
{
analogWrite(6,Ciclo);
while(1);
}

//Genera la seal PWM


//Bucle sin fin

Al cargar el programa y ejecutarlo, veremos que el led S0 brilla bastante menos que como lo ha
venido haciendo en ejemplos anteriores. Puedes probar a modificar el programa variando el valor de la
potencia deseada.
2-2 Ejemplo: Efectos
Con este programa de ejemplo s que podrs apreciar claramente el efecto de regulacin del brillo
de un led, al que se le aplica una seal PWM variable. Emplea el mismo esquema de conexiones que el de la
figura 5-4.
Efectivamente, mediante un bucle for() el ciclo til de la seal PWM va creciendo desde un mnimo
(0) hasta un mximo (255) en pasos de 5 en 5.
for(int Ciclo=0; Ciclo <=255; Ciclo +=5)
{
analogWrite(6, Ciclo);
delay(40);
}

//Desde 0 a 255 en pasos de 5 en 5


//Seal PWM con un ciclo til que va aumentando
//Temporiza 40 mS entre incrementos

5-3

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

La variable Ciclo empieza con 0 y evoluciona hasta llegara a 255 en incrementos de +5 (0, 5, 10,
15,). Los distintos valores de esta variable se emplean para generar una seal PWM cuyo ciclo til va
aumentando hasta llegar al 100% (255). El brillo del led ir aumentando.
Luego, mediante otro bucle for() y de forma parecida, la seal va decreciendo desde un mximo (255)
hasta un mnimo (0) en iguales pasos. El brillo del led ir disminuyendo.
2-3 Ejemplo: Luces_Aleatorias

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Monta el circuito del esquema de la figura 5-5. Consiste en un vistoso


juego de luces en el que los leds S0-S3 lucen con un brillo aleatorio.
Estos leds se conectan con las patillas D6, D9, D10 y D11 que, como
ya sabemos, pueden actuar como salidas de seales PWM.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

S3
S2
S1
S0

La importancia de este ejemplo radica en que se demuestra que el


controlador es capaz de generar cuatro seales PWM simultneas y
diferentes. No olvides que puede generar hasta seis seales PWM.
Mediante la ya conocida funcin random() se generan cuatro nmeros
aleatorios comprendidos entre 0 y 255. Cada nmero se emplea para
determinar el ciclo til de cada una de las seales PWM de salida que
van a parar a sus correspondientes leds.
Figura 5-5. Luces_Aleatorias
+5Vcc

2-4 Ejemplo: Regulacin

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Otro ejemplo de carcter prctico. En esta ocasin vamos


a ajustar manualmente el ciclo til de una seal PWM que regula
el brillo de un led. Monta el circuito de la figura 5-6.

ARDUINO NANO

Figura 5-6. Regulacin manual

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

El led S0 se conecta con la patilla D6 desde donde se le


aplica la seal PWM. La patilla D2 se conecta con el pulsador
E10. Con cada pulsacin, la seal PWM en D6, va aumentando
de 10 en 10 hasta un mximo de 250 (mximo brillo). La patilla
D3 se conecta con el pulsador E11. Con cada pulsacin la seal
PWM va disminuyendo de 10 en 10 hasta llegar a 0 (mnimo
brillo).
AUMENTA

E10

DISMINUY E

E11
S0

3.- SERVOMOTORES
Los servomotores, tambin conocidos como servos, son dispositivos similares a un motor de
corriente continua (DC) pero con la capacidad de realizar giros de forma controlada a cualquier posicin y en
cualquier sentido, dentro de su rango de accin. Por ejemplo, podemos indicar que su eje realice un giro de
34 en sentido horario, y se mantenga en esa posicin indefinidamente hasta que se indique otra nueva.
Su aspecto puede parecerse al que se muestra en la figura 5-7. Se utilizan con
mucha frecuencia en sistemas de radio control como aviones teledirigidos,
helicpteros, embarcaciones, vehculos, etc Tambin se emplean en robtica
y, en general, en todas aquellas aplicaciones en que se necesite posicionar con
precisin el eje de un motor.

Figura 5-7. Un servomotor

5-4

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

En la figura 5-8 se muestra su composicin interna. Est


formado por un motor DC, un grupo reductor y una electrnica de
control.
Todo ello va encapsulado en una caja con un eje que
transmite el movimiento. El servo se controla aplicndole una
seal PWM de unas determinadas caractersticas determinadas
por su fabricante.

Figura 5-8. Composicin interna de un servo

Desde el punto de vista de su conexin, la mayor parte de los servos precisan nicamente de tres
cables como se muestra en la figura 5-9. El cable negro para la tensin GND o 0V de alimentacin. Por el rojo
se aplica una tensin de +5V. Por el blanco se aplica la seal
PWM de control. Debes tener en cuenta que esto puede cambiar
de un modelo a otro de servo. Lo ideal es consultar y cerciorarse
mediante la documentacin que facilita el fabricante.

Figura 5-9. Conexiones tpicas de un servo


Comercialmente podemos encontrar muchos tipos de servos. Se diferencian en el tamao, fuerza o
par motor, velocidad, tensin de alimentacin, tipo de eje y, sobre todo, rotacin del mismo. Hay servos
cuyo eje es de rotacin continua, y otros rotan o giran un nmero limitado de grados. Entre estos ltimos, el
ms popular es el que cuyo eje es capaz de girar entre 0 y 180.
El control de un servo se realiza aplicndole,
por la correspondiente patilla, una seal PWM cuyo
ciclo til determina la posicin o rotacin a la que se
desplazar el eje. Aunque las especificaciones
exactas las facilita el fabricante, ms o menos todos
funcionan de forma similar. La figura 5-10 puede ser
un buen ejemplo.
El periodo T de la seal es fijo, y suele ser en
torno a los 20 mS (F=50 Hz). Un ciclo til de 1,5 ms
de duracin, mantiene al servo centrado en 0.
Un ciclo til de 1 mS hace que el servo gire
90 en un sentido. Entre 1 mS y 1.5 mS rotar la parte
proporcional.
Con un ciclo til cuya anchura es de 2 mS, el
servo rota otros 90 en sentido contrario. Un ciclo de
entre 1,5 mS y 2 mS producir una rotacin
proporcional.
Figura 5-10. Seales PWM para el control de un
servo

5-5

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

3-1 Conexin del servo


Para nuestras prcticas y ejemplos vamos a usar el servo modelo S3003 de la firma Futaba, que se
incluye en el presente mdulo. Sus caractersticas fundamentales son:

Velocidad: 0.23 seg./60 a 4.8V y 0.19 seg./60 a 6V


Fuerza: 3.2 Kg/cm a 4.8V y 4.1 Kg/cm a 6V
Dimensiones: 40 x 20 x 36 mm
Peso: 36 gr
Conector: Tipo J de 3 vas paso 2.54 mm
Rotacin: 0 180
Ciclo til: 0.3 2.3 mS. Centrado a 1.3 mS. Periodo T=20 mS (F=50 Hz)
Como se muestra en la figura 5-11, vamos a emplear una tira de pines macho.
Esta tira, a la que cortaremos un trozo con tres pines, tambin se incluye en el
lote de materiales del presente mdulo.
Por un lado estos tres pines se insertan en el conector hembra del servo,
tambin de tres vas. Posteriormente podremos insertar todo el conjunto sobre
el mdulo board del entrenador Universal Trainer y hacer as las conexiones.
Figura 5-11. La tira de pines

+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Servo
900-00008

Figura 5-12. Conexiones elctricas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

PWM
1

GND
Vdd

ARDUINO NANO

3
2

En la figura 5-12 tenemos el esquema de conexiones que


vamos a emplear en los prximos ejemplos. El servo nicamente
necesita tres conexiones. El cable negro se conecta con GND de
alimentacin. El cable rojo se conecta con +5Vcc de alimentacin.
Mediante el cable blanco se le aplica la seal PWM que controla su
posicionamiento o rotacin. Lo vamos a conectar con la patilla D3 del
controlador Arduino NANO.

+5Vcc

El montaje prctico se muestra en la figura 5-13.

Figura 5-13. Montaje prctico del servo

5-6

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

3-2 La librera servo


El lenguaje Arduino, al igual que cualquier otro lenguaje, es algo vivo que con el paso del tiempo se
va enriqueciendo incluyendo nuevas palabras y acepciones. En nuestro caso el lenguaje Arduino va
adquiriendo nuevas funciones y sentencias.
Cuando se aaden sentencias de propsito general, que no tienen una aplicacin en concreto, estas
se incluyen en el propio lenguaje, como si fuera una ampliacin del mismo. Por eso es aconsejable que,
peridicamente, descargues la ltima versin disponible. Sin embargo, si se crean nuevas sentencias para un
fin especfico, estas se suelen incluir en lo que se denomina una librera, que no es otra cosa que un fichero
auxiliar con extensin .h que contiene el cdigo necesario para implementarlas.
Podemos encontrar libreras para el control de pantallas, robots, servos, comunicaciones, tarjetas de
memoria, internet y mucho ms. Algunas libreras estn diseadas por la propia organizacin de Arduino.
Otras libreras las suministran los propios fabricantes de hardware y accesorios. En otros casos t mismo
puedes crear tus propias libreras para un determinado objetivo.
En estos momentos nos vamos a centrar en la librera Servo. Se trata de un fichero, Servo.h, que
se instala junto con el sistema Arduino. Una vez incluido en nuestro programa podemos pensar que nuestro
lenguaje se ha enriquecido con las nuevas sentencias que incluye ese fichero.
En el caso de Servo.h disponemos de seis nuevas funciones o sentencias relacionadas con el
control de los servos. El hecho de usarlas nos facilitar notablemente el diseo de nuestros propios
programas y aplicaciones.
3-2-1 #include
Permite incluir en nuestro programa cualquiera de las libreras disponibles.
Sintaxis:
#include <fichero.h>

Incluir la librera indicada.

Ejemplo:
#include <Servo.h>

Incluye en nuestro programa la librera Servo. Esto nos permite hacer uso de todas
las funciones y sentencias que contiene y que veremos a continuacin.

3-2-2 attach()
Asocia un servo a cualquiera de las lneas digitales disponibles. A diferencia de las seales PWM,
que nicamente estaban disponibles en seis de las patillas del controlador, las seales PWM para el control
de servos se pueden generar por cualquier patilla. Son seales que se generan por software.
Sintaxis:
servo.attach(pin);
servo.attach(pin,min,max);
servo:

Es una variable tipo servo que asigna un nombre al servo que vamos a controlar (lo veremos
enseguida).
pin:
Nmero de patilla a la que se conecta el servo.
min (opcional): Establece, en micro segundos, la anchura mnima del pulso correspondiente a un ngulo de
0. Por defecto es de 544. Revisar la documentacin del fabricante.
max (opcional): Establece, en micro segundos, la anchura mxima del pulso correspondiente a un ngulo de
180. Por defecto es de 2400. Revisar la documentacin del fabricante.

5-7

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

Ejemplo:
#include <Servo.h>
Servo Mi_Servo;

Mi_Servo.attach(3);

//Incluir la librera Servo


//Crea una variable tipo servo denominada Mi_Servo
//Conecta Mi_Servo con la patilla D3

3-2-3 writeMicroseconds()
Genera una seal PWM cuya anchura o ciclo til, expresado en microsegundos, se aplica al servo
indicado. Esta seal origina por tanto el desplazamiento del eje un determinado nmero de grados.
Sintaxis:
servo.writeMicroseconds(valor);
servo: Variable del tipo servo.
valor: Valor de tipo int que determina los microsegundos que dura el ciclo til de la seal PWM generada.
Ejemplo:
Suponiendo el servo modelo S3003 de Futaba, como el que se incluye en este mdulo de prcticas
#include <Servo.h>
Servo S3003;

S3003.attach(3);
S3003.writeMicroseconds(300);
delay(1000);
S3003.writeMicroseconds(2300);

//Incluir la librera Servo


//Crea una variable tipo servo denominada S3003
//Conecta S3003 con la patilla D3
//Ciclo til de 0.3 mS (giro a un extremo, 0)
//Temporiza 1 segundo
//Ciclo til 2.3 mS (giro al extremo opuesto, 180)

3-2-4 write()
Genera una seal PWM cuya anchura o ciclo til se obtiene a partir de los grados que indicamos en la
propia funcin. Esta seal origina por tanto el desplazamiento del eje del servo un determinado nmero de
grados.
Sintaxis:
servo.write (valor);
servo: Variable del tipo servo.
valor: Valor de tipo byte que determina los grados que se desplaza el eje (entre 0 y 180).
Ejemplo:
Suponiendo el servo modelo S3003 de Futaba, como el que se incluye en este mdulo de prcticas
#include <Servo.h>
Servo S3003;

S3003.attach(3,300,2300);
S3003.write (0);
delay(1000);
S3003.write(180);

//Incluir la librera Servo


//Crea una variable tipo servo denominada S3003
//Conecta S3003 con D3 y establece la anchura mnima y mxima
//del ciclo til de la seal PWM
//Giro a un extremo (0)
//Temporiza 1 segundo
//Giro al extremo opuesto (180)

5-8

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

3-2-5 read()
Lee el ngulo actual en el que se encuentra el servo, que no es otro que el valor que se le ha pasado
en la ltima funcin write().
Sintaxis:
servo.read();
servo: Variable de tipo servo.
Ejemplo:
#include <Servo.h>
Servo S3003;
S3003.attach(3,300,2300);
.
S3003.read();

//Incluir la librera Servo


//Crea una variable tipo servo denominada S3003
//Conecta S3003 con D3 y establece la anchura mnima y mxima
//Devuelve un valor de entre 0 y 180 que representa el ngulo en
//que se encuentra actualmente el servo.

3-2-6 attached()
Comprueba si un servo est o no asociado a una determinada patilla.
Sintaxis:
servo.attached();
servo: Variable de tipo servo
Ejemplo:
#include <Servo.h>
Servo S3003;
S3003.attach(3,300,2300);
.
S3003.attached()

//Incluir la librera Servo


//Crea una variable tipo servo denominada S3003
//Conecta S3003 con D3 y establece la anchura mnima y mxima
//Devuelve true ya que el servo est vinculado a D3

3-2-7 detach()
Desconecta o desvincula la variable Servo de su correspondiente patilla. Cuando tenemos algn
servo vinculado, las patillas D9 y D10 NO pueden usarse como salidas PWM. Si se desvinculan todas las
variables Servo existentes, esas patillas SI pueden usarse como salidas PWM.
Sintaxis:
servo.detach();
servo: Variable de tipo servo
Ejemplo:
#include <Servo.h>
Servo S3003;
S3003.attach(3);
.
S3003.detach()

//Incluir la librera Servo


//Crea una variable tipo servo denominada S3003
//Conecta y vincula S3003 con D3
//Desvincula el servo S3003 de la patilla D3

5-9

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

4.- USANDO LOS SERVOS


Es el momento de proponer una serie de ejemplos que nos permitan aprender a usar un servo como
el que se incluye en el lote de materiales del presente mdulo de prcticas.
Recuerda que los servos son perifricos con una gran cantidad de aplicaciones. Se utilizan en
aquellos casos en que sea necesario controlar con cierta exactitud el posicionamiento del eje de un motor: el
timn de una embarcacin, la direccin de un vehculo, los alerones de un avin, el posicionamiento de un
objeto, robtica, automatismos, y un largo etctera.
4-1 Ejemplo: Servo
Un buen ejemplo para tener una primera toma de contacto con un servo motor. Necesitas montar el
esquema mostrado en la anterior figura 5-12, en la que el servo se controla mediante la patilla D3 del
controlador Arduino NANO.
El programa empieza incluyendo la librera Servo.h que contiene las funciones que usaremos
posteriormente para controlar el servo.
#include <Servo.h>

//Incluir la librera Servo

A continuacin se define la variable Servo a la que se le asigna el nombre S3003. Es el modelo de


servo de la firma Futaba que estamos usando. Puedes emplear cualquier otro nombre, pero aquel pongas,
ser el que debes utilizar en lo sucesivo para cualquier operacin que vayas a hacer con ese servo.
Tambin se crea la variable pwm. En ella introducimos, en micro segundos, la duracin del ciclo til
de la seal PWM que se aplicar al servo. Segn las especificaciones del modelo Futaba S3003, la duracin
mnima es de 300 S y la mxima 2300 S, lo que provoca desplazamientos del eje de un extremo al otro con
un giro de 180 de recorrido en total.
Servo S3003;
int pwm=2300;

//Crea la variable S3003 (modelo de futaba)


//Establece el ciclo til (entre 300 y 2300 uS)

En la funcin de configuracin indicamos, mediante la sentencia attach(), que el servo S3003 est
conectado o vinculado con la patilla D3 del controlador.
void setup()
{
S3003.attach(3);
}

//Conecta el servo

Finalmente el programa principal, mediante la sentencia writeMicroseconds(), se limita a generar la


seal PWM que controlar el servo S3003. La duracin del ciclo til depende del contenido de la variable
pwm.
void loop()
{
S3003.writeMicroseconds(pwm);
while(1);
}

//El servo se posiciona segn "pwm"


//Fin del programa

4-1-1 Trabajo personal


Se puede calcular cuntos S de ciclo til son necesarios para girar 1. En nuestro modelo Futaba
S3003 ser:
=

5 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

Ahora ser fcil determinar la duracin que debe tener el ciclo til de la seal PWM, para que el eje
gire un determinado nmero de grados (g).
=

Por ejemplo:

Para girar 0 (un extremo del servo), PWM = 2300 (0 * 11.11) = 2300
Para girar 90 (servo centrado), PWM = 2300 (90 * 11.11) = 1300
Para girar 180 (el otro extremo del servo), PWM = 2300 (180 * 11.11) = 300

Completa la siguiente tabla calculando los valores necesarios para realizar giros de diferentes grados.
Luego modificas la variable pwm del programa para comprobar el correcto funcionamiento.
ANGULO
PWM

15

30

45

75

90

105

120

135

150

165

180

4-2 Ejemplo: Servo_V2


Se trata de un ejemplo similar. En lugar de emplear la funcin writeMicroseconds() se emplea la
funcin write() para generar la seal PWM que controlar el giro del servo. Dicha funcin write() tiene la
ventaja de que podemos expresar el giro directamente en grados, por lo que no es necesario hacer los
clculos que hicimos en el ejemplo anterior.
Es la propia funcin write() quien calcula la duracin del ciclo til de la seal PWM, a partir de los
grados que deseamos girar. Ahora bien, para ello es necesario que conozca la duracin mnima y mxima de
se ciclo til, segn el modelo de servo que estemos utilizando. Por este motivo, en la funcin attach()
indicamos ahora estos dos parmetros:
void setup()
{
S3003.attach(3,300,2300);
}

//Conecta y ajusta el servo

Si no se indican, se toman por defecto los valores de 544 S y 2400 S para la duracin mnima y
mxima respectivamente. El efecto que esto puede producir es que el servo se vea excedido o limitado en su
recorrido.
4-3 Ejemplo: Servo_V3
Este ejemplo es una consecuencia de todo lo visto hasta el momento. El servo realiza una maniobra
consistente en desplazarse de un extremo al otro (180 en total) en intervalos de 5. Luego vuelve a la
posicin inicial y el ciclo se repite constantemente.
4-4 Ejemplo: Servo_Control

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

PWM
1

GND
Vdd

ARDUINO NANO

3
2

Con un poco de imaginacin quiz puedas entrever las


posibilidades prcticas de este programa.

Servo
900-00008

Un buen ejemplo que te va a permitir interaccionar y


controlar manualmente el posicionamiento del servo. Monta el
esquema de la figura 5-14. Inicialmente el servo se mantiene
centrado a 90. Mediante los pulsadores E10 y E11, conectados
con las patillas D4 y D5, vamos aumentando o disminuyendo el
ngulo de giro en pasos o intervalos de 5.

+5Vcc

DISMINUY E
E11

Figura 5-14. Control manual de posicionamiento

AUMENTA
+5Vcc

E10

5 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 5: Las seales PWM y el control de servo motores
www.microcontroladores.com

5 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

TEMA 6: Las comunicaciones


1.- INTRODUCCIN
Entendemos por comunicar al hecho de compartir informacin. Entre los humanos podemos transmitir y
recibir ideas, sensaciones, pensamientos, conocimientos, sentimientos, etc En el mundo de los ordenadores
en general y de Arduino en particular, tambin se puede compartir informacin. Un Arduino se puede
comunicar con otro Arduino, con un ordenador tipo PC, con otro controlador, con un perifrico, etc Estamos
hablando de transmitir y recibir datos numricos.
Imagina un Arduino que, bajo el control de tu programa, es capaz de recoger informacin del entorno
que le rodea a travs de sensores de luz, presin, temperatura, humedad, velocidad, posicin, presencia, etc
Esta informacin se transmite, por ejemplo, a un PC. Este a su vez, bajo su propio programa de control, recoge
la informacin recibida para manipularla, registrarla, visualizarla grficamente, imprimirla y, en definitiva,
realizar cualquier tipo de tratamiento con ella.
De igual forma, te puedes imaginar a un PC transmitiendo a nuestro Artduino una serie de rdenes o
instrucciones. Ordenes que al ser recibidas por nuestro Arduino, se procesan y se traducen en tareas tales
como activar / desactivar una bombilla, un led, un motor, un servo, un rel, o cualquier cosa que sea necesario
controlar. Ordenes con las que generar seales PWM, frecuencias de diferentes valores, realizar clculos o
iniciar diferentes procesos dentro de Arduino.
En definitiva, las posibilidades de comunicar nuestro controlador Arduino NANO, abren una ventana
con el mundo exterior. Arduino no se queda en una simple tarjeta electrnica que ejecuta una determinada
tarea. Arduino es ahora capaz de dialogar con otros perifricos o sistemas, algunos de los cuales ms
grandes y potentes que l mismo, y compartir informacin.
2.- LA COMUNICACIN SERIE
Al hablar de comunicar Arduino con cualquier otro sistema, estamos hablando de una comunicacin
digital donde los datos transferidos son siempre cdigos binarios compuestos de bits. Es ms, la cantidad
mnima de informacin que se puede transferir es un byte que, como ya sabes, est compuesto de 8 bits.
Las personas nos podemos comunicar de diferentes formas: oral, escrita o visual. De la misma
manera, los sistemas digitales tambin tienen diferentes formas de trasferir informacin. Probablemente, una
de las ms extendidas y utilizadas, sea la comunicacin serie asncrona. Observa la figura 6-1.

Figura 6-1. La comunicacin serie


Es un tipo de comunicacin que est disponible en cualquiera de las plataformas Arduino (UNO,
NANO, MEGA, DUE, etc). Se emplean nicamente dos patillas o lneas: transmisin de datos (Tx) y
recepcin de datos (Rx). Bajo el punto de vista del Arduino de la figura, ste transmite datos a travs de la
lnea Tx y son recibidos por el PC a travs de su lnea Rx. Tambin a la inversa. El PC transmite datos a
travs de su lnea Tx, que son recogidos por la lnea Rx de Arduino. Es decir, lo que es transmisin (Tx) en un
extremo, es recepcin (Rx) en el opuesto y viceversa.

6-1

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Una transferencia de datos puede estar compuesta de decenas, cientos o miles de bytes. Un byte
est compuesto de 8 bits que van circulando uno tras otro por las lneas Tx y/o Rx, dependiendo de quin
trasmita o quin reciba.
Segn el tiempo t en que cada uno de esos bits se mantenga en la lnea Tx o Rx, se determina la
velocidad de la transferencia. Por ejemplo, si cada bit de cada byte se mantiene 1 segundo en las lneas Tx o
Rx, se dice que la comunicacin es de 1 bit por segundo. Esto recibe el nombre de baudio. Un byte
completo tardar como mnimo 8 segundos en transferirse. Si lo multiplicas por el nmero total de bytes a
transferir, obtienes el tiempo que tarda en realizarse la comunicacin.
Arduino es capaz de realizar comunicaciones desde los 300 hasta los 115200 baudios. Es decir,
115200 bits por segundo, o lo que es lo mismo, aproximadamente 14000 bytes por segundo (115200 / 8). En
este caso, cada bit se transmite o recibe en tan solo 8.6 S (1 / 115200).
La velocidad a la que vamos a realizar las comunicaciones en los prximos programas de ejemplo, es
de 9600 baudios. Se trata de una velocidad muy segura y fiable. La admiten la mayor parte de dispositivos
con los que vayamos a comunicar, por ejemplo, un PC.
2-1 Tipos de comunicacin serie
Realmente Arduino, y la mayor parte de controladores, puede realizar diferentes tipos de
comunicaciones serie, con objeto de poder compartir informacin con el mayor nmero de dispositivos
posible:

Comunicacin asncrona tipo UART


Es la ms utilizada y a ella nos vamos a referir en el presente tema. Su esquema responde a la figura
6-1 y se emplean dos seales para ello: Tx y Rx. Est pensada para la comunicacin entre equipos,
por ejemplo: Arduino-Arduino; Arduino-PC, Arduino-Perifrico, etc..

Comunicacin sncrona tipo I2C


Tambin es muy utilizada. Cada bit que se transmite o recibe va acompaado de un pulso de reloj o
sincronismo. Emplea dos seales. La seal de datos (SDA) es por donde, bit a bit, se van
transfiriendo o recibiendo los diferentes bytes de la informacin. La seal de reloj (SCL) genera un
pulso de sincronismo por cada bit que se transfiere. Se emplea para la comunicacin entre el
controlador (p.e. Arduino) y otros circuitos integrados que lo acompaan.

Comunicacin sncrona tipo SPI


Emplea cuatro seales. Por la seal MOSI se reciben los bits y por la seal MISO se transmiten. La
seal SCK es la seal de reloj por donde se genera un pulso por cada bit transmitido y/o recibido.
Existe una cuarta seal, SS, que se suele emplear para seleccionar un dispositivo SPI en particular
cuando conviven varios en el mismo circuito. Tambin se emplea para la comunicacin entre el
controlador y otros circuitos integrados que lo puedan acompaar.

Sea cual sea el tipo de comunicacin que vayamos a realizar, debemos conocer qu patillas de
nuestro controlador Arduino NANO son empleadas por esas seales. Se resumen en la siguiente tabla:
TIPO
UART
I2C
SPI

D0
Rx

D1
Tx

D4
SDA

PATILLA
D5
D10

D11

D12

D13

MOSI

MISO

SCK

SCL
SS

2-2 La comunicacin tipo UART


Las patillas D0 y D1 se emplean como seales de recepcin (Rx) y transmisin (Tx) respectivamente.
Se pueden conectar directamente con otra tarjeta Arduino o con cualquier otro tipo de dispositivo que admita
este mismo tipo de comunicacin serie, y cuyas seales se adapten a las especificaciones elctricas TTL.

6-2

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Quiz recuerdes que estas dos patillas (D0 y D1) las hemos empleado en algn ejemplo anterior,
como lneas de E/S para el control de perifricos, al igual que el resto de patillas. Sin embargo, si ahora
vamos a utilizarlas como lneas de comunicacin, no debemos usarlas con ningn otro fin.
Dentro del sistema Arduino NANO, estas lneas (D0=Rx y D1=Tx), tambin estn conectadas con
unos circuitos electrnicos que las adaptan a las especificaciones USB. En realidad las hemos estado
usando, sin saberlo, cada vez que el Arduino se comunica con el PC cuando grabamos un programa.
En resumidas cuentas, las patillas D0 (Rx) y D1 (Tx), o su equivalente a travs del conector USB, las
podemos usar a partir de ahora para realizar nuestros propios programas de comunicacin tipo UART.

3.- ESTABLECIENDO LA COMUNICACIN


Cualquier programa que vayamos a realizar a partir de ahora, y que emplee comunicaciones serie
tipo UART, necesita ser configurado y activado convenientemente. Para ello, el lenguaje Arduino dispone de
dos sentencias muy sencillas y fciles de utilizar.
3-1 Funcin: Serial.begin()
Activa la comunicacin serie tipo UART y establece, en baudios, la velocidad de la misma. Una vez
ejecutada esta funcin, las lneas D0 y D1 se configuran como lneas de recepcin (Rx) y transmisin (Tx)
respectivamente. A partir de este momento no deben ser usadas como lneas de entrada / salida digital.
Sintaxis:
Serial.begin(baudios);
baudios:

Establece la velocidad deseada en la comunicacin. Los valores posibles son: 300, 1200,
2400, 4800, 9600, 14400, 28800, 38400, 57600 o 115200.

Ejemplo:
void setup()
{
Serial.begin(9600);
}

//Activa la comunicacin serie a una velocidad de 9600 baudios

3-2 Funcin: Serial.end()


Desactiva la comunicacin serie. Ejecutada esta sentencia, las patillas D0 (Rx) y D1 (Tx) pueden
volver a usarse como patillas de entrada / salida digital.
Sintaxis:
Serial.end();
Ejemplo:
Serial.end();

//Desactiva la comunicacin serie

4.- TRANSMISION DE DATOS


Una vez establecida la comunicacin podemos comenzar a realizar programas en los que, como se
muestra en la figura 6-2, Arduino transmite informacin al mundo exterior: un PC, otro Arduino, una
impresora, etc Basta conocer las sentencias o funciones oportunas.

6-3

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Figura 6-2. Transmisin de un mensaje


4-1 Funcin: Serial.print()
Transmite datos va serie y puede tener varias formas. Los valores numricos se transmiten mediante
sus equivalentes caracteres ASCII, uno por cada dgito. En el caso de los nmeros en coma flotante (float),
se transmiten con dos decimales por defecto. Los datos de tipo byte se transmiten como un nico carcter
ASCII. Los caracteres o cadenas de caracteres (strings) se transmiten tal cual. Van cerrados entre comillas
simples o dobles respectivamente.
Sintaxis 1:
Serial.print(valor);
valor:

Es el valor (de cualquier tipo) a transmitir

Ejemplos:
int A = 78;
Serial.print(A*2);

//Transmite 156

float PI = 3.141592;
Serial.print(PI);

//Transmite 3.14

Serial.print(A);
Serial.print(Hola);

//Transmite A
//Transmite Hola

Sintaxis 2:
Serial.print(valor,formato);
valor:
formato:

Es el valor (de cualquier tipo) a transmitir


En el caso de los nmeros enteros permite establecer la base de numeracin deseada. En el
caso de los nmeros float, establece el nmero de decimales a transmitir.

Ejemplos:
int A = 78;
Serial.print(A,BYTE);
Serial.print(A,DEC);
Serial.print(A,HEX);
Serial.print(A,BIN);
Serial.print(A,OCT);

//Transmite N (en ASCII 78=N)


//Transmite 78 (en decimal, base 10). Por defecto
//Transmite 4E (en hexadecimal, base 16)
//Transmite 01001110 (en binario, base 2)
//Transmite 116 (en octal, base 8)

float PI = 3.141592;
Serial.print(PI,0);
Serial.print(PI,2);
Serial.print(PI,5);

//Transmite 3 (sin decimales)


//Transmite 3.14 (con 5 decimales, por defecto)
//Transmite 3.14159 (con 5 decimales)

6-4

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

4-2 Funcin: Serial.println()


Tiene las mismas formas que la funcin anterior. La nica diferencia es que tras transmitir los datos,
automticamente transmite un cdigo de retorno de carro (\r o 0x0D) y un avance de lnea (\n o 0x0A).
Sintaxis:
Serial.println(valor);
Serial.println(valor,formato);
valor:
formato:

Es el valor (de cualquier tipo) a transmitir


En el caso de los nmeros enteros permite establecer la base de numeracin deseada. En el
caso de los nmeros float, establece el nmero de decimales a transmitir.

4-3 Ejemplos de transmisin


Ya basta de teora. Hemos visto las sentencias fundamentales para establecer una comunicacin
serie y transmitir datos. Es hora de hacer algunos sencillos programas que nos permitan introducirnos al
fascinante mundo de la transmisin de datos en serie.
+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13
ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Es el ms sencillo y clsico de los ejemplos


posibles. Consiste en transmitir un mensaje cada vez que se
acciona un pulsador E10 conectado en la patilla D4, segn
el esquema de la figura 6-3. Aunque aparece en el
esquema, lo concerniente al interface USB no va con
nosotros. Simplemente representa que las lneas D0 y D1
enlazan con el PC a travs del interface USB. Ya hemos
comentado que estas lneas no debemos usarlas con otros
fines en aquellos programas que realicen comunicaciones
serie.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

4-3-1 Ejemplo: Saludos

Tx

Interface USB
Rx
con el PC

Figura 6-3. Circuito del ejemplo Saludos

E10

En la funcin void setup() tenemos como novedad a la funcin Serial.begin(9600). Habilita al


Arduino para realizar comunicaciones serie tipo UART a una velocidad de 9600 baudios. Recuerda que una
vez ejecutada esta funcin, no debes hacer uso de las patillas D0 y D1, ya que se emplean ahora para la
recepcin (Rx) y transmisin (Tx) de datos.
void setup()
{
pinMode(4,INPUT);
Serial.begin(9600);
}

//D4 es entrada
//Ajusta velocidad de la comunicacin a 9600 baudios

Como novedad del programa principal, en la funcin void loop(), comentar la presencia de la funcin
Serial.println() que transmite va serie la cadena indicada (Saludos desde Arduino ) y que aade
automticamente los caracteres de control /r y /n (retorno de carro y avance de lnea).
Serial.println("Saludos desde Arduino ..."); //Transmite el saludo
La transmisin se produce cuando se detecta un pulso en la patilla D4 de entrada.
Cmo verificar el funcionamiento del programa? Si tenemos en cuenta que el programa del Arduino
trata de transmitir un mensaje al PC, hemos de suponer que dicho PC tambin deber tener un programa
para recibir ese mensaje y, por lo menos, visualizarlo. A este tipo de programas se les llama programas de
comunicaciones. Para ordenadores PC bajo plataformas Windows podemos encontrar un buen nmero de

6-5

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

ellos: HyperTerminal (incluido en Windows), Docklight, Procomm, Smartcomm, etc Incluso, el propio
entorno de trabajo de Arduino, incluye un sencillo programa de comunicaciones llamado Serial monitor, que
nos facilita la comprobacin de programas y ejemplos de ste tipo. Para activarlo basta con pulsar el icono
representado mediante una lupa. Ver la figura 6-4.

Figura 6-4. El monitor serie incorporado en el entorno de Arduino


Cada vez que se acciona el pulsador E10 conectado con la patilla D4, Arduino transmite el mensaje
que ser visualizado en la ventana de ese monitor.
Si ests familiarizado con los programas de
comunicaciones para PC, puedes utilizar el que ms
te guste. El resultado deber ser el mismo. Por
ejemplo, puedes probar con el programa Hyper
Terminal que incorpora el propio Windows. Una vez
configurado convenientemente (velocidad, canal
COM a emplear, N de bits, etc), debers apreciar
algo parecido a lo mostrado en la figura 6-5.
Figura 6-5. Recepcin del mensaje desde el
programa Hyper Terminal

4-3-2 Ejemplo: Nmeros


Con este ejemplo tienes una buena ocasin de repasar
los diferentes sistemas de numeracin. Se emplea el mismo
esquema elctrico que el mostrado en la figura 6-3. Cada vez
que se pulsa E10, conectado con la patilla D4, se transmiten 10
nmeros correlativos. Cada nmero se transmite en diferentes
formatos: decimal o base 10 (DEC), hexadecimal o base 16
(HEX), octal o base 8 (OCT) y binario o base 2 (BIN). El
resultado de la ejecucin del programa se puede observar en la
ventana del monitor serie de Arduino muestra en la figura 6-6.

Figura 6-6. El ejemplo Nmeros

6-6

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

4-3-3 Ejemplo: Monitor_Remoto


+5Vcc

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Aqu tienes un buen ejemplo prctico. Se trata de monitorizar el


estado lgico de cuatro interruptores, E3:E0, conectados con
las patillas D4:D7. Monta el circuito de la figura 6-7.
El programa es muy sencillo. Se van leyendo cada una de las
entradas D4:D7. Si estn a nivel 1 se transmite el carcter 1.
Si estn a nivel 0 se transmite el carcter 0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ARDUINO NANO

Tx

Interface USB
Rx
con el PC

E0
E1
E2
E3

Como el programa se repite de forma indefinida, cada vez que


una de los interruptores del entrenador Universal Trainer
cambie de estado, inmediatamente se ver reflejado en el
monitor serie.

Figura 6-7. Monitorizacin remota


El montaje prctico se muestra en la fotografa de la figura 6-8 y el resultado de la monitorizacin en
la figura 6-9. Es un ejemplo que abre las puertas a mltiples aplicaciones.

Figura 6-8. Montaje prctico

Figura 6-9. Monitorizacin

5.- RECEPCION DE DATOS


De la misma manera, una vez establecida y activada la
comunicacin, Arduino NANO puede empezar a recibir los bytes que le
transmite un PC, otro Arduino o cualquier otro dispositivo. Esto no afecta
al programa que en ese momento se est ejecutando. Simplemente,
cada vez que se recibe un byte, se guarda automticamente en una
memoria RAM interna que recibe el nombre de buffer. Se representa
en la figura 6-10.
El buffer es capaz de almacenar un mximo de 64 bytes segn
se van recibiendo. Si se reciben ms bytes sin haber ledo o sacado los
que hubiera en ese momento, el buffer se desborda y se van perdiendo
los bytes que primero llegaron.
Figura 6-10. El buffer de recepcin
Mediante las funciones oportunas del lenguaje de programacin Arduino, tenemos la posibilidad de
conocer si se ha recibido o no algn byte, es decir, si hay alguno almacenado en el buffer. Tambin podemos
leerlos en el mismo orden en que fueron llegando.

6-7

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Observa la figura 6-11. Muestra un porttil conectado con una tarjeta Arduino cualquiera (la UNO en
la figura), mediante el puerto USB. Desde l se transmiten los caracteres de la cadena HOLA, que son
recibidos por Arduino y almacenados en su buffer interno de memoria RAM.

Figura 6-11. Ejemplo de recepcin


5-1 Funcin: Serial.available()
Devuelve el nmero de bytes que se han recibido y estn por tanto almacenados en el buffer de
memoria. Si devuelve el valor 0 es que no se ha recibido ningn byte y el buffer est vaco. El valor mximo
que puede devolver es de 64.
Sintaxis:
Serial.available();
Ejemplo:
byte A;
A=Serial.available();
.
while(Serial.available());

//A se carga con el valor 4 suponiendo el ejemplo de la figura 6-11


//Espera mientras no se reciba ningn byte

5-2 Funcin: Serial.read()


Lee del buffer los bytes segn se han recibido. Si no se ha recibido nada, devuelve el valor de -1.
Sintaxis:
Serial.read();
Ejemplo:
char A;
A=Serial.read();
A=Serial.read();
A=Serial.read();
A=Serial.read();

//Variable tipo char


//Lee del buffer el primer carcter recibido (H)
//Lee del buffer el siguiente carcter (O)
//Lee del buffer el siguiente carcter (L)
//Lee del buffer el siguiente carcter (A)

5-3 Funcin: Serial.parseint()


Lee del buffer un nmero entero con signo recibido por el canal serie. El nmero recibido nicamente
puede estar compuesto de los caracteres 0 al 9, y del signo (+ o -). No se admite ningn otro carcter. Estar
comprendido entre -32768 y +32768.

6-8

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Sintaxis:
Serial.parseint();
Ejemplo:
int N;
N=Serial.parseint();

//Variable tipo int


//N se carga con el nmero entero (2 bytes) recibido va serie

5-4 Funcin: Serial.parsefloat()


Lee del buffer el nmero en coma flotante (nmero real) recibido va serie. El nmero recibido
nicamente puede estar compuesto de los caracteres 0 al 9, del punto decimal (.) y del signo (-). No se
admite ningn otro carcter.
Sintaxis:
Serial.parsefloat();
Ejemplo:
float N;
N=Serial.parsefloat();

//Variable de tipo float


//N se carga con el nmero flotante (4 bytes) recibido va serie

5-5 Ejemplos de recepcin


Con las funciones o sentencias que acabamos de ver, ya estamos listos para presentar y trabajar con
una serie de ejemplos que reciben datos desde un PC, otro Arduino o cualquier otro tipo de dispositivo o
perifrico cualquiera. Los datos recibidos sern procesados y tratados por nuestro controlador Arduino NANO
de acuerdo a las necesidades. En resumidas cuentas, tenemos lo necesario para que nuestro Arduino pueda
transmitir y/o recibir datos, e interaccionar con el mundo exterior mediante las comunicaciones serie tipo
UART.
+5Vcc

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

5-5-1 Ejemplo: Control_Remoto

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Dichos leds se conectan con las patillas D4:D7


respectivamente. A travs del interface USB, Arduino recibe desde
el PC cuatro posibles caracteres correspondientes a otros tantos
comandos: 0, 1, 2 y 3.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

Con este ejemplo de indudable inters prctico, vas a


poder controlar de forma remota la activacin o desactivacin de
los leds S3:S0 del laboratorio Universal Trainer, desde un PC.
Realiza el montaje del esquema de la figura 6-12.

Tx

Interf ace USB


Rx
con el PC

S0
S1
S2

Figura 6-12. Control remoto

S3

En funcin del comando recibido, uno de los leds de salida cambia de estado: comando 0 S0, 1
S1, 2 S2 y 3 S3. Observa y estudia el siguiente fragmento del programa:
case '0':
digitalWrite(4,!digitalRead(4));
break;

//Si el comando es '0'...


//El led S0 cambia de estado

6-9

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Si se recibe el comando 0, se lee el estado de la patilla D4 (led S0) y se invierte (digitalRead(4)). El


resultado se escribe sobre la misma patilla D4 (digitalWrite()). Es decir, si la patilla D4 est a nivel 0, pasa a
nivel 1 y viceversa. Se emplea la misma tcnica de cambio de estado para el resto de comandos y patillas.
5-5-2 Ejemplo: Calculadora
El ejemplo emula el funcionamiento de una calculadora capaz de realizar las cuatro operaciones
bsicas (suma, resta, multiplicacin y divisin) entre dos nmeros enteros. Ambos nmeros se transmiten
desde el PC al Arduino va comunicacin serie. As mismo, el resultado obtenido por Arduino, se transmite
ahora al PC va serie. Tenemos por tanto una comunicacin en ambos sentidos: Arduino PC .
La novedad principal del programa reside en que vamos a crear y usar nuestra primera funcin. Una
funcin es a su vez un conjunto de funciones o sentencias que se deben ejecutar varias veces. En lugar de
escribirlas tantas veces como se necesiten, se escriben una nica vez y se usan las veces que sea necesario.
En este caso hemos creado la funcin Dato(). Est formada a su vez por otras tres funciones:
While(), Serial.parseInt() y return(). Cada vez que nuestro programa llame a la funcin Dato(), se ejecutarn
todas las funciones que sta contiene devolviendo el nmero entero que se reciba va serie.
int Dato()
//Esta funcin espera a recibir un n int por el canal serie
{
while(!Serial.available());
//Esperar si no se recibe nada
int N=Serial.parseInt();
//Lee el n int
return(N);
//Devuelve el n int
}

Se aconseja que las funciones creadas por el usuario se definan y escriban al principio del programa,
antes incluso que la funcin void loop().
No se puede usar una funcin que no haya sido previamente declarada.
El nombre de la funcin debe empezar siempre por una letra.
Todas las sentencia que contiene una funcin deben estar encerradas entre llaves ({ }).
Si la funcin, como en este caso, devuelve un valor de tipo int, se debe declarar como tal (int Dato()).
La sentencia return() finaliza la funcin y puede devolver el valor que le indiquemos (return(N) en el
ejemplo).
Una funcin puede tener tambin parmetros de entrada con los que operar. Se pasan desde el
programa principal.
Una funcin puede llamar a otra funcin.
Al finalizar una funcin se retorna al programa principal o a la funcin que la llam.
El programa principal hace uso o llama a una funcin, ejecutando las instrucciones que contenga,
tantas veces como haga falta:

A=Dato();
Serial.print(A);
.
.
B=Dato();
Serial.print(B);

//Espera al primer operando

//Espera al segundo operando


//Imprime el segundo operando

Nuestro ejemplo espera a que introduzcamos va serie, desde el PC, el primer operando (A=Dato()).
Luego debemos introducir el smbolo de la operacin a realizar (+, -, *, /). Por ltimo introducimos el segundo
operando (B=Dato()). Calcula el resultado segn la operacin deseada, y lo transmite va serie al PC:
Serial.print(" = ");
Serial.println(R);

//Retransmite el resultado

6 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

En la figura 6-13 se muestra unas cuantas


operaciones aritmticas de ejemplo. Recordemos que las
operaciones se realizan entre dos datos de 16 bits que
pueden expresar valores de +/- 32767.
Hemos empleado el propio monitor serie que incluye
el entorno Arduino. En el recuadro superior introducimos el
valor del operando A, el smbolo de la operacin a realizar
(+, -, *, /) y el valor del operando B. Se introducen seguidos
del RETURN.
En este ejemplo se aconseja elegir la opcin
remarcada: No hay fin de lnea. De esta manera, cuando
introducimos un operando o smbolo seguido de RETURN,
el monitor serie lo transmite al Arduino pero SIN incluir el
cdigo propio del RETURN (0x0D en HEX).
Figura 6-13. Calculadora
+5Vcc

5-5-3 Ejemplo: Potencia_PWM

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13
ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

El led S0 del laboratorio Universal Trainer se conecta


con la patilla D4. Su brillo se regular de forma remota
mediante el terminal serie del entorno Arduino.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Se trata de otro ejemplo de control remoto. En esta


ocasin vamos a hacer un programa amigable que, de forma
interactiva, nos pregunte por el porcentaje de potencia que
deseamos aplicar a un led de salida. Nos devuelve la duracin
del ciclo til y genera la seal PWM correspondiente. Monta el
circuito de la figura 6-14.

Tx

Interface USB
Rx
con el PC

S0

Figura 6-14. Control remoto de la seal PWM

La figura 6-15 nos muestra el terminal serie con los valores


de algunas de las pruebas realizadas.
Cuando transmitimos desde el PC la potencia deseada (en
%), el Arduino calcula y retransmite al PC el valor de la
duracin del pulso.
Se aconseja elegir la opcin remarcada: No hay fin de
lnea. De esta manera, cuando introducimos el valor de la
potencia seguido de RETURN, el monitor serie lo transmite
al Arduino pero SIN incluir el cdigo propio del RETURN
(0x0D en HEX).

Figura 6-15. Generando seales PWM

Trabajo personal
Proponemos que disees un programa amigable e interactivo que permita controlar la potencia que
se aplica a los leds S3:S0 conectados respectivamente con las patillas D4:D7 del controlador Arduino NANO.

6 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

5-5-4 Ejemplo: Servo_Control_Remoto


En la misma lnea que el ejemplo anterior, se trata de controlar de forma remota el posicionamiento
de un servo. De forma interactiva, mediante el terminal serie del entorno Arduino, se pregunta el nmero de
grados que el servo debe girar (entre 0 y 180).

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Servo
900-00008

+5Vcc

La figura 6-16 muestra el esquema de las


conexiones a realizar.

Interface USB
Rx
con el PC

Figura 6-16. Control remoto de un servo

Vdd
GND
2
3

Tx

PWM

ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Como ya sabemos, las patillas D0 y D1 se


emplean como lneas de recepcin (Rx) y
transmisin (Tx) respectivamente. Van a parar al
interface USB que conecta Arduino NANO con el
PC. Desde ste, transmitimos en grados el
desplazamiento que deseamos que gire el servo.

D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13

El servo se controla mediante una seal


PWM desde la patilla D3, al igual que en los
ejemplos del tema anterior.

+5Vcc

Trabajo personal
Imagina una mquina herramienta cuyo usillo debe realizar diferentes desplazamientos. Proponemos
disear un programa mediante el cual el servo realice una secuencia de cinco maniobras consecutivas. En la
pantalla del PC recibiremos los mensajes oportunos para que, de forma sencilla, cualquier usuario pueda
definir las diferentes maniobras. Por ejemplo:
VALORES
GIRO
TEMPORIZACION
REPETICION

1
10
5

2
90
3

MANIOBRA
3
5
45
135
5
2

5
180
6

10

Esto se puede pude traducir como que en la maniobra n 1, el servo gira 10 y espera 5, en la
maniobra n 2 gira 90 y espera 3, etc La repeticin representa el nmero de veces que se han de repetir
las maniobras anteriores.
Una vez que finaliza toda la secuencia, el sistema queda disponible para iniciar una nueva.

6.- MAS EJEMPLOS


Ahora que ya sabemos comunicar nuestro Arduino NANO con el PC (o con cualquier otro equipo), y
transferir datos en ambos sentidos mediante la comunicacin serie tipo UART, quiz sea un buen momento
para estudiar nuevas funciones y posibilidades del lenguaje Arduino.
6-1 Funciones matemticas
Anteriormente vimos el ejemplo Calculadora, en el que simulbamos su funcionamiento haciendo
las operaciones bsicas (+, -, *, /) entre dos nmeros enteros. Avanzamos un paso ms para trabajar ahora
con nmeros float y de paso ver algunas de las funciones matemticas ms importantes incluidas en el
lenguaje de programacin Arduino.
No vamos a necesitar tener conectado ningn perifrico en el controlador. Nos basta con mantener la
conexin USB con el PC.

6 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Aunque los programas que proponemos son sencillos e interactivos con el usuario, siempre son
susceptibles de ser mejorados. Te animamos a ello.
6-1-1 Ejemplo: Min_Max
Utiliza las funciones min() y max() que permiten obtener el valor
mnimo y mximo de dos nmeros respectivamente. La figura 6-17 muestra
la pantalla del terminal serie del entorno Arduino, con el resultado de
algunos ejemplos.
Figura 6-17. Calculando mnimos y mximos
Sintaxis:
min(A,B);
max(A,B);
A:
B:

Es el primer nmero. Puede ser cualquier expresin de cualquier tipo.


Es el segundo nmero. Puede ser cualquier expresin de cualquier tipo.

6-1-2 Ejemplo: Absoluto


La funcin abs() permite obtener el valor absoluto de un nmero. El
valor absoluto de un nmero es siempre un nmero positivo. La figura 6-18
muestra algunos ejemplos.
Figura 6-18. El valor absoluto
Sintaxis:
abs(A);
A:

Es el nmero cuyo valor absoluto se calcula.

6-1-3 Ejemplo: Potencia


Mediante la funcin pow() se calcula la base de un nmero elevado
al exponente o potencia indicada. La figura 6-19 muestra los resultados de
algunos ejemplos.
Figura 6-19. Clculo de la potencia de un nmero
Sintaxis:
pow(base,exponente);
base:
exponente:

El nmero (float)
La potencia a la que se eleva la base (float)

6-1-4 Ejemplo:Raiz
Emplea la funcin sqrt() para calcular la raz cuadrada de un
nmero. La figura 6-20 muestra algunos de los resultados obtenidos.
Observa cmo trabajamos con cinco decimales (o los que sean).
Figura 6-20. Raz cuadrada
Sintaxis:
sqrt(A);
A:

Es un nmero de cualquier tipo.

6 - 13

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

6-1-5 Ejemplo: Trigonometra


Las funciones trigonomtricas sin(), cos() y tan() permiten obtener
el seno, coseno y tangente respectivamente de un ngulo expresado en
radianes. El ejemplo pide el valor de un ngulo expresado en grados y
calcula tambin su equivalente en radianes. La figura 6-21 muestra la
solucin a varios ejemplos.
Figura 6-21. Funciones trigonomtricas
Sintaxis:
sin(A);
cos(A);
tan(A);
A:

Es el valor del ngulo expresado en radianes

6-2 Funciones avanzadas


El lenguaje Arduino dispone, adems de las ya conocidas, otras funciones para el control del tiempo y
tambin para realizar ciertas operaciones especiales con las entradas y salidas digitales. Ahora que sabemos
comunicarnos va serie con el exterior, es un buen momento para estudiarlas, usarlas y transmitir sus
resultados al PC a travs del terminal serie del entorno Arduino.
6-2-1 Ejemplo: Tiempo_On
Gracias a la funcin millis() es posible conocer el tiempo que lleva Arduino ejecutando un programa
desde que se conect la alimentacin o se reinici mediante el RESET. Esta funcin devuelve un nmero
largo sin signo, unsigned long (4 bytes), que representa el tiempo en milisegundos. Este nmero puede ir
32
desde 0 mS hasta 4.294.967.295 mS (2 -1), que representa
aproximadamente a unos 50 das de funcionamiento. En el ejemplo (figura
6-22) se visualiza en segundos el tiempo trascurrido desde el reinicio, y se
intercala una temporizacin de 5000 mS entre una visualizacin y la
siguiente.
Figura 6-22. Tiempo transcurrido en segundos
Sintaxis:
millis();
6-2-2 Ejemplo: Tiempo_On_V2
De forma similar, la funcin micros() tambin nos permite conocer el tiempo que lleva Arduino
ejecutando un programa desde que se conect la alimentacin o se reinici mediante el RESET. En esta
ocasin la funcin devuelve un nmero largo sin signo, unsigned long (4 bytes), que representa el tiempo en
microsegundos. Este nmero puede ir desde 0 S hasta 4.294.967.295 S
32
(2 -1), que representa aproximadamente a unos 70 minutos de
funcionamiento. En el ejemplo (figura 6-23) se visualiza en microsegundos
el tiempo trascurrido desde el reinicio, y se intercala una temporizacin de
5000 mS entre una visualizacin y la siguiente.
Figura 6-23. Tiempo transcurrido en microsegundos
Sintaxis:
micros();

6 - 14

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

6-2-3 Ejemplo: Medir_Pulso


En el tema anterior se estudiaron las seales PWM que se generaban mediante la funcin
analogWrite(). La duracin del ciclo til se estableca mediante un valor comprendido entre 0 y 255. En este
ejemplo vamos a ver la relacin que hay entre ese valor y el tiempo real en S que dura un ciclo til o nivel
1.
Para ello vamos a emplear una nueva funcin: pulseIn(). Esta funcin es capaz de medir el tiempo
que dura un pulso a 1 o un pulso a 0 de una seal aplicada por cualquier patilla de entrada digital.
32
Devuelve un valor entero grande sin signo (unsigned long) comprendido entre 0 S y 4.294.967.295 S (2 1), equivalente a unos 70 minutos de duracin.
Sintaxis:
pulseIn(pin, nivel, tiempo);
pin:
Representa la patilla de entrada con la seal a medir.
nivel: Indica si se va a medir la duracin del pulso a 1 (1) o del pulso a 0 (0).
tiempo: Se trata de un valor unsigned long que indica, en micro segundos, el tiempo que se ha de esperar
para hacer la medida. Es opcional y por defecto es de 1000000 S (1 seg.). Si transcurrido ese
tiempo (Time-Out), no se produce el pulso a 1 o a 0 que queremos medir, se devuelve el valor 0.
Vas a montar el circuito del esquema de
la figura 6-24. Por la patilla de salida D11 se
genera una seal PWM cuya anchura o ciclo til
indicaremos tecleando un valor de entre 0 y 255.
Utilizamos para ello el terminal serie del entorno
Arduino El brillo del led S0 vara en funcin de
ese valor.

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
D1
VIN
D0
GND
RESET RESET
GND
+5V
D2
A7
D3
A6
D4
A5
D5
A4
D6
A3
D7
A2
D8
A1
D9
A0
D10
AREF
D11
3V3
D12
D13
ARDUINO NANO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

La patilla D11 se conecta a su vez con la


patilla de entrada D2. Mediante pulseIn()
medimos el tiempo que la seal en esta patilla se
mantiene a 1. Ese tiempo representa
exactamente los microsegundos que dura el ciclo
til de la seal PWM generada.

+5Vcc

Tx

Interface USB
Rx
con el PC

S0

Figura 6-24. Midiendo el ciclo til


En la figura 6-25 se muestra el resultado obtenido para diferentes valores del ciclo til. Recordemos
que el sistema Arduino genera una seal PWM de aproximadamente 490 Hz de frecuencia F con un periodo
T de 2040 S. Todos los valores indicados son aproximados y pueden variar ligeramente en funcin de
mltiples factores.
Se aprecia que con la anchura mnima del ciclo til (0) la duracin es,
evidentemente, de 0 S. Con una anchura de 254, la duracin es de 2010
S. La mxima posible sera 255, el 100%, pero esto nos dara una
duracin de 0 S, ya que en este caso la seal PWM es fija a nivel 1. No
es un pulso. Desborda el tiempo (Time-Out) de la funcin pulseIn() y
devuelve el valor 0.
Figura 6-25. Duracin de diferentes ciclos tiles
La figura 6-26 muestra la seal PWM capturada mediante un osciloscopio. Se aprecia claramente la
lectura que ofrecen los cursores que miden la anchura del nivel 1 de una seal PWM, cuyo ciclo til es de
100. El resultado de la medida es de 800 S, muy cercano a los 788 S ofrecido en la figura 6-25 para una
misma seal.

6 - 15

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

Figura 6-26. Seal PWM con 800 S de ciclo til


6-2-4 Ejemplo: Frecuencmetro
Como se muestra en la figura 6-27, toda seal digital est
compuesta de transiciones de niveles lgicos 1 y 0. Con pulseIn()
podemos medir el tiempo que dura el semiperiodo en el que la seal est a
nivel 1 (SMP1), y el semiperiodo en el que est a nivel 0 (SMP0). La
suma de ambos semiperiodos da lugar al periodo T, que es la parte que se
repite en una seal. Conocido el periodo podemos calcular tambin la
frecuencia F de esa seal.
Figura 6-27. Seal digital
Tx

Interface USB
Rx
con el PC

DIG

1-50Hz

F =

1H z

Up Sel .

Dn Adj.

E10
MEDIR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

ARDUINO NANO

Monta el esquema de la figura 6-28. Por


primera vez vamos a utilizar el generador
lgico del entrenador Universal Trainer. Nos
va a proporcionar la seal de onda cuadrada
cuya frecuencia el Arduino ser capaz de
medir mediante pulseIn().
Si dispones de la versin V1 o V2 del
entrenador, debes usar el generador lgico y
NO el generador de funciones. Selecciona la
frecuencia ms baja de las disponibles.
Figura 6-28. Esquema del frecuencmetro

Si ests usando la ltima versin del Universal Trainer, la V3, debes seleccionar la seal de salida de
tipo digital (DIG), la escala ms baja (1-50 Hz) y ajustar, mediante el potencimetro, la frecuencia de salida
ms baja posible.
El programa espera una pulsacin en la patilla D3
en la que le hemos conectado el pulsador E10 del
entrenador. Seguidamente lee la duracin del semiperiodo
positivo (SMP1) y del negativo (SMP0) de la seal que
proporciona el generador lgico y que se aplica por la
patilla D2. A continuacin calcula el periodo T y la
frecuencia F. Por ltimo visualiza los resultados
transmitindolos va serie al terminal del entorno Arduino.

Figura 6-29. Midiendo una frecuencia

6 - 16

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

La figura 6-29 muestra el resultado de la ejecucin del programa. El generador de funciones se ha


ajustado a una seal digital cuya frecuencia es de 28 Hz (o cualquier otra). La ventana del terminal serie nos
ofrece las medidas realizadas: SMP1=17802 S, SMP0=17778 S, el periodo T es de 0.035580 mS y la
frecuencia F de 28.1 Hz.
Puedes probar con cualquier frecuencia que el generador lgico de tu entrenador sea capaz de
suministrar. Quiz observes que cuanto mayor sea esta, menor precisin se obtiene en la medida. Esto es
debido a que el pulso mnimo que la funcin pulseIn() puede medir es de aproximadamente unos 10 S, lo
que hace un periodo mnimo de 20 S que equivale a una frecuencia mxima de unos 50 KHz.
3-2-5 Ejemplo: Tiempo_de_Activacin
Tx

Interface USB
Rx
con el PC
E10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Otro ejemplo con mltiples aplicaciones prcticas.


Empleando la funcin pulseIn(), se trata de medir el
tiempo en que un pulsador (o cualquier dispositivo
similar) se mantiene activado. Monta el circuito de la
figura 6-30.
En este caso empleamos el pulsador E10 del
entrenador que conectamos con la patilla D2. En
reposo est a nivel 1. Cada vez que se pulsa produce
un nivel 0.
Figura 6-30. Medir el tiempo de activacin del pulsador

ARDUINO NANO

La funcin pulseIn() tiene un parmetro que expresa el tiempo que debe esperar a que se produzca
el pulso que queremos medir. Se trata de un entero largo sin signo (unsigned long) que est comprendido
32
entre 0 S y 4.294.967.295 S (2 -1). Equivale a una espera mxima de unos 70 minutos de duracin.
Si transcurre dicho tiempo sin que llegue el pulso (Time-Out), la funcin devuelve el valor 0. En este
ejemplo el valor de espera se establece en la variable TO que se carga con el valor 10000000 (10
segundos). En la figura 6-31 se muestra algunos resultados:
1. E10 se ha pulsado durante 0.14 segundos.
2. E10 no se ha pulsado en el tiempo establecido de 10
segundos. Ha habido Time-Out.
3. E10 se ha mantenido pulsado durante 3.39 segundos.

Figura 6-31. Pulsaciones de diferentes pulsaciones

Trabajo personal
Prueba a cambiar el pulsador E10 por el interruptor E0. Cuando lo mueves de nivel 1 a nivel 0 y de
nuevo a 1, qu observas en las diferentes medidas?. El error se debe al efecto rebote del que ya hemos
hablado. Los interruptores del entrenador Universal Trainer, al igual que dispositivos similares, presentan
dicho efecto. Por qu no ocurra con el pulsador?
Los pulsadores E10 y E11 del entrenador estn dotados de un circuito anti rebote como el que se
muestra en la figura 6-32. Por la lnea E10 se obtiene un pulso limpio con transicin 1-0-1 cada que se
pulsa.

6 - 17

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com
+5Vcc

El circuito de los interruptores que hay en el entrenador es


muy parecido. Le falta el condensador. Si pruebas a conectar un
condensador de 100 n entre la lnea E0 y GND observars que las
medidas mejoran ahora notablemente.

4K7
E10
E10
470

Figura 6-32. Circuito anti rebote

100n

7.- MAS FUNCIONES PARA LAS COMUNICACIONES


Hemos visto las funciones ms importantes empleadas en las comunicaciones serie, y tambin
hemos practicado con ellas. Sin embargo, el lenguaje Arduino tiene ms funciones relacionadas con la
comunicacin serie tipo UART. En este apartado vamos a hacer un resumen de ellas, dejando que seas t
mismo quien experimentes con las mismas y las utilices segn te convenga.

7-1 Funcin: Serial.find()


Lee los datos que hay en el buffer de recepcin serie en busca de la cadena de caracteres indicada.
La funcin devuelve true (verdad) si la cadena se encuentra efectivamente en el buffer. Si devuelve falso
es porque la cadena no se ha encontrado y no hay ms datos en el buffer.
Sintaxis:
Serial.find(cadena);
cadena:

Es la cadena que se desea encontrar dentro del buffer.

7-2 Funcin: Serial.findUntil()


Es similar a find(), pero la bsqueda se detiene si no se encuentra el final indicado. Es til para
encontrar una cadena con un final determinado, por ejemplo, retorno de carro (\r).
Sintaxis:
Serial.findUntil(cadena,final);
cadena:
final:

Es la cadena a buscar dentro del buffer


Es el carcter con que debe finalizar la cadena

7-3 Funcin: Serial.peek()


Devuelve el siguiente byte o carcter que haya en el buffer de recepcin, pero sin sacarlo del mismo
como haca la funcin Serial.read().
Sintaxis:
Serial.peek();

6 - 18

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

7-4 Funcin: Serial.readBytes()


Lee caracteres del puerto serie y los almacena en el buffer indicado. La funcin finaliza si se ha ledo
el nmero de caracteres indicado, o se excede el tiempo de espera establecido (Time-Out). Devuelve el
nmero de caracteres almacenados en el buffer. Un valor 0 indica que no se recibi ninguno.
Sintaxis:
Serial.readBytes(buffer,nmero);
buffer:
nmero:

Buffer donde se reciben y guardan los caracteres (p.e. char recibir[ ])


Nmero de bytes a recibir (int)

7-5 Funcin: Serial.readBytesUntil()


Lee caracteres del puerto serie y los va almacenando en el buffer indicado. La funcin finaliza cuando
se detecte un determinado carcter, o se hayan recibido el nmero de caracteres indicado, o bien se excede
el tiempo de espera establecido (Time-Out). Devuelve el nmero de caracteres recibidos y almacenados en el
buffer. Un valor 0 indica que no se recibi ninguno.
Sintaxis:
Serial.readBytesUntil(carcter,buffer,nmero);
carcter:
buffer:
nmero:

Es el carcter que, cuando se recibe, finaliza la recepcin.


Buffer donde se guardan los caracteres recibidos (p.e. char recibir[ ])
Nmero de bytes a recibir (int)

7-6 Funcin: Serial.setTimeout()


Permite ajustar el tiempo de espera que emplean ciertas funciones como Serial.parseInt(),
Serial.readBytes() o Serial.readBytesUntil(), para que se den por finalizadas.
Sintaxis:
Serial.setTimeout(tiempo);
tiempo:

Es un nmero entero largo (long) que expresa, en milisegundos, el tiempo de espera. Por
defecto es de 1000 mS (1 segundo).

7-7 Funcin: Serial.write()


Escribe uno o ms bytes sobre el puerto serie. Para enviar bytes que representan dgitos o caracteres
se aconseja el empleo de Serial.print().
Sintaxis:
Serial.write(byte);
Serial.write(cadena);
Serial.write(buffer,nmero);
byte:
cadena:
buffer:
nmero:

Es el byte a transmitir
Representa la cadena o serie de bytes a transmitir
El buffer que contiene los bytes a transmitir
El nmero de bytes contenidos en el buffer a transmitir

6 - 19

ARDUINO: La tecnologa al alcance de todos


TEMA 6: Las comunicaciones
www.microcontroladores.com

7-8 Funcin serialEvent()


Es una funcin a la que se le llama cada vez que se recibe un byte, ejecutndose as todas las
sentencias que contenga. Se debe emplear la funcin Serial.read() para leer el dato recibido.
Sintaxis:
void serialEvent()
{
.
.
}

6 - 20

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

TEMA 7: Las seales analgicas


1.- INTRODUCCIN
Es probable que en algn momento hayamos hablado de seales o entradas analgicas, pero qu
son?, para qu sirven?, dnde estn?, cmo se manejan? Vamos a dedicar este tema a explicarlas tanto
de forma terica como prctica a base de diferentes ejemplos.
Hasta el momento hemos visto a nuestro controlador Arduino como un sistema digital que nicamente
entiende y manipula seales digitales compuestas de niveles 1 y 0. Con estos niveles lgicos o bits
podemos realizar cualquier tipo de operacin aritmtico / lgica, operaciones de control, temporizaciones,
sonidos, regulacin y hasta comunicaciones, como hemos estudiado en los temas precedentes.
En el mundo digital todo se contempla como si nicamente hubiera dos posibles valores. Un
interruptor o pulsador puede estar activado (1) o desactivado (0). Un led se puede encender o apagar. El
sonido se puede generar a partir de una seal de onda cuadrada, compuesta de 1s y 0s, con diferentes
frecuencias. La regulacin en el brillo de un led, la velocidad de un motor o el posicionamiento de un servo, se
puede realizar mediante seales PWM, que tambin son seales compuestas de 1s y 0s.
Sin embargo el mundo real es diferente. En la naturaleza nos podemos encontrar con parmetros o
magnitudes que pueden adquirir mltiples valores, no slo 1s y 0s. Pensemos por ejemplo en la
temperatura. Se trata de una magnitud fsica que constantemente est variando en el tiempo. No hace la
misma temperatura de madrugada, que al medioda o a la noche. Si dispusiramos de un sensor capaz de
capturar la temperatura y ofrecernos una tensin proporcional a la misma, veramos que esa tensin puede
tener multitud de valores posibles, como se muestra
en la figura 7-1. La temperatura es una magnitud
analgica. Gracias al sensor obtenemos una
tensin de 2V a las 5h de la maana. A las 9h la
tensin es de unos 4V y sube a unos 5V a las 15h.
A partir de las 16h la temperatura va disminuyendo
y, por la tanto, la tensin que ofrece el sensor
tambin. nicamente nos hace falta establecer una
relacin entre tensin (V) y temperatura (C).
Figura 7-1. La temperatura es una magnitud
analgica
Piensa en las mltiples magnitudes fsicas analgicas que nos rodean. Mediante los sensores o
transductores apropiados podemos convertir esas magnitudes a sus tensiones analgicas equivalentes:

Humedad y/o humedad relativa. Nos permite conocer la cantidad de vapor de agua que hay en la
atmsfera terrestre.
Presin atmosfrica. Con el sensor oportuno podemos conocer la presin que ejerce el aire sobre la
tierra.
Peso. Podemos medir la fuerza con la que un cuerpo acta sobre un punto de apoyo.
Velocidad. Con los sensores apropiados podemos medir la velocidad a la que se desplaza el aire, una
persona, un vehculo, etc
Luz. Podemos medir la luz ambiente o la luz que incide sobre un objeto. Hay sensores que detectan luz
visible, infra roja, ultra violeta, etc
Sonido. Con los transductores existentes se puede medir, conocer y/o detectar ruidos, sonido
ambiente, volumen, etc

2.- CONVERSION DIGITAL


Hoy en da existen en el mercado todo tipo de sensores y transductores capaces de ofrecer una
tensin analgica equivalente a la magnitud fsica que estn midiendo. Sin embargo, ningn sistema digital es
capaz de manipular ni procesar directamente esas tensiones analgicas. Nuestro controlador Arduino tampoco.

7-1

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

Primero es necesario convertir las tensiones analgicas a sus equivalentes valores digitales. Para ello
se emplean unos circuitos electrnicos llamados Convertidores Analgicos Digitales o Analog Digital
Converters, abreviadamente ADC.
La figura 7-2 resume los elementos necesarios para poder procesar una magnitud analgica como
puede ser la temperatura.

Figura 7-2. Conversin analgica


1. El sensor o transductor, en este caso de temperatura, capta la magnitud fsica a medir. A su salida
ofrece una tensin analgica proporcional a esa temperatura.
2. Esa tensin se introduce al convertidor analgico/digital ADC. Este circuito ofrece a su salida un valor
binario equivalente a esa tensin.
3. El valor binario puede ser ledo por el sistema digital, que puede ser nuestro Arduino o cualquier tipo de
controlador.
4. El sistema digital es ahora capaz de realizar cualquier tratamiento con ese valor binario: registrarlo en
memoria, realizar operaciones aritmtico / lgicas, visualizarlo, transferirlo a otro sistema, etc
Casi todos los microcontroladores actuales llevan integrado el circuito convertidor ADC. Bsicamente
solo hace falta conectarle el sensor o transductor correspondiente a la magnitud fsica que queremos medir y
tratar. El controlador Arduino NANO, como no poda ser menos, es uno de ellos.
La mayor parte de los controladores integran un
nico convertidor, pero pueden tomar muestras de
tensiones analgicas procedentes de diferentes patillas
o canales analgicos de entrada. Tal y como se ve en
la figura 7-3, en el caso de nuestro controlador Arduino
NANO, disponemos de 8 de estas patillas numeradas
como A0-A7, lo que nos permite recoger muestras
analgicas de hasta 8 sensores diferentes.
Figura 7-3. Canales analgicos de Arduino NANO

Mediante el uso de las funciones


apropiadas podemos seleccionar en todo
momento qu canal analgico queremos
convertir. nicamente se puede realizar la
conversin de un canal cada vez. Observa la
figura 7-4. Cada vez que ordenamos realizar una
conversin, se toma una muestra de la tensin
analgica presente en ese momento en el canal
de entrada seleccionado. Arduino tarda unos
100 S (0.0001 s.) en obtener el resultado
binario equivalente, lo que permitira realizar
unas 10000 conversiones por segundo.
Figura 7-4. Conversiones AD

7-2

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

Cuando se ordena realizar la conversin en el instante 1, la tensin analgica muestreada en ese


momento es de 2.2 V aproximadamente. El convertidor generar como resultado un cdigo o valor binario
proporcional a esa tensin. En el instante 2, la tensin muestreada y su correspondiente valor binario
proporcional, corresponde a una tensin de 2.8 V. En el instante 3 a 3.5 V, en el 4 a 4.2 V y, en el instante 10, a
una tensin de 4.7 V.
En la figura se aprecia que entre una conversin y
otra transcurre un lapsus de 100 S (0.0001 s.).
Representa el tiempo mnimo que tarda Arduino NANO en
hacer una conversin. Es un tiempo de conversin
bastante aceptable si se trata de muestrear seales que
varan con cierta rapidez en el tiempo. Por ejemplo, si
como se muestra en la figura 7-5, disponemos de una
seal analgica con una frecuencia F de 1000 Hz, su
periodo T sera de 1000 S (1 mS). Por lo tanto, podemos
tomar 10 muestras de cada ciclo de esa seal (1000 S /
100 S).
Figura 7-5. Muestreo de una seal de 1000 Hz
Si tuviramos una seal analgica cuya frecuencia F es de 500 Hz y su periodo T de 2000 S,
podremos hacer una total de 20 muestreos (2000 S / 100 S). Es decir, tendramos una digitalizacin ms
precisa de esta nueva seal.
No siempre es necesario tomar tantas muestras por segundo de una determinada seal analgica.
Pensemos de nuevo en un sensor que mide la temperatura ambiente. Se trata de una magnitud que vara muy
lentamente. La temperatura no pasa de -10 C a +15 C en 0.0001 segundos. Lo mismo pasa con la luz natural.
No pasamos de la noche al da cada 100 S. Tambin ocurre con el peso. Nadie pesa 60 Kg ahora y 85 Kg 100
S despus. Por todo ello podemos afirmar: La velocidad de conversin de Arduino NANO es ms que
suficiente para medir la mayor parte de magnitudes fsicas analgicas !!
Adems de la velocidad de conversin, otro factor a tener en cuenta en un convertidor es su
resolucin o precisin. En el caso del convertidor que integra Arduino NANO, se dice que tiene una resolucin
de 10 bits. Quiere decir que el resultado que ofrece tras una conversin puede tener 1024 valores digitales
10
posibles (2 ).
Para establecer una relacin entre el valor digital o binario de salida, y la tensin analgica de entrada
que estamos midiendo, necesitamos conocer una constante llamada Tensin de referencia (VREF). Es la
tensin que emplea el convertidor para hacer sus operaciones. La resolucin por bit se calcula segn la
siguiente ecuacin, y depende tanto de la VREF como del nmero de bits del convertidor. Suponiendo que VREF
= 5 V:

= .

= .

Conocido esto podemos predecir el valor binario de salida que nos ofrecer el convertidor, en funcin
de la tensin analgica de entrada que estamos midiendo. Observa y analiza la siguiente tabla:

TENSION
0.000
0.005
0.010
0.015
0.020
1.000
2.000

SALIDA
BINARIO
DEC.
0000000000
0
0000000001
1
0000000010
2
0000000011
3
0000000100
4
0011001100
204
0110011000
408

HEX.
0x0
0x1
0x2
0x3
0x4
0xCC
0x198

TENSION
2.500
3.000
4.000
4.985
4.990
4.995
5.00

SALIDA
BINARIO
DEC.
1000000000
512
1001100110
614
1100110011
819
1111111100
1020
1111111101
1021
1111111110
1022
1111111111
1023

HEX.
0x200
0x266
0x333
0x3FC
0x3FD
0x3FE
0x3FF

7-3

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

Basta dividir la tensin de entrada analgica entre la resolucin por bit del convertidor, en este caso
0.00488. Por ejemplo: 3 V / 0.00488 = 614 = 0x266 = 1001100110.
IMPORTANTE !!. La tensin analgica a medir nunca debe ser superior a la tensin de referencia VREF
que emplea el convertidor en sus operaciones internas. Por ejemplo, si VREF = 5V la tensin analgica
mxima de entrada ser tambin de 5 V.

3.- FUNCIONES DEL LENGUAJE ARDUINO


Para el control y empleo del convertidor ADC integrado en Arduino NANO nicamente se necesitan dos
sentencias del lenguaje de programacin Arduino. Son muy sencillas y seguro que les encuentras un sinfn de
posibles aplicaciones.
3-1 Funcin: analogReference()
Permite determinar la tensin de referencia (VREF) que va a emplear el convertidor ADC, para realizar la
conversin de una tensin analgica en su equivalente valor digital o binario. Esto es importante ya que
conocida sta podremos calcular la resolucin por bit del convertidor.
La tensin VREF no debe ser mayor que la tensin general que alimenta al controlador Arduino NANO
(normalmente 5 V). Por su parte, la tensin analgica que se desea convertir, no debe ser mayor que la tensin
VREF.
Sintaxis:
analogReference(tipo);
tipo:

Selecciona el tipo de VREF que va a emplear el convertidor:


DEFAULT: Es la tensin de referencia por defecto. VREF es la misma que la tensin con la que se
alimenta el controlador: 5 V o 3.3 V segn el tipo de controlador.
INTERNAL: Es una tensin de referencia fija que se genera en el interior del propio controlador. En el
caso de Arduino NANO es de 1.1 V.
EXTERNAL: Se usa como tensin VREF de referencia la aplicada por la patilla AREF del controlador.

Ejemplo:
analogReference(INTERNAL);

//Se emplea una tensin de referencia de 1.1V

En este ejemplo, teniendo en cuenta que el convertidor es de 10 bits, la resolucin por bit es de:

= .

= .

3-2 Funcin: analogRead()


Es la sentencia que vamos a emplear para realizar una conversin analgico/digital. Cada vez que se
ejecuta toma una muestra de la tensin presente en el canal analgico indicado, y realiza la conversin de la
misma.
Sintaxis:
analogRead(pin);

7-4

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

pin:

Es el nmero de la patilla correspondiente al canal analgico que deseamos convertir. En el caso de


Arduino NANO son 8: A0-A7.

Ejemplo:
int V;
V=analogRead(A3);

//Realiza la conversin de la tensin presente en la patilla A3.

3-3 Funcin map()


Esta sentencia no est relacionada exclusivamente con el convertidor analgico/digital. Se puede
utilizar en muchos otros casos, pero viene muy bien en el que nos ocupa. La funcin nos permite remapear,
reasignar o acotar un valor comprendido entre un mnimo y un mximo, en otro.
Ya sabemos que el convertidor de nuestro Arduino tiene una resolucin de 10 bits, por lo que el
10
resultado puede ser un valor numrico comprendido entre 0 y 1023 (2 ). Sin embargo, nos puede interesar
8
usar dicho valor como si fuera de 8 bits (byte), comprendido entre 0 y 255 (2 ), ya que es un formato mucho
ms estndar y ms empleado por mltiples funciones.
Sintaxis:
map(valor, min, max, Nmin, Nmax);
valor:

Es el valor que se desea reasignar. Normalmente es de tipo int (16 bits) o de tipo long (32 bits). No
debe usarse con valores tipo float.
min:
Expresa el lmite mnimo del valor actual.
max: Expresa el lmite mximo del valor actual.
Nmin: Expresa el lmite mnimo del nuevo valor.
Nmax: Expresa el lmite mximo del nuevo valor.
Ejemplo:
int V;
V=readAnalog(A3);
v=map(V,0,1023,0,255);

//Realiza la conversin de la tensin presente en la patilla A3


//Reasigna el valor ledo convirtindolo a un byte

El valor analgico ledo desde la patilla A3, est comprendido entre 0 y 1023 y se almacena en la
variable V. Dicho valor se reasigna a otro equivalente comprendido entre 0 y 255. Esta sentencia, segn
Arduino, responde a la siguiente funcin matemtica:

)(

)+

4.- PERIFERICOS ANALOGICOS


Ya se ha comentado que en el mercado existe una gran variedad de sensores y dispositivos capaces
de proporcionar una tensin analgica, comprendida entre un mnimo y un mximo, en funcin de una
determinada magnitud fsica. Para desarrollar las siguientes prcticas hemos elegido a tres de ellos por su
facilidad de uso, por ser asequibles y fciles de localizar.

7-5

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

4-1 El potencimetro
Se trata de una resistencia cuyo valor vara conforme
movemos su eje, mando o cursor. Son los perifricos
analgicos ms econmicos que puedes encontrar y pueden
tener diferentes formas, tamaos y valores. Como se muestra en
la figura 7-6, el entrenador Universal Trainer dispone de dos
potencimetros que podemos usar cuando nos interese. Uno de
ellos tiene una resistencia total de 1 K y el otro de 100 K.

Figura 7-6. Potencimetros en el Universal Trainer


En la figura 7-7 puedes ver el aspecto de uno de estos potencimetros as como su smbolo elctrico.
Dispone de tres terminales o patillas. La 1 y la 2 se corresponden con los extremos de la resistencia y
representan el valor total de la misma. La patilla 3 es el cursor
y est asociado mecnicamente con el eje o mando que
permite deslizarlo por el cuerpo de la resistencia. Cada vez que
lo movemos variamos el valor de la resistencia. Si lo
colocamos justo en el centro de su recorrido, entre las patillas
1 y 3 tenemos la mitad de la resistencia total, en las patillas 2 y
3 la otra mitad. Por el mismo motivo se aplicamos una tensin
en sus extremos 1 y 2, por ejemplo de 5 V, entre la patilla 3 y
cualquiera de las otras dos tendremos una tensin que vara
entre 0 y 5V en funcin de dnde coloquemos el cursor.
Figura 7-7. Un potencimetro
4-1-1 Ejemplo: Conversin_AD

ARDUINO NANO
Tx

Veamos un primer ejemplo de conversin a


digital o binario de una tensin analgica que se aplica
por la patilla A0. Realiza el montaje del esquema de la
figura 7-8. Los extremos del potencimetro de 1K del
entrenador Universal Trainer se conectan con GND y +5
VCC de alimentacin. El cursor se conecta con el canal
analgico de entrada de la patilla A0. Moviendo ese
cursor de un extremo a otro estaremos aplicando una
tensin analgica comprendida entre 0 y 5V. La
conversin se realiza cada vez que se accione el
pulsador E10 conectado con la patilla D2.

Interface USB
Rx
con el PC
E10
CONVERTIR
+5Vcc
1K

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

Figura 7-8. Conversin AD


El programa espera a recibir un pulso procedente de la entrada digital D2. La nica novedad en este
ejemplo se encuentra en las siguientes dos funciones:
AN0=analogRead(A0);
V=AN0*0.00488;

//Realiza la conversin de A0 (potencimetro)


//Calcula la tensin equivalente

La funcin AN0=analogRead(A0) toma una muestra de la tensin analgica presente en la patilla A0, y
que suministra el potencimetro. El resultado digital se almacena en la variable AN0. A continuacin se
calcula la tensin real aplicada, como si fuera un voltmetro. Basta con multiplicar el valor digital por la
constante 0.00488. Recuerda que esta constante representa la resolucin por bit.

7-6

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

Finalmente, de la forma ya conocida, transmitimos el resultado va


serie al terminal del entorno Arduino. Lo hacemos en decimal, en
binario, en hexadecimal y en voltios. En la figura 7-9 se ven una serie
de medidas realizas.
Con el potencimetro en un extremo la tensin analgica aplicada es
de 0V. En el extremo opuesto ser de +5V. En medio puedes realizar
mltiples medidas cuya tensin puedes contrastar con un voltmetro.
Figura 7-9. Midiendo tensiones analgicas

4-1-2 Ejemplo: Umbrales


Al disponer de un valor numrico representando a una tensin analgica, tenemos la posibilidad de
realizar todo tipo de procesos y clculos con l. En este ejemplo se trata de comparar la tensin analgica con
dos valores: uno mnimo y otro mximo.
Monta el circuito de la figura 7-10. El
potencimetro se conecta con el canal analgico de la
patilla A0, el led S7 con la patilla D2 y el led S0 con la
patilla D3.
Si la tensin es igual o menor que la mnima
establecida, se activa S7. Si es igual o mayor que la
mxima, se activa S0. Si no est en ninguno de los dos
rangos, ambos leds se desactivan.

Figura 7-10. Comparando una tensin

MINIMO
S7
S0
MAXIMO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

+5Vcc

1K

ARDUINO NANO

4-1-3 Ejemplo: Comparador_Analgico


Tx

Interface USB
Rx
con el PC
S7

V1>V2

S4

V1=V2

S0

V1<V2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

ARDUINO NANO

+5Vcc
+5Vcc
V2

100K

+5Vcc

V1

1K

Por supuesto que podemos utilizar dos o ms


canales analgicos. En este ejemplo se compara la
tensin analgica V1 en la patilla A0, con la tensin
analgica V2 en la patilla A1. Realiza el montaje de
la figura 7-11. Las tensiones se introducen a travs
de los potencimetros del entrenador. Si V1 > V2
se activa la salida D2 conectada con el led S7. Si
V1 = V2 se activa la salida D3 conectada con el led
S4. Por ltimo, si V1 < V2 se activa la salida D4
conectada con el S0. Puedes usar un voltmetro
para medir ambas tensiones V1 y V2 y comprobar
el correcto funcionamiento del comparador
analgico de tensiones.

Figura 7-11. Circuito comparador


Es posible que notes que es francamente difcil ajustar ambas tensiones V1 y V2 a un mismo valor y
que se active as el led S4 (V1=V2). Los convertidores suelen tener una precisin de 1 bit. Si adems
tenemos en cuenta que los potencimetros son dispositivos electromecnicos, resultar muy difcil obtener dos
conversiones idnticas. La igualdad en ambas tensiones V1 y V2 se aprecia perfectamente cuando los
potencimetros se mueven a ambos extremos (0V o 5V).

7-7

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

4-1-4 Ejemplo: Control_de_Brillo


Por qu no usar un valor analgico, tras su conversin
a digital, como el parmetro de entrada para otras funciones?
Es lo que proponemos en este ejemplo. La tensin analgica
que se introduce a travs de un potencimetro, la vamos a
emplear para regular el ciclo til de una seal PWM con la que
controlaremos el brillo de un led (o una bombilla, o la velocidad
de giro de un motor, o la posicin de un servo, etc).

S0

Monta el circuito de la figura 7-12. El potencimetro de


1K se conecta con la patilla de entrada analgica A0. El led S0
cuyo brillo vamos a regular se conecta con la patilla D3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

+5Vcc

REG.

1K

ARDUINO NANO

Figura 7-12. Control de brillo

Como novedad en el ejemplo usamos la funcin map(). Se emplea para trasladar un nmero de un
rango a otro rango diferente de forma proporcional. En este programa el valor obtenido de la conversin, que
est en el rango comprendido entre 0 y 1023, se pasa a otro rango comprendido entre 0 y 255 con el que se
genera la seal PWM.
AN0=analogRead(A0);
AN0=map(AN0,0,1023,0,255);

//Realiza la conversin de A0
//Reasigna el resultado entre 0 y 255

4-1-5 Ejemplo: Generador_BF

LS7

SPEAKER

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

+5Vcc

REG.

1K

ARDUINO NANO

De forma similar, tambin podemos ajustar, por ejemplo, la


frecuencia de una seal. Monta el circuito de la figura 7-13. Se
trata de un generador de frecuencias que puede tener un buen
nmero de aplicaciones prcticas como la comprobacin de
amplificadores B.F. (Baja Frecuencia), equipos de audio,
ecualizadores, etc
A partir del valor analgico que proporciona el potencimetro de
1K conectado en la patilla A0, se genera una frecuencia audible
comprendida entre 100 y 5000 Hz (5 KHz).
Figura 7-13. El generador de BF

El programa es muy similar al


anterior. Una vez realiza la conversin
analgica, se obtiene un valor digital
comprendido entre 0 y 1023. Se le mapea a
un rango de 100 a 5000, que se corresponde
con el rango deseado de las frecuencias de
salida.
Tambin se verifica si la frecuencia
seleccionada ha variado en 50 Hz, en cuyo
caso se transmite va serie y se ajusta la
nueva frecuencia.
La figura 7-14 muestra la ltima
frecuencia ajustada (1095 Hz) y la medida
realizada por un osciloscopio conectado en
D12.

Figura 7-14. La frecuencia de salida

7-8

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

4-2 El sensor de luz


Se basa en un componente llamado fototransistor. Este dispositivo es capaz de
dejar pasar a su travs ms o menos intensidad en funcin de la luz visible que
incide sobre l. Es directamente proporcional. A ms luz ms intensidad y
viceversa. Los hay de diferentes modelos. Algunos, como ste, son capaces de
detectar la luz ambiente visible por el ojo humano. Otros detectan luz no visible
como la infra-roja. La fotografa de la figura 7-15 muestra el aspecto del sensor
modelo BPW40 que vamos a usar en los siguientes ejemplos. Consta de dos
electrodos: el Emisor (E) y el Colector (C), que es la patilla ms corta.
Figura 7-15. El sensor BPW40

La figura 7-16 nos proporciona el smbolo del fototransistor


BPW40 y su esquema de funcionamiento. Imagina que, mediante
una linterna, haces incidir ms o menos luz sobre el sensor. Con ello
varas la intensidad (I) que lo recorre desde el emisor (E) al colector
(C). Dicha intensidad al atravesar la resistencia (R), provoca una
tensin (V) que tambin vara de forma proporcional: V = R * I. En
resumidas cuentas, cuanta ms luz incida sobre el sensor, mayor es
la intensidad que lo recorre y mayor es tambin la tensin en la
salida V. Esta vara entre los 0 V (a oscuras) y los 5 V (luz mxima).
Figura 7-16. Funcionamiento del sensor BPW40
4-2-1 Ejemplo: Fotmetro
Es el ejemplo ms sencillo y realmente no aporta
cosas nuevas respecto a todo lo visto hasta ahora.
Monta el circuito del esquema de la figura 7-17.

Tx

Interface USB
Rx
con el PC
MEDIR
E10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

ARDUINO NANO

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

El colector C (patilla corta) del BPW40 se conecta con


+5Vcc y el emisor E con la patilla A0 del Arduino
NANO y con un extremo de la resistencia de 10 K.
El otro extremo de la resistencia se conecta con
GND.
E

10K

BPW40

Cada vez que se pulsa E10 conectado con la patilla


D2, se realiza una nueva medida.

+5Vcc

Figura 7-17. El fotmetro

El programa se limita a medir la tensin que genera el sensor BPW40 en funcin de la luz que incide
cobre l. Transmite va serie al terminal del entorno Arduino, el resultado de la conversin, la intensidad que
circula por el sensor y la resistencia, y la cada de tensin en sta.
Trabajo personal
Debes considerar a este ejemplo como un programa
experimental. Puedes realizar varias medidas de referencia en
diferentes condiciones de luz ambiente y tomar nota de ellas como en
la figura 7-18. Tambin puedes buscar una relacin entre esas medidas
y las proporcionadas por un instrumento comercial. A partir de ah t
tambin puedes disear tu propio instrumento que mida la luz en luxes
o en lmenes.
Figura 7-18. Muestras de medidas de luz

7-9

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

4-2-2 Ejemplo: Control_Alumbrado

S0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

Aqu tienes un ejemplo con una buena utilidad prctica. Se


trata de controlar un sistema de alumbrado de forma que,
cuando la luz ambiente baje por debajo de un valor mnimo
(p.e. se hace de noche), se active una salida que simula la
activacin de una bombilla, farola, etc

+5Vcc

Monta el circuito de la figura 7-19. El led S0 se conecta con


la patilla D3 de salida. Simula la activacin o no del sistema
de alumbrado.

E
10K

ARDUINO NANO

BPW40

+5Vcc

Figura 7-19. Control de alumbrado

El ejemplo muestra cmo filtrar una seal analgica que, como en este caso, nos suministra el sensor
de luz. Basta con tomar un nmero determinado de muestras haciendo las conversiones analgico/digitales
que sean necesarias. Luego se calcula la media aritmtica con todas ellas.
Para realizar esta tarea se ha creado una funcin llamada Medir_luz(). Devuelve un valor entero con el
valor medio de las 10 conversiones que se realizan con un intervalo de 2 mS entre muestra y muestra.
Se comprueba si el valor medio obtenido es menor que el valor mnimo establecido, en cuyo caso se
activa la salida D3 simulando el alumbrado.
Trabajo personal
Consideremos el control de alumbrado anterior. Es de noche y las farolas estn activadas. Qu pasa
si en una noche de tormenta se produce un rayo o un relmpago cuya luz incide sobre el sensor? Seguramente
las farolas se apagan ya que, en ese instante, el sistema piensa que es de da. Luego se volvern a encender.
Esto es real y puede ocurrir, pero es deseable? Encuentra una solucin para corregir este tipo de casos.
4-2-3 Ejemplo: Regulacin _de_Luz
Estamos seguros de que se te van a ocurrir gran cantidad de aplicaciones basadas en la deteccin y
tratamiento de la luz ambiente. Por ello te vamos a proponer un ltimo ejemplo que, como todos los dems, es
susceptible de ser mejorado. Se trata de un sistema automtico para regular el alumbrado de, por ejemplo, un
recinto.
Imagina una habitacin con una bombilla de alumbrado y un sensor de luz colocado estratgicamente
en el exterior. Segn la luz que reciba, la bombilla brillar ms o menos. Cuando es un da claro y luminoso la
bombilla permanece apagada o con muy poca intensidad. Si por el contrario es un da nublado, o es de noche,
la bombilla brillar con mucha intensidad.
Te sirve el mismo esquema que el de la figura 7-19 anterior. El programa es muy sencillo y como tal no
aporta nada nuevo salvo la idea propia de la aplicacin. Se realiza una conversin analgica/digital y se toma
una muestra de la luz ambiente actual. Para ello empleamos la funcin Medir_luz() desarrollada en el ejemplo
anterior.
El valor obtenido estar comprendido entre 0 y 1023 y se mapea en otro valor comprendido entre 255 y
0 mediante:
Luz=Medir_luz();
Luz=map(Luz,0,1023,255,0);

//Mide la luz ambiente


//Redondear a un valor entre 255 y 0

Observa que si la luz medida es de 0 (oscuridad total), tras el mapeado tenemos el valor 255. Si se
recibe la luz mxima, el valor de la conversin es de 1023 tras el mapeado tendremos el valor 0. Es decir, con
poca luz tenemos un valor alto y viceversa.

7 - 10

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

Este valor mapeado es el que vamos a usar para generar una seal PWM por la patilla D3, y que
controlar el brillo del led S0 (o la bombilla). Cuanto menor sea la luz ambiente (de noche), mayor es la
duracin del ciclo til. El led se ilumina con ms intensidad. Si la luz ambiente es mayor (de da), menor es la
duracin del ciclo til. El led se ilumina con menos intensidad.

4-3 El sensor de temperatura


En la fotografa de la figura 7-20 se muestra el sensor LM35DZ junto
con la distribucin de sus patillas. Se trata de un sensor analgico de
temperatura.

Figura 7-20. El sensor LM35

La figura 7-21 muestra su esquema de conexiones. Tiene tres patillas. Dos de ellas
se conectan con la alimentacin, +5V y GND. Por la tercera patilla circula una
intensidad (I) proporcional a la temperatura. Esta intensidad atraviesa la resistencia
(R) creando en ella una tensin (Vout) que la aplicaremos a la entrada del
convertidor analgico digital, desde donde la podremos leer y procesar.
As pues tenemos una tensin directamente proporcional a la temperatura del
sensor. Segn su fabricante, su resolucin es de:

10 mv / C
Figura 7-21. Conexiones del sensor de temperatura

Para calcular la temperatura ambiente en grados centgrados (C), a partir del resultado de la tensin
Vout que suministra el sensor, podemos aplicar la siguiente ecuacin:

4-3-1 Ejemplo: Temperatura

+5Vcc
Tx

La salida Vout del sensor de temperatura se


conecta con la patilla de entrada analgica A0.
El resultado se transmite va serie al terminal
del entorno de programacin de Arduino.

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

t
GND

E10

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

Vdd

MEDIR

LM35DZ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Siguiendo la lnea de ejemplos anteriores, se


trata de medir la temperatura que capta el sensor
LM35 cada vez que se acciona el pulsador E10
conectado con la patilla D2. Ver el esquema de la
figura 7-22.

Interface USB
Rx
con el PC

Vout

100K

ARDUINO NANO

Figura 7-22. Sensor de temperatura

7 - 11

ARDUINO: La tecnologa al alcance de todos


TEMA 7: Las seales analgicas
www.microcontroladores.com

La figura 7-23 muestra una ventana con diferentes capturas de las


temperaturas medidas. En primer lugar se transmite el valor capturado por
el convertidor analgico digital AN0, procedente del sensor. Luego se
transmite la tensin equivalente V (AN0 * 0.00488) seguido de la intensidad I
en A (V / 100000 * 1000000 = V * 10). Por ltimo se transmite la
temperatura T en C (V / 10mV.
Figura 7-23. Midiendo temperaturas

4-3-2 Ejemplo: Climatizador


Acabamos el tema con otro ejemplo de una importante utilidad prctica. Vamos a simular un sencillo
sistema de climatizacin. Monta el circuito de la figura 7-24.

S0
CALEFACTOR

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

t
GND

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

Vout

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

S7
REFRIGERADOR

LM35DZ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Vdd

Interface USB
Rx
con el PC

El ejemplo toma la temperatura actual


mediante el sensor analgico conectado con A0. Si
sobrepasa unos lmites mximos y mnimos se activa
el sistema correspondiente. En cualquier caso, la
temperatura actual, que se toma cada dos segundos,
se transmite va serie al terminal del entorno Arduino.

+5Vcc
Tx

El led S7 simula la activacin o no de un


sistema de refrigeracin, mientras que el led S0
simula a un sistema de calefaccin. Ambos se
conectan con las patillas D2 y D3 respectivamente.

100K

ARDUINO NANO

Figura 7-24. Sistema de climatizacin

7 - 12

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

TEMA 8: LA pantalla LCD


1.- INTRODUCCIN
Vamos a acabar este mdulo de prcticas presentando una serie de ejemplos adicionales que,
esperamos, puedan tener una valiosa utilidad prctica, te sirvan definitivamente para asentar todo lo aprendido
hasta el momento y te proporcionen una visin de las mltiples aplicaciones que puedes realizar con un
controlador como nuestro Arduino NANO.
Queremos hacer una mencin especial a la pantalla LCD que vamos a emplear. Sobre ella vamos a
poder visualizar todo tipo de informacin. En realidad, todos aquellos ejemplos que hemos realizado, y cuyos
resultados se trasmitan va serie al PC, podemos visualizarlos ahora sobre la pantalla LCD. Esto nos permitir
realizar aplicaciones totalmente autnomas e independientes.

2.- LA PANTALLA LCD


Se trata de uno de los perifricos ms potentes y verstiles. Es capaz de visualizar todo tipo de
mensajes compuestos de texto, nmeros y smbolos, y producir adems diferentes efectos de visualizacin
como desplazamientos a izquierda y derecha, parpadeos, scrolls, etc Una pantalla LCD tiene su propio
controlador que la gestiona.
La figura 8-1 muestra la pantalla LCD que vamos a utilizar y que se incluye
en el mdulo. Se trata de una pantalla compuesta de 2 filas y 16 caracteres
por fila (2x16). Las hay con diferentes configuraciones: 1 x 16, 4 x 20, 2 x
20, 2 x 40, etc En la figura tambin se aprecia cmo hemos soldado una
tira de 14 pines macho, que nos permitar insertar la pantalla sobre el
mdulo board del entrenador Universal Trainer. De esta forma podremos
hacer rpidamente las conexiones con el controlador. Observa la posicin
en que se encuentra la patilla nmero 1.

Figura 8-2. Conexiones de una pantalla LCD


NOMBRE
GND
VCC
VLC

N
1
2
3

RS

R/W

D0:D7

7 14

7
8
9
10
11
12
13
14
D0
D1
D2
D3
D4
D5
D6
D7

4
5
6
RS
R/W
E

La figura 8-2 muestra el conexionado tpico de estas pantallas.


Normalmente disponen de 14 patillas que se describen en la siguiente tabla.
Tambin las hay de 16 patillas. En este caso las dos ltimas, la 15 y la 16,
permiten controlar una luz de fondo.

GND
VCC
VLC

1
2
3

Figura 8-1. La pantalla LCD de 2 x 16

LCD2x16

DESCRIPCION
Conexin con GND de alimentacin
Conexin con +5 V de alimentacin
Tensin variable de entrada de entre 0 y 5 V para ajustar el contraste de la
pantalla.
Entrada de control. A nivel 1 la pantalla recibe los cdigos ASCII de los
caracteres a visualizar. A nivel 0 recibe cdigos de control.
Entrada de lectura / escritura. A nivel 1 podemos leer el estado interno de la
pantalla. A nivel 0 podemos escribir los distintos caracteres a visualizar o los
distintos cdigos de control.
A nivel 1 la pantalla queda habilitada para recibir caracteres y/o cdigos de
control. A nivel 0 queda desconectada.
Son las lneas de datos por donde la pantalla recibe los caracteres y/o cdigos
de control. Se conectan con las salidas de nuestro controlador. El interface
puede ser de 8 bits (se emplean a D0:D7) o de 4 bits (se emplean a D4:D7)

8-1

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

7
8
9
10
11
12
13
14
D0
D1
D2
D3
D4
D5
D6
D7

4
5
6
RS
R/W
E

GND
VCC
VLC

1
2
3

4K7

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

La figura 8-3 muestra las conexiones que


vamos a realizar entre la pantalla LCD y
el controlador Arduino NANO.
Se realiza un interface de 4 bits. Las
patillas D4:D7 del Arduino se conectan
con las patillas D4:D7 de la pantalla.
Las patillas D2 y D3 controla las seales
RS y E. La seal R/W se manda
directamente a GND (modo escritura).

ARDUINO NANO

Con la resistencia de 4K7 conectada


entre VLC y GND se consigue un buen
contraste. Su valor se puede variar para
aumentarlo o disminuirlo.

LCD2x16

Figura 8-3. Conexin de Arduino con la pantalla LCD


La fotografa de la figura 8-4 muestra el montaje final sobre el entrenador Universal Trainer.

Figura 8-4. Montaje de la pantalla LCD

3.- FUNCIONES PARA EL CONTROL DE UN LCD


Ya estamos familiarizados con el concepto de librera y el manejo de las mltiples funciones que
contiene. Acurdate de la librera Servo.h que usamos en su momento para el control de servomotores.
De las muchas libreras creadas por el equipo de Arduino, vamos a hablar ahora de la librera
LiquidCrystal.h. Contiene un buen nmero de funciones dedicadas al control y manejo de pantallas LCD
basadas en el controlador Hitachi HD44780 o compatible.

8-2

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

De todas esas funciones, vamos a estudiar las ms representativas e importantes. En cualquier caso,
te invitamos a que visites el sitio www.arduino.cc donde encontrars abundante informacin y ejemplos con
todas ellas.
3-1 Funcin: LiquidCrystal()
Crea una variable tipo LiquidCrystal y establece las conexiones entre la pantalla y el controlador
Arduino. El interface entre ambos puede ser de 8 o de 4 bits, en cuyo caso las lneas D0-D3 no se emplean.
Igualmente podemos determinar si se emplea o no la seal R/W de la pantalla. En caso de no usarse, dicha
seal debe conectarse con GND.
Sintaxis:
LiquidCrystal var(RS,E,D4,D5,D6,D7);
LiquidCrystal var(RS,RW,E,D4,D5,D6,D7);
LiquidCrystal var(RS,E,D0,D1,D2,D3,D4,D5,D6,D7);
LiquidCrystal var(RS,RW,E,D0,D1,D2,D3,D4,D5,D6,D7);
var:
RS:
RW:
E:
D0-D7:

//Para interface de 4 bits sin seal R/W


//Para interface de 4 bits con seal R/W
//Interface de 8 bits sin seal R/W
//Interface de 8 bits con seal R/W

Nombre de una variable que se asigna a la pantalla LCD que vamos a controlar.
Patilla del Arduino que se conecta con la seal RS de la pantalla.
Patilla del Arduino que se conecta con la seal R/W de la pantalla (si es que se va a usar).
Patilla del Arduino que se conecta con la seal E de la pantalla.
Patillas de Arduino que se conectan con las lneas de datos D0-D7 de la pantalla. Si no se indican las
patillas para D0-D3, se supone un interface de 4 bits y nicamente se emplean las seales D4-D7.

Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);

//Establece la conexin de una pantalla llamada lcd. Las patillas D2 a D7 del


//Arduino se conectan con las seales RS,E,D4,D5,D6 y D7 de la pantalla. La
//seal R/W se debe conectar con GND

3-2 Funcin: begin()


Inicia la pantalla LCD y le asigna el nmero de filas y el nmero de caracteres por fila segn el modelo
de que se trate. En nuestro caso usamos una pantalla de 16 x 2 caracteres.
Sintaxis:
var.begin(c,f);
var:
c:
f:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).


Nmero de columnas.
Nmero de filas.

Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.begin(16,2);

//La pantalla lcd es de 16 x 2

3-3 Funcin setCursor()


Coloca el cursor de la pantalla LCD en la posicin deseada. A partir de ella se irn visualizando los
posteriores caracteres.
Sintaxis:
var.setCursor(c,f);

8-3

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

var:
c:
f:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).


Nmero de columna (contando desde 0).
Nmero de fila (contando desde 0).

Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.setCursor(3,0);

//Coloca el cursor en la posicin 3 (4 carcter) de la fila 0 (la 1)

3-4 Funcin: home()


Coloca el cursor en la primera posicin de la pantalla, el ngulo superior izquierdo (posicin 0 de la fila
0). No se borra el contenido de la misma.
Sintaxis:
var.home();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-5 Funcin: clear()


Borra la pantalla LCD y coloca el cursor en el ngulo superior izquierdo (posicin 0 de la fila 0).
Sintaxis:
var.clear();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.clear();

//Borra la pantalla

3-6 Funcin: write()


Escribe un carcter en la posicin actual del cursor.
Sintaxis:
var.write(char);
var:
char:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).


El carcter a visualizar

Ejemplo:
lcd.write(A);

//Escribe A

3-7 Funcin: print()


Imprime sobre el LCD a partir de la posicin actual del cursor.
Sintaxis:
var.print(dato);
var.print(dato,base);

8-4

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

var:
dato:
base:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).


Dato a imprimir. Puede ser char, int, long, float o string.
Es opcional y expresa la base de numeracin deseada: BIN=Binario; DEC=Decimal (por defecto);
OCT=Octal; HEX=Hexadecimal; o N=n de decimales en el caso de los float (por defecto 2).

Ejemplos:
int A=19;
float PI=3.1416;
lcd.print(A,HEX);
lcd.print(Hola);
lcd.print(PI*2,4);

//Imprime A en hexadecimal (1910 = 1316)


//Imprime Hola
//Imprime 6.2832

3-8 Funcin: cursor()


Visualiza el cursor representndolo en la pantalla LCD en forma de un guin bajo ( _ ) en su posicin
actual, donde se escribir el siguiente carcter.
Sintaxis:
var.cursor();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-9 Funcin: noCursor()


Oculta la visualizacin del cursor de la pantalla LCD.
Sintaxis:
var.noCursor();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-10 Funcin: blink()


Visualiza el cursor representndolo en la pantalla como un smbolo slido ( ) intermitente en su
posicin actual, donde se escribir el siguiente carcter.
Sintaxis:
var.blink();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-11 Funcin: noBlink()


Oculta la visualizacin del cursor slido ( ) intermitente.
Sintaxis:
var.noBlink();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-12 Funcin noDisplay()


Apaga la pantalla LCD sin perder ni el texto que hubiera ni la posicin actual del cursor.

8-5

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

Sintaxis:
var.noDisplay();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-13 Funcin: display()


Conecta el LCD restaurando el texto que hubiera antes de ejecutar noDisplay().
Sintaxis:
var.display();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-14 Funcin scrollDisplayLeft()


Desplaza el contenido que visualiza la pantalla (texto y posicin del cursor) una posicin a la izquierda.
Sintaxis:
var.scrollDisplayLeft();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-15 Funcin scrollDisplayRight()


Desplaza el contenido que visualiza la pantalla (texto y posicin del cursor) una posicin a la derecha.
Sintaxis:
var.scrollDisplayRight();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-16 Funcin: leftToRight()


Establece la direccin de escritura de izquierda a derecha sobre la pantalla (por defecto). Esto implica
que los caracteres se van escribiendo de izquierda a derecha sin afectar a los que ya estn escritos.
Sintaxis:
var.LeftToRight();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-17 Funcin: rightToLeft()


Establece la direccin de escritura de derecha a izquierda sobre la pantalla. Esto implica que los
caracteres se van escribiendo de derecha a izquierda sin afectar a los que ya estn escritos.
Sintaxis:
var.RightToLeft();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

8-6

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

3-18 Funcin autoscroll()


Activa el scroll o desplazamiento automtico de la visualizacin. Cada carcter enviado a la pantalla se
visualiza y a continuacin se desplaza una posicin a los caracteres que ya hubiera en ella. Si la direccin
actual es de izquierda a derecha (leftToRight()), la visualizacin se desplaza hacia la izquierda. Si la direccin
actual es de derecha a izquierda (rifghtToLeft()), la visualizacin se desplaza hacia la derecha.
Sintaxis:
var.autoscroll();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-19 Funcin noAutoscroll()


Desactiva el scroll o desplazamiento automtico de la visualizacin.
Sintaxis:
var.noAutoscroll();
var:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).

3-20 Funcin: createChar()


Crea un carcter personalizado por el usuario. Se pueden crear un total de 8 caracteres de 5 x 8 pixels
y numerados del 0 al 7. La apariencia o diseo de un carcter se determina en una matriz de 8 bytes, uno por
cada fila. Los 5 bits de menos peso de cada byte se corresponden con los 5 pixels que forman cada fila del
carcter. Una vez creado un carcter, se puede visualizar en la pantalla indicando simplemente su nmero.
Sintaxis:
var.createChar(n,dato);
var:
n:
dato:

Es el nombre que define a la pantalla en cuestin (establecido en LyquidCrystal()).


Expresa el nmero del carcter en cuestin (del 0 al 7).
Es el nombre de la matriz que contiene los bytes que definen el carcter personalizado.

Ejemplo:
byte flecha[8] ={
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
B00100 };

//Crea la matriz flecha con 8 bytes que definen el nuevo carcter personalizado

lcd.createChar(0,flecha);
.
lcd.write(byte(0));

//Crea el nuevo carcter n 0 con el contenido definido en flecha


//Visualiza el carcter personalizado n 0 (la flecha)

8-7

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

4.- EJEMPLOS DE CONTROL DE UNA PANTALLA LCD


En este apartado vamos a presentar una serie de ejemplos que utilizan las funciones anteriores, con
objeto de controlar la pantalla LCD y realizar diferentes efectos de visualizacin. La mayor parte de ellos se han
realizado a partir de los ejemplos incluidos en Arduino, no sin antes modificarlos y adaptarlos a nuestras
condiciones.
Para probarlos, y salvo que se indique otra cosa, vamos a emplear el esquema de conexiones que se
mostr en la figura 8-3.
4-1 Ejemplo: HolaMundo

Es el ms sencillo. Se realizan las tareas ms bsicas


como incluir la librera LiquidCrystal.h y definir,
mediante LiquidCrystal(), las conexiones entre el
Arduino y la pantalla LCD que, en nuestro caso, se
corresponden con el esquema de la figura 8-3. Por
ltimo, mediante la funcin begin(), se inicia la pantalla
LCD indicando el nmero de caracteres y de filas de
que consta (16 x 2).
El resultado de la ejecucin de este programa se
aprecia en la fotografa de la figura 8-5. Bsicamente se
limita a emplear la funcin print() para escribir cualquier
texto y setCursor() para posicionar el cursor de la
pantalla a partir de la posicin que se desea escribir.
Figura 8-5. Ejemplo Hola, mundo!
4-2 Ejemplo: Display
Emplea las funciones display() y noDisplay() para habilitar o no la pantalla LCD. Cuando se
deshabilita la pantalla se apaga, pero su informacin se mantiene. De esta forma, cuando se vuelve a habilitar
la pantalla visualiza exactamente lo mismo que tena.
4-3 Ejemplo: Cursor
Las funciones cursor() y noCursor() permite activar o no la visualizacin del cursor. El cursor se
presenta como el smbolo de un guin bajo ( _ ) y en todo momento indica la posicin donde se visualizar el
siguiente carcter que escribamos en la pantalla.
4-4 Ejemplo: Blink
El cursor tambin se puede representar como un smbolo slido ( ) intermitente, que indica la
posicin donde se visualizar el siguiente carcter que escribamos en la pantalla. Para ello podemos emplear
las funciones blink() y noBlink().
4-5 Ejemplo: DireccionTexto
Mediante las funciones leftToRight() y rightToLeft() podemos establecer si el texto se visualiza de
izquierda a derecha segn lo vamos escribiendo, o bien de derecha a izquierda. Por defecto la pantalla, al igual
de cmo lo hacemos nosotros, visualiza el texto de izquierda a derecha.
El ejemplo escribe un mismo texto Microsystems en las dos lneas que dispone la pantalla LCD. En la
lnea superior se escribe de izquierda a derecha, lo normal. En la lnea inferior se escribe de derecha a
izquierda.

8-8

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com

4-6 Ejemplo: Scroll


Cada vez que se ejecutan las sentencias scrollDisplayLeft() o scrollDisplayRight(), el contenido
actualmente visualizado en la pantalla se desplaza una posicin a la izquierda o a la derecha respectivamente.
El programa del ejemplo ofrece unos bonitos efectos de presentacin. Visualiza dos textos en ambas lneas de
la pantalla LCD, luego los desplaza a la izquierda, a la derecha y de nuevo a la izquierda. Finaliza haciendo
una secuencia de intermitencia.
4-7 Ejemplo: Autoscroll
Mediante las funciones autoscroll() y noAutoscroll() se habilita o no el desplazamiento automtico.
Este consiste en desplazar la visualizacin una posicin cada vez que se escribe un nuevo carcter en la
pantalla. El desplazamiento puede ser hacia la izquierda o hacia la derecha. Si la direccin del texto est
ajustada de izquierda a derecha mediante la funcin leftToRight() (por defecto), se produce un desplazamiento
a la izquierda. Si la direccin del texto est ajustada de derecha a izquierda mediante la funcin rightToLeft(),
se produce un desplazamiento automtico a la derecha.
El ejemplo visualiza dos textos, uno en cada lnea de la pantalla. En la lnea superior se visualiza sin
desplazamiento, en la lnea inferior se visualiza con un desplazamiento automtico hacia la izquierda (por
defecto).
4-8 Ejemplo: CaracteresPersonalizados
La mayor parte de las pantallas LCD compatibles con el controlador Hitachi HD44780 permiten disear
o personalizar hasta un mximo de 8 caracteres numerados del 0 al 7. De esta forma podemos construir
smbolos grficos o incluso caracteres de un determinado idioma que no estn definidos en la propia pantalla.
Cada carcter se construye en torno a una matriz de 5x8 pixels o puntos, por lo que se necesitan los 5
bits de menos peso de 8 bytes consecutivos. En la figura 8-6 tenemos el diseo de dos caracteres: una sonrisa
y un corazn. Cada uno de ellos precisa de 8 bytes que se codifican segn se muestra. Un bit a nivel 1
implica que su correspondiente pixel se activa.

Figura 8-6. Diseo de caracteres personalizados


El programa crea cinco matrices o arrays de 8 bytes cada una, donde se definen otros tantos
caracteres personalizados: corazon, alegre, serio, abajo y arriba. Mediante la funcin createChat() se
numeran (del 0 al 4) y se almacenan en la memoria interna de la pantalla.
Por ltimo, para visualizarlos en la posicin actual del cursor, basta con emplear la funcin write(n),
donde n expresa el nmero de carcter (del 0 al 4 en el ejemplo) que se desea visualizar.
4-9 Ejemplo: SerialDisplay
Aqu tienes un ejemplo de indudable inters prctico. Se trata de crear un nexo de unin entre el canal
serie de, por ejemplo, un ordenador tipo PC, y nuestra pantalla LCD. En medio se encuentra nuestro
controlador Arduino NANO. Monta el circuito de la figura 8-7.

8-9

ARDUINO: La tecnologa al alcance de todos


TEMA 8: La pantalla LCD
www.microcontroladores.com
Tx

Interface USB
Rx
con el PC

7
8
9
10
11
12
13
14
D0
D1
D2
D3
D4
D5
D6
D7

4
5
6
RS
R/W
E

GND
VCC
VLC

1
2
3

4K7

+5Vcc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

D1
D0
RESET
GND
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12

VIN
GND
RESET
+5V
A7
A6
A5
A4
A3
A2
A1
A0
AREF
3V3
D13

ARDUINO NANO

LCD2x16

30
29
28
27
26
25
24
23
22
21
20
19
18
17
16

+5Vcc

El Arduino hace de puente. Por un lado se


conecta, mediante el interface USB con
un PC. Por otro lado se conecta con la
pantalla LCD como lo hemos venido
haciendo hasta ahora.
Desde el PC vamos a transmitir una serie
de mensajes que sern recibidos por el
Arduino. Este a su vez los trasmitir a la
pantalla LCD.

Figura 8-7. Comunicacin PC / LCD

En el PC podemos emplear cualquier programa de comunicaciones como el Hyperterminal, o bien el


propio monitor serie que integra el entorno de trabajo de Arduino. Es el que hemos usado nosotros. La figura 88 muestra el resultado de la ejecucin. Desde el PC transmitimos el mensaje Hola, que tal ? que se visualiza
en la pantalla LCD.

Figura 8-8. Ejemplo de comunicacin


5.- TRABAJO PERSONAL
Llegamos al final del presente mdulo de prcticas. Como trabajo personal te proponemos que
modifiques aquellos ejemplos en los que se usaba la comunicacin serie para recibir los distintos resultados
que se obtenan en la ejecucin.
Ahora ya sabes manejar una pantalla LCD. Se trata de un perifrico de salida muy potente y verstil
capaz de visualizar cualquier cosa. No te hace falta un ordenador tipo PC que reciba los resultados que se
obtienen en las diferentes aplicaciones. Ahora puedes emplear la pantalla para visualizarlos. Con ello
conseguirs aplicaciones mucho ms autnomas, porttiles y econmicas.

8 - 10

You might also like