Beruflich Dokumente
Kultur Dokumente
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
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
i-1
i-2
i-3
i-4
i-5
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.
i-6
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.
i-7
i-8
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
tcnica disponible sobre las mismas. Vamos a echar un vistazo a las ms representativas y a sus
caractersticas ms relevantes.
1-2
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
1-3
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 !!
1-4
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.
1-5
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.
1-6
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
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
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
1-7
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
1-8
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.
1-9
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
1 - 10
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.
1 - 11
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.
1 - 12
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.
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
2-2
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
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
Ejemplos;
V=digitalRead(6);
V=digitalRead(3);
Ejemplos
digitalWrite(6,HIGH);
digitalWrite(13,LOW);
digitalWrite(6,digitalRead(3));
2-4
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARDUINO NANO
S0
E0
2-5
2-6
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
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
=
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
+5Vcc
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
E2
E1
2 - 10
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:
2 - 11
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:
2 - 12
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
=(
//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
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
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARDUINO NANO
E3
S3
S2
S0
S1
E2
E1
E0
//D3:D0 salidas
//D11:D8 entradas
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
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
E2
E1
S7
S6
S5
S4
S3
S2
S0
S1
E0
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
2 - 18
ARDUINO NANO
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
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
+5Vcc
1.- INTRODUCCIN
S0
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
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);
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);
void setup()
{
pinMode( 2 , OUTPUT); //D2 Salida
}
void loop()
{
digitalWrite(2,HIGH);
delay(Tiempo);
digitalWrite(2,LOW);
delay(Tiempo);
}
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
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
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
S3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARDUINO NANO
3-3
4-3 Semforo V1
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
E10
RESET
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
+5Vcc
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:
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
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
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.
3-6
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
Valores[4] = 12345
En la variable 4 del array Valores se introduce el nmero 12345
char Letra=Texto[2]
Extrae la variable 2 del array Texto (letra D) y la almacena sobre la variable Letra
3-7
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
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.
= .
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;
3-9
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);
}
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
20 Hz
200 Hz
1 KHz
4 KHz
10 KHz
15 KHz
18 KHz
20 KHz
3 - 10
Ejemplos:
tone(12,1000,1000);
tone(3, A + 100,300);
tone(6,2500);
Indica la patilla por donde se est generando la seal audible que se desea detener.
Ejemplo:
tone(6,2500);
noTone(6);
3 - 11
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
+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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARDUINO NANO
E10
RESET
3 - 12
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
3 - 13
3 - 14
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
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
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
E10
TIMBRE
void loop()
{
if(digitalRead(2)==0)
{
tone(12,400);
delay(300);
tone(12,300,300);
}
}
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().
4-3
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;
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
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.
4-4
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
ROJO2 S0
AMBAR2 S1
E10
PASAR
VERDE2 S2
Es una expresin que permite cargar una variable con un valor inicial. Solo se ejecuta una vez,
al principio del bucle.
condicin:
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
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++)
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
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
+5Vcc
S0
4-6
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.
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);
}
}
}
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
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.
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
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
4-9
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:
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
4 - 10
//Lee el valor de E1 y E0
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
4 - 11
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
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
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
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
4 - 14
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
4 - 15
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:
Ejemplo:
A = random (1,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);
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.
} 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
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).
Es el valor que devuelve la funcin en su retorno. Es opcional y puede ser una variable o una
constante.
goto prueba;
4 - 17
4 - 18
5-1
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);
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
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
+5Vcc
ARDUINO NANO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
S0
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);
}
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);
}
5-3
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARDUINO NANO
S3
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
ARDUINO NANO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
5-4
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.
5-5
+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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PWM
1
GND
Vdd
ARDUINO NANO
3
2
+5Vcc
5-6
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
Ejemplo:
#include <Servo.h>
Servo Mi_Servo;
Mi_Servo.attach(3);
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);
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);
5-8
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();
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()
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()
5-9
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
5 - 10
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
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
Servo
900-00008
+5Vcc
DISMINUY E
E11
AUMENTA
+5Vcc
E10
5 - 11
5 - 12
6-1
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:
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
6-2
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.
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);
}
6-3
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:
Ejemplos:
int A = 78;
Serial.print(A,BYTE);
Serial.print(A,DEC);
Serial.print(A,HEX);
Serial.print(A,BIN);
Serial.print(A,OCT);
float PI = 3.141592;
Serial.print(PI,0);
Serial.print(PI,2);
Serial.print(PI,5);
6-4
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
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
Tx
Interface USB
Rx
con el PC
E10
//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
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.
6-6
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
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
6-7
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.
6-8
Sintaxis:
Serial.parseint();
Ejemplo:
int N;
N=Serial.parseint();
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
ARDUINO NANO
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
Tx
S0
S1
S2
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;
6-9
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);
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
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
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
Tx
Interface USB
Rx
con el PC
S0
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
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
Servo
900-00008
+5Vcc
Interface USB
Rx
con el PC
Vdd
GND
2
3
Tx
PWM
ARDUINO NANO
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
+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 - 12
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:
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:
6 - 13
6 - 14
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
+5Vcc
Tx
Interface USB
Rx
con el PC
S0
6 - 15
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
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.
6 - 16
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
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.
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
4K7
E10
E10
470
100n
6 - 18
Es un nmero entero largo (long) que expresa, en milisegundos, el tiempo de espera. Por
defecto es de 1000 mS (1 segundo).
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
6 - 20
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
7-1
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.
7-2
= .
= .
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
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.
Ejemplo:
analogReference(INTERNAL);
En este ejemplo, teniendo en cuenta que el convertidor es de 10 bits, la resolucin por bit es de:
= .
= .
7-4
pin:
Ejemplo:
int V;
V=analogRead(A3);
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);
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:
)(
)+
7-5
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.
ARDUINO NANO
Tx
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
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
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
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
7-7
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
+5Vcc
+5Vcc
REG.
1K
ARDUINO NANO
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
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
7-8
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
10K
BPW40
+5Vcc
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
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
+5Vcc
E
10K
ARDUINO NANO
BPW40
+5Vcc
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);
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
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.
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:
+5Vcc
Tx
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
Interface USB
Rx
con el PC
Vout
100K
ARDUINO NANO
7 - 11
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
+5Vcc
Tx
100K
ARDUINO NANO
7 - 12
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
GND
VCC
VLC
1
2
3
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
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
ARDUINO NANO
LCD2x16
8-2
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:
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);
Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.begin(16,2);
8-3
var:
c:
f:
Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.setCursor(3,0);
Ejemplo:
LiquidCrystal lcd(2,3,4,5,6,7);
lcd.clear();
//Borra la pantalla
Ejemplo:
lcd.write(A);
//Escribe A
8-4
var:
dato:
base:
Ejemplos:
int A=19;
float PI=3.1416;
lcd.print(A,HEX);
lcd.print(Hola);
lcd.print(PI*2,4);
8-5
Sintaxis:
var.noDisplay();
var:
8-6
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));
8-7
8-8
8-9
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
8 - 10