You are on page 1of 92

Copyright 2017,Rubn Beiroa Mosquera

Todos los derechos reservados.


Queda prohibida la reproduccin total o parcial sin el permiso previo y por escrito del titular
del Copyright.

1
ndice
Introduccin 3
Estructuras de control de flujo repetitivas 3
while 4
do while 8
for 11
break y continue 13
go to 14
Comunicacin serie 15
Monitor serie 17
Enviar datos del Arduino al IDE 21
Saltos de lnea y tabulaciones 31
Variables 34
Recibir datos 42
Comunicacin serie entre Arduinos 57
Funciones 68
Funciones con valor de retorno 73
Pasar parmetros a una funcin 76
Interrupciones 81
Interrupciones por seal 81
Interrupciones por tiempo 85
Fritzing 87
Simuladores 90

2
www.full-ebook.com
Introduccin
Este ejemplar es la continuacin del libro Arduino. Entendiendo el
mundo. Tomo I. Por lo tanto, si no has ledo el Tomo I, te recomiendo
que lo hagas antes de continuar con la lectura de este. La finalidad de
este libro es compartir nuevos conocimientos relacionados con los
vistos en el libro anterior.

Pese a que los contenidos de ambos libros son diferentes, el


desarrollo de ambos es idntico. Cada nuevo conocimiento que
descubramos vendr acompaado de casos prcticos resueltos para
poder asimilarlo de forma sencilla y se propondrn ejercicios para que
el pblico lector evale lo aprendido.

Como ya sabemos, Arduino es una plataforma y, como tal, dispone


de varios elementos: hardware, software y lenguaje de
programacin. Este libro pretende ampliar tu lenguaje de
programacin y, teniendo en cuenta la base que hemos visto en el
libro anterior, no necesitamos aadir ms conceptos sobre electrnica
y hardware, pero si sobre el IDE de Arduino.

Los temas que veremos sern: estructuras de control de flujo


repetitivas, comunicacin serie, funciones, interrupciones, Fritzing y
simuladores. Una vez finalizado este libro, junto con el Tomo I,
dispondremos de una base para empezar a desarrollar nuestros
proyectos; an as, existen otros tomos dentro de esta serie que
comprenden mayores niveles de programacin y electrnica (sobre
Arduino).

Estructuras de control de flujo repetitivas


Este tipo de estructuras son tambin conocidas como bucles; se
diferencian de las estructuras no repetitivas en que, siempre y
cuando se cumpla la condicin o condiciones, se ejecutan las lneas
de cdigo una y otra vez sin salir de la estructura.

3
www.full-ebook.com
while

Esta estructura ejecuta las instrucciones que se encuentran entre sus


llaves de apertura y cierre. Cuntas veces? Se ejecutarn mientras
la condicin especificada se cumpla, sin ejecutarse ninguna otra lnea
de cdigo que se encuentre fuera de la estructura.

while(condicin)
{
//Instrucciones que se ejecutan mientras se cumpla la condicin
}

Imagen 1.

Imagen 2.

4
www.full-ebook.com
Imagen 3.

Imagen 4.

Al cagar este programa con el circuito anterior, mientras el botn


est pulsado, el led se encender y, en el momento en que deje de
estar pulsado, se apagar un mnimo de dos minutos. Al igual que
ocurra con las instrucciones de control de flujo no repetitivas,
podemos aadir tantas condiciones como sean necesarias.

5
www.full-ebook.com
Imagen 5.

Imagen 6.

Ejercicio propuesto:

1.Conectar un led, un botn y un potencimetro. Regular el led


mientras el botn est pulsado.

6
www.full-ebook.com
1. Conectar un led, un botn y un potencimetro. Regular el led
mientras el botn est pulsado.

7
www.full-ebook.com
do while

La estructura do while funciona igual que while. La diferencia es que


las lneas de cdigo de esta nueva estructura se ejecutan al menos
una vez; despus de esto, se evala la condicin y, si se cumple, se
vuelven a ejecutar mientras se siga cumpliendo.

do
{
//Instrucciones que se ejecutan al menos una vez y
mientras se cumpla la condicin

}while(condicin);

Imagen 7.

8
www.full-ebook.com
Imagen 8.

Imagen 9.

Ejercicios propuestos:

2. Conectar un led y un potencimetro. El led siempre se tiene que


encender durante al menos 1 segundo y, si la entrada analgica
(conectada al potencimetro) recibe una seal entre 1 y 4 V,
permanecer encendido al menos 1 segundo ms. Cuando no se
cumpla esta condicin, el led deber apagarse durante al menos 4
segundos.

9
www.full-ebook.com
2.Conectar un led y un potencimetro. El led siempre se
tiene que encender durante al menos 1 segundo y, si la
entrada analgica (conectada al potencimetro) recibe una
seal entre 1 y 4 V, permanecer encendido al menos 1
segundo ms. Cuando no se cumpla esta condicin, el led
deber apagarse durante al menos 4 segundos .

10
www.full-ebook.com
for

Esta estructura permite fijar el nmero de veces que se repite la


ejecucin de las lneas de cdigo que engloba.

for(valor_inicial_contador ; valor_final_contador ; operacin)


{
//Instrucciones que se repetirn un nmero determinado de
veces
}

La condicin de esta estructura viene definida por tres parmetros:

Valor inicial: puede empezar por cualquier valor numrico.

Valor final contador: cada vez que se ejecuten las instrucciones


de la estructura, se incrementa el valor del contador conforme
se defina en el campo de operacin y se comprueba si se
alcanza el valor final; de ser as, se da por finalizado el bucle y
se continua con la ejecucin del resto del programa.

Operacin: define qu operacin se realiza sobre el valor del


contador del bucle (suma, resta, multiplicacin, divisin).

11
www.full-ebook.com
Imagen 10.

Imagen 11.

Imagen 12.

12
www.full-ebook.com
break y continue

Son instrucciones que permiten modificar la ejecucin de una


estructura. Con la instruccin break, se da por finalizada la ejecucin
de una estructura de control. La instruccin continue fuerza a volver
a la primera instruccin de la estructura, sin evaluar las condiciones
ni ejecutar las lneas de cdigo restantes.

Imagen 13.

Imagen 14.

13
www.full-ebook.com
Imagen 15.

go to

Esta instruccin permite saltar a la lnea de cdigo que contenga una


etiqueta en concreto.

go to nombre_etiqueta;
-
.
.
.
nombre_etiqueta:;

Imagen 16.

14
www.full-ebook.com
Imagen 17

La instruccin go to puede saltar tanto a una etiqueta que se


encuentre despus o antes. No puede haber dos etiquetas con el
mismo nombre, puesto que entonces no sabra a cul de ellas saltar y
el nombre de las etiquetas sigue las mismas reglas que la declaracin
de una variable.

Comunicacin serie
Para transmitir datos al exterior, un Arduino dispone de varios
protocolos de comunicacin: atendiendo a si es una comunicacin
sncrona o asncrona, disponemos de varios protocolos de
comunicacin. En este captulo, trabajaremos con la comunicacin
serie (UART).

La comunicacin serie es un elemento importante de un Arduino, no


solo por permitir establecer una comunicacin con un entorno (PC,
mdulos u otros Arduinos) de una forma diferente a lo que hemos
hecho hasta ahora (entradas/salidas digitales, salidas PWM o
entradas analgicas), sino porque nos va ha permitir afianzar los
conocimientos adquiridos en el primer tomo.

La conexin USB del Arduino, adems de alimentar el Arduino, sirve


para la transferencia de informacin; de hecho, ya lo hemos utilizado,
cada vez que cargamos un programa. Esto es posible porque tanto el
PC como el Arduino pueden manejar el protocolo USB.

El protocolo USB es demasiado complejo para el MCU del Arduino


UNO, por lo que se necesita un elemento que traduzca el protocolo

15
www.full-ebook.com
USB. Para ello, el Arduino UNO dispone de un segundo MCU
(ATmega16U2), que realiza la traduccin.

Imagen 18.

Todos los MCU de los Arduinos disponen entonces del hardware para
establecer una comunicacin UART (transmisor receptor asncrono
universal). No necesitamos profundizar en esta tecnologa, lo que nos
interesa saber es que, para que dos dispositivos se comuniquen
mediante UART, se necesitan tres cables: TX, que es por el que se
transmite, RX, por el que se recibe y GND, conexin en comn entre
ambos dispositivos. Al disponer de dos lneas diferentes para recibir y
enviar datos, la comunicacin es full duplex (informacin en ambos
sentidos).

El MCU del Arduino UNO (ATmega328p) proporciona una


comunicacin serie UART TTL (se trata de un tipo de tecnologa),
presente en los pines 0 (RX) y 1 (TX). Por lo tanto, podemos
establecer una comunicacin serie por el puerto USB o por los pines 0
y 1.

Quiere esto decir que puedo enviar y recibir datos por el


conector USB y por los pines 0 y 1? S y no, podemos establecer
una comunicacin por una de las dos vas, pero no por las dos
simultneamente.

16
www.full-ebook.com
Imagen 19.

Como se puede ver en la imagen anterior, internamente, los pines 0


y 1 intervienen en la comunicacin serie con el PC.

Monitor serie

Si nos vamos a la barra de botones del IDE de Arduino, en el margen


derecho, disponemos de un botn con una lupa.

Imagen 20.

Si hacemos clic sobre la lupa, se abre una pestaa, adems del IDE
de Arduino, lo que se conoce como monitor serie.

17
www.full-ebook.com
Imagen 21. Monitor serie

Para que se abra, es imprescindible tener un Arduino conectado al


puerto USB del PC y que el IDE detecte el Arduino. Si no es as y
tratamos de abrir el monitor serie, el IDE nos mostrar un error.

Imagen 22. Error Arduino no conectado

Si volvemos al monitor serie, encontramos varios apartados, que


iremos descubriendo poco a poco.

Imagen 23.

18
www.full-ebook.com
Imagen 24.

Imagen 25.

Una vez montado el circuito anterior y con el programa cargado,


comprobamos que el led parpadea 4 veces una vez finalizado. Si
abrimos el monitor serie, vemos que se vuelve a repetir la operacin
y el led vuelve a parpadear 4 veces. Esto se debe a que, cada vez
que abrimos el monitor serie, se resetea el Arduino (gracias al MCU
ATmega16U2). Al resetearse, como sabemos, se vuelve a ejecutar la
parte del programa que se encuentra en el void setup y, despus, de
forma cclica, el void loop.

Al lado del conector USB del hardware del Arduino UNO, disponemos
de un botn que sirve para restear el Arduino. Si continuamos con el
mismo programa y circuito anteriores y pulsamos el botn, vemos
que ocurre lo mismo que al abrir el puerto serie.

19
www.full-ebook.com
Imagen 26.

Empecemos a usar la comunicacin serie del Arduino: para ello,


necesitamos programar el elemento Serial. Para cualquier operacin
emplearemos el prefijo Serial, ms la operacin que hay que
realizar. Al igual que ocurra cuando utilizbamos los pines digitales,
cada operacin vena precedida del prefijo digital ms la operacin,
por ejemplo: digitalRead, digitalWrite.

Serial.begin(parmetro);

Instruccin imprescindible para utilizar la comunicacin serie,


sirve para inicializar la velocidad (bits/s) del puerto serie, que debe
ser la misma que tiene el monitor serie. Posibles valores:

300
1200
2400
4800
9600
19200
38400
57600
74880
115200
230400
250000

Estas velocidades son estndares; la mayora de los sistemas utiliza,


por defecto, la velocidad de 9600 bits/s.

20
www.full-ebook.com
Imagen 27.

Por lo tanto, con las velocidades configuradas, vamos a enviar


nuestro primer mensaje del Arduino al PC.

Enviar datos del Arduino al IDE

Disponemos de diferentes instrucciones para enviar datos del Arduino


al exterior por el puerto serie.

Serial.println();

Esta instruccin permite enviar datos por el puerto USB y, una


vez finalizado el envo, realiza un salto de lnea (equivalente a pulsar
Enter en una hoja de Word).

Imagen 28.

21
www.full-ebook.com
Imagen 29.

Si cargamos el programa anterior y abrimos el monitor serie, vemos


que cada dos segundos recibimos el mensaje de Arduino.
Entendiendo el mundo y cada mensaje en una lnea diferente.

Podemos enviar un texto fijo con la instruccin Serial.println(); ms


lo que queramos enviar entre comillas.

Serial.print();

Cuenta con el mismo funcionamiento que Serial.println();. La


diferencia radica en que no se produce un salto de lnea.

Imagen 30.

Si cargamos este programa y abrimos el monitor serie, podemos


comprobar que, a diferencia del caso anterior, todos los mensajes no
se ven en diferentes lneas, sino en la misma lnea, que se va
haciendo cada vez ms grande.

Imagen 31.

Ahora que podemos enviar mensajes y visualizar informacin en


nuestro IDE, y antes de continuar, vamos a aprovechar estas
cuestiones para hacer un repaso de lo que ya hemos visto en el
primer tomo.

22
www.full-ebook.com
Imagen 32. Conexin Pull-Down externa

Imagen 33.

Si recordamos lo que vimos en el primer tomo, un Arduino solo


trabaja con ceros y unos. Al leer una entrada en la que tengamos
5 V, el Arduino lo traduce a un valor binario de 1 y, si hay 0 V, lo
traduce a 0. Para enviar datos que provengan de una funcin, no se
escriben entre comillas.

Imagen 34.

Si, por el contrario, la conexin es INPUT_PULLUP, estos valores se


invierten.

23
www.full-ebook.com
Imagen 35.

Imagen 36

Si abrimos el monitor serie, los valores se invierten:

Imagen 37.

Con el smbolo, invertimos el valor, por lo que el comportamiento es


el mismo que con una conexin Pull_Down.

24
www.full-ebook.com
Imagen 38.

Imagen 39.

En cuanto a las entradas analgicas, y como el Arduino UNO tiene


una resolucin de 10 bits, si conectamos un potencimetro, la lectura
que se tome vara entre 0 y 1023, que equivale a 0 y 5 V.

Imagen 40.

25
www.full-ebook.com
Imagen 41.

Imagen 42.

Imagen 43.

Si abrimos el monitor serie, comprobamos que, al llegar a 255 la


variable se resetea y se comienza otra vez a contar desde cero; esto
sucedera continuamente.

26
www.full-ebook.com
Por qu? Un byte est formado por 8 bits, esto significa que
tenemos 256 (28) posibles combinaciones de ceros y unos. Si esto lo
traducimos a nmeros reales, comprendera nmeros entre 0 y 255.
Como la variable es de tipo byte, al llegar a 255 y tratar de
incrementar el valor del contador, este se resetea y vuelve a empezar
desde 0.

Vamos a ir un poco ms all: enviamos el mismo contador, pero


ahora, aadimos, al lado de cada valor, su equivalente en binario.

Imagen 44.

Imagen 45.

Observamos que, al llegar a 255 en binario, se traduce de 8 bits a 1


y, al tratar de incrementar otra vez el contador, este se resetea.

27
www.full-ebook.com
Con todos estos conceptos ms claros, vamos a sacarle un poco ms
de partido a la monitorizacin de un Arduino.

Imagen 46.

Lo que vamos hacer es que el Arduino nos enve un mensaje para


saber cundo se enciende y cundo se apaga el led.

Imagen 47.

28
www.full-ebook.com
Imagen 48.

Con todo esto, podemos monitorizar el estado del led a travs del
IDE. Puede darse la circunstancia de que, al cambiar de estado, nos
enve dos veces el mensaje de encendido y apagado. Esto es debido
al mecanismo de un interruptor, que introduce interferencias en la
seal; veremos en prximos tomos cmo eliminar esto.

Imagen 49.

Si nos fijamos en la imagen anterior, lo ideal en el cambio de estado


de una seal (de 0 a 5 V y viceversa) es el camino definido por la
lnea verde; sin embargo, por el mecanismo del botn que utilizamos,
que no es ideal, describe un camino similar al definido por la lnea
roja.

Lo que hace esto es que la seal pase varias veces por el margen que
delimita los dos estados posibles: encendido o apagado, 0 o 1...
Entonces, cabe la posibilidad de tomar lecturas incorrectas. Veremos
cmo solucionar esta cuestin en el prximo tomo, profundizando en
un componente nuevo: el condensador.

Vamos a certificar el margen de 2,5 voltios, ahora que sabemos


enviar informacin al IDE.

29
www.full-ebook.com
Imagen 50.

Imagen 51.

Imagen 52.

Imagen 53.

30
www.full-ebook.com
Tenemos conectado el potencimetro, por un lado, a la entrada
analgica y, por otro, a una entrada digital. Lo que se pretende
demostrar es que los mrgenes para cada estado son: de 0 a 2,5 V,
estado = 0, y de 2,5 a 5 V, estado = 1. Si analizamos el
comportamiento, vemos que, entre 2,4 y 2,6, los cambios se pueden
volver difciles de predecir; es un factor que hay que tener en cuenta
a la hora de disear los circuitos con los que trabajemos.

Saltos de lnea y tabulaciones

Salto de lnea: \n

Al aadir los caracteres \n, el IDE de Arduino lo interpretar como un


salto de lnea.

Imagen 54.

Imagen 55.

En el caso del programa anterior, apreciamos que, a pesar de enviar


un mensaje con la instruccin Serial.print(); y no Serial.println();,
tras cada mensaje enviado a travs del Arduino, se hace un salto de
lnea; esto sucede por incluir, al final del mensaje, la cadena de
caracteres \n. Podemos incluir tantos saltos de lnea como
necesitemos.

31
www.full-ebook.com
Imagen 56.

Imagen 57.

Se realizarn tantos saltos de lnea como \n se concatenen. Adems,


se pueden incluir en cualquier parte del texto.

Imagen 58.

32
www.full-ebook.com
Imagen 59.

Tabulacin: \t

Al igual que ocurra con \n, que incluye un salto de lnea, con los
caracteres \t se incluye una tabulacin.

Imagen 60.

Imagen 61.

33
www.full-ebook.com
En resumen, el funcionamiento es igual que \n, pero haciendo una
tabulacin y, por supuesto, se pueden usar en un mismo mensaje
varios saltos de lneas y tabulaciones.

Variables

Hasta ahora, hemos visto casi todos los tipos de datos numricos,
salvo los datos tipo float y double, que permiten almacenar datos con
decimales. En estas variables, se pueden almacenar datos entre
3.4028235x1038 a 3.4028235x1038 y se escriben con punto y no con
coma.

En la introduccin de la comunicacin serie ya hemos manejado


datos no numricos; por lo tanto, vamos a ver cmo se operan y
almacenan estos nuevos tipos de datos.

Los MCU solo operan con 0 y 1, cmo podemos, entonces,


trabajar con caracteres? En realidad, un MCU no entiende nada
ms all de 0 y 1; por lo tanto, lo que se hizo fue una tabla para
codificar caracteres en dgitos binarios. Es algo similar a lo que ya
hemos visto con respecto a los nmeros naturales y su
correspondiente codificacin en binario. Para ello, disponemos de la
tabla ASCII; es una tabla que consta de tres partes: la primera parte
se conoce como caracteres no imprimibles, la segunda,
imprimibles y, la tercera, extendido. Nosotros vamos a
centrarnos en la segunda parte.

Si buscamos en Internet tabla ASCII, encontraremos una gran


cantidad de resultados; en la siguiente tabla solo se presenta la parte
de la tabla ASCII que se refiere a los caracteres imprimibles.

34
www.full-ebook.com
Cdigo Cdigo Cdigo
numrico Carcter numrico Carcter numrico Carcter
33 ! 65 A 97 a
34 " 66 B 98 b
35 # 67 C 99 c
36 $ 68 D 100 d
37 % 69 E 101 e
38 & 70 F 102 f
39 71 G 103 g
40 ( 72 H 104 h
41 ) 73 I 105 i
42 * 74 J 106 j
43 + 75 K 107 k
44 , 76 L 108 l
45 - 77 M 109 m
46 . 78 N 110 n
47 / 79 O 111 o
48 0 80 P 112 p
49 1 81 Q 113 q
50 2 82 R 114 r
51 3 83 S 115 s
52 4 84 T 116 t
53 5 85 U 117 u
54 6 86 V 118 v
55 7 87 W 119 w
56 8 88 X 120 x
57 9 89 Y 121 y
58 : 90 Z 122 z
59 ; 91 [ 123 {
60 < 92 \ 124 |
61 = 93 ] 125 }
62 > 94 ^ 126 ~
63 ? 95 _ 127 DEL
64 @ 96

Lo que se hace con la tabla ASCII es asignar valores numricos a


caracteres, es decir, los codificamos. An as, el MCU hace una
segunda codificacin, ya que pasa esos nmeros al sistema binario.
Vamos a suponer que enviamos el mensaje Arduino, segn la tabla
sera: 65-114-100-117-105-110-111. Esta sera la codificacin
numrica que se enva, pero como el Arduino solo trabaja con 0 y 1
la informacin con la que realmente trabajara es la siguiente:
01000001-01110010-01100100-01110101-01101001-01101110-
01101111.

35
www.full-ebook.com
Imagen 62.

Es necesario tener esto en cuenta para cuando trabajemos con


valores numricos enviados por el puerto serie.

La variable ms bsica a la hora de trabajar con caracteres es la


variable tipo char (8 bits), la cual puede almacenar un nico carcter
de los vistos en la tabla anterior y entre comillas simples.

Imagen 63.

Imagen 64.

Ya podemos almacenar y trabajar con, al menos, un carcter. Si nos


vamos a la tabla y modificamos este por su correspondiente valor
numrico y lo volvemos a almacenar en una variable tipo char, nos
encontraremos con el mismo resultado.

36
www.full-ebook.com
Imagen 65.

Para finalizar, podemos comparar la codificacin binaria del nmero


65 y del carcter A almacenados en sus correspondientes tipos de
datos (numrico y carcter).

Imagen 66.

Imagen 67.

Como conclusin, el MCU codifica un dato en funcin de su valor y el


tipo de dato. Una variable tipo char solo puede almacenar un
carcter, por lo que, para almacenar ms caracteres, debemos
utilizar una variable tipo string, conocida como cadena de
caracteres, los cuales deben ir definidos entre comillas dobles.

37
www.full-ebook.com
Imagen 68.

Imagen 69.

Si necesitamos enviar un mensaje de texto y otra parte que dependa


del valor de una variable, se puede enviar todo en la misma
instruccin, Serial.print o Serial.println, uniendo todo con el operador
+ siempre y cuando las variables sean de tipo carcter o cadena de
caracteres.

Imagen 70.

Imagen 71.

Si necesitamos enviar un mensaje de texto y una variable de tipo


numrico, es necesario enviar cada parte por separado, tal y como
vemos en el siguiente caso.

38
www.full-ebook.com
Imagen 72.

Imagen 73.

Imagen 74.

Este error aparece por tratar de sumar un dato de tipo numrico


con una cadena de texto; al ser formatos diferentes, no se puede
realizar la operacin. Lo que tenemos que hacer es enviarlo en
mensajes separados.

39
www.full-ebook.com
Imagen 75.

En este caso, visualizaramos correctamente el mensaje, no como


anteriormente, porque tratbamos de sumar dos datos de
diferente tipo.

Serial.write();

Por ltimo, la instruccin Serial.write(); permite enviar datos, al


igual que Serial.print, sin salto de lnea, la diferencia es que solo
permite enviar un nico carcter.

Antes de ver cmo podemos recibir datos del IDE y almacenarlos en


el Arduino o realizar cualquier tipo de operacin, en funcin del dato
recibido, vamos a analizar cmo es el proceso de envo de datos.

El envo de un dato del Arduino al exterior se hace carcter a


carcter; cuando se ejecuta la instruccin Serial.print();,
Serial.println(); o Serial.write();, lo que se hace es trocear el
mensaje en caracteres y cada uno de ellos se almacena en una
memoria (buffer), la cual se va vaciando en funcin de la velocidad a
la que hayamos configurado el puerto serie.

El buffer tiene una capacidad de 64 bytes o, lo que es lo mismo,


64 caracteres.

40
www.full-ebook.com
Imagen 76.

Lo entenderemos mejor con un par de ejemplos; esto no solo es


importante para entender el envo de datos, sino la recepcin, puesto
que el comportamiento es el mismo.

Imagen 77.

41
www.full-ebook.com
Hasta aqu quizs sea fcil de entender, lo que puede resultar un
poco ms complicado es el envo de nmeros. Cuando se enva un
nmero, lo que se hace es traducir cada dgito con la tabla ASCII y,
luego, se enva cada dgito traducido.

Cdigo
numrico Carcter
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
Es importante tener esta cuestin en cuenta a la hora de recibir
valores del IDE, puesto que, si son nmeros, antes de operar con
ellos, debemos realizar la conversin correcta.

Recibir datos

Para recibir datos, realizamos el proceso inverso, por lo que


disponemos de una segunda memoria, el buffer de entrada, con otras
64 posiciones. Por lo tanto, para saber si nos han enviado datos,
debemos comprobar si en esa memoria hay algn dato.

Serial.availble();

Esta instruccin no lleva parmetros y nos devuelve un 0 si el


buffer de entrada est vaco, lo que significa que no hemos recibido
nada. Si hay datos en el buffer, nos devuelve el nmero de posiciones
ocupadas.

Imagen 78.

42
www.full-ebook.com
Una vez que sepamos si hay datos o no, debemos leerlos y
almacenarlos en una variable, para que se eliminen del buffer de
entrada y dejen espacio a otros datos que se puedan recibir. Si no lo
hacemos, una vez que se llene el buffer de entrada (con 64 datos),
cada carcter que nos enven se perdera.

Serial.read();

Esta instruccin nos devuelve el dato que se encuentre en la


primera posicin del buffer de entrada, es decir, lee el primer dato. Al
leerlo, lo elimina del buffer y, automticamente, si hay ms datos,
suben todos una posicin, quedando siempre ocupada la primera
posicin por el siguiente dato recibido.

Imagen 79.

Con esto entendido, ya podemos enviar datos del IDE al Arduino y


empezar a procesarlos.

En el siguiente caso, lo que har el Arduino es reenviar las cadenas


de texto que se envan desde el IDE, devolvindolas con un texto
aadido: Mensaje enviado del IDE, ms el mensaje.

43
www.full-ebook.com
Imagen 80.

Si enviamos:

Imagen 81.

Recibiremos del Arduino:

Ilustracin 82

Antes de continuar, vamos a ver cmo enva y recibe bytes un


Arduino. Volvamos al caso visto anteriormente: enviamos el mensaje
Arduino, 65-114-100-117-105-110-111 = 01000001-01110010-
01100100-01110101-01101001-01101110-01101111. Entre byte y

44
www.full-ebook.com
byte o, lo que es lo mismo, entre carcter y carcter, ponemos un
guion para diferenciar cundo empieza y acaba uno. En la
comunicacin serie pasa algo similar: cada byte viene precedido por
un bit de inicio y un bit de fin, que delimitan cada carcter.

Con esto, ya podemos trabajar con informacin que el Arduino reciba


por comunicacin serie. Esto nos puede permitir controlar el Arduino.

Imagen 83.

Conectamos un led al pin 13 y, si el Arduino recibe el mensaje


encender, el led se encender y, si recibe apagar, se apagar.

Imagen 84.

45
www.full-ebook.com
Antes de enviar un mensaje por el puerto serie y probar si, al enviar
encender, se enciende y, con apagar se apaga, debemos
configurar el monitor serie.

Imagen 85.

Esto se hace para no enviar la cadena junto con un salto de lnea, lo


que hara que la comparacin que realizamos no se cumpliese.

Vamos a regular un led a travs del monitor serie; aqu es donde


debemos tener en cuenta que sean letras, smbolos o nmeros todo
lo que se reciba por el puerto USB; se recibe carcter a carcter y
codificado en la tabla ASCII.

No obstante, recordemos antes cmo trabajaba la instruccin


analogWrite(): el primer parmetro indica sobre qu pin se genera la
seal PWM y, el segundo parmetro, el valor nmero entre 0 y 255
(con un tamao de 1 byte). Sabemos cmo se codifican nmeros en
el sistema binario.

Equivalente nmero
Codificacin binario natural
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 1 1 3
0 0 0 0 0 1 0 0 4
0 0 0 0 0 1 0 1 5

Cdigo
numrico Carcter
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8

Por ejemplo: el nmero 127 correspondera en binario a: 01111111.


El problema radica en que, por el puerto serie, vamos a recibir dgito
a dgito y codificado segn la tabla ASCII.

46
www.full-ebook.com
Imagen 86.

Por lo tanto, si recibimos por el puerto serie el valor 127, ya no es un


byte, sino tres bytes (00110001 00110010 00110111). Cmo
solucionamos esto? Lo que tenemos que hacer es almacenarlo en
una cadena de caracteres y luego convertirlo en un nmero entero.

toInt();

Esta funcin transforma una cadena de caracteres (en la que


los caracteres solo pueden ser nmeros) a su dato numrico
equivalente.

Imagen 87.

Si cargamos este programa y conectamos el led al pin 11,


observaremos cmo, si enviamos un valor entre 0 y 255, el led se
regula, como si tuviese conectado un potencimetro.

47
www.full-ebook.com
Ejercicios propuestos:

3. Conectar un led, un botn y un pulsador a un Arduino. Configurar


tres modos de funcionamiento que se puedan controlar desde el IDE:
modo 1, el led parpadea cada segundo; modo 2, el led se puede
encender o apagar con el botn; modo 3, el led se puede regular con
el potencimetro.

4-Dos Arduinos: el Arduino A recibe rdenes de encendido y apagado


de un led por el puerto serie; el Arduino B tiene conectado el led. Si
el A recibe el mensaje de encender, el B debe encender el led; si el A
recibe el mensaje de apagar, el B debe apagar el led.

5. Dos Arduinos: el Arduino A recibe el valor de regulacin de un led y


el B tiene conectado el led. El Arduino B debe regular el led en
funcin del valor que se enve por el puerto serie al Arduino A.

6. Dos Arduinos: el Arduino A se comunica por el puerto serie con el


IDE y el Arduino B tiene conectado un botn. En el momento en el
que se pulse o se deje de pulsar el botn del B, el A debe enviar el
mensaje correspondiente del evento que acaba de ocurrir. (Solo ante
un cambio de estado).

7. Dos Arduinos: el Arduino A se comunica por el puerto serie con el


IDE y tiene conectado un potencimetro; por otro lado, el Arduino B
tiene conectado un botn. Cada vez que se pulse el botn del Arduino
B, el A debe enviar al IDE el valor actual del potencimetro. Solo una
vez por cada pulsacin.

8. Traductor de caracteres. Enviar un carcter y que el Arduino nos


devuelva su posicin en la tabla ASCII y su codificacin en binario.
13
14
15
16
17
18
19
20
21
22
23
24
25
26

48
www.full-ebook.com
3. Conectar un led, un botn y un pulsador a un Arduino.
Configurar tres modos de funcionamiento que se puedan
controlar desde el IDE: modo 1, el led parpadea cada
segundo; modo 2, el led se puede encender o apagar con el
botn; modo 3, el led se puede regular con el
potencimetro.

49
www.full-ebook.com
Contina

50
www.full-ebook.com
4. Dos Arduinos: el Arduino A recibe rdenes de encendido y
apagado de un led por el puerto serie y el Arduino B tiene
conectado el led. Si el A recibe el mensaje de encender, el B
debe encender el led; si el A recibe el mensaje de apagar, el B
debe apagar el led.

A B

51
www.full-ebook.com
B

52
www.full-ebook.com
5. Dos Arduinos: el Arduino A recibe el valor de regulacin de
un led y el B tiene conectado el led. El Arduino B debe regular
el led en funcin del valor que se enve por el puerto serie al
Arduino A.

A B

53
www.full-ebook.com
6. Dos Arduinos: el Arduino A se comunica por el puerto serie
con el IDE y el Arduino B tiene conectado un botn. En el
momento en el que se pulse o se deje de pulsar el botn del B,
el A debe enviar el mensaje correspondiente del evento que
acaba de ocurrir. (Solo ante un cambio de estado).

A B

54
www.full-ebook.com
7-Dos Arduinos: el Arduino A se comunica por el puerto serie
con el IDE y tiene conectado un potencimetro; por otro lado,
el Arduino B tiene conectado un botn. Cada vez que se pulse
el botn del Arduino B, el A debe enviar al IDE el valor actual
del potencimetro. Solo una vez por cada pulsacin.

B
A

55
www.full-ebook.com
8Traductor de caracteres. Enviar un carcter y que el Arduino
nos devuelva su posicin en la tabla ASCII y su codificacin en
binario.

56
www.full-ebook.com
Comunicacin serie entre Arduinos

En este captulo, veremos cmo comunicar dos Arduinos por el puerto


serie.

A B

Imagen 88.

Para comunicar dos Arduinos por el puerto serie, es necesario


conectar el pin RX del A con el pin TX del B y viceversa (siempre y
cuando no se use el puerto serie a travs del IDE). Asimismo, si no
comparten la misma fuente de alimentacin, es necesario conectar
los pines GND de cada uno.

A B

Imagen 89.

Lo que vamos a realizar, en este caso, es el control del led del


Arduino A, en funcin del mensaje enviado por el Arduino B.

57
www.full-ebook.com
A

Imagen 90.

Imagen 91.

Vamos ahora a tratar de visualizar los mensajes que se reciben de


otro Arduino por el monitor serie del IDE.

A
B

Imagen 92.

58
www.full-ebook.com
Para esto, lo primero que tenemos que hacer es cargar el programa a
cada Arduino por separado y, luego, conectarlos. Hay que tener en
cuenta que el monitor serie utiliza el mismo canal y, si hay una
comunicacin por los pines RX y TX proveniente de otro Arduino, no
vamos a poder cargar el programa.

Imagen 93.

Imagen 94.

En consecuencia, a cada segundo y si conectamos el Arduino A al


monitor serie, visualizaremos H o L.

A continuacin, vamos a enviar un mensaje del monitor a dos


Arduinos; para comprobar que funciona correctamente, se va a
controlar un led de cada Arduino. Si se enva un mensaje por el
monitor de encender, se deben encender los dos leds y, si se enva
apagar, se deben apagar los dos.

59
www.full-ebook.com
A B

Imagen 95.

Al igual que ocurra anteriormente, cargamos el programa a cada


Arduino y, despus, realizamos las conexiones.

Imagen 96.

60
www.full-ebook.com
B

Imagen 97.

En los dos ltimos casos, debido a que el Arduino UNO solo dispone
de un puerto serie, tenemos que cargar primero los programas y,
despus, conectar los circuitos. Si, por ejemplo, queremos establecer
un chat entre dos ordenadores a travs del IDE de Arduino, no
podramos hacerlo; en cambio, si dispusiramos de otro Arduino,
como el Arduino Mega 2560, que dispone de varios puertos, esto ya
sera posible.

Imagen 98.

61
www.full-ebook.com
Como el Arduino Mega 2560 dispone de hasta cuatro puertos serie,
podemos utilizar uno para comunicar el Arduino con el IDE de su PC
y, otro, para la comunicacin con el otro Arduino.

Con el Arduino UNO no podemos hacer un chat? S, pero, para


ello, necesitamos una librera. Es la primera vez que utilizamos una
librera; an as, gracias al primer tomo, sabemos que una librera es
un programa que tenemos o podemos tener instalado en nuestro IDE
y que nos facilita la programacin.

Una librera pone a nuestra disposicin una serie de funciones con


una programacin compleja, las cuales podemos utilizar facilitar la
tarea de programacin. Vamos a ver qu operaciones podemos hacer
con una librera; para ello, necesitamos ver otro apartado del IDE de
Arduino.

Imagen 99.

Si nos vamos a la barra de men y al apartado Programa, se abre


un desplegable. En l, encontramos un apartado que pone Incluir
Librera.

Imagen 100.

Si abrimos ese segundo desplegable encontramos tres apartados: el


primero, Gestionar Libreras, abre un repositorio que nos permite

62
www.full-ebook.com
buscar una librera en concreto; si hemos encontrado algn caso
prctico en una web y vemos que necesitamos una librera, podemos
probar a buscarla en este apartado.

Imagen 101.

Disponemos de dos filtros de bsqueda e incluso un campo para


escribir la librera que necesitamos. La instalacin es sencilla:
simplemente seleccionamos una librera, en el margen inferior
derecho nos aparecen las versiones disponibles, en un desplegable, y
un botn para instalar la versin seleccionada.

Imagen 102.

Con pulsar el botn de instalar se inicia el proceso de instalacin, que


tardar unos pocos segundos en finalizar. Si, por el contrario,
queremos instalar una librera que hemos descargado de alguna web,
seleccionamos el apartado de Aadir librera .ZIP, buscamos el
archivo descargado a travs de un directorio y, con seleccionarlo y
aceptar, se instala la librera.

Por ltimo, nos aparece un listado con todas las libreras instaladas;
muchas de ellas ya vienen instaladas al descargar el IDE de Arduino,
son las que se conocen como libreras oficiales de Arduino.

63
www.full-ebook.com
Las libreras que instalemos por nuestra cuenta se incluirn en esta
lista de libreras, pero con un encabezado diferente. Ahora que
sabemos cmo instalar libreras, tenemos que saber utilizarlas para
tener acceso a sus funciones.
Para ello, debemos declarar qu librera o libreras vamos a utilizar;
una forma sencilla de hacerlo es seleccionarla de la lista. Para el caso
que nos ocupa, necesitamos la librera SoftwareSerial.

Imagen 103.

Si la seleccionamos y volvemos a nuestro programa, veremos cmo


se hace referencia a ella al inicio.

Imagen 104.

Podemos referenciar una librera de esta manera o podemos escribir


nosotros mismos #include <nombre_librera.h>. Sea cual sea la
forma en la que lo hagamos, esto debe incluirse siempre en la parte
superior antes de cualquier lnea de cdigo.

64
www.full-ebook.com
Cada librera implementa sus propias funciones o instrucciones, por lo
que cada librera es un mundo. Como al principio puede resultar
complejo entender cada librera, disponemos de ejemplos para
asimilar su funcionamiento.

Imagen 105.

Si nos vamos a la barra de men y al apartado Archivo, se nos


abrir un desplegable. Si accedemos a Ejemplos, se nos abre un
segundo desplegable en el cual encontraremos ejemplos sobre cada
librera.

Imagen 106.

Los ejemplos no son ms que programas que podemos probar o


modificar para entender el funcionamiento de las funciones (o
instrucciones) que aporta cada librera.

Empecemos con la librera SoftwareSerial; esta librera nos permite


definir uno o varios puertos de comunicacin serie adicionales a los
que incorpore cada Arduino. Podemos entonces solventar el problema

65
www.full-ebook.com
de utilizar un puerto del Arduino UNO para la comunicacin con el IDE
y, otro, para la comunicacin con otro Arduino.

En consecuencia, podemos realizar un chat entre dos ordenadores a


travs de dos Arduinos y el IDE de Arduino. Lo primero que tenemos
que hacer es definir qu pines se van a comportar como un puerto
serie.

Imagen 107.

Creamos una instancia con SoftwareSerial y, a continuacin,


definimos un nombre para el nuevo puerto serie. En este caso, lo
llamamos mySerial y, por ltimo, indicamos qu pin sirve para
transmitir y cul para recibir; 11 y 10, respectivamente.

Con este paso, ya podemos trabajar con este puerto igual que hemos
hecho con el Serial; la diferencia es que el prefijo es mySerial:
mySerial.print();, mySerial.println();, mySerial.available();.

Vamos a cargar el mismo programa a los dos Arduinos, puesto que


los dos tienen que realizar la misma operacin: recibir los mensajes
del IDE (por el puerto Serial) y enviarlos al otro Arduino (por el
mySerial) y, los mensajes que reciban del otro Arduino (por el
mySerial) enviarlos al IDE (por el Serial). Ambos utilizarn los pines
10 (RX) y 11(TX) como nuevo puerto.

66
www.full-ebook.com
A
B

Imagen 108.

Para una correcta comunicacin, se debe conectar el pin 10 del


Arduino A con el 11 del B y el 11 del A con el 10 del B, ya que, por el
11, cada uno de ellos transmite datos y, por el 10, cada uno de ellos
recibe datos.

Imagen 109.

67
www.full-ebook.com
Cargamos el programa anterior a cada Arduino, conectamos entre s
los Arduinos y cada uno a un PC. Abrimos en cada PC el IDE de
Arduino y empezamos a enviar mensajes. Al enviar mensajes,
comprobamos que, los que nosotros enviamos, se visualizan en
nuestro monitor en el margen derecho y, los que nos enva el otro
PC, en el margen izquierdo; se ha programado cada Arduino para
simular el funcionamiento de un chat.

Funciones
Una funcin no es ms que un trozo de cdigo que se identifica con
un nombre y que, para que se ejecute, debe ser llamado. Por lo
tanto, podemos escribir lneas de cdigo fuera del void setup y void
loop, que deben estar identificadas por un nombre y que se
ejecutarn si se las llama desde otra parte del programa.

Imagen 110.

Si abrimos el monitor serie, veremos la siguiente secuencia de


mensajes.

68
www.full-ebook.com
Imagen 111.

Lo que vemos con este primer caso es cmo, al llamar a una


funcin, el programa sale de la ejecucin de lneas de cdigo del
programa principal (void loop) y ejecuta otra parte de cdigo.

Imagen 112.

En la imagen anterior, vemos cmo se representa la llamada a una


funcin en un diagrama de flujo. Para indicar que se llama a una
funcin, se utiliza un rectngulo con doble rayado y se escribe el
nombre de la funcin.

Para representar las operaciones (recuadros) que se realizan dentro


de cada funcin, se engloban entre dos elipses. La de apertura

69
www.full-ebook.com
incluye el nombre de la funcin y, la de cierre, el nombre de retorno.
En cuanto al nombre de una funcin, debemos seguir las mismas
normas que en la declaracin de funciones.

Las funciones nos permiten trocear un programa en partes e


identificarlas segn la operacin que se realice en cada una de ellas.
Esto nos permite escribir programas mucho ms legibles, adems de
optimizar la programacin. Si, a lo largo de un programa, repetimos
una serie de operaciones, podemos englobarlas todas en una funcin
y llamar a la funcin que sea necesaria.

Por consiguiente, las funciones son un elemento importante para


optimizar un programa y hacerlo ms legible.

Ejercicios propuestos:

7. Crear una funcin para que un led parpadee cada segundo.

8.Con una funcin, encender un led si se ha pulsado un botn.


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

70
www.full-ebook.com
7. Crear una funcin para que un led parpadee cada segundo.
55
56

57
58

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

71
www.full-ebook.com
8. Con una funcin, encender un led si se ha pulsado un botn.
79

80
81
82

83
84
85
86
87
88
89
90
91
92
93
94

72
www.full-ebook.com
Funciones con valor de retorno

La funcin tipo void loop ejecutaba el cdigo que haba entre sus
llaves y, al finalizar, volva a la lnea desde donde haba sido
llamada. Las funciones permiten devolver un valor (tipo string,
int...) en la lnea en la que son llamadas.

Para ello, las funciones no deben ser declaradas tipo void, sino que
deben ser declaradas como algn tipo de variable, es decir: tipo int,
string, etc.

Al declarar as una funcin, el valor que devuelve es del tipo que sea
la funcin, es decir: una funcin tipo int devuelve un valor tipo int. Es
obligacin de la persona que programa almacenar el valor que
devuelve la funcin.

Por ltimo, cmo se hace para devolver un valor? Para ello, se


implementa la instruccin return, la cual indica que el valor que la
acompaa es el que se devuelve. Veamos todo esto en un ejemplo.

Imagen 113.

73
www.full-ebook.com
Imagen 114.

Ejercicios propuestos:

9. Crear una funcin que, al recibir un mensaje por el monitor serie, lo


almacene y, al finalizar, devuelva ese mensaje al programa principal,
para visualizarlo en el monitor serie.

74
www.full-ebook.com
9. Crear una funcin que, al recibir un mensaje por el
monitor serie, lo almacene y, al finalizar, devuelva ese
mensaje al programa principal para visualizarlo en el
monitor serie.

75
www.full-ebook.com
Pasar parmetros a una funcin

Una funcin no solo puede devolver datos, sino que, al ser llamada,
se le pueden pasar datos. Para ello, debe haber una concordancia
entre el valor que se enva y la variable en la que se almacena, es
decir, ambos deben ser del mismo tipo.

Imagen 115.

Imagen 116.

76
www.full-ebook.com
Podemos pasar a una funcin el nmero de parmetros que
necesitemos y todos los datos pueden ser, o no, del mismo tipo.
Mantenemos el mismo circuito y cargamos el siguiente programa.

Imagen 117.

Ejercicios propuestos:

10. Pasar como parmetros el valor de una entrada analgica y de un


pulsador, para que la funcin regule el led si el pulsador est pulsado
y lo apague si no est pulsado.

11. Crear funciones para establecer un chat mediante el puerto serie


con otro Arduino.

77
www.full-ebook.com
10 Pasar como parmetros el valor de una entrada analgica
y de un pulsador, para que la funcin regule el led si el
pulsador est pulsado y lo apague si no est pulsado.

78
www.full-ebook.com
11. Crear funciones para establecer un chat mediante el puerto
serie con otro Arduino.

79
www.full-ebook.com
El IDE de Arduino dispone de una herramienta que permite escribir
funciones en otras ventanas y as dejar la hoja en la que
escribimos el programa principal para: declarar libreras, variables y
las partes bsicas del programa (loop y setup).

Imagen 118.

Si seleccionamos, en el desplegable, Nueva Pestaa, en la parte


inferior del IDE, antes de la consola, surge una ventana como la
siguiente.

Imagen 119.

Cuando creamos una pestaa, el nombre de esta sigue las mismas


reglas que las de los nombres de las variables.

Imagen 120.

80
www.full-ebook.com
Imagen 121.

Entonces, se crea una pestaa en blanco con el nombre que le


asignamos. El nico funcionamiento de esta herramienta es separar
el programa en hojas diferentes para hacerlo ms legible; en
realidad, no cambia el funcionamiento del programa.

Interrupciones
Este tipo de mecanismo interrumpe la ejecucin normal de un
programa por la atencin de un evento. Los eventos que puede
atender un Arduino son:

Por una seal externa.


Por tiempo.

Las interrupciones son similares a una funcin, la diferencia reside en


que la funciones que hemos visto hasta ahora tenan que ser
llamadas por otra parte del programa. Una interrupcin no es ms
que una funcin que se ejecutar, no por que sea llamada, sino
porque se ha configurado el motivo por el cual se debe ejecutar
(atendiendo al tipo de evento y sus caractersticas).

Interrupciones por seal

Estas interrupciones se utilizan para dar una respuesta rpida a


eventos cortos y rpidos.

Cmo se configura una interrupcin por un evento externo?


Este tipo de interrupciones necesitan configurar tres parmetros: el
primero es en qu pin se va ha producir el evento; el segundo, el
nombre de la funcin que se va a ejecutar y, el tercero, las
caractersticas del evento.

attachInterrupt(Pin_interrupcin,nombre_funcin,tipo_evento);

Con esta instruccin, podemos configurar cada uno de los tres


parmetros de una interrupcin por un evento externo.

81
www.full-ebook.com
No se pueden atender eventos en todos los pines: en el caso del
Arduino UNO, disponemos de dos eventos por interrupcin en los
pines 2 y 3, que se configuran como interrupcin 0 e interrupcin 1,
respectivamente.

Una vez entendido el uso de las interrupciones y tras encontrarles


utilidad en nuestros proyectos, puede ser una caracterstica que nos
haga decantarnos por un Arduino u otro. Si, por ejemplo,
necesitamos atender a ms de dos eventos externos con
interrupciones, el Arduino UNO no es la mejor opcin y podemos
optar, por ejemplo, por el Arduino DUE.

El nombre de la funcin que se va a ejecutar si se cumple el evento


queda a nuestra eleccin. Una vez definido el pin en el que se va a
producir el evento y el nombre de la funcin que se tiene que
ejecutar, si se produce el evento, queda por definir qu evento en
concreto debe ocurrir en el pin indicado para que se ejecute la
funcin.

Los eventos que puede atender una interrupcin son los que
presentamos a continuacin; vamos a suponer que el evento
suceder en el pin 2, es decir, la interrupcin 0 y la funcin que se
tiene que ejecutar tiene el nombre de funcion_evento:

LOW: si configuramos la interrupcin con este parmetro, se


ejecutar la funcin funcion_evento cuando la entrada del pin 2
reciba una seal de 0 V.

CHANGE: si configuramos la interrupcin con este parmetro, se


ejecutar la funcin funcion_evento cuando la entrada del pin 2
cambie de estado, tanto si es de 0 a 5 voltios (flanco subida) como
de 5 a 0 voltios (flanco bajada).

RISING: si configuramos la interrupcin con este parmetro, se


ejecutar la funcin funcion_evento cuando la entrada del pin 2
cambie de 0 a 5 voltios (flanco subida).

FALLING: si configuramos la interrupcin con este parmetro, se


ejecutar la funcin funcion_evento cuando la entrada del pin 2
cambie de 5 a 0 voltios (flanco bajada).

HIGH: si configuramos la interrupcin con este parmetro, se


ejecutar la funcin funcion_evento cuando la entrada del pin 2
reciba una seal de 5 V. No obstante, el Arduino UNO no dispone de
este tipo de evento.

82
www.full-ebook.com
Vamos a realizar un ejemplo para entender cmo funciona una de
ellas, ya que el resto funciona exactamente igual; la diferencia reside
en el evento que se atiende.

Imagen 122.

Imagen 123.

El funcionamiento ideal sera que, al dejar de pulsar el botn, si el led


estaba encendido, se apague, y viceversa, pero, en ocasiones,
veremos que no se cumple; esto se debe a que se ejecuta varias
veces la interrupcin.

83
www.full-ebook.com
Imagen 124.

Si recordamos, debido al mecanismo de un botn, la seal sufre


perturbaciones; por lo tanto, puede ser que, aunque nosotros
pulsemos una vez, el Arduino reciba una seal que le haga creer
que se acaban de realizar dos o ms pulsaciones.

La funcin de una interrupcin no es la de ejecutar un programa


largo; est pensado para atender lo ms rpido posible a un
evento y realizar un par de tareas necesarias.

Dentro de las interrupciones, instrucciones como delay no funcionan;


tampoco es recomendable usar el puerto serie (por su lentitud).

Para variables que dependan de modificar su valor por una


interrupcin, deben ser declaradas como volatile:

No es un tipo de variable, sino una directiva para el compilador.

En algunas circunstancias, puede haber un conflicto con las


variables, por lo que se recomienda usar volatile.

volatile tipo_variable nombre_variable;

Disponemos de ms instrucciones para trabajar con interrupciones.

noInterrupts(), desactiva cualquier interrupcin del programa.

Interrupts(), para los casos en los que se han deshabilitado las


interrupciones con la instruccin anterior y queremos que se
vuelvan a activar.

detachInterrupt(), desactiva la interrupcin indicada:

detachInterrupt ( interrupcin )

detachInterrupt (digitalPinToInterrupt (pin));


detachInterrupt ( pin ) (solo arduino DUE y CERO)

84
www.full-ebook.com
Interrupciones por tiempo

Nos permiten configurar operaciones que se deben ejecutar cada


cierto tiempo. Son conocidas como Timers. Para ello, necesitamos
instalar la librera TimerOne.h.

Imagen 125.

Imagen 126.

Imagen 127.

Ejercicios propuestos:

12. Conectar un led, un botn y un potencimetro. El led, por


defecto, debe parpadear cada 2 segundos mediante una
interrupcin de tiempo. Sin embargo, este tiempo puede cambiar
si se produce una interrupcin por un evento externo, proveniente

85
www.full-ebook.com
del botn; si se da este caso, se regular el tiempo de interrupcin
con el valor del potencimetro entre un valor de 0,2 y 2 segundos
proporcional a la medida del potencimetro.

86
www.full-ebook.com
Fritzing
Fritzing es una herramienta que nos permite graficar los circuitos que
realizamos mediante un entorno sencillo e intuitivo. Todas las
imgenes de circuitos que se muestran en esta serie de ejemplares
fueron creadas en esta herramienta.

En muchos casos, necesitamos documentar algn circuito que


montemos y, si no conocemos los smbolos que se suelen utilizar en
electrnica, usar programas especficos o, simplemente, necesitamos
un esquema sencillo para nosotros, Fritzing es la herramienta que
precisamos.

La podemos descargar de forma gratuita desde su pgina web


(disponible para cualquier sistema operativo)
http://fritzing.org/download/. Con el entorno descargado nos
disponemos a realizar nuestro primer circuito.

Imagen 128.

En el men superior accedemos al apartado Protoboard.

87
www.full-ebook.com
Imagen 129.

En la parte de lienzo es donde incorporamos los componentes y


trazamos las conexiones. Para realizar una conexin con un cable,
basta con seleccionar cualquier punto de conexin y desplazar el
ratn.

Imagen 130.

Esto lo podemos realizar con cualquier punto de conexin de


cualquier componente que incorporemos al lienzo. Existen
componentes que permiten algn tipo de configuracin grfica, por
ejemplo: rotacin, color, etc. Segn el componente, tendremos
diferentes opciones, pero todos se seleccionan de la misma forma:
hacemos clic en el componente y, despus, pulsamos el botn
derecho de nuestro ratn.

88
www.full-ebook.com
Imagen 131.

Para incorporar componentes, disponemos, en el margen derecho, de


un conjunto de opciones.

Imagen 132.

Si no encontramos el elemento que necesitamos, podemos buscarlo


en nuestro navegador web. Posiblemente alguien lo haya creado y lo
haya puesto a nuestra disposicin.

89
www.full-ebook.com
Imagen 133.

Si queremos generar la imagen del circuito que acabamos de crear,


basta con ir al men del programa, Archivo Exportar Imagen, y
podemos guardar el resultado para incluirlo, por ejemplo, en una hoja
de Word. Fritzing dispone de ms apartados, pero, de momento, con
este primer recorrido ya podemos dibujar nuestros circuitos.

Simuladores
Los simuladores son ideales para cuando no disponemos de un
Arduino, pero necesitamos realizar pruebas o, incluso, queremos
desarrollar un proyecto, pero, por seguridad y antes de cargarlo al
Arduino, queremos probarlo si peligro.

123D Circuits es una plataforma que nos permite simular circuitos y


programas. Es una herramienta online (https://circuits.io/) en la que
necesitamos crear un usuario. Una vez registrados, podemos
empezar a simular; para ello, lo primero ser incorporar los
componentes.

90
www.full-ebook.com
Imagen 134.

Al igual que en Fritzing, disponemos de un lienzo y el modo de


trabajo es muy similar. En la parte superior derecha, encontramos un
botn para aadir componentes: + Components.

Imagen 135.

Para incluir componentes, debemos arrastrarlos y podremos


configurar ciertas caractersticas.

Imagen 136.

91
www.full-ebook.com
Imagen 137.

Con el Arduino en el lienzo y las conexiones realizadas, solo nos


queda programarlo. Al lado del botn + Components, tenemos el
Code Editor, que nos abre una ventana como la de la imagen
anterior, en la que podemos escribir el programa y cargarlo al
Arduino.

92
www.full-ebook.com

You might also like