Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción a Arduino
1.- ¿Qué es Arduino?
Dicho de otra manera, Arduino es una tarjeta electrónica que integra básicamente a
un microcontrolador y un conjunto de pines de conexión de entradas y salidas que
permiten, mediante un determinado programa, interaccionar con el medio físico
mediante sensores y actuadores electrónicos. Los proyectos creados con Arduino
pueden ser autónomos o comunicarse con un programa que se ejecute en un ordenador.
Desde octubre de 2012, algunos modelos de Arduino (los más potentes) usan
microcontroladores CortexM3 ARM de 32 bits. Estos microcontroladores no son
compatibles a nivel binario con los AVR, pero se pueden programar con el mismo IDE
de Arduino y por tanto con el mismo lenguaje de programación. Eso sí, los
microcontroladores CortexM3 usan 3,3V, a diferencia de la mayoría de las placas con
AVR que generalmente usan 5V.
A la hora de analizar los modelos que existen de Arduino en la actualidad, hay que
diferenciar entre dos tipos de productos bien distintos: las placas de Arduino y los
shields de Arduino. Las primeras son las placas electrónicas que contienen el
microcontrolador junto con una serie de conectores en los pines de entrada/salida. Estas
placas se diferencian principalmente por el tipo de microcontrolador que incorporan, y
por tanto por el número de entradas y salidas que disponen. Por otro lado, las “shields”
o escudos de Arduino son placas que se conectan a una placa de Arduino y le
otorgan una determinada funcionalidad. Por ejemplo, hay una shield que permite que
Arduino pueda conectarse a Internet, otra que le otorga funcionalidad GSM, etc.
Permite conectar una placa Arduino a Permite conectar una placa Arduino a
internet a través de un conector RJ45 Internet de forma inalámbrica por wifi
Compatible con Arduino UNO y Mega Compatible con UNO, Mega y DUE.
Board shield
GPS shield
3
Permite incorporar una placa de prototipos a Receptor GPS y GALILEO capaz de
Arduino para realizar montajes propios. comunicarse con Arduino por UART, USB o
Compatible con UNO, Mega y DUE I2C
De todos los modelos de Arduino que existen actualmente, nos centraremos en la placa
Arduino UNO, en concreto en su revisión 3, que es la última versión que ha salido. El
motivo para elegir esta placa es que se trata del modelo más sencillo, pero a la vez es
suficientemente potente como para hacer proyectos de envergadura con ella. Además,
prácticamente todas los shields y sensores son compatibles con ella, por lo que resulta
ideal como primera toma de contacto con el mundo de los microcontroladores.
En concreto existen dos modelos diferentes de Arduino UNO: uno de ellos lleva el
microcontrolador en formato PDIP (inserción) y el otro lo lleva en formato SMD
(superficial), como se observa en las siguientes imágenes:
Nosotros nos decantaremos por la primera opción por dos motivos: en primer lugar,
porque si el microcontrolador se estropea se puede sustituir por otro fácilmente. En
segundo lugar, porque esta placa nos permite programar el microcontrolador sobre la
propia placa y después extraerlo y emplearlo en otros montajes independientes.
4
Alimentación de la placa:
Para alimentar la placa de Arduino UNO tenemos dos opciones: a través de un cable
USB conectado a un ordenador o a través de una fuente de alimentación externa.
5
1.- Conector de alimentación: se trata de un
conector plug hembra de 2.1mm, para conectar una
fuente de alimentación externa. Se recomienda que la
tensión de dicha fuente esté comprendida entre los
7V y los 12V. En ningún caso debe superar los 20V,
puesto que podría destruir los componentes
electrónicos de la placa, ni ser inferior a 6V.
2.- VIN: en este pin tendremos la tensión de alimentación que le está entrando a la
placa, es decir, la misma tensión que proporciona la fuente externa que conectemos
a la placa.
4.- 5V: en este pin tenemos una tensión continua de 5V, que proviene del regulador de
tensión incorporado en la propia placa. Podemos utilizar esta tensión para alimentar un
pequeño circuito en una protoboard conectada a Arduino.
5.- 3.3V: en este pin tenemos una tensión continua de 3.3V, generada por un chip
integrado en la placa, que proporciona una corriente máxima de 50mA.
Entradas analógicas:
7.- Pines NO PWM. Los pines que no tienen el símbolo ˜ junto al número, son pines
digitales de entrada/salida normales. En concreto, se trata de los pines 0, 1, 2, 4, 7, 8, 12
y 13.
8.- Pines PWM. Los pines que tienen el símbolo ˜ junto al número, además de
comportarse como pines digitales de entrada/salida, también pueden proporcionar a su
salida una señal modulada en PWM, por lo que se pueden usar para controlar la
velocidad de un motor o el brillo de un LED, por ejemplo. En concreto, se trata de los
pines 3, 5, 6, 9, 10 y 11. Por tanto, esta placa dispone de 6 salidas PWM.
Estos son los dos grandes grupos de pines de entrada/salida digitales. No obstante,
alguno de esos pines tiene, además, alguna función especial, como se explica a
continuación:
-Pines 0 (RX) y 1 (TX): pines de comunicación serie. Estos pines pueden utilizarse
para recibir y transmitir datos por el puerto de comunicación serie (USART) del
microcontrolador. A estos pines deberemos conectar cualquier dispositivo que
queramos comunicar con nuestra placa por el protocolo de comunicación serie.
-Pines para comunicación SPI: pin 10 (SS), pin 11 (MOSI), pin 12 (MISO) y pin 13
(CLK). Estos pines sirven para establecer una comunicación serie con dispositivos que
siguen el protocolo SPI.
Tensión de referencia:
Reset:
10.- Botón de reset. Al presionarlo, se aplica un nivel bajo al pin de reset del
microcontrolador, lo que provoca un reset del sistema.
Diodos LED:
16.- LED de usuario conectado al pin 13. Este LED lo puede utilizar el usuario para
su aplicación. Como vimos, está conectado al pin 13 mediante una resistencia
limitadora.
Microcontrolador:
Otros elementos:
15.- Cristal de cuarzo. Se trata de un cristal de cuarzo de 16MHz que, junto con un par
de condensadores SMD, forman el oscilador que genera la señal de reloj del
microcontrolador.
17.- Conector ICSP. Se trata de un conector para la programación ICSP (In Circuit
Serial Programming). El ICSP es el sistema utilizado para poder programar los
dispositivos sin necesidad de tener que retirar el chip del circuito del que forma parte.
Este conector se utilizaría en caso de que se estropeara el microcontrolador que lleva la
placa y tuviéramos que reemplazarlo por uno virgen, es decir, no programado. Para que
la comunicación de la placa con su entorno de programación fuera posible, sería
necesario programar el bootloader en el microcontrolador. Para ello, conectaríamos un
programador externo a la placa Arduino mediante el conector ICSP.
18.- Microcontrolador Atmega16U2. Este microcontrolador tiene una única función
en esta placa: permitir que el microcontrolador ATmega328P y el ordenador se puedan
comunicar por el puerto USB. Este elemento es indispensable ya que el
microcontrolador ATmega328P no dispone de un puerto de comunicación USB, por lo
que es necesario adaptar las señales procedentes del puerto USB del ordenador a un
protocolo de comunicación serie, que sí es entendible por el microcontrolador de
Arduino. Por este motivo, cuando conectamos nuestro Arduino al ordenador aparece
como un puerto COM virtual, es decir, un puerto serie virtual.
Microcontrolador Atmega328P
Voltaje de operación 5V
Pines para entrada- salida digital. 14 (6 pueden usarse como salida de PWM)
SRAM 2 KB
EEPROM 1 KB
LED de usuario 1
1.- ¿Cuál es la principal diferencia de la placa Arduino DUE con respecto al resto de
placas de Arduino?
2.- ¿Cuál es la principal diferencia de la placa Arduino YUN con respecto al resto de
placas de Arduino?
5.- ¿En qué se diferencian los pines de entrada/salida digitales que tienen el símbolo ˜
de los que no lo tienen?
6.- Además de funcionar como entrada/salida digital, ¿qué otra función pueden tener
los pines 0 y 1?
Actualmente, la versión más reciente es la 1.6.4., que está disponible para los tres
principales sistemas operativos.
Una vez descargado, lo instalaremos siguiendo los pasos adecuados, dependiendo del
sistema operativo con el que estemos trabajando. Finalmente, conectaremos nuestra
placa Arduino UNO al ordenador mediante un cable USB y ejecutaremos el entorno de
desarrollo. Nos aparecerá una imagen como la siguiente:
Como podemos observar, el IDE de Arduino está dividido en cuatro zonas principales:
zona de menús, zona de iconos, zona de trabajo y zona de mensajes, que se describirán a
continuación.
Menú Archivo:
Dispone de las mismas opciones que cualquier programa de Windows (Nuevo, Abrir,
Cerrar, Salir, etc), y algunas opciones específicas como por ejemplo:
-Ejemplos: al situarnos encima se despliegan todos los programas de ejemplo que trae
el IDE de Arduino por defecto. Esto es muy interesante porque nos pueden ayudar
cuando estamos empezando a trabajar con un elemento nuevo, como la pantalla LCD, el
teclado o las comunicaciones serie, por ejemplo.
Este menú dispone de las clásicas opciones que aparecen en el menú Editar de cualquier
programa de Windows (Cortar, Copiar, Pegar), así como otras específicas que no son
demasiado importantes (Copiar para el foro, Copiar como HTML, etc).
Menú Sketch
Las principales opciones que tenemos en este menú son las siguientes:
-Importar librería: permite importar una librería, por ejemplo cuando tengamos que
trabajar con un determinado sensor y necesitemos una librería para ello. El IDE de
Arduino ya tiene por defecto incorporadas una serie de librerías para poder manejar los
dispositivos más comunes, como pantallas LCD, servomotores, motores paso a paso,
etc. Todas estas librerías aparecen en cuanto situamos el cursor sobre la opción
“Importar librerías”. Las primeras librerías que aparecen son las que vienen por defecto
en el IDE, mientras que las últimas son las que hemos importado nosotros en particular.
Por ejemplo, en la imagen que se muestra a continuación, la librería “Keypad” ha sido
importada por el propio usuario, lo que le permitirá manejar teclados matriciales de
forma sencilla. Más adelante se explicará cómo importar librerías.
Menú Herramientas:
-Archivar el Sketch: comprime todos los Sketch abiertos en el IDE, creando un único
archivo *.zip.
-Monitor Serial: abre una ventana de monitorización que permite visualizar los datos
enviados por el microcontrolador al ordenador, o enviar datos desde el ordenador hasta
el micro.
-Tarjeta: sirve para elegir la placa o tarjeta de Arduino con la que estamos trabajando.
- Puerto serie: sirve para escoger el puerto donde tenemos conectado la placa Arduino.
Al igual que en el resto de programas basados en Windows, estos iconos no son más
que accesos rápidos a las funciones más utilizadas de la zona de menús. En la siguiente
imagen se muestran los diferentes iconos con sus correspondientes funciones:
4.3.- Descripción de la zona de mensajes
En la zona de mensajes el IDE de Arduino nos indica en qué puerto está conectada
nuestra placa, en qué línea del programa está ubicado el cursor y sobre todo nos
proporciona información muy importante sobre el proceso de compilación.
El área de trabajo es la zona editable del IDE de Arduino donde escribiremos nuestro
código para posteriormente compilarlo y transferirlo a la placa.
En esta área las palabras clave del compilador cambian automáticamente de color, lo
que facilita en gran medida la compresión de los programas. Además, es importante
tener en cuenta que el compilador distinguirá las letras entre mayúsculas y minúsculas.
Por otro lado, activaremos las casillas para que el entorno de desarrollo nos muestre los
números de línea de nuestro Sketch, el resultado detallado durante la compilación del
programa, así como para que se verifique la correcta programación de la placa después
de cargar un programa.
Hasta aquí la descripción del IDE de Arduino y su configuración inicial. Ahora tan sólo
queda aprender los fundamentos de programación para comenzar a programar nuestra
placa Arduino, cosa que desarrollaremos en la próxima unidad.
Tema 2
Programación de Arduino I
Primeros Pasos con Arduino
El lenguaje de programación de Arduino se basa en C/C++, aunque se añaden muchas
instrucciones y librerías que son exclusivas de Arduino y por tanto no existen en el
lenguaje C estándar. En las próximas unidades se tratará de explicar las características
más importantes del lenguaje C para Arduino, aunque en la página web que se cita a
continuación se puede consultar la información completa (en inglés):
http://arduino.cc/es/Reference/HomePage
Función setup()
La función setup() se ejecuta una sola vez, cuando el microcontrolador arranca después
de un reset. Por tanto, en esta función se deben escribir las instrucciones de
inicialización de los recursos del microcontrolador que se vayan a emplear. Por
ejemplo, los pines digitales que se vayan utilizar habrá que definirlos como pines de
entrada o salida; si se va a realizar comunicación por puerto serie, habrá que definir su
velocidad, etc.
Es importante tener en cuenta que esta función siempre debe estar incluida en el
programa, aunque no haya que realizar ninguna inicialización. En ese caso, la función
quedaría vacía.
Función loop()
El punto y coma ;
2
Comentarios
Cuando queremos introducir un comentario que ocupe una sola línea de código, tan solo
hay que añadir antes del comentario los símbolos “//”. Todo lo que escribamos en esa
línea a continuación de estos símbolos será ignorado por el compilador, y por tanto no
ocuparán espacio en la memoria del microcontrolador.
Los comentarios de una sola línea se utilizan a menudo después de una instrucción, para
proporcionar más información acerca de lo que realiza dicha instrucción.
Comentarios multi-línea:
Cuando queremos introducir un comentario que ocupe más de una línea de texto, hay
que poner los símbolos “/*” al principio del comentario y los símbolos “*/” al final
del comentario. Todo el texto comprendido entre ambos símbolos será ignorado por el
compilador, independientemente del número de líneas que comprenda.
Cuando vamos a utilizar un pin digital de Arduino, antes de poder usarlo es necesario
configurarlo como pin de entrada o de salida. Para ello disponemos de la instrucción:
pinMode(pin, modo)
donde:
pin es el número del pin digital que queremos configurar, que en Arduino UNO
será cualquier número entre el 0 y el 13.
modo hace referencia al modo en el que va a trabajar dicho pin, que puede ser
OUTPUT, es decir, salida; INPUT, es decir, entrada; o INPUT_PULLUP, es
decir, entrada con resistencia interna de pull up habilitada.
Todos los pines digitales que vayamos a utilizar deben haber sido configurados
previamente con esta instrucción. Lógicamente, esta instrucción debe colocarse en la
función setup(), que es la que se ejecuta al principio para configurar correctamente
todos los recursos del microcontrolador.
Cuando hemos configurado un pin digital como pin de salida, podemos escribir en él un
´1´ lógico, lo que equivale a 5V aproximadamente, o un ´0´ lógico, lo que equivale a 0V
aproximadamente. Para ello disponemos de la instrucción:
digitalWrite(pin, valor)
donde:
pin es el número del pin donde queremos escribir, y que previamente debe haber
sido configurado como pin de salida.
valor es el valor que queremos escribir en el pin, que puede ser HIGH (1
lógico) o LOW (0 lógico).
Cuando programamos tenemos que tener en cuenta que la velocidad de ejecución de las
instrucciones por parte del microcontrolador es realmente rápida, ya que la placa de
Arduino UNO dispone de un reloj de 16MHz de frecuencia. Es decir, las instrucciones
se ejecutan a un ritmo de 16 millones de instrucciones por segundo (en realidad es un
poco menos, ya que muchas de las instrucciones que escribimos en Arduino se dividen
en varias instrucciones al compilarlas, pero igualmente la velocidad es muy alta).
Por tanto, en muchas ocasiones será necesario generar un retardo, es decir, hacer que el
microcontrolador se espere para que no vaya tan veloz, porque de lo contrario irá tan
rápido que no veremos lo que hace.
El LED se apagará y encenderá todo el tiempo, pero lo hará a una velocidad tan elevada
que nosotros lo percibiremos siempre encendido. Lo que podemos hacer para solucionar
este problema es decirle al microcontrolador que, una vez encendido el LED, se espere
un tiempo antes de apagarlo. Esto se realiza con la instrucción:
delay(tiempo)
donde:
En Arduino existe otra manera mucho más interesante para generar retardos, pero para
ello se requiere la instrucción millis(), que será explicada más adelante.
Con todo lo que hemos visto ya estamos en disposición de realizar nuestro primer
programa en Arduino. Se trata de conseguir que el microcontrolador provoque un
parpardeo cada segundo en el LED interno de la placa Arduino UNO, manteniéndolo
durante 500ms encencido y durante 500ms apagado.
En el programa anterior le hemos dicho a Arduino que encendiera y apagara el pin 13,
que es donde tenemos conectado el LED. Esto ha sido fácil de recordar porque
solamente teníamos una salida. Pero si en un mismo programa tenemos muchas entradas
y salidas, se hace muy difícil recordar en qué número de pin tenemos conectada cada
entrada o salida.
Para solucionar esto tenemos la instrucción #define. Esta instrucción permite dar un
nombre, el que nosotros queramos, a un valor constante:
#define LED 13
Utilizando la instrucción #define podemos escribir los programas de una forma mucho
más fácil de leer, ya que podemos asignar un nombre a cada uno de los pines que
estamos utilizando. Por ejemplo, el programa del apartado anterior quedaría:
Ejercicios_
1.- Realiza un programa para controlar el parpadeo de dos diodos LED que funcionen
de forma complementaria el uno del otro, es decir, que cuando uno de ellos esté
encendido, el otro permanezca apagado, y viceversa.
SEMÁFORO DURACIÓN
Verde 10 segundos
Ambar (parpadeante) 3 segundos
Rojo 10 segundos
3.- Modifica el programa del ejercicio anterior para que el microcontrolador genere la
secuencia de encendido y apagado de dos semáforos complementarios en un cruce.
Cada semáforo dispondrá de tres luces, simuladas con tres LEDs: verde, rojo y ambar.
La secuencia será la siguiente:
5.- Modifica el programa del ejercicio anterior para que la secuencia de encendido de
los LEDs vaya de derecha a izquierda y, una vez estén todos los LEDs encendidos,
vayan apagándose de izquierda a derecha, hasta que queden todos apagados,
repitiéndose la secuencia de forma indefinida.
Tema 3
Programación de Arduino II
Variables , Tipos de Datos e
Instrucciones de Selección
1.- Variables
Cuando Arduino ejecuta un programa, normalmente debe manejar datos. Por ejemplo,
guardar las lecturas de un sensor de temperatura para después procesarlas. En
programación, los datos se almacenan en variables. Por tanto, una variable es un trozo
de la memoria de datos (SRAM) del microcontrolador donde almacenamos un
dato de un tipo concreto. El contenido de las variables se puede leer o cambiar en
cualquier momento del programa. Es decir, no son datos fijos o constantes. De ahí
viene su nombre.
Las variables pueden ser de distintos tipos dependiendo del tipo de dato que queramos
meter. Por ejemplo, no es lo mismo guardar un carácter que un número, y por supuesto
no se pueden hacer las mismas operaciones sobre un número con decimales que sobre
un carácter.
Para poder usar una variable primero hay que declararla. Declarar una variable es, por
decirlo así, crear una variable nueva, lo que equivale a reservar un espacio de la
memoria RAM para guardar un dato. Para declarar una variable es preciso indicar
dos cosas: el nombre de la variable y el tipo de dato que almacenará la misma. Esto se
hace de la siguiente manera:
tipo_dato nombre_variable;
donde
:
tipo_dato es el tipo de dato que vamos a guardar en la variable, que puede ser
int (número entero), char (carácter), float (número con decimales), etc.
nombre_variable es el nombre que nosotros le vamos a dar a esa variable.
A las variables no se les puede dar cualquier nombre. No se pueden poner más que
letras de la 'a' a la 'z' (la ñ no vale), números y el símbolo '_'. No se pueden poner signos
de admiración, ni de interrogación. Además, el nombre de una variable puede contener
números, pero su primer carácter no puede serlo. Tampoco valen como nombres de
variable las palabras reservadas que usa el compilador, como por ejemplo: for, main, do,
while.
2
Es importante tener en cuenta que el lenguaje de programación C distingue entre
mayúsculas y minúsculas. Por lo tanto, los siguientes nombres serán tres variables
diferentes:
nombre
Nombre
NOMBRE
Por último, con el objetivo de escribir un código que sea fácilmente legible, para
nombrar a las variables se deben utilizar nombres descriptivos, es decir, nombres que
definan de alguna manera el dato que van a guardar. A continuación se muestran
algunos ejemplos de nombres descriptivos y no descriptivos:
Ya sabemos cómo se declaran las variables, pero la siguiente pregunta sería: ¿en qué
lugar de nuestro programa hemos de declararlas?
Boolean: es un tipo de dato que sólo puede adquirir dos valores diferentes: true
o false. En principio un dato de tipo boolean debería ocupar un solo bit de
información, pero la realidad es que no se puede acceder a la memoria RAM del
microcontrolador bit a bit, sino que el acceso es por grupos de 8 bits. Por tanto,
una variable de tipo boolean ocupará 1 byte de memoria RAM.
Byte: las variables de tipo byte almacenan un número entero sin signo de 8
bits. Por tanto, el rango de números que pueden almacenarse con este tipo de
dato va de 0 a 255. Para valores mayores será necesario emplear un tipo de dato
de más bits (16 o 32).
Int: las variables de tipo int almacenan un número entero con signo de 16 bits.
Por tanto, el rango de números que pueden almacenarse con este tipo de dato va
de -32768 a 32767.
Long: las variables de tipo long almacenan un número entero con signo de 32
bits. Por tanto, el rango de números que pueden almacenarse con este tipo de
dato va de -2147483648 a 2147483647.
Float: en una variable de tipo float podemos almacenar números reales, es decir,
números con parte entera y parte decimal. Una variable de tipo float ocupa
32 bits, es decir, 4 bytes. El rango de posibles valores es del 3.4 ⋅10 al 3.4 ⋅10 38
−38
Char: las variables de tipo char sirven para almacenar caracteres. Los
caracteres se almacenan en realidad como números enteros codificados según el
código ASCII estándar. Una variable char ocupa 8 bits, es decir, 1 byte. En
una variable char podemos almacenar un solo carácter, no podemos
almacenar ni frases ni palabras. Para asignar un carácter a una variable char se
pone el carácter entre comillas simples.
A continuación se muestra una tabla resumen con los principales tipos de datos:
En la unidad anterior vimos cómo se hacía una escritura digital en Arduino. Ahora
vamos a ver cómo se hace una lectura de un pin digital.
En primer lugar, el pin que vamos a leer debe haber sido configurado en la función
setup() como pin de entrada, utilizando para ello la instrucción pinMode. Como vimos
en la unidad anterior, se puede configurar como pin de entrada normal, o como pin de
entrada con resistencia de pull up interna habilitada. Esto se utilizará, por ejemplo, para
conectar pulsadores o interruptores al microcontrolador sin usar resistencias de pull up
externas.
Una vez configurado como entrada, cuando queramos leer el valor de un pin digital
utilizaremos la siguiente instrucción:
digitalRead(pin)
donde
:
pin es el número del pin que queremos leer (del 0 al 13 en Arduino UNO).
Esta función leerá el valor del pin y devolverá uno de los siguientes valores: HIGH
(valor alto) o LOW (valor bajo).
Ejercicio resuelto:
Este mismo ejercicio se podría haber resuelto sin el uso de ninguna variable, tal y como
se muestra a continuación:
Ejercicios_
2.- Modifica el programa anterior para poder conectar a tu placa Arduino el pulsador
sin usar una resistencia de pull up externa, habilitando para ello la resistencia interna
de pull up que incorpora el microcontrolador en cada pin.
4.- Operadores
Ya hemos visto cómo crear variables nuevas y cómo inicializarlas. Sin embargo, sólo
con esto no podemos hacer ningún programa complejo, ya que normalmente cualquier
programa lo que hace es tomar datos de sensores o del teclado, procesarlos y actuar en
consecuencia. Y, para procesar los datos, necesitamos hacer operaciones con ellos, y
para eso es para lo que están los operadores.
Se trata del operador ‘=’ y sirve para dar valor a una variable. Esto en C se hace de la
siguiente manera:
Son aquellos que sirven para realizar operaciones tales como la suma, resta,
multiplicación, etc., es decir, operaciones aritméticas.
A la hora de trabajar con los operadores aritméticos, hemos de tener en cuenta algunas
consideraciones importantes:
Si todos los operandos son del mismo tipo, el resultado de la operación será
también del mismo tipo. En cambio, si los operandos son de diferentes tipos,
para el cálculo se utilizará el tipo más grande de los operandos en juego. Por
tanto, cuando programamos puede darse la siguiente paradoja:
Al realizar una operación aritmética, la variable que guarda el resultado de la
operación puede sufrir desbordamiento, si dicho resultado es mayor que el
valor máximo que puede almacenar la variable. Por tanto:
Estos operadores, que en principio parece que no tengan demasiada utilidad, los
emplearemos muchísimo en las instrucciones de control de flujo, que veremos al final
de este tema. A continuación se muestra un ejemplo:
En muchas ocasiones queremos que una acción se realice cuando se cumplen dos o más
condiciones. Los operadores lógicos se utilizan para concatenar varias condiciones en
las instrucciones de control de flujo. Los comparadores lógicos son 3:
Como sabes, el contenido de cualquier variable está expresado en bits. Los operadores
de manipulación de bits sirven para hacer operaciones lógicas con las variables por
dentro, es decir, con los bits que componen las variables.
Hasta el momento, en todos los programas que hemos visto, el orden de ejecución de las
instrucciones era secuencial, es decir, una instrucción se ejecutaba después de la
inmediatamente anterior.
Sin embargo, la mayoría de aplicaciones más complejas requieren que ese flujo
secuencial se rompa en algún momento, de forma que la siguiente instrucción en
ejecutarse no tenga por qué ser siempre la instrucción que se encuentra en la línea
siguiente.
Por ejemplo, nos puede interesar que dependiendo del valor de una variable se ejecuten
unas instrucciones u otras, o que un conjunto de instrucciones se repita un determinado
número de veces.
Ejemplo:
Como hemos visto, la instrucción if – else permite elegir entre dos posibilidades
diferentes en función de una determinada condición. Pero, ¿qué pasa si queremos poder
elegir entre 3 o más posibilidades? En ese caso podemos anidar varias instrucciones
if – else de la siguiente manera:
Realizar un programa para controlar el estado del LED interno de la placa Arduino
UNO mediante dos pulsadores, llamados MARCHA y PARO. Cuando se acccione el
pulsador de MARCHA, el LED se encenderá, manteniéndose en ese estado hasta que se
accione el pulsador de PARO, que apagará el LED. Ten en cuenta que los pulsadores
que se van a utilizar están conectados mediante una resistencia de pull-up, por tanto
son activos a NIVEL BAJO.
Si lo has entendido todo hasta aquí, ahora es tu turno de programar. Resuelve los
siguientes ejercicios utilizando la instrucción if-else y todo lo aprendido hasta este
momento.
Ejercicios
3.- Realizar un programa que controle la velocidad de parpadeo del LED interno de la
placa Arduino UNO mediante un conmutador. Si el conmutador está a nivel bajo, los
tiempos de encendido y apagado del LED durarán 500ms cada uno. Si el conmutador
está a nivel alto, los tiempos de encendido y apagado serán de 250ms cada uno.
4.- En el ejercicio 3 de la unidad anterior realizaste un programa para controlar la
secuencia de encendido y apagado de dos semáforos complementarios en un cruce.
Ahora debes modificar dicho programa para controlar dos semáforos, también
complementarios, pero en esta ocasión se trata de los semáforos de un paso de
peatones: uno para los coches y otro para los peatones. La diferencia es que ahora el
accionamiento del semáforo de los peatones se realizará con un pulsador. El
funcionamiento debe ser el siguiente: Si ningún peatón acciona el pulsador, el semáforo
de los coches debe estar SIEMPRE EN VERDE, mientras que el de peatones SIEMPRE
EN ROJO. Cuando algún peatón accione el pulsador, el semáforo de coches se
mantendrá 5 segundos más en verde, tras lo cual comenzará su secuencia de puesta en
rojo (primero en ambar parpadeante durante 3 segundos, y luego en rojo), al mismo
tiempo que el semáforo de peatones comenzará su secuencia de puesta en verde. Tras
10 segundos en verde, el semáforo de peatones iniciará su secuencia de puesta en rojo
(primero en ambar parpadeante durante 3 segundos y después en rojo), mientras que el
de coches iniciará su secuencia de puesta en verde. Finalmente, este estado se
mantendrá hasta que un nuevo peatón vuelva a accionar el pulsador. A continuación se
muestra un resumen de la secuencia:
NOTA: Para realizar este programa de forma eficiente, no se debe escribir dos veces la
misma secuencia, con dos retardos diferentes, sino que se debe emplear una variable
para generar los retardos.
5.1.2.- Instrucción switch-case
Existe otra instrucción de selección parecida a if – else, pero con algunas diferencias,
conocida como switch-case, cuya estructura se muestra a continuación:
Como puedes observar, después de cada acción se debe escribir la palabra break.
Esto es para que, llegado a ese punto, el programa salte el resto de opciones y comience
a ejecutar la siguiente instrucción después del switch-case. Si no ponemos la palabra
break, una vez que el programa entra en un bloque case, ejecutaría el resto de
instrucciones hasta el final.
Por otro lado, al final de la instrucción se puede añadir de forma opcional la palabra
default. Esto se hace para indicar la acción que se debe realizar por defecto, es decir, la
acción que se realizará si el valor de la variable no coincide con ninguno de los
indicados anteriormente en las sentencias case.
Ejemplo:
7.- Utiliza la placa Arduino UNO y una protoboard para implementar un sencillo
contador de segundos. Nada más resetar el microcontrolador, éste comenzará a contar
segundos desde el 0 hasta el 9, que serán visualizados en una pantalla de 7 segmentos.
Cuando llegue al número 9, el contador deberá comenzar de nuevo con el 0.
8.- Realiza un programa que implemente un sencillo contador de pulsos con la placa
Arduino UNO, una pantalla de 7 segmentos y un pulsador. Inicialmente en la pantalla
debe aparecer el número 0. Cada vez que el usuario accione el pulsador, el número que
irá apareciendo se incrementará en 1, hasta llegar al número 9. Después del número 9
la cuenta volverá otra vez a 0, repitiéndose el proceso indefinidamente.
9.- Modifica el ejercicio anterior para que se pueda controlar el sentido de la cuenta
mediante dos pulsadores. Cada vez que se accione el primer pulsador, la cuenta se
incrementará en 1. Cada vez que se accione el segundo pulsador, la cuenta se
decrementará en 1. En ambos casos la cuenta debe ser cíclica, es decir, si se
incrementa el número 9 se debe volver al 0, y si se decrementa el número 0 se debe
volver al 9.
10.- Utiliza la placa Arduino UNO y una protoboard para implementar un dado
electrónico. Nada más resetar el microcontrolador, éste comenzará a contar del 1 al 6
periódicamente a mucha velocidad. De esta forma, el usuario no podrá distinguir el
número que aparece en la pantalla de 7 segmentos. Cuando el usuario apriete un
pulsador, la cuenta se detendrá durante dos segundos, de forma que el usuario podrá
ver el valor de la tirada del dado electrónico.
Tema 4
Programación de Arduino III
Instrucciones de Repetición
En la unidad anterior vimos que hay dos tipos de instrucciones para controlar el flujo de
un programa: las instrucciones de selección y las de repetición. Después de haber
estudiado las de selección, le llega ahora el turno a las instrucciones de repetición.
Para evitar tener que repetir código innecesario, existe una instrucción que permite
repetir un determinado código las veces que queremos. Tan sólo hay que especificarle
cuántas veces queremos que se repita. Esta instrucción se llama for, y su estructura es la
siguiente:
La instrucción for inicializa una variable al valor elegido por nosotros. Cuando termina
la primera iteración, incrementa la variable según lo especificado, y comprueba si
dicha variable cumple la condición indicada. Si la cumple, se ejecuta una nueva
iteración. Si no la cumple, se abandona el bucle.
Por ejemplo, para hacer que el LED interno parpadee 100 veces escribiríamos:
Cuestión:
Ejercicios
1.- Realiza un programa para que el microcontrolador de Arduino haga que cuatro
diodos LED parpadeen al mismo tiempo cuatro veces cada vez que se acciona un
pulsador.
2
3.- Si el ejercicio 2 lo has resuelto escribiendo 4 bucles for, cada uno de ellos con un
número de iteraciones diferente, vuelve a realizar el ejercicio 2, pero esta vez
escribiendo un único bucle for, en el que el número de iteraciones no sea un número
fijo sino una variable.
Existe otra instrucción que sirve para repetir un mismo código un número determinado
de veces. Esa instrucción se llama while, y su estructura es la siguiente:
While significa en inglés mientras. Por tanto, la acción o acciones que se encuentran
dentro de las llaves se ejecutarán mientras se cumpla la condición establecida entre
paréntesis. Esta condición puede cambiar a expensas de una expresión dentro del
código del bucle o por un evento externo, por ejemplo un cambio en un pin al que esté
conectado un sensor o un pulsador.
Para hacer que el LED interno de Arduino parpadee 100 veces escribiríamos:
En este caso, la variable que utilizamos para contar el número de iteraciones ha de ser
inicializada antes de empezar la instrucción while, y debe ser actualizada durante la
ejecución del bucle para que el programa pueda salir de él en un momento dado.
La respuesta es que en realidad no son dos instrucciones equivalentes, sino que tienen
una diferencia muy importante: cuando escribimos una instrucción for, tenemos que
saber de antemano cuántas veces queremos que se repita el bucle. Sin embargo, cuando
utilizamos la instrucción while, no necesariamente tenemos que saber cuántas veces
debe ejecutarse el bucle, sino que eso puede definirse a lo largo de la ejecución del
programa. Por ejemplo, imagina que quieres hacer un programa para que el LED interno
parpadee indefinidamente hasta que el usuario accione un pulsador. En este caso,
cuando escribimos el código no sabemos cuántas veces tiene que repetirse el bucle, ya
que de hecho el número de repeticiones puede cambiar cada vez. Por tanto, deberíamos
usar la instrucción while de la siguiente manera:
En el programa de arriba, las acciones se repetirán mientras el valor leído en el pin del
pulsador sea 1, es decir, mientras el pulsador no esté pulsado. En el momento en que
alguien accione el pulsador, el valor leído en el pin será 0, por lo que no se cumplirá la
condición y se saldrá del bucle. Es decir, en este programa la condición de salida del
bucle depende de algo que sucede externamente.
Ejercicios
5.- Vuelve a escribir el programa del ejercicio 1, pero utilizando un bucle while en
lugar de un bucle for.
6.- Vuelve a escribir el programa del ejercicio 4, pero utilizando un bucle while en
lugar de un bucle for.
7.- Realiza un programa para que el microcontrolador de Arduino genere una
secuencia de encendido y apagado de 2 diodos LED. La secuencia en concreto debe ser
la siguiente:
- Inicialmente debe parpadear 4 veces el diodo derecho.
- A continuación deben parpadear los dos LEDs indefinidamente hasta que el
usuario accione un pulsador.
- Finalmente debe parpadear 4 veces el LED izquierdo.
- Una vez terminada la secuencia, ésta debe repetirse desde el principio.
9.- Realiza un programa para que el microcontrolador de Arduino una serie de efectos
de visualización sobre dos diodos LED controlados por dos conmutadores y un
pulsador. Cuando el usuario accione el pulsador, el microcontrolador leerá los dos
conmutadores y realizará los siguientes efectos:
- Si los dos conmutadores están a 0, parpadeará 4 veces el LED derecho.
- Si el primer conmutador está a 0 y el segundo está a 1, parpadeará 4 veces el
LED izquierdo.
- Si el primer conmutador está a 1 y el segundo está a 0, parpadearán 6 veces
los dos LEDs.
- Si los dos conmutadores están a 1, parpadearán 8 veces los dos LEDs.
Para hacer que un LED parpadee 100 veces con la instrucción do-while escribiríamos:
10.- Vuelve a escribir el programa del ejercicio 5, pero utilizando un bucle do-while en
lugar de un bucle while.
11.- Vuelve a escribir el programa del ejercicio 6, pero utilizando un bucle do-while en
lugar de un bucle while.
12.- Vuelve a escribir el programa del ejercicio 7, pero utilizando un bucle do-while en
lugar de un bucle while.
Ejemplo: si, una vez alimentada la placa, el usuario acciona 5 veces el pulsador 1, la
pantalla irá incrementándose con cada pulsación hasta el número 5. Si en ese momento
acciona el pulsador 2, comenzará la siguiente cuenta atrás automática: 5-4-3-2-1-0
(cada número durante 1 segundo).
15.- Utiliza la placa Arduino UNO para diseñar un pequeño programador de riego de 4
sectores. El programador dispondrá de un pulsador para iniciar el riego, 2
conmutadores para que el usuario pueda seleccionar el número de veces que se
repetirá el ciclo de riego, 4 salidas para activar 4 electroválvulas (una por sector) y
una pantalla de 7 segmentos donde aparecerá el tiempo que queda de riego del sector
que se está regando en ese momento.
Cuando termina el ciclo de riego, éste debe repetirse tantas veces como haya indicado
previamente el usuario con los conmutadores.
Para simular las electroválvulas se emplearán diodos LED. Por otro lado, para no
tener que esperar tantos minutos para comprobar el correcto funcionamiento del
circuito, se puede sustituir cada minuto por 1 segundo, es decir, que cada sector se
riegue 3 segundos en lugar de 3 minutos.
Tema 5
Lectura Digital
y PWM
En los ejercicios que hemos resuelto hasta ahora el control de potencia siempre ha sido del tipo
ON/OFF, es decir, la carga se activa o no se activa. Sin embargo, en muchas ocasiones nos puede
interesar controlar de forma gradual la potencia que se cede a la carga, por ejemplo para controlar
la velocidad de giro de un motor o el nivel de luminosidad de una tira de diodos LED. A
continuación veremos cómo se hace esto, centrándonos en el control gradual de potencia
para cargas de continua. El método empleado para regular la potencia en cargas de alterna es
algo más complejo y se estudiará más adelante.
El modulador de anchura de pulsos, más conocido como modulador PWM (Pulse Width
Modulation), es un circuito incorporado en el microcontrolador que genera una señal cuadrada
periódica cuyo valor de tiempo a nivel alto (conocido como ciclo de trabajo) es configurable.
Dicho de otra manera, genera una señal periódica cuyos pulsos tienen una anchura variable. Al
aplicar dicha señal a una carga (a través de un transistor de potencia), se consigue controlar con
mucha precisión y de forma sencilla la potencia entregada a la misma.
La siguiente imagen muestra una señal PWM con diferentes anchuras de pulso, o lo que es lo
mismo, diferentes ciclos de trabajo. En el primer caso el ciclo de trabajo es del 0%, por lo que
la señal está siempre a nivel bajo. Al aplicar dicha señal a una tira de LEDs, estarían siempre
apagados. En el segundo caso el ciclo de trabajo es del 25%, es decir, la señal está el 25% del
tiempo de un ciclo a nivel alto, y el 75% a nivel bajo. Al aplicar esta señal a la tira de LEDs,
estos brillarían débilmente. En el siguiente caso el ciclo de trabajo es del
50%, es decir, la señal pasa la mitad del tiempo a nivel alto y la otra mitad a nivel bajo. Al aplicar
esta señal a la tira de LEDs, estos brillarían más que en el caso anterior, pero todavía no lo
harían al nivel máximo, nivel que se alcanzaría cuando el ciclo de trabajo de la señal PWM
fuera del 100%.
En Arduino UNO existen seis pines digitales que incorporan un modulador PWM, por lo
que podemos controlar hasta seis cargas distintas. Se trata de los pines que vienen
marcados con el símbolo ˜: 3, 5, 6, 9, 10 y 11.
Para activar el modulador PWM en un pin, en primer lugar hay que configurarlo como pin
de salida con la función pinMode(). Después tan solo hay que llamar a la siguiente función:
Ejercicios
Por tanto, una vez que hayamos leído el número entero proporcionado por el
convertidor, si queremos conocer el valor de tensión entregado por el sensor tan solo
tenemos que aplicar la siguiente ecuación:
donde:
Lectura es el número entero proporcionado por el convertidor A/D.
A/D
donde:
Por tanto, la resolución del convertidor A/D de nuestra placa Arduino UNO es:
Es decir, nuestro convertidor A/D puede detectar cambios en la tensión analógica de
entrada de hasta 5mV, lo cual es una precisión bastante aceptable. No obstante, de la
fórmula de arriba se deduce que si quisiéramos más resolución podemos hacer dos
cosas:
Aumentar el número de bits del convertidor A/D, algo que solo puede hacerse
eligiendo otro microcontrolador con esta característica.
Disminuir la tensión de fondo de escala, algo que veremos más adelante.
Para realizar una lectura con el convertidor A/D de Arduino, conectaremos el sensor
analógico a cualquiera de los canales analógicos (AN0- AN5) y llamaremos a la
siguiente función:
analogRead(pin)
donde:
pin es el número del canal analógico que queremos muestrear (del 0 al 5)
Ejemplo de uso:
NOTA: es importante tener en cuenta que los pines analógicos no hace falta
configurarlos en la función setup() como pines de entrada, ya que estos pines no
pueden comportarse como pines de salida, por lo que únicamente pueden ser entradas.
Por tanto, para utilizarlos no es necesario realizar ninguna configuración previa en la
función setup().
Ejercicio resuelto
Realizar un programa que mande cada segundo por el monitor serial un número
proporcional a la tensión que aparece en el cursor de un potenciómetro que tiene sus
extremos conectados entre VCC y masa. En concreto el mensaje que debe mandarse es:
Valor leído: XX
Ejercicios______________________________________________________________
2.- Modifica el programa anterior para que el número que se envíe al monitor serial se
corresponda exactamente con el valor de tensión que aparece en el potenciómetro. El
mensaje mostrado debe ser el siguiente:
3.- Modifica el programa anterior para se envíe por el monitor serial el voltaje que
aparece en dos potenciómetros diferentes. Para ello se utilizarán 2 canales analógicos
diferentes. Los mensajes que se mostrarán son los siguientes:
donde:
n_rescalar es la variable que contiene el valor que queremos re-escalar o remapear.
En esta función los límites máximos (los de entrada o los de salida) pueden ser
inferiores a los límites mínimos. En ese caso, la función no realizará un mapeo
proporcional, sino inversamente proporcional. Por ejemplo, la siguiente llamada:
Entregaría a la variable lectura un valor de 255 cuando el valor de entrada sea 0, y una
valor de 0 cuando la entrada sea de 1023.
El valor entregado por esta función es siempre un número entero. Por tanto, si
necesitamos hacer el re-escalado con números decimales deberemos llevarlo a cabo
efectuando las operaciones matemáticas correspondientes, pero no usando esta función.
Ejercicios______________________________________________________________
6.- Añade al ejercicio anterior un pulsador para enviar al ordenador por comunicación
serie el nivel actual de iluminación del LEDs, cada vez que se acciona el
pulsador. Este nivel será indicado en porcentaje: 0% equivale a la tira totalmente
apagada, mientras que 100% equivale a la tira totalmente encendida.
Tema 6
Comunicaciones serie
1.- Comunicación de Arduino con el ordenador por puerto serie
En este apartado vamos a ver cómo podemos comunicar nuestra placa Arduino UNO
con el ordenador, utilizando para ello la USART incorporada en el microcontrolador de
Arduino.
Sin embargo, ¿es posible comunicar un puerto USB del ordenador con la USART de
Arduino, siendo protocolos de comunicación diferentes? La respuesta es que sí. En
este caso, en vez de realizar una adaptación de niveles, es necesario realizar una
adaptación de protocolos (de USB a USART), cosa de la que se encarga otro chip:
el FTDI, que ya viene incorporado en la propia placa de Arduino.
Este integrado canaliza la comunicación serie a traes del USB, mientras que los drivers
FTDI (incluidos en el software de Arduino) proporcionan un puerto serie virtual en el
ordenador. Es decir, cuando nos comunicamos por USB con nuestra placa Arduino
UNO, en realidad lo estamos haciendo a través de su USART, aunque a nosotros nos
parezca una comunicación USB.
Cuando comunicamos nuestro Arduino con el ordenador por puerto USB, los LEDS RX
y TX de la placa parpadean cuando se detecta comunicación transmitida través del chip
FTDI. En cambio, no parpadean si se usa la comunicación serie a través de los pines
digitales 0 y 1 (por ejemplo para comunicar con otro dispositivo por USART).
Además, el propio IDE de Arduino incluye una herramienta llamada Monitor Serial
que permite enviar y recibir datos por ese puerto serie virtual que se crea cuando
conectamos nuestro Arduino a un ordenador a través del puerto USB.
Esta herramienta permite enviar datos por el puerto serie, y muestra en pantalla los
datos recibidos. Además, permite configurar la velocidad de transmisión y los datos que
se envían al pulsar la tecla ENTER. A este respecto tenemos 4 opciones:
- No hay fin de línea: al pulsar ENTER se envían únicamente los datos escritos en
la pantalla
- Nueva línea: al pulsar ENTER se envían los datos escritos en pantalla, seguido
del comando de nueva línea (\n).
- Retorno de carro: al pulsar ENTER se envían los datos escritos en pantalla,
seguidos del comando de retorno de carro (\r).
- Ambos: al pulsar ENTER se envían los datos escritos en pantalla, seguidos del
comando de nueva línea (\n) y del retorno de carro (\r).
2.- Funciones de Arduino para la comunicación serie _
Serial.begin(velocidad)
Esta función abre el puerto serie y fija la velocidad en baudios para la transmisión de
datos. El valor típico de velocidad para comunicarse con el ordenador es 9600, aunque
otras velocidades pueden ser soportadas (4800, 19200, 115200, etc). Si no se especifica
lo contrario, la comunicación se realiza con 8 bits de datos, 1 bit de stop y sin
paridad.
Ejemplos:
Serial.end()
Serial.flush()
Serial.print(dato)
Imprime el dato indicado entre paréntesis como texto en código ASCII. Se pueden
imprimir caracteres, cadenas de caracteres, números enteros o números decimales, pero
siempre en formato de texto ASCII. Es decir, el número entero 65 se imprimirá como
el carácter 6 y el carácter 5.
Serial.print(dato, formato)
Ejercicio resuelto
2.- Realiza un programa para que cada vez que se accione un pulsador, el
microcontrolador envíe al ordenador a través del puerto USB una tabla con los 255
primeros números en formato decimal, binario y hexadecimal. Cada fila de la tabla
tendrá la siguiente forma:
Serial.available()
Esta función se utiliza para saber si se han recibido datos por el puerto serie. Devuelve
un entero con el número de bytes (caracteres) disponibles para leer desde el buffer de la
USART (128 bytes como máximo) ó 0 en caso de que no haya ninguno. Por tanto,
siempre que haya algún dato disponible para leer, el número devuelto por
SerialAvailable() será mayor que 0.
Así pues, para saber si hemos recibido algún dato por el puerto serie, podemos hacer lo
siguiente:
También podemos hacer que nuestro programa de Arduino se espere a que se reciba un
dato por puerto serie escribiendo lo siguiente:
Serial.read()
Esta función se utiliza para leer un dato recibido por el puerto serie. Al invocarla,
devuelve el primer byte recibido por el puerto serie que todavía no haya sido leído (es
decir, el primer byte almacenado en el buffer). En caso de no haber ningún dato
disponible, devuelve el número -1.
Ejercicio resuelto
3.- Realiza un programa para controlar el encendido de 8 diodos LEDs desde el teclado
del ordenador. El usuario enviará por el monitor serial un número comprendido entre
el 0 y el 8. Una vez recibido, el micro deberá encender tantos LEDs como indique el
número recibido.
5.- Realiza un programa que permita controlar mediante el teclado del ordenador el
número de veces que pitará un zumbador conectado a la placa Arduino UNO. Si el
usuario pulsa la tecla 3 del ordenador, el zumbador deberá pitar 3 veces. Si pulsa la
tecla 5, deberá pitar 5 veces, y así con todos los números comprendidos entre 1 y 9.
La instrucción Serial.read() lee los datos recibidos por puerto serie byte a byte. Esta
instrucción es muy útil cuando el dato enviado por el usuario es un número de un único
dígito. Pero si lo que envía el usuario es un número de varios dígitos, como el 740, si lo
leemos con la instrucción Serial.read() haremos 3 lecturas separadas: el 7, el 4 y el 0,
que después tendremos que juntar de manera compleja por software. Para estos casos
existen dos instrucciones mucho más interesantes, que analizamos a continuación:
Serial.parseInt()
Esta función lee el buffer de recepción de la USART y devuelve un número entero que
contiene todos los dígitos que se encuentran en el buffer hasta que aparece un carácter
que no es un dígito (como un espacio, una coma, un retorno de carro, etc). En caso de
que no se encuentre ningún número, devuelve el número 0.
Ejercicio resuelto
Realizar un programa en el que el usuario controle a través del monitor serial del
ordenador el nivel de brillo de un diodo LED. En concreto, el usuario escribirá por el
monitor serial cualquier número entre 0 y 255, indicando el porcentaje de brillo (0
completamente apagado, 255 completamente encendido). El microcontrolador de
Arduino deberá recibir este dato y actuar sobre el modulador PWM para generar el
nivel de iluminación especificado.
3.- Funciones matemáticas _
A continuación se presentan una serie de ejercicios en los que deberás utilizar, además
de todo lo relacionado con las comunicaciones serie, las funciones matemáticas map()
y/o constrain() para resolverlos.
Ejercicios
0 50 100
El LED rojo debe permanecer apagado, el LED verde debe brillar al 50% de su
intensidad máxima y el LED azul debe brillar a nivel máximo.
7.- Modifica el programa anterior para que, además de controlar el color de un LED
RGB, el microcontrolador mande al ordenador el siguiente mensaje, para comprobar
que se ha recibido correctamente:
8.- Realiza un programa para que el usuario controle el tiempo de duración de cada
color de un LED RGB, de la siguiente manera:
-Inicialmente el LED estará apagado.
-El usuario escribirá en el terminal tres números, separados por comas o espacios.
Estos números podrán contener decimales, e indicarán el tiempo (en segundos) que
permanecerá el LED en color rojo, verde y azul.
-En cuanto el usuario pulse la tecla ENTER, el LED comenzará a brillar en color
rojo el tiempo indicado en el primer número, luego pasará a verde el tiempo
indicado en el segundo número y después pasará a azul el tiempo indicado en el
tercer número.
-Finalmente el LED se apagará, quedando a la espera de un nuevo dato.
9.- Modifica el ejercicio 7 para que, en caso de que el usuario cometa un error al
introducir los niveles de iluminación de cada LED, no suceda nada extraño. Para ello,
si el nivel introducido para algún LED es inferior a 0, debe tomarse dicho nivel como 0.
Si el nivel introducido es superior a 100, debe tomarse como 100.
Tema 7
Comunicaciones serie II
1.- Introducción
Para comunicar nuestra placa Arduino con otro Arduino a través del puerto serie, la
configuración hardware es mucho más sencilla que en el caso de comunicarlo con un
ordenador, ya que ambos dispositivos disponen de USART. Por tanto, no es necesario
realizar una conversión de protocolos (como hacía el chip FTDI para pasar de
USART a USB) ni realizar adaptación de niveles (como hacía el chip MAX232 para
pasar de niveles TTL a niveles RS232).
Tan solo hay que interconectar los pines RX y TX de ambos dispositivos (TX1 con
RX2 y RX1 con TX2), además de unir las masas de ambas placas, tal y como muestra el
siguiente esquema:
3.- Comunicación de Arduino con un módulo bluetooth
Los equipos que integran este protocolo pueden comunicarse entre ellos cuando se
encuentran dentro de su alcance, aunque no se encuentren alineados e incluso en
distintas estancias, si la potencia de transmisión es suficiente. En ese sentido, estos
dispositivos se clasifican en tres clases diferentes según su potencia de transmisión:
Cada uno de los dispositivos bluetooth tienen asignada una dirección única de 12
bytes que sirve para identificarlos, conocida como dirección MAC (algo similar a la
MAC de una tarjeta de red). Además de la dirección MAC, presentan un nombre de
dispositivo, que sirve para identificarlo cómodamente, y que se puede cambiar al gusto
del usuario (no así la dirección MAC, que es fija). Generalmente incluyen además un
código PIN que debe teclearse para permitir la comunicación con el dispositivo.
3
Como se puede observar, este módulo de bajo coste y reducido tamaño dispone
únicamente de 4 pines: RXD, TXD, VCC y GND. Por tanto, la conexión con Arduino
es realmente sencilla, ya que únicamente debemos cruzar los pines de transmisión y
recepción, además de alimentar el módulo, tal y como se muestra en el siguiente
esquema:
NOTA: Aunque el dispositivo en cuestión trabaja con una tensión de 3.3V, dispone en
su placa de un pequeño regulador de tensión que obtiene los 3.3V requeridos a partir de
una tensión continua entre 3.3V y 6V. Por tanto, podemos alimentar sin problema el
módulo bluetooth desde el pin de 5V de nuestra placa Arduino.
NOTA 2: Existe en el mercado otro módulo bluetooth que físicamente resulta muy
parecido al que estamos estudiando: el HC-05. La manera más sencilla de diferenciarlos
es observando el número de pines: el HC-06 dispone de 4 pines, mientras que el HC-
05 dispone de 6 pines. En cuanto a diferencias funcionales, el modelo HC-06 solo
puede actuar como esclavo y además dispone de un juego reducido de instrucciones,
mientras que el modelo HC-05 puede funcionar como maestro o como esclavo, y acepta
un número mayor de órdenes de configuración. No obstante, para las aplicaciones que
se abordarán en este documento el modelo HC-06 es más que suficiente.
Los comandos AT comenzaron a utilizarse hace algunas décadas para configurar los
primeros módems mediante las líneas del puerto serie de los ordenadores. Cada
comando consiste en una cadena de texto que siempre sigue el mismo formato:
AT+ORDEN
Donde AT viene de la palabra en inglés attention (atención), que indicaba que lo que
venía a continuación era un comando de configuración, y no un dato que tuviera que
enviarse a través de la línea telefónica.
AT+NAMEnombre
AT+PINXXXX
AT+BAUDX
NOMBRE: LINVOR
PIN: 1234
VELOCIDAD: 9600bps
Según acabamos de ver, para cambiar esta configuración lo único que tenemos que
hacer es enviar con nuestra placa Arduino los comandos AT necesarios a través del
puerto serie. A continuación se muestra un ejemplo que configura el módulo con el
nombre “Mi_HC06” y con el PIN 4444, manteniendo la velocidad de comunicación por
defecto:
Una vez cambiados estos parámetros, el módulo los guarda en su memoria interna,
por lo que sólo es necesario enviar los comandos AT una vez (mientras no queramos
modificar de nuevo los parámetros de configuración).
Content
1. Key Features ............................................................................................................................1
2. Product Description ................................................................................................................1
3. Applications .............................................................................................................................1
4. Specifications ...........................................................................................................................2
5. Electrical Characteristics .......................................................................................................2
6. Power Consumption ................................................................................................................ 2
7. Typical Application .................................................................................................................3
8. Pin Definition ...........................................................................................................................4
9. Package Description and Dimensions ....................................................................................5
10. Schematic Overview..................................................................................................................8
11. Full AT Commands list............................................................................................................11
BTM-5 Bluetooth Module Datasheet Rev2.0
1. Key Features
¾ Bluetooth Spec v2.0+EDR Compliant
¾ Class 2 type Output Power
¾ Full speed Bluetooth operation with full piconet support
¾ Scatternet support
¾ Support Serial Port Profile (SPP)
¾ Onboard antenna
¾ 3.3V operation
¾ UART interface
¾ Support for 8Mbit external onboard Flash
¾ Minimized size 26.9mm(L) x 13mm(W) x 2.2mm(H)
¾ RoHS Compliant
2. Product Description
3. Applications
¾ Bluetooth Carkit
¾ PCs
¾ Personal Digital Assistants (PDAs)
¾ Computer Accessories (Compact Flash Cards, PCMCIA Cards, SD Cards and USB Dongles)
¾ Access Points
¾ Digital Cameras
1
BTM-5 Bluetooth Module Datasheet Rev2.0
4. Specifications
Parameters Specifications
Operating Frequency Baud 2.4GHz-2.48GHz unlicensed ISM Band
Bluetooth Specification V2.0+EDR
Output Power Class -4 ~ 6dBm adjustable , Class 2
Sensitivity -80dBm at 0.1% BER
Data Rate Asynchronous: 2Mbps (Max)
Operating Voltage 3.3V
Host Interface USB / UART
Audio Interface PCM and Analog interface
Flash Memory Size 8Mbit
Operation temperature -20 ~ +55 ℃
Dimension 26.9mm(L) x 13mm(W) x 2.2mm(H)
*Specifications are subject to change without prior notice
5. Electrical Characteristics
Absolute Maximum Ratings
Rating Min Max
Storage temperature -40℃ +150 ℃
Supply voltage : VBAT -0.4V 5.6V
Other terminal voltages VSS-0.4V VDD+0.4V
6. Power Consumption
Operation Mode Connection UART Rate Average Unit
Type (kbps)
Page scan - 115.2 0.42 mA
ACL No traffic Master 115.2 4.60 mA
ACL with file transfer Master 115.2 10.3 mA
ACL 1.28s sniff Master 38.4 0.37 mA
ACL 1.28s sniff Slave 38.4 0.42 mA
SCO HV3 30ms sniff Master 38.4 19.8 mA
SCO HV3 30ms sniff Slave 38.4 19.0 mA
Standby Host connecton - 38.4 40 uA
2
BTM-5 Bluetooth Module Datasheet Rev2.0
7. Typical Application
The f ollowing sc hematic i s the ty pical hardw are a pplication for the BTM- 5 module, it
provide both RS232 and 5V TTL logic level connection to the module.
We prov ide t wo varia tions of BTM-5 breakout board, one is RS23 2 in terface, t he ot her is
TTL interface. Note that t hese two dif ferent br eakout bo ard use different su pply v oltage an d
different interface, please take care before using them.
User can change t he d efault s etting of BTM-5 m odule w ith t he AT c ommand v ia onboard
button or ‘Mode’ pin. If t he bottom pressed or ‘Mode’ pin pulled high, the module enter the AT
command mode. Th e breakout board provide two LE D to i ndicate the st atus of t he module, th e
RED led indicate the link activity status, the GREEN led indicate the pairing status.
3
BTM-5 Bluetooth Module Datasheet Rev2.0
8. Basic AT Command
Users can use AT commands t o s etup the m odule with dif ferent co nfigurations. Every AT
command must be fol lowed with <CR> and<LF> control character which is 0x0D and 0 x0A in
hexadecimal. Every AT command will foll owed with a response "OK". They will be som e basic
AT command you should know.
1. AT
AT command is use to test the module to see if it is OK.
2. AT+RESET
AT+RESET command is reset the module back to power up status.
3. AT+ROLE?
AT+ROLE? command inquiry the module's role, 0 = Slave, 1 = Master, 2 = Slave-loopback.
4. AT+ROLE=<param>
AT+ROLE command is used to set the module with master or slave, 0 = Slave, 1 = Master, 2
= Slave-loopback. You have to configure one module to master and the other to slave to become a
pair.
5. AT+CMODE?
AT+CMODE? command inquiry the link mode. 0 = Specific bluetooth link address, 1 = Any
bluetooth link address, 2 = Slave-loopback
6. AT+CMODE=<param>
AT+CMODE com mand is use d to set up m odule l ink m ode. 0 = Spec ific b luetooth link
address, 1 = Any bluetooth link address, 2 = Slave-loopback. It is better to set the mode to 1 if you
only have one pair device, because it is much easier to make them a pair.
7. AT+PSWD?
AT+PSWD? command inquiry the password of the module.
8. AT+PSWD=<param>
AT+PSWD command is used to set the pairing password.
9. AT+UART?
AT+UART? command inquiry the uart configurations
4
BTM-5 Bluetooth Module Datasheet Rev2.0
9. Pin Definition
Pin Description
1 UAR T_TXD
2 UAR T_RXD
3 UAR T_CTS
4 UAR T_RTS
9~11 N A
12 3.3V Supply input
13 GND
14~20 N A
21,22 G ND
23 PIO0 Programmable IO port
24 PIO1 Programmable IO port
25 PIO2 Programmable IO port
26 PIO3 Programmable IO port
27 PIO4 Programmable IO port
28 PIO5 Programmable IO port
29 PIO6 Programmable IO port
30 PIO7 Programmable IO port
31 PIO8 Programmable IO port
32 PIO9 Programmable IO port
33 PIO10 Programmable IO port
34 PIO11 Programmable IO port
5
FULL
BTM-5 Bluetooth Module Datasheet Rev2.0
6
Schematic overview
The following schematic is the typical hardware application for the BTM-5 module, it provide
both RS232 and 5V TTL logic level connection to the module.
The BTM-5 module pairs is default configured with 115200bps baud rate, the master and slave's
PIO8 (Pin31) indicate the link status which is connected to a LED (D2) shown in the application
schematic. When power up, the both module's LED flashes every 0.5 seconds and look for each
other for pairing. After successfully pairing, the LED flashes 3 seconds. At this time you can
transmit data via the UART port with each other.
The module's PIO11 (Pin32) is a mode selection pin to switch between normal mode and AT
command mode. In the application schematic, it is connected to a button S1. When it is press
down the module enter AT command mode, it come back to normal mode if the button is
released. Note that, when the link is not established, once the module enter AT command mode,
it will not come back to normal mode until link established or send a AT+RESET command or
re-power the module.
FAQ and Known Issues
• The module is delivered with a default baud rate of 115200, although 38400baud is
specified in the document.
• After sending AT+RESET, the module restores some "factory defaults" and the baud rate
changes to 38400
• Changing the PIO11 level from 0 to 1 or vice-versa, when the module is powered,
changes the mode of operation istantly but the LED on PIO8 blinks the same way. Thus
the user does not know whether the module changed the operation mode or not. The only
way to find out is trying to send AT commands and see if it responds in any way.
• When the module is powered up in Data Transfer Mode, the LED blinks quickly (2-3Hz)
indicating that the module is ready to connect. After a connection has been established
the LED on PIO9 lights up and the LED on PIO8 blinks short twice every second.
• When the module is powered up in AT Command Mode, the LED on PIO8 blinks
slowly(1 Hz).
#1 : Test Command
#2 : Reset
At+addr?\r\n
+ADDR:1234:56:abcdef
OK
Example:
OK
OK
at+name?\r\n
+NAME: Beijin
OK
#7: Poll remote device name
t+rname? 0002,72,0d2224\r\n
+RNAMELBluetooth
OK
In order the effectively filter the nearby device and quickly locate the users self defined
device, user can set the device to be nonstandard device, such as 0x1f1f (hex)
#10: Set/Poll Inquire Access Code
If the inquire access code is set to GIAC(General Inquire Access Code: 0x9e8b33), it can be
used to discover or be discovered by all nearby devices. If user wants the device to be able
to be found quickly, user can set the Inquire Access Code to be code not as GIAC and LIAC,
such as 0x928b3f.
Example:
AT+IAC=928b3f\r\n
OK
AT+IAC?\r\n
+ IAC: 928b3f
OK
Default: 1,1,48
AT+INQM=1,9,48\r\n -- Set inquiry mode: with RSSI, max device response number 9 then
stop inquiry, max time out 48X1.28=61.44s
OK
AT+INQM?\r\n
+INQM:1,9,48
OK
#12: Set and poll paring password
Default: 9600,0,0
Example: Set serial port parameters to 115200, 2 bits stop bit, and even parity
OK
AT+UART
+UART:115200,1,2
OK
#14: Set and poll connection mode
Default: 0
Example:
AT+BIND=1234,56,abcdef\r\n
OK
AT+BIND?\r\n
+BIND:1234:56:abcdef
OK
Param2:
0-PI09 outputs low level to turn on
LED
1-PI09 outputs high level to turn on
LED
Default: 1,1
PI08 drives the working status, and PI09 drives the link status.
Example:
PI08 outputs low level to turn on LED, and PI09 outputs high level to turn on LED.
AT+POLAR=0,1 \r\n
OK
AT+POLAR?\r\n
+POLAR:0,1
OK
Example:
1. PIO10 outputs high level
AT+PIO=10,1\r\n
OK
2. PIO10 outputs low level
AT+PIO=10,0\r\n
OK
Example:
PIO2 mask= (1<<2)=0x004
PIO10 mask = (1<<10)=0x400
PIO port mask combination= (0x004 | 0x400)=0x404
PIO 2 and PIO 10 output high:
AT+MPIO=404\r\n
OK
#19: Poll PIO port input
Default: 0,0,0,0
#22: Set/Poll Security and Encryption modes
Default: 0,0
Example:
Delete device with address: 12:34:56:ab:cd:ef
at+rmsad=1234:56:abcdef\r\n
OK
Or
at+rmsad=1234:56:abcdef\r\n
FAIL ==== there is no such device in the list
#24: Delete all Authenticated Devices from the authenticated device list
Example:
Finddevice with address: 12:34:56:ab:cd:ef
at+FSAD=1234:56:abcdef\r\n
OK
Or
at+fsad=1234:56:abcdef\r\n
FAIL ==== there is no such device in the list
#26: Obtain the total Authenticated Device number in the authenticated device list
Example 1:
at+init\r\n —— Initialize SPP (can’t repeatedly initialize)
OK
at+iac=9e8b33\r\n ——inquire general inquire access code
OK
at+class=0\r\n —— inquire all devices types
OK
at+inqm=1,9,48\r\n —— Inquire mode: RSSI, max number 9, timeout 48
At+inq\r\n —— inquire
+INQ:2:72:D2224,3E0104,FFBC
+INQ:1234:56:0,1F1F,FFC1
+INQ:1234:56:0,1F1F,FFC0
+INQ:1234:56:0,1F1F,FFC1
+INQ:2:72:D2224,3E0104,FFAD
+INQ:1234:56:0,1F1F,FFBE
+INQ:1234:56:0,1F1F,FFC2
+INQ:1234:56:0,1F1F,FFBE
+INQ:2:72:D2224,3E0104,FFBC
OK
The Class of Device/Service(CoD)is a 32 bits number that is made of 3 fields. One field
specifies the service supported by the device. Another field specifies the major device
class, which broadly corresponds to the type of the device. The third field specifies the
minor device class, which describes the device type in more detail.
The Class of Device/Service (CoD) field has a variable format. The format is indicated
using the 'Format Type field' within the CoD. The length of the Format Type field is
variable and ends with two bits different from '11'. The version field starts at the least
significant bit of the CoD and may extend upwards. In the 'format #1' of the CoD
(Format Type field = 00), 11 bits are assigned as a bit-mask (multiple bits can be set)
each bit corresponding to a high level generic category of service class. Currently 7
categories are defined. These are primarily of a 'public service' nature. The remaining 11
bits are used to indicate device type category and other device-specific
characteristics.Any reserved but otherwise unassigned bits, such as in the Major Service
Class field, should be set to 0.
Figure 1.2: The Class of Device/Service field (first format type). Please note the order in
which the octets are sent on the air and stored in memory. Bit number 0 is sent first on
the air.
1. MAJOR SERVICE CLASSES
Bluetooth SIG]
The Major Class segment is the highest level of granularity for defining a Bluetooth Device.
The main function of a device is used to determine the major class grouping. There are 32
different possible major classes. The assignment of this Major Class field is defined in
Table 1.3.
[Ref #2: Used where a more specific Major Device Class code is not suited (but only as
specified in this document). Devices that do not have a major class code assigned can use
the all-1 code until 'classified']
3. THE MINOR DEVICE CLASS FIELD
The 'Minor Device Class field' (bits 7 to 2 in the CoD), are to be interpreted only in
the context of the Major Device Class (but independent of the Service Class field).
Thus the meaning of the bits may change, depending on the value of the 'Major
Device Class field'. When the Minor Device Class field indicates a device class, then
the primary device class should be reported, e.g. a cellular phone that can also work
as a cordless handset should use 'Cellular' in the minor device class field.
TABLE 1.4: SUB DEVICE CLASS FIELD FOR THE 'COMPUTER' MAJOR CLASS
[Ref #3: "Device is fully utilized and cannot accept additional connections at this
time, please retry later"]
The exact loading formula is not standardized. It is up to each LAN/Network Access
Point implementation to determine what internal conditions to report as a
utilization percentage. The only requirement is that the number reflects an ever-
increasing utilization of communication resources within the box. As a
recommendation, a client that locates multiple LAN/Network Access Points should
attempt to connect to the one reporting the lowest load.
[Ref #4: Only to be used with a Gaming/Toy device that makes audio/video
capabilities available via Bluetooth]
TABLE 1.8: SUB DEVICE CLASSES FOR THE 'AUDIO/VIDEO' MAJOR CLASS
The Inquiry Access Code is the first level of filtering when finding Bluetooth devices and
services. The main purpose of defining multiple IACs is to limit the number of responses
that are received when scanning devices within range.
The Limited Inquiry Access Code (LIAC) is only intended to be used for limited time periods
in scenarios where both sides have been explicitly caused to enter this state, usually by user
action. For further explanation of the use of the LIAC, please refer to the Generic Access
profile.
In contrast it is allowed to be continuously scanning for the General Inquiry Access Code
(GIAC) and respond whenever inquired.
Tema 9
Pantalla LCD
1.- Introducción___________________________________________________
El líquido de una pantalla LCD está entre dos placas de vidrio paralelas con una
separación de unos micrones. Estas placas de vidrio tienen unos electrodos especiales
que definen, con su forma, los símbolos, caracteres, etc. que se visualizarán.
La superficie del vidrio que hace contacto con el líquido es tratada de manera que
induzca la alineación de los cristales en dirección paralela a las placas. Esta alineación
permite el paso de la luz incidente sin ninguna alteración.
Por tanto, los LCD son visualizadores pasivos. Esto significa que no emiten luz como
una pantalla de 7 segmentos hecha con un conjunto de diodos LED. Por esa razón la
pantalla LCD tiene muy bajo consumo de energía.
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
La siguiente gráfica muestra los diferentes elementos que componen una pantalla de
cristal líquido:
A la hora de clasificar las pantallas LCD, podemos hacerlo en base a dos criterios: su
tamaño y su iluminación.
Tamaño:
El tamaño viene definido por el número de filas y columnas de que dispone la pantalla.
Las pantallas más habituales son de 2x16 (2 filas y 16 columnas), aunque las hay de
muchos tamaños diferentes, incluso de 4x80.
Pantalla de 1x16
2
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
La pantalla de cristal líquido con la que vamos a trabajar es una pantalla estándar que
dispone de 2 filas de 16 caracteres cada una, y cada carácter dispone de una matriz de
5x7 puntos (pixeles). Es importante tener en cuenta que, aunque esta pantalla sólo puede
mostrar 16 caracteres en una fila, realmente cada fila tiene una memoria de 40
caracteres, por lo que se pueden escribir mensajes con más de 16 caracteres,
desplazando después la pantalla por software para mostrar todo el mensaje.
Iluminación:
Sin retroiluminación: la propia pantalla no emite ninguna luz. Para visualizar los
caracteres usa la propia luz ambiente, que es reflejada por el fondo de la pantalla
excepto en aquellos lugares en los que el cristal líquido ha sido polarizado, dibujando
así las formas de los caracteres. Por tanto, en ausencia de luz externa, es imposible
ver el mensaje de la pantalla. Como ventaja, su consumo se mínimo, ya que no emite
luz.
Con retroiluminación: estas pantallas emiten una luz, generada normalmente con
diodos situados en la parte trasera de la pantalla, lo que permite ver el mensaje
mostrado incluso en condiciones de total oscuridad. Como desventaja, como es
normal, presentan un consumo mayor que las pantallas sin retroiluminación.
3
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Las imágenes superiores muestran el aspecto de la parte trasera de dos pantallas LCD.
En ambos casos se observan dos circuitos integrados. Uno de ellos es el controlador de
la pantalla (El HD44780 de Hitachi u otro compatible), mientras que el otro es una
memoria EEPROM donde vienen almacenados los caracteres que puede representar la
pantalla. Se trata de 240 caracteres ASCII ya predefinidos (letras mayúsculas,
minúsculas, signos de puntuación, números, etc), junto con 8 caracteres definibles por el
usuario vía software.
Las pantallas LCD pueden ser de 14 pines (en caso de que no dispongan de
retroiluminación), o de 16 pines (si disponen de retroiluminación).
La siguiente gráfica muestra la distribución habitual de los pines de una pantalla LCD:
4
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
5
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Pin 4 – RS Indica al controlador interno del LCD que el valor presente en el bus
de datos es un comando o bien un carácter para representar
RS = 0 Comando
RS = 1 Datos
Pin 5 – RW Permite decidir si queremos enviar datos a la pantalla o bien nos
interesa leer lo que la pantalla tiene en su memoria o conocer su estado.
RW = 0 El módulo LCD es escrito
RW = 1 El módulo LCD es leído
Pin 6 - E Señal de activación del módulo LCD:
E = 0 Módulo desconectado
E = 1 Módulo habilitado
• Pines 7, 8, 9, 10, 11, 12, 13, 14: Estos ocho pines son el “bus de datos” del
controlador de la pantalla. Llamados DB0-DB7, son los encargados de recibir (o
enviar) los comandos o datos desde o hacia la pantalla.
• Pines 15 y 16: estos pines solo aparecen en las pantallas que disponen de
retroiluminación, y se utilizan para alimentar los LEDs del fondo de la
pantalla que proporcionan la retroiluminación. El pin 15 debe ser conectado
a 5 voltios y el 16 a masa. En estas condiciones, la luz de fondo estaría
encendida al 100% de su intensidad. Nuevamente, se puede utilizar un
potenciómetro para ajustar el brillo.
6
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
7
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Controlar una pantalla LCD con Arduino es realmente fácil gracias a la librería
LiquidCrystal incorporada en el IDE de Arduino. Esta librería contiene una serie de
funciones que permiten escribir texto, borrar la pantalla, situar el cursor en la
posición deseada, etc, para cualquier pantalla LCD basada en el controlador
Hitachi HD44780 o compatible.
Para poder utilizar las funciones de la librería, en primer lugar es necesario incluir la
librería al principio del programa, antes de la función setup() de la siguiente forma:
donde:
nombre es el nombre del objeto de tipo LiquidCrystal que crearemos. Podemos
usar el que queramos, por ejemplo lcd, milcd o cualquier otro.
rs, enable, db4, db5, db6, db7 son el número de los pines de Arduino donde
conectamos cada uno de los pines de la pantalla LCD.
Ejemplo:
Los pines de Arduino a los que conectemos la pantalla LCD pueden ser cualquiera de
los digitales.
8
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Una vez creado el objeto de clase LiquidCrystal, ya se pueden utilizar cualquiera de las
funciones de la librería. A continuación se describen las principales funciones de la
librería para el manejo de la pantalla LCD, separadas en dos grupos: funciones básicas y
funciones avanzadas.
lcd.begin(columnas, filas)
lcd.print(dato)
lcd.print(dato, formato)
9
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
lcd.clear()
lcd.setCursor(columna,fila)
Sitúa el cursor en la posición especificada por los parámetros columna y fila. La primera
columna de la izquierda es la 0 y la última es la 15. En cuanto a las filas, la superior es
la 0, y la inferior es la 1.
Ejercicio resuelto:
10
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Ejercicios______________________________________________________________
1.- Modifica el programa anterior para que muestre por la pantalla LCD de forma
alternativa los mensajes “Hola” y “Adios”. Cada mensaje debe tener una duración de
2 segundos. Los mensajes deberán superponerse, es decir, cuando sale la palabra
"Adios", deberá desaparecer la palabra "Hola".
2.- Modifica el programa anterior para que la palabra “Hola” salga en el centro de la
primera línea y la palabra “Adios” en el centro de la segunda.
3.- Realiza un programa que muestre por la pantalla LCD un mensaje parpadeante.
Concretamente, la pantalla debe mostrar la frase “Mensaje parpadeo” durante un
segundo, y después debe estar en blanco durante otro segundo, repitiéndose este
proceso de forma indefinida.
4.- Realiza un programa que muestre por la primera línea de la pantalla LCD un
mensaje parpadeante y por la segunda línea un mensaje fijo. Concretamente, la
pantalla debe mostrar las frases “Esta SI parpadea” y “Esta NO parpadea”, cada una
en una línea diferente. La velocidad de parpadeo debe ser, como en el ejercicio
anterior, de 1 segundo.
TEMPERATURA: XX C
HUMEDAD: XX %
6.- Modifica el programa anterior para que Arduino genere una alarma sonora con un
zumbador cada vez que la temperatura supera los 25 grados.
7.- Modifica el programa anterior para que la alarma sonora pueda activarse o
desactivarse apretando un pulsador. Cada vez que se accione el pulsador, la alarma
cambiará de estado (activa/desactiva). Para indicar que la alarma está activa, la
pantalla LCD mostrará en su esquina inferior derecha el símbolo ‘*’. Si no se muestra
el símbolo, significará que la alarma está desactivada, y por tanto el zumbador no
pitará aunque la temperatura supere los 25 grados.
11
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
lcd.scrollDisplayRight()
Realiza el desplazamiento de la pantalla de una posición a la derecha.
lcd.scrollDisplayLeft()
Realiza el desplazamiento de la pantalla de una posición a la izquierda.
lcd.home()
Lleva el cursor a la esquina superior izquierda (sin borrar la pantalla).
lcd.cursor()
Provoca la aparición del cursor, que por defecto no aparece. El cursor se representa
como un guión bajo ( _ ).
lcd.noCursor()
Hace desaparecer el cursor. Solamente es necesario llamar a esta función si previamente
se ha llamado a la función lcd_cursor(), ya que por defecto el cursor no aparece.
lcd.blink()
Hace que el cursor aparezca parpadeando. En este caso el cursor no se representa como
un guión bajo, sino como un rectángulo ( █ ).
lcd.noBlink()
Hace que el cursor deje de parpadear y desaparezca. Solamente es necesario llamar a
esta función si previamente se ha llamado a la función lcd_blink(), ya que por defecto el
cursor no aparece.
lcd.leftToRight()
Determina el sentido de escritura de los caracteres de izquierda a derecha, es decir, el
sentido normal de escritura.
lcd.rightToLeft()
Determina el sentido de escritura de los caracteres de derecha a izquierda, es decir, el
sentido contrario al habitualmente utilizado.
lcd.autoscroll()
Activa la función de autoscroll, es decir, que la pantalla se desplace una posición cada
vez que se imprima un nuevo carácter.
lcd.noAutoscroll()
Desactiva la función de autoscroll.
12
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
lcd.display()
Enciende la pantalla LCD
lcd.noDisplay()
Apaga la pantalla LCD
Ejercicio resuelto:
13
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Ejercicios______________________________________________________________
8.- Modifica el programa anterior para que el sentido del desplazamiento de la palabra
se pueda elegir mediante dos pulsadores. Si se acciona el primer pulsador, la palabra
se desplazará hacia la izquierda, como en el ejercicio anterior. Si se acciona el
segundo pulsador, la palabra de desplazará hacia la derecha.
9.- Modifica el ejercicio 8.6. de forma que el camino que siga la palabra "Pillame" una
vez accionado el pulsador sea más largo. En concreto, deberá ser el siguiente: la
palabra se irá desplazando hacia la izquierda hasta salirse por el lado izquierdo de la
pantalla. Dos segundos después volverá a aparecer por el lado izquierdo de la pantalla,
pero por la fila de abajo, e irá desplazándose hacia la derecha hasta salirse por
completo por el lado derecho de la pantalla. Dos segundos después comenzará a
aparecer por la fila superior del lado derecho, desplazándose hacia la izquierda, hasta
situarse en el centro de la fila superior, es decir, en el punto de partida.
11.- Realiza un programa en el que se escriban dos frases en la pantalla LCD, una en
cada fila. En la primera fila aparecerá la frase "sentido normal", y en la segunda
aparecerá "sentido inverso". Las frases no se escribirán de golpe, sino letra a letra, con
un tiempo entre cada letra de 250ms. En la primera frase se utilizará el sentido normal
de escritura (de izquierda a derecha), mientras que en la segunda se empleará el orden
inverso (de derecha a izquierda). El cursor permanecerá activado todo el tiempo.
Cuando se terminen de escribir las dos frases, se borrará la pantalla y comenzará de
nuevo el proceso.
12.- Realiza un programa que muestre en la pantalla LCD el turno de una cola, de 1 a
99, incrementándose cada vez que se acciona un pulsador. En el centro de la primera
línea se visualizará el mensaje “SU TURNO”, mientras que en el centro de la segunda
línea aparecerá el turno actual. Cuando se pase del turno 99, se volverá a comenzar
por el turno 1. Además, se añadirá al sistema un zumbador, de forma que cada vez que
se cambie de turno, el zumbador sonará durante medio segundo.
13.- Realiza un programa que lleve a cabo la siguiente función: cada vez que se
accione un pulsador, se escribirá en la primera línea una letra del abecedario,
incrementándose desde la 'a' hasta la 'z'. Cuando se alcancen las primeras 16 letras, la
primera línea de la pantalla estará completa, por lo que, para poder ver la siguientes
letras, cada vez que se escriba una nueva letra la pantalla se desplazará una posición a
la izquierda. Cuando se llegue a la letra 'z', se borrará la pantalla y se empezará de
nuevo.
14
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
14.- Realiza un programa que lleve a cabo la siguiente función: cada vez que se
accione un pulsador, se escribirá en la primera línea una letra del abecedario,
incrementándose desde la 'a' hasta la 'z'. Cuando se alcancen las primeras 16 letras, la
primera línea de la pantalla estará completa, por lo que, para poder ver la siguientes
letras, se continuará escribiendo las letras en la segunda línea. Cuando se llegue a la
letra 'z', se borrará la pantalla y se empezará de nuevo.
15.- Realiza un programa para controlar el nivel de iluminación de una tira de LEDs
mediante dos pulsadores y un menú que aparecerá en la pantalla. Inicialmente
aparecerá el siguiente menú:
16.- Modificar el ejercicio anterior para que en el menú aparezca la información del
nivel actual de iluminación. Para ello, cuando el usuario escoja un nivel de iluminación
determinado, aparecerá junto a la cifra elegida el símbolo '*', que se mantendrá en
dicha posición hasta que el usuario cambie el nivel de iluminación, momento en el que
el símbolo se situará junto al nuevo valor elegido.
15
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Aunque con Arduino podemos controlar cualquier pantalla LCD, existe una shield
especialmente diseñada para Arduino, conocida como LCDKeypad, donde además de la
pantalla disponemos de 6 pulsadores, un circuito de regulación de contraste con un
potenciómetro multivuelta y, como todas las shields, se integra sobre el Arduino
conectándose sin necesidad de cableado.
16
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Aunque la shield lleva muchas conexiones con Arduino, sólo utiliza las que se
enumeran en la siguiente tabla, dejando el resto libre para otros usos:
Como se puede observar, esta shield utiliza 7 líneas de entrada/salida digitales y una
entrada analógica de Arduino. La entrada analógica se emplea para leer el estado de
los pulsadores con una única línea, utilizando para ello un divisor resistivo, tal y como
se muestra en el siguiente esquema:
17
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Cuando se accione uno de los pulsadores, aparecerá una tensión en el pin AN0 cuyo
valor dependerá del pulsador accionado. Por tanto, haciendo una lectura analógica
de dicho pin se puede determinar la identidad del pulsador accionado. Para ello,
teniendo en cuenta que el convertidor A/D de Arduino es de 10 bits y su valor máximo
es de 1023, podemos seguir la siguiente regla:
18
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
19
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
Por último, en la página siguiente se muestra el ejercicio resuelto de la página 13, pero
en esta ocasión adaptado a la LCDKeypad shield. Como se puede observar, la única
diferencia reside en la lectura del pulsador, que en esta ocasión se resuelve efectuando
una lectura analógica del pin AN0.
20
_________________Gonzalo Penalva Torregrosa y Marcos Benavent Pla__________________
21