UNIVERSIDAD POLITÉCNICA DE
MADRID
ESCUELA UNIVERSITARIA
DE INGENIERÍA TÉCNICA
DE TELECOMUNICACIÓN
PROYECTO DE FIN DE CARRERA
PROGRAMACIÓN CONCURRENTE
ORIENTADA A EVENTOS EN ARDUINO PARA
EL INTERNET DE LAS COSAS
AITOR CANTERO ROMERO
SEPTIEMBRE 2017!
Resumen
Este proyecto fin de carrera propone enmarcar en un contexto tecnológico
el desarrollo de una aplicación para Internet de las Cosas, desde una línea de
trabajo concreta, en la que se incluye el paradigma de la programación dirigida por
eventos y una plataforma hardware y software libre como Arduino.
Para ello se incluye el estudio y la comparativa de las diferentes opciones
existentes para cada uno de los elementos constituyentes del sistema completo, así
como la realización de un caso práctico, particularizado en un sistema de control
de congestión de tráfico mediante semáforos inteligentes.
Abstract
This final project aims to frame an Internet of Things
application development in a technological context, from a concrete line of work,
which includes event-‐driven programming paradigm and free hardware-‐software
platform as Arduino.
This includes the study and comparison of the different available options
for each constituent element of the entire system.
It wraps up with the realization of a practical case, particularized in a traffic
congestion control system using smart traffic lights.
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 7!
Índice!
Capitulo!1:!Introducción!y!objetivos!.........................................................................................!9!
1.1! Introducción!.........................................................................................................................!9!
1.2! Objetivos!..............................................................................................................................!10!
Capítulo!2:!Definiciones!previas!................................................................................................!11!
2.1!Computadora!.........................................................................................................................!11!
2.2!Procesador!..............................................................................................................................!14!
2.3!Núcleo,!multiprocesador,!multinúcleo!y!computación!distribuida!...............!14!
2.3!Microcontrolador!.................................................................................................................!15!
2.4!Sistema!Operativo!...............................................................................................................!16!
2.6!Procesos!e!hilos!....................................................................................................................!20!
2.7!Programación!concurrente!.............................................................................................!22!
2.8!Programación!dirigida!por!eventos!.............................................................................!24!
2.9!Internet!de!las!cosas!...........................................................................................................!25!
Capítulo!3:!Hardware!.....................................................................................................................!29!
3.1!Arduino!....................................................................................................................................!29!
3.2!Comparativa!frente!a!la!competencia.!Arduino!vs!PIC!........................................!31!
Capitulo!4:!Software!.......................................................................................................................!33!
4.1!Estado!del!arte.!Estudio!de!las!diferentes!opciones!.............................................!33!
4.2!Basadas!en!Sistemas!Operativos!...................................................................................!33!
4.2.1!QPTMWnano!......................................................................................................................!33!
4.2.2!RTuinOS!..........................................................................................................................!36!
4.2.3!Contiki!OS!.......................................................................................................................!40!
4.3!Basadas!en!lenguaje!de!programación!.......................................................................!43!
4.3.1!OccamW!π!.........................................................................................................................!43!
4.3.2!Protothreads!.................................................................................................................!46!
Capitulo!5.!Conectividad!...............................................................................................................!51!
5.1!Consideraciones!previas!...................................................................................................!51!
5.1.1!Modelo!OSI!.....................................................................................................................!51!
5.1.2!Modelo!TCP/IP!.............................................................................................................!53!
5.1.3!Internet.!IPv4!e!IPv6.!.................................................................................................!54!
5.1.4!Conceptos!de!IPv6!......................................................................................................!56!
5.1.5!Autoconfiguración!de!dirección!IPv6.!SLAAC!.................................................!59!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!8!
5.1.6!Topologías!de!Red!.......................................................................................................!61!
5.2!Tecnologías!de!red!local!inalámbrica!.........................................................................!64!
5.2.1!WiWFi!.................................................................................................................................!64!
5.2.2!Bluetooth!4.0!.................................................................................................................!66!
5.2.3!ZigBee!...............................................................................................................................!67!
5.2.4!ANT!....................................................................................................................................!69!
5.2.5!Comparativa!entre!WiWFi,!Bluetooth!4.0,!ZigBee!y!ANT!.............................!71!
Capitulo!6.!!Caso!práctico.!Aplicación!Semáforo!Conectado!..........................................!75!
6.1!Automaton!framework!......................................................................................................!75!
6.1.1!“Hola!mundo”!en!Automaton!.................................................................................!77!
6.1.2!¿Cómo!funciona?!..........................................................................................................!78!
6.1.2.1!La!clase!Machine!.................................................................................................!78!
6.1.2.2!La!clase!Automaton!...........................................................................................!82!
6.1.2.3!La!comunicación!entre!máquinas!................................................................!82!
6.1.3!Creación!de!componentes!propios!......................................................................!84!
6.2!Microcontrolador!ESP8266!.............................................................................................!87!
6.3!Diseño!.......................................................................................................................................!88!
6.4!Protocolo!de!comunicaciones!de!red.!REST!.............................................................!90!
6.5!Implementación!...................................................................................................................!92!
Capítulo!8.!Conclusiones!............................................................................................................!105!
Capítulo!9.!Bibliografía!...............................................................................................................!107!
!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 9!
Capitulo&1:&Introducción&y&objetivos&
1.1 Introducción&
Actualmente!y!debido!al!auge!principalmente!de!Internet!de!las!Cosas!(IoT,!
Internet!of!Things)!el!paradigma!de!la!programación!orientada!a!eventos!es!cada!
vez!más!popular.!La!esencia!de!este!modelo!de!programación!en!lugar!de!tratar!los!
procesos! secuencialmente,! los! formula! como! procesos! aislados,! independientes,!
que!son!lanzados!en!el!momento!en!que!se!requieran.!En!definitiva,!es!un!modelo!
orientado! a! sistemas! reactivos:! sistemas! que! hacen! algo! (reaccionan)! cuando!
ocurre!algo!(un!evento).!Esta!filosofía!se!puede!resumir!en!una!frase:!
!
Esto sucede cuando eso sucede
!
Esto! es! la! reacción! (ubicada! en! el! futuro! inmediato).! Eso! es! el! evento!
(ubicado!en!el! pasado! inmediato).!Cuando! es! la! asociación!evento–reacción.!Esta!
relación!puede!o!no!estar!restringida!a!un!intervalo!de!tiempo!crítico!(como!es!el!
caso!de!los!sistemas!de!tiempo!real).!De!esta!manera!se!forman!redes!de!acción–
reacción! que! regulan! el! comportamiento! del! sistema! (como! es! el! caso! de! las!
máquinas! de! estado! finito)! pero!que! cada!esto! funciona! independientemente!del!
resto.!
En! el! ámbito! de! Internet! de! las! Cosas,! las! cosas, son! heterogéneas! e!
interconectadas.! Una! cosa! es! algo! que! puede! hacer! algo.! Un! sistema! de!
computación! (grande! o! pequeño)! con! capacidad! de! procesar! y! transmitir!
información.!!
En!este!proyecto!se!desarrolla!el!concepto!de!la!programación!orientada!a!
eventos,! las! diferentes! iniciativas! posibles! y! se! implementa,! a!modo! de! ejemplo,!
una!estrategia!particular!de!este!paradigma!basada!en!máquinas!de!estado!sobre!la!
plataforma! de! desarrollo! de! prototipos! Arduino! (un! proyecto! de! software! y!
hardware!de!libre!distribución!barato!y!simple).!
El!desarrollo!final,!es!un!mero!ejemplo!de!las!tecnologías,!métodos!y!vías!de!
programación!que!permiten!conseguir!un!proyecto!de!esta! índole,! con! la! idea!de!
que!pueda!ser!tenida!en!consideración!y/o!aplicada!por!siguientes!desarrolladores.!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!10!
1.2 Objetivos&
El! objetivo!de! este!proyecto! es! realizar!un! estudio! sobre! las! vías!posibles!
para!programar!de!manera! concurrente! y! orientada! a! eventos! en! general,! en!un!
microcontrolador! Arduino! en! particular,! utilizando! los! protocolos! de!
comunicación!necesarios,!para!el!Internet!de!las!Cosas.!
A! lo! largo! de! este! proyecto! se! presentan! una! serie! de! conceptos! previos!
necesarios!para!enmarcar!el!problema!que!se!afronta.!!También!se!va!a!sondear!el!
estado!actual!de!la!tecnología,!tanto!física!como!lógica,!para!justificar!la!elección!de!
la!propuesta!adoptada.!
Para!concluir,! se!documenta!un!ejemplo!de!un!proyecto!completo!a!modo!
de! demostración,! comprendiendo! en! la! medida! de! lo! posible,! la! modularidad! y!
heterogeneidad!que!el!Internet!de!las!Cosas!admite.!
Dado! el! carácter! abierto! del! estudio! realizado,! se! puede! utilizar! la!
experiencia! documentada! en! esta! memoria! como! guía! para! un! proyecto! donde!
encajen!mejor!otras!vías!no!elegidas!por!su!autor.!
! &
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 11!
Capítulo&2:&Definiciones&previas&
2.1&Computadora&
“La! computadora! (del! inglés:! computer;! y! este! del! latín:! computare,!
'calcular'),! también! denominada! computador! y! ordenador,! es! una! máquina!
electrónica! que! recibe! y! procesa! datos,! para! convertirlos! en! información!
conveniente!y!útil,!que!pueda!ser!analizada!y!utilizada!por!humanos.!Un!ordenador!
está! formado! físicamente! por! numerosos! circuitos! integrados! y! muchos!
componentes!de!apoyo,! extensión!y!accesorios,!que!en!conjunto!pueden!ejecutar!
tareas!diversas!con!suma!rapidez!y!bajo!el!control!de!un!programa!(software).”!!
Las!partes!que!componen!un!ordenador!apenas!han!variado!desde!que!se!
construyese!la!primera!computadora!digital!en!1946,!llamada!ENIAC.!Estas!partes,!
como!mínimo,!son:!procesador,!memoria!principal,!periféricos!de!entrada/salida!y!
sus!interconexiones.!
!
Figura&2.1!IBM!PC!5150.!El!primer!ordenador!personal!PC,!del!año!1981.&&
!
Un!funcionamiento!básico!completo!de!una!computadora,!se!puede!resumir!
como!sigue:!una!lista!de!instrucciones!colocadas!en!la!memoria!principal!con!cierto!
propósito,! son! interpretadas! y! resueltas! secuencialmente! por! el! procesador,!
colocando! los! resultados! de! dichos! cálculos! en! una! parte! de! la! memoria,! para!
posteriormente!mostrarlos!por!algún!dispositivo!de!salida,!como!un!monitor!o!una!
impresora!o!ser!transmitido!a!través!de!algún!enlace!o!módem.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!12!
Este!funcionamiento!es!similar!a!la!preparación!de!una!receta!por!parte!de!
un!cocinero.!La!receta!es!la!lista!de!instrucciones,!a!la!que!llamamos!programa,!que!
hemos! colocado! en! la! memoria.! El! cocinero! es! en! este! caso! el! procesador,!
encargado!de!asimilar!secuencialmente!todos! los!pasos!enumerados!en! la!receta:!
poner!un!litro!de!agua!con!sal!en!una!cacerola!a!fuego!lento,!añadir!300!gramos!de!
pasta!cuando!el!agua!hierva,!remover!durante!12!minutos!el!contenido!de!la!olla,!
para! retirarlo! más! tarde,! escurriéndolo! y! añadiendo! una! salsa! de! tomate,!
finalizando!con!la!colocación!en!el!plato.!El!cocinero!solo!sabe! interpretar!ciertas!
instrucciones! pactadas! previamente.! No! es! posible! pedirle! al! cocinero! que! sepa!
tocar!el!piano.!Para!que!la!receta!(programa)!se!cocine,!se!necesita!hacer!uso!de!los!
fogones,! la! nevera,! un! reloj,! etc.! (dispositivos! o! periféricos),! hasta! obtener,! por!
ejemplo,!un!plato!de!pasta!(resultado!final).!
Cuando! se! construyeron! las! primeras! computadoras,! del! tamaño! de! un!
edificio,! se! programaban! mecánicamente! sus! conexiones! para! poder! variar! el!
comportamiento! de! sus! instrucciones! y! obtener! el! resultado! final,! que! podía! ser!
impreso,!visualmente!mediante!una!serie!de!bombillas!o!emitiendo!ciertos!pitidos.!
Según! se! ha! ido! desarrollando! la! computación,! se! pasó! de! la! programación! tan!
tediosa!por!parte!de!un!operador!mediante!infinidad!de!cables,!a!hacerlo!mediante!
instrucciones! en! tarjetas! perforadas,! para! más! tarde! tomar! esas! órdenes! de!
dispositivos! electromagnéticos.! En! paralelo,! la! evolución! de! los! componentes!
electrónicos,! transistores! basados! en! semiconductores! como! el! silicio,! su!
producción!en!serie,! los!circuitos! impresos!integrados!y! la!miniaturización!de!los!
componentes!dieron!lugar!a!la!computadora!personal!a!principios!de!la!década!de!
los! 80.! Todo! esto! constituye! la! parte! tangible! del! ordenador:! el! hardware.! En!
cuanto!a!la!parte!intangible!de!un!ordenador,!el!software.!En!origen,!el!procesador!
recibía!estímulos!eléctricos!gracias!al!conexionado!de!cables.!Más!tarde!recibía!las!
instrucciones! tras! leer! una! cinta! con! perforaciones! binarias! de! una! longitud! fija!
(siendo! 0! la! región! sin! perforar! y! 1! la! perforada,! por! ejemplo)! con! la! que! se!
formaban!palabras!de!código!binario.!Después,!las!tarjetas!perforadas!dieron!paso!
a! las!cintas!perforadas,!cintas!y!discos!electromagnéticos!y!memorias!basadas!en!
chips!electrónicos!como!en!nuestros!días.!Es! crucial,!que!para! la! composición!de!
las!instrucciones!en!dicha!memoria,!haya!habido!una!evolución!comparable!a!la!de!
la! parte! física! de! la! computadora.! Para! programas! sencillos,! con! unas! cuantas!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 13!
instrucciones! de! código! máquina! Wcomo! se! conoce! a! las! instrucciones! que! un!
determinado!procesador!puede!interpretarW!valía.!Tanto!para!el!programador!que!
diseñaba! el! algoritmo! como! para! el! operador! de!máquina,! que! se! encargaba! de!
hacer! funcionar!el! ordenador! con!esas! instrucciones!–y!que!muchas!veces! era! el!
mismo! ingenieroW! estas! programaciones! iban! aumentando! en! complejidad,! y! se!
hacía!tedioso!e! inviable,!por! lo!que!fue!necesario!encontrar! la!manera!de!agilizar!
este!proceso.!Para!ello!se!crearon!los!lenguajes!de!programación.!!
!
c = a + b;
! _asm { MOV AX, a MOV BX, b ADD AX, BX MOV c, AX };
! 0: 66 a1 00 00 00 00 6: 66 8b 1d 00 00 00 00 d: 66 01 d8 10: 66 a3 00 00 00 00
a)!lenguaje!C! ! b)!ensamblador! ! c)!código!máquina!
Figura&2.2&Comparación!entre!lenguaje!de!alto!nivel!C,!lenguaje!ensamblador!
Intel!8086!y!código!máquina!8086.!
!
Un! lenguaje!de!programación!es!un! ! lenguaje! formado!por!un!conjunto!de!
reglas! sintácticas! y! semánticas! precisas,! que! sirve! para! expresar! la! manera! de!
afrontar! un! problema! mediante! una! computadora.! Normalmente,! el! código! de!
programación! escrito! en! un! lenguaje! de! programación! concreto,! debe! ser!
transformado! a! código! máquina! legible! por! un! procesador! o! sistema.! A! esta!
transformación! se! la! conoce! compilación.! A! los! lenguajes! de! programación! más!
primitivos! se! les! conoce! como! lenguaje! ensamblador,! que! apenas! modifican! el!
lenguaje! máquina! por! ciertas! palabras! haciendo! referencia! al! resultado! de! sus!
instrucciones.! Según! el! programador! es! abstraído! y! separado! del! lenguaje!
máquina,! se! dice! que! el! lenguaje! es! de! más! alto! nivel.! El! límite! es! el! lenguaje!
natural!que!utilizamos!las!personas!para!comunicarnos!a!diario.!Se!puede!observar!
la!diferencia!entre!lenguajes!máquina,!ensamblador!y!de!nivel!alto!en!la!Figura!2.2.!!
Tanto!el!lenguaje!de!alto!nivel,!como!el!lenguaje!ensamblador,!son!legibles!para!el!
programador.! En! el! caso! del! código! máquina,! es! el! decodificador! alojado! en! el!
procesador!el!que!debe!interpretar!esta!información.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!14!
2.2&Procesador&
Un!procesador!o!unidad!central!de!procesamiento!(CPU,!por!sus!siglas!del!
inglés:!Central,Processing,Unit)!es!la!parte!más!importante!de!una!computadora!o!
sistema!informático.!Es!el!“cerebro”!de!la!máquina.!A!nivel!interno,!se!compone,!en!
base,!de!lo!siguiente:!!
• La! unidad! aritméticoWlógica! o! (ALU,! por! sus! siglas! del! inglés:! Arithmetic:
Logic, Unit)! donde! se! realiza! las! operaciones! matemáticas! y! lógicas.! Esta!
parte!del!procesador!se!encarga!de!sumar,!restar,!la!operación!lógica!AND,!o!
comparar!por!ejemplo.!!
• La! unidad! de! control! (UC)! que! interpreta! las! instrucciones! y! controla! su!
ejecución.!
• Registros.! Son! regiones! de! memoria! de! alta! velocidad! y! poca! capacidad!
donde! se! almacenan! valores! utilizados! a! corto! plazo! por! el! procesador.!
Pueden! encontrarse! registros! de! datos,! memoria,! propósito! general,! de!
coma! flotante! y! propósito! específico.! Estos! últimos! contienen! entre! otra!
información!el!puntero!de!programa,!que!permite!saber!cual!es!la!siguiente!
posición!de!memoria!a!interpretar.!
En!el!procesador!pueden!encontrarse!otras!unidades!como!la!de!cálculo!para!coma!
flotante,!memoria!caché,!controlador!de!memoria!como!en!la!arquitectura!core,i!de!
Intel,!etc.!
Un! microprocesador! es! un! procesador! donde! todas! sus! partes! están!
integradas!en!un!mismo!chip.!En!adelante!en!este!documento!microprocesador!y!
procesador! lo! utilizaré! de! manera! indistinta.! El! primer! microprocesador! fue! el!
4004!desarrollado!por!la!empresa!Intel!en!1971.!
2.3&Núcleo,&multiprocesador,&multinúcleo&y&computación&distribuida&
Un! núcleo! de! procesamiento! es! la! parte! esencial! de! un!microprocesador.!
Por!tanto!un!microprocesador!siempre!tiene!al!menos!un!núcleo.!Desde!mediados!
de! la! década! de! 1980! existen! microprocesadores! con! dos! o! más! núcleos.! Esto!
conlleva!a!una!complicación!en!el!hardware,!que!debe!ser!tenida!en!cuenta!tanto!
por! el! resto! del! hardware! del! ordenador,! como! por! el! sistema! operativo! y! el!
software!que!corra!sobre!el.!La!arquitectura!multinúcleo!puede!contener!dos!o!más!
CPU,!memoria! caché! y/o! unidad! de! coma! flotante! compartida! entre! los! núcleos,!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 15!
memoria!caché!individual!para!cada!núcleo,!etc.!Con!estos!procesadores!especiales!
se!pueden!interpretar!instrucciones!de!memoria!de!manera!paralela!y!simultánea.!!
Otra! variante!diferente!para! conseguir!un! resultado! similar,! es!utilizar!un!
sistema!con!dos!o!más!microprocesadores.!Entraña!una!complejidad!parecida!a!la!
introducida! por! un! chip! multinúcleo.! A! esta! disposición! se! la! conoce! como!
multiprocesador.! Estos! pueden! compartir! la! memoria! principal! del! sistema!
(arquitectura!SMP),!o!bien!acceder!únicamente!y!exclusivamente!a!una!parte!de!la!
memoria!asignada!(arquitectura!NUMA).!!
!
!
Figura&2.3&a)!multiprocesador!con!memoria!compartida.!b)!multiprocesador!con!
memoria!dedicada.!c)!sistema!distribuido!con!comunicación!a!través!de!Internet.!
!
Los! mismos! mecanismos! que! hay! que! tener! en! cuenta! para! la! correcta!
sincronización! y! ejecución! de! tareas! de! forma! paralela! en! un! sistema!
multiprocesador,!se!pueden!dar!en!un!sistema!distribuido,!es!decir,!en!el!que! los!
procesadores!tengan!que!comunicarse!a!través!de!una!red!de!datos!(local!o!global).!
!
2.3&Microcontrolador&
Un!microcontrolador,!es!un!circuito!integrado!donde!se!contienen!las!partes!
esenciales!de!un!ordenador.!Esto!es:!!unidad!de!procesamiento,!memoria!primaria,!
memoria! secundaria! (programable).! También! son! conocidos! como! SoC,! por! las!
siglas!en! inglés!de!System,on,a,Chip.! Su!origen!es!brevemente!posterior!al!de! los!
microprocesadores,!en!la!década!de!1970.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!16!
Suelen! utilizarse! para! realizar! tareas! predeterminadas,! gobernar!
dispositivos! electrónicos,! electrodomésticos,! o! complementar! partes! de! un!
ordenador! de! propósito! general.! Les! diferencia! de! un! ordenador! completo! su!
arquitectura!simplificada,!su!menor!capacidad!de!proceso!y!sus!recursos!limitados.!
Esto! conlleva! a! un! menor! consumo! energético! y! costo! que! si! utilizásemos! un!
ordenador!para!llevar!a!cabo!la!misma!tarea.!
Suelen! incluir! ciertas! características! adicionales,! conocidas! como!
periféricos,!que!les!otorgan!versatilidad.!Algunos!ejemplos!son:!
• Puertos!de!entrada!y!salida!digital!o!analógica.!
• Conversor!digital–analógico,!o!ADC!por!sus!siglas!en!inglés.!
• Modulación!por!anchura!de!pulso,!para!simular!una!salida!analógica.!
• Comunicación! bidireccional! digital,! para! comunicarse! con! otros!
dispositivos.!
!
La!evolución!de! los!microcontroladores!ha!seguido!un!camino!similar!a! la!de! los!
microprocesadoes! y! ordenadores.! Pero! dado! su! uso! especializado,! algunas!
características!han!permanecido!prácticamente!desde!sus!orígenes.!Por!ejemplo,!el!
desarrollo!de! software! de! los!microcontroladores! suele! llevarse! a! cabo!mediante!
lenguaje! ensamblador.! En! algunos! casos,! los! fabricantes! de! estos! chips!
proporcionan!un!compilador!de!un!lenguaje!de!alto!nivel,!C!o!C++,!dado!el!caso.!!El!
lenguaje!ensamblador!permite!el!máximo!control!sobre!el!flujo!del!programa,!pero!
dificulta! su! comprensión! por! parte! de! otros! programadores,! y! su! posterior!
modificación!y!reutilización!del!código.!En!el!caso!de!C!y!C++,!se!consigue!mejorar!
en!la!velocidad!de!desarrollo!a!costa!de!un!pérdida!mínima!de!eficiencia!de!código.!
2.4&Sistema&Operativo&
Es! un! conjunto! de! programas! que! sirven! de! interfaz! entre! el! usuario! y! el!
hardware.!Sirve!para!ocultar!la!parte!física!del!ordenador!y!su!problemática!de!uso!
a! usuarios! y! programadores! y! es! a! su! vez! un! gestor! de! recursos.! Controla! la!
ejecución!de! los!programas!para!evitar!errores!o!un!uso! impropio!del!hardware.!
Están!diseñados!con!objeto!de!hacerlo!con!eficiencia,!fiabilidad!y!seguridad.!
Está!formado!por!diferentes!partes.!El!núcleo!del!sistema!operativo!o!kernel,!
es!el!programa!que!está!permanentemente!en!memoria!y!controla!la!ejecución!de!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 17!
los!demás!programas!y!el!acceso!a!los!recursos!hardware.!Es!habitual!que!incluyan!
herramientas!básicas!para!poder!realizar! tareas!básicas!sin!recurrir!a!programas!
externos,! como! pueda! ser! un! editor! de! texto,! un! calendario,! un! explorador! de!
archivos,!etc.!
Por!motivos!de! seguridad! e! integridad,! los! usuarios! interaccionan! con! los!
programas! del! sistema! y! las! aplicaciones,! con! el! núcleo! y! los! programas! del!
sistema.!Las!personas!interactúan!con!el!sistema!operativo!mediante!la!interfaz!de!
usuario,! que!puede! ser!un! intérprete!de! línea!de! comandos! (CLI/Shell)! en!modo!
texto,!un!sistema!de!ventanas!o!interfaz!gráfico!(GUI)!o!una!combinación!de!ambas.!
En! el! origen! de! la! computación! (1945W1955),! los! sistemas! operativos! no!
existían.! Los! ordenadores! basados! en! válvulas! de! vacío! se! dedicaban! a! procesar!
secuencialmente!un!único!programa!insertado!a!su!dispositivo!de!entrada,!que!era!
escrito! en! lenguaje!máquina,! sin! que! ningún!mecanismo! intermedio!mediara! en!
sus!operaciones!de!entrada/salida!de!datos.!Las!computadoras!de!esta!época!eran!
monousuario! y! monoprograma.! A! finales! de! esta! época! surgen! los! lenguajes! de!
ensamble.!
Más! adelante,! en! la! segunda! generación! (1955W1964),! los! computadores!
gobernados! por! transistores.! Aparecen! los! primeros! lenguajes! de! programación!
FORTRAN!y!Cobol!y!sus!compiladores.!Se!realiza!un!control!de!proceso!por!lotes.!
Un!arcaico!sistema!operativo!llamado!monitor!residente!controla! la! lectura!de!su!
entrada! de! datos! mediante! tarjetas! perforadas! al! principio,! y! cintas! magnéticas!
después.!Básicamente!separa!los!resultados!de!los!diferentes!programas!que!le!son!
entregados!en!serie!o!lote.!
En! la! tercera! generación! (1965W1980),! nacen! los! circuitos! integrados!
posibilitando! la! miniaturización! de! los! ordenadores! y! reduciendo! su! precio! en!
igual! medida.! Aparece! la! multiprogramación,! es! decir,! diferentes! programas!
pueden! correr! sobre! el! sistema! operativo,! y! este! se! encargará! de! planificar! los!
recursos! del! sistema:! CPU,! memoria,! cinta,! etc.! Los! programas! pueden! ser!
interactivos! con! el! usuario,! y! los! sistemas! pueden! ser! utilizados! por! varias!
personas!a!la!vez!sin!mezclar!sus!trabajos,!mediante!tiempo!compartido.!Aparecen!
los!discos!duros,! los!sistemas!de! ficheros,!el!acceso!directo!a!memoria! (DMA)!en!
lugar! del! acceso! secuencial! previo.! Se! desarrolla! la! programación! concurrente.!
Nacen!el!sistema!operativo!UNIX!y!OS360.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!18!
En! la! cuarta! generación! (1980Wactualidad).! Se! desarrolla! la! tecnología!LSI!
(Large, Scale, Integration,! Integración! a! gran! escala),! que! permite! que! miles! de!
transistores!puedan!ser!contenidos!en!un!chip!del!tamaño!de!un!sello!de!correos.!
Nace!el!ordenador!personal!(PC),!en!los!que!usuarios!no!especializados!comienzan!
a! interactuar! con! la! computación.! Se! retorna! a! los! orígenes:! monotarea,!
monousuario,! sin! protección,! escasa! potencia! y! capacidad.! Posteriormente!
evolucionan:!multiprogramación,! protección,!memoria! virtual,! trabajos! por! lotes.!
Se!populariza!la!interfaz!gráfica!de!usuario,!las!redes!de!ordenadores!y!hay!mayor!
preocupación!por!la!seguridad.!
Existen!multitud!de!tipos!de!sistemas!operativos!diferentes,!caracterizados!
por!el!hardware!al!que!administran,!o!por!su!finalidad:!
• Mainframe!(z/OS)!.!
• Consola!de!videojuegos:!PlayStation,!Xbox,!Wii.!!
• Supercomputadores!(Unix).!!
• Servidores!(Windows!Server!2008/2012,!Unix).!!
• Personales!(Windows!10,!Mac!OS,!Ubuntu).!!
• Tiempo!real!(VxWorks,!QNX).!!
• Embebidos!(Windows!Mobile,!Symbian,!BlackBerry,!iOS,!Android).!!
!!
2.5&Procesos&
Un!proceso!es!un!programa!en!ejecución!con!un!contexto!que!es!gestionado!
por!el!núcleo!del!sistema!operativo.!!El!contexto!se!constituye!por:!
• CPU:!asignada!por!el!núcleo!y!compartida!con!otros!procesos.!!
• Registros:!los!registros!reales!del!proceso,!su!contador!de!programa.!
• E/S:!el!proceso!puede!solicitar!el!acceso!a!dispositivos!de!E/S.!!
• Memoria:!código,!datos!y!pila.!Exclusiva!para!cada!proceso,!aunque!también!
se!puede!compartir.!!
• Comunicación!con!otros!procesos.!!
• Varios:!identificador,!credenciales,!estadísticas.!
!
Un!programa!ejecutado!dos!veces!a! la!vez!genera!dos!procesos!diferentes.!En!
un!sistema!actual!es!posible!tener!abiertas!dos!instancias!del!programa!Word!a!la!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 19!
vez.!El! sistema!operativo! lo!gestiona!como!procesos!diferentes,! los! identifica!con!
un!PID! (Process,ID)!y!sus!pilas!de!datos!son! también!diferentes.!Se!podría!cerrar!
uno!de!estos!procesos!con!independencia!del!otro.!!
!
!
Figura&2.4&Ejemplo!de!administrador!de!procesos!en!sistema!operativo!macOS.!
!
! !A! la! posibilidad! de! poder! ejecutar! varias! aplicaciones! diferentes! en! el!
mismo! ordenador! se! le! llama! multiprogramación.! La! multiprogramación! y! la!
compartición!del!sistema!por!varios!procesos!y!usuarios!obligan!a!la!protección.!La!
protección! evita! que! unos! procesos! o! usuarios! puedan! dañar! a! otros! procesos,!
otros!usuarios!o!al!propio!sistema!operativo.!
Es!imprescindible!contar!con!el!hardware!para!implementar!mecanismos!de!
protección! eficaces.! Por! ello! existen! dos!modos! de! funcionamiento! básicos! en! la!
CPU!de!un!ordenador!moderno:!modo!supervisor!o!kernel,(núcleo)!y!modo!usuario!
(procesos! de! usuario).! El! paso! a! modo! supervisor! se! realiza! mediante!
interrupciones.!Las!interrupciones!pueden!ser:!!
• Hardware:!atención!a!dispositivos!de!entrada/salida.!
• Excepciones:!fallos!de!protección!vía!software.!
• Llamadas!al!sistema.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!20!
!
Figura&2.5&Ejemplo!de!cambio!de!modo!usuario!a!kernel!y!retorno!a!modo!usuario.!
!
Al! retornar! de! las! interrupciones! se! vuelve! implícitamente! a!modo! usuario.! Las!
interrupciones!son!evaluadas!dada!su!prioridad.!Normalmente! la!prioridad!viene!
establecida!según!la!inmediatez!requerida!para!la!atención!de!esa!interrupción.!!
2.6&Procesos&e&hilos&
Un!proceso!común!solo!tiene!un!hilo!de!ejecución,!es!decir,!su!contador!de!
programa!va!avanzando!secuencialmente!por!las!instrucciones!de!memoria!que!le!
son!propias!para!realizar!su!tarea.!En!ocasiones!esta!solución!no!es!la!más!óptima!
en!términos!de!rendimiento.!Imagine!un!navegador!web!de!múltiples!pestañas.!En!
una! de! las! pestañas! se! quiere! escuchar! un! podcast, sobre! microcontroladores,!
mientras! que! en! otra! pestaña! se! quiere! leer! el! periódico! nacional.! Si! solo! se!
pudiese! tener! un! hilo! de! ejecución! para! cierto! proceso,! sería! inviable! leer! el!
periódico!mientras!sonase!el!audio.!Habría!que!conformarse!con!hacer!una!de!las!
dos!cosas!a!cada!momento.!La!aplicación!podría!abordar!esta!problemática!de!dos!
formas!distintas:!mediante!procesos!o!mediante!hilos.!!
La! solución! multiproceso! consistiría! en! que! cada! vez! que! se! abriese! una!
pestaña! nueva,! el! navegador!web! autogenerase! un! proceso! nuevo! para! atender!
cada! una! de! las! pestañas.! Esto! implicaría! que! cada! proceso! solo! podría! estar! en!!
ejecución!real!en!caso!de!tener!una!sola!CPU.!Lo!ideal!sería!que!el!proceso!principal!
gobernase! a! los! otros! procesos,! uno! por! pestaña,! para! así! poder! administrarles!
según! interese! al! programa.! Dado! que! el! programa! es! el! mismo! no! deberían!
competir!los!procesos!por!utilizar!la!CPU.!El!problema!es!que!el!sistema!operativo,!
que! es! quien! en! realidad! controla! el!hardware! del! ordenador,! entiende! que! son!
procesos! diferentes! y! les! dará! tiempo! de! CPU! y! atenderá! sus! peticiones! de!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 21!
entrada/salida!por! separado.!A! su! vez,! cada!proceso! tendrá! sus!propias! pilas! de!
datos,! su! región! de!memoria,! sus! ficheros! abiertos! para! leer! o! escribir,! etc.! Esto!
provoca!que! tendrán!que! realizarse! comunicaciones!entre! ellos,! de! igual!manera!
que!si!fuesen!procesos!con!distinto!origen.!!
!
!
Figura& 2.6& Diferencia! entre! programación! a)! multiproceso! y! b)! programación!
multihilo.!
!
Esto! plantea! otra! manera! conveniente! de! afrontar! el! problema! del! único!
hilo!de!ejecución!de!otra!manera.!Para!ello! existe! el! concepto!de!hilo,! o! también!
llamado!proceso!ligero.!Un!hilo,!a!diferencia!de!un!proceso!nuevo,!garantiza!que!se!
trabaje! sobre! el! mismo! espacio! de! direcciones.! Por! tanto,! un! proceso! que! esté!
compuesto! por! varios! hilos,! tiene! más! fácil! la! tarea! de! compartir! información.!
Además!se! tiene! la!ventaja!de!que!si!un!hilo!necesita!esperar!por!cierto! recurso,!
puede!ceder!de!manera!interna!el!control!a!otro!hilo!del!mismo!proceso!que!pueda!
aprovecha!el! tiempo!de!CPU.!Al! tratarse!de!hilos!del!mismo!proceso,! se!entiende!
que! el! programador! ha! pensado! en! la! mejor! manera! de! cooperación! entre! sus!
distintos!hilos,!dando!lugar!a!una!mejor!eficiencia!de!los!recursos.!Además,!se!evita!
duplicar!contenido!en!memoria,!con!el!consiguiente!ahorro!de!la!misma.!Amén,!la!
creación!y!destrucción!de!hilos,!es!mucho!mas!rápida!que!la!de!los!procesos.!En!el!
ejemplo!anterior,!con!hilos,!el!navegador!web!puede!acceder!a!los!recursos,!como!
el!controlador!de!red!como!una!única!entidad,!evitando!así!tener!que!turnarse!con!
otro!proceso!hermano!para!obtener!datos!de!Internet.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!22!
!
Figura&2.7&Diferencia!entre!la!gestión!de!hilos!por!parte!del!usuario!a)!y!por!parte!
del!sistema!operativo!b).!
! !
Dependiendo! del! sistema! operativo! y! del! lenguaje! de! programación! los! hilos!
pueden!tratarse!de!manera!interna!al!proceso,!lo!que!se!conoce!a!nivel!de!usuario,!
o!bien!pueden!ser!tenidos!en!cuenta!y!administrados!a!nivel!de!núcleo!de!sistema!
operativo.!
2.7&Programación&concurrente&
En!origen!y!aún!actualmente,!una!unidad!de!proceso!o!CPU!por!sus!siglas!en!
inglés!solo!es!capaz!de!realizar!una!tarea!a!la!vez.!Este!hecho,!daba!lugar!a!que!la!
ejecución! secuencial! de! un! solo! programa,! dejaba! ocioso! al! procesador! en!
intervalos! de! tiempo! elevados..! Dado! los! costes! de! estos! sistemas! y! su! baja!
eficiencia,! ya! que!muchas! tareas! requerían! de! la! intervención! de! un! dispositivo!
periférico,!como!un!lector!de!cinta!o!impresora,!o!bien!la!de!un!humano!–programa!
interactivo–!,!era!necesario!que!el!procesador!pudiese!estar!en!funcionamiento!la!
mayor!parte!del! tiempo!posible.!Los! ingenieros!se!dieron!cuenta!de!que! la!mejor!
manera! de! aprovechar! estos! tiempos! de! espera,! era! dándole! otra! cosa! útil! que!
hacer!al!procesador!mientras!el!primer!programa!quedaba!en!espera.!Es!decir,! la!
computadora! debía! soportar!más! de! un! proceso! a! la! vez.! A! este! fenómeno! se! le!
conoce!como!multiprogramación.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 23!
En!cualquier!sistema!de!multiprogramación,!la!CPU!conmuta!de!un!proceso!
a! otro! con! rapidez,! ejecutando! cada! uno! durante! décimas! o! centésimas! de!
milisegundos:! hablando! en! sentido! estricto,! en! cualquier! instante! la! CPU! está!
ejecutando! sólo! un! proceso,! y! en! el! transcurso! de! 1! segundo! podría! trabajar! en!
varios!de!ellos,!dando!la!apariencia!de!un!paralelismo!(o!pseudoparalelismo,!para!
distinguirlo! del! verdadero! paralelismo! de! hardware! de! los! sistemas!
multiprocesadores! o! multinúcleo! con! dos! o! más! CPUs! que! comparten! la! misma!
memoria!física).!Para!ello,!los!sistemas!operativos!utilizan!diferentes!mecanismos!
para! planificar! el! uso! de! CPU! por! parte! de! los! diferentes! procesos.! Podemos!
diferenciar!los!mecanismos!de!planificación!de!un!sistema!operativo:!
• Multiprogramación! cooperativa:! este!método! de! planificación,! consiste! en!
que!son!los!propios!procesos!los!que!deciden!cuando!ceder!el!uso!de!CPU!a!
otro!proceso.!Esto!suele!darse!cuando!el!proceso!requiere!una!operación!de!
entrada/salida,!o!bien!necesita!sincronizarse!con!otro!proceso,!etc.!
• Multiprogramación! apropiativa:! ! en! este! caso,! el! planificador! es! el!
responsable!de!otorgar!el!uso!de!CPU!a!los!diferentes!procesos!que!quieren!
utilizarla.! Para! ello! asigna! unos! intervalos! de! tiempo,! llamados! quantum,!
donde!cada!proceso!puede!utilizar!la!CPU!cuando!es!su!turno.!Es!similar!a!la!
manera!en!que!dos!jugadores!de!ajedrez!se!turnan!para!mover!sus!piezas.!A!
este!tipo!de!conmutación!temporal!se!le!denomina!round,robin.!
El!primer!mecanismo,!tiene!el!problema!de!que!si!nos!encontramos!con!un!proceso!
egoísta,!o!incurre!en!un!bucle!infinito,!el!resto!de!procesos!no!podrá!acceder!nunca!
a! la! CPU.! A! esto! se! lo! conoce! como! inanición.! Por! tanto,! solo! funciona! si! los!
procesos!son!cooperantes!entre!sí,!lo!que!sería!un!sistema!ideal.!
! Existen! diferentes! implementaciones:! con! adición! de! prioridades,! con!
mecanismos!de!elección!de!procesos!por!su!duración,!con!quantums!dinámicos!en!
función! de! estadísticas,! etc.! En! cualquier! caso,! lo! que! se! pretende! es! la!máxima!
eficiencia!del!sistema!y!de!sus!recursos.!
! La! computación!concurrente!es! la! simultaneidad! (o!pseudosimultaneidad)!
en! la! ejecución! de! múltiples! tareas! interactivas.! Estas! tareas! pueden! ser! un!
conjunto! de! procesos! o! hilos! de! ejecución! creados! por! un! único! programa.! Las!
tareas! se! pueden! ejecutar! en! una! sola! unidad! central! de! proceso,! en! varios!
procesadores! o! en! una! red! de! computadores! distribuidos.! La! programación!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!24!
concurrente! está! relacionada! con! la! programación!paralela,! pero! enfatiza!más! la!
interacción! entre! tareas.! Así,! la! correcta! secuencia! de! interacciones! o!
comunicaciones! entre! los! procesos! y! el! acceso! coordinado! de! recursos! que! se!
comparten!por!todos!los!procesos!o!tareas!son!las!claves!de!esta!disciplina.!
! En! el! caso! concreto! de! los! microcontroladores,! y! a! diferencia! de! los!
ordenadores! de! propósito! general,! su! programación! esta! orientada! a! una! tarea!
global!concreta;!un!solo!programa.!Además,!los!recursos!de!memoria!y!capacidad!
de!proceso!son!limitados,!por!lo!que,!para!mejorar!la!eficiencia,!se!puede!afrontar!
la! problemática! de! la! programación! concurrente! sin! recurrir! a! algoritmos! de!
planificación!apropiativos.!
!
2.8&Programación&dirigida&por&eventos&
Habitualmente,! los! programas! diseñados! para! microcontroladores! se!
escriben! y! ejecutan! de!manera! secuencial.! Siempre! que! un! programa! escrito! de!
esta! manera! necesita! capturar! algún! evento! externo,! como! pulsar! un! botón,! la!
llegada!de!un!carácter!a!través!del!puerto!serie!o!un!retardo!de!tiempo,!realiza!una!
espera!activa!y!explícita!hasta! la!ocurrencia!del!evento.!La!espera!activa!significa!
que!el!procesador!del!microcontrolador!utiliza!sus!ciclos!de!reloj!constantemente!
evaluando! alguna! condición! en! un! bucle! cerrado,! llamado! bucle! de! sondeo! en!
castellano!o!poolling!en!inglés.!Por!ejemplo,!en!el!siguiente!fragmento!de!código,!en!
la! llamada! a! la! función! delay(),! contienen! un! bucle! de! sondeo! implícitos! en! su!
interior:!
!
void loop () { digitalWrite (13, HIGH); // encender el LED delay (1000); // esperar 1 segundo digitalWrite (13, LOW); // apagar el LED delay (1000); // esperar 1 segundo }
Código&2.1&Ejemplo!de!código!para!microcontrolador!utilizando!un!bucle!de!
sondeo!escrito!en!lenguaje!C.!
!
Aunque!este!enfoque!es!funcional!en!muchas!situaciones,!no!funciona!muy!
bien!cuando!hay!múltiples!fuentes!de!eventos!cuyos!tiempos!de!llegada!y!orden!no!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 25!
se! pueden! predecir,! y! donde! es! importante! manejar! los! eventos! de! manera!
oportuna.!El!problema!fundamental!es!que!mientras!un!programa!secuencial!está!
esperando! un! tipo! de! evento! (por! ejemplo,! un! retardo! de! tiempo),! no! está!
realizando! ningún! otro! trabajo! y! no! responde! a! otros! eventos! (por! ejemplo,!
pulsaciones!de!botones).&
A!diferencia!de! la!programación!estructurada!clásica,! en! la!que!el! flujo!de!
programa!se! realiza!de!manera!secuencial,! según!el!objetivo!del!programador,! la!
programación! dirigida! por! eventos! se! basa! en! ceder! la! responsabilidad! de! la!
consecución! de! acciones! o! flujo! del! programa! a! los! eventos! que! el! programa!
maneje.!
Un!ejemplo!de!este!tipo!de!programación,!se!da!en!las!interfaces!gráficas!de!
usuario!(GUI!por!sus!siglas),!donde!la!pulsación!del!ratón!en!un!área!específica!de!
la!pantalla!desencadena!una!serie!de!acciones!por!parte!del!programa.!
Estos!eventos!son!manejados!por!un!llamado!administrador!de!eventos.!Es!
competencia! del! programador! definir,! limitar! y! manejar! lo! que! cada! evento!
produce!en!el!programa.!Esto!suele!venir!condicionado!por!el!sistema!operativo,!el!
lenguaje! de! programación! empleado! y! el! hardware.! Los! eventos! pueden! ser!
acciones! externas! como! la! pulsación! de! una! tecla,! la! activación! de! un! sensor! o!
internas!como!el!desbordamiento!de!un!temporizador!interno.!
Este!paradigma!de!programación!supone!algo!de!complejidad!respecto!a!la!
programación! estructurada! y! la! orientada! a! objetos.! Una! parte! de! esta!
problemática! consiste! en! la! abstracción! que! debe! llevar! a! cabo! el! programador!
para!manejar!el!flujo!del!programa!y!otra!de!ellas!es!acotar!el!comportamiento!del!
código!para!todas!las!situaciones!posibles.!
NOTA:!Los!contenidos!hasta!aquí!expuestos!tienen!como!referencia!de!consulta![L1]!
2.9&Internet&de&las&cosas&
El!Internet!de!las!cosas!o!IoT!por!sus!siglas!en!inglés!!(Internet!of!Things)!es!
un!término!originado!por!Kevin!Ashton,!un!ingeniero!británico!que!trabajaba!en!la!
identificación! por! radiofrecuencia! (RFID)! en! el! Instituto! Tecnológico! de!
Massachusetts,! y! concibió! un! sistema!de! sensores! universales! que! conectaban! el!
mundo!físico!a!Internet!en!1999.!El!RFID!fue!semilla!y!ahora!rama,!del!Internet!de!
las!Cosas.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!26!
Es!un!concepto!que!relaciona!la!capacidad!dada!a!objetos!de!uso!común!de!
comunicarse!entre!ellos!y!con!Internet.!También!hace!referencia!al!fenómeno!que!
se!observa!y!se!espera,!de!que!la!información!que!circula!en!Internet!no!tenga!en!
último! término! un! origen! humano.! Es! decir,! que! estos! objetos! conectados! a!
Internet!generen!su!propia!información,!la!reciban!y!la!procesen.!Esto!provocaría!
que! los! usuarios! de! Internet,! humanos,! se! vean! superados! en! número! por! estos!
dispositivos!conectados.!
La!constitución!de!una!red!compleja!que!conecta!billones!de!dispositivos!y!
seres! humanos! en! una! infraestructura! multitecnológica,! multiprotocolo! y!
multiplataforma,! la! visión! principal! de! Internet! de! las! Cosas! es! crear! un!mundo!
inteligente! donde! lo! real! y! lo! virtual! converjan,! gracias! a! lo! digital,! para! crear!
entornos! inteligentes.! La! expectativa! es! la! de! interconectar!millones! de! islas! de!
redes! inteligentes! que! permitan! el! acceso! a! la! información! no! solo! en! cualquier!
momento!y!en!cualquier! lugar,!sino!también!mediante!cualquier!cosa!y!cualquier!
persona! idealmente!a! través!de!cualquier!ruta,! red!y!servicio.!Esto!se!conseguirá!
dotando! a! los! objetos! cotidianos! con! dispositivos! de! detección,! identificación! y!
posicionamiento!y!comunicación!para!convertirse!en!objetos!inteligentes,!capaces!
de!comunicarse!no!sólo!con!otros!objetos!inteligentes,!sino!también!con!los!seres!
humanos.! La! expectativa! es! obtener! información! de! áreas! que! nunca! podríamos!
alcanzar! sin! los! avances! en! las! tecnologías! de! detección,! identificación! y!
posicionamiento.! Al! ser! descubiertos! globalmente! y! consultados,! estos! objetos!
inteligentes! pueden! descubrir! e! interactuar! de! forma! similar! con! entidades!
externas!consultando!a!seres!humanos,!computadoras!y!otros!objetos!inteligentes.!
Los! objetos! inteligentes! también! pueden! obtener! inteligencia! haciendo! o!
permitiendo!decisiones!relacionadas!con!el!contexto!aprovechando!los!canales!de!
comunicación! disponibles! para! proporcionar! información! sobre! sí! mismos! al!
mismo!tiempo!que!acceden!a!información!que!ha!sido!agregada!por!otros!objetos!
inteligentes.!
La! Unión! Internacional! de! Telecomunicaciones! (UIT),! propone! una!
infraestructura!esencial!que!se!construirá!alrededor!de!una!arquitectura!multicapa!
en!la!que!los!objetos!inteligentes!se!utilizarán!para!entregar!diferentes!servicios!a!
través!de!las!cuatro!capas!principales!representadas!en!la!Figura!2.8:!una!capa!de!
dispositivo,!una!capa!de!red,!una!capa!de!soporte!y!la!capa!de!aplicación.!En!la!capa!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 27!
del! dispositivo! hay! dispositivos! como! sensores,! actuadores,! RFID! y! puertas! de!
enlace! utilizadas! para! recoger! las! lecturas! del! sensor! para! procesamiento!
adicional.! La! capa! de! red! proporciona! las! capacidades! de! transporte! y! de! red!
necesarias! para! encaminar! los! datos! de! Internet! de! las! Cosas! a! lugares! de!
procesamiento.! La! capa! de! soporte! es! una! capa! de! middleware! que! sirve! para!
ocultar! la! complejidad! de! las! capas! inferiores! a! la! capa! de! aplicación! y!
proporcionar!servicios!específicos!y!genéricos.!
!
Figura&2.8&Esquema!de!arquitectura!de!IoT!propuesto!por!la!Unión!
Internacional!de!Telecomunicaciones.!
Internet! de! las! Cosas! puede! percibirse! como! una! infraestructura! que!
conduce!una!serie!de!servicios!de!aplicaciones!que!están!habilitados!por!una!serie!
de! tecnologías.! Sus! ámbitos! de! aplicación! se! expanden! a! través! de! muchos!
dominios!tales!como!ciudades!inteligentes,!transporte,!edificios,!energía,!industria!
y!salud,!mientras!que!está!habilitado!por!diferentes!tecnologías!como!sensores!(y!
redes! de! sensores),! nanoelectrónica,! actuadores,! RFID,! localización,!
almacenamiento,!etc.!Los!sistemas!y!aplicaciones! IoT!deben!estar!diseñados!para!
proporcionar! seguridad,! privacidad,! integridad,! confianza,! fiabilidad,!
transparencia,!anonimato!y!están!sujetos!a!restricciones!éticas.! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!28!
! &
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 29!
Capítulo&3:&Hardware&
!
Una!de!las!características!principales!de!IoT!es!la!heterogeneidad;!es!decir,!
múltiple! hardware–software! que! cooperan! entre! sí! a! través! de! redes! para! crear!
servicios! complejos.! Se! podría! decir! que! la! colaboración! se! basa! en! un! complejo!
entramado! de!microservicios.! La! interconexión! entre! las! diferentes! cosas! puede!
ser! almábrica! o! inalámbrica! y,! habitualmente! las! redes! se! constituyen! como! un!
complejo! entramado! de! subredes! que! pasan! información! entre! ellas! a! través! de!
cosas! que! actúan! como!pasarelas.! En! particular! esta! investigación! se! basa! en! un!
hardware!simple,!barato!y!ampliamente!soportado:!Arduino.!
&
3.1&Arduino&
Arduino! es! una! plataforma! electrónica! hardwareWsoftware! de! código!
abierto! que! fue! creada! con! el! objetivo! de! acercar,! en! cuanto! a! facilidad! de!
aprendizaje!y!bajo!coste,!a!cualquier!persona!que!desease!crear!proyectos!basados!
en!arte!electrónico.!
!
Figura&3.1&Detalle!de!la!placa!Arduino!UNO!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!30!
Se! trata! de! un! ecosistema! de! desarrollo! donde! el! hardware,! una! placa!
electrónica! gobernada! por! un! microcontrolador,! es! cargada! con! un! software!
llamado!sketch!mediante!un!entorno!de!programación!Arduino!IDE,!escribiendo!el!
código!en!un!lenguaje!de!programación!llamado!Processing,!que!está!basado!en!C!y!
C++.!
!
Microcontrolador&& Atmega328&&
Voltaje!de!operación!! 5V!!
Voltaje! de! entrada!
(Recomendado)!!7!–!12V!!
Voltaje!de!entrada!(Límite)!! 6!–!20V!!
Pines! para! entradaW! salida!
digital.!!
14! (6! pueden! usarse! como!
salida!de!PWM)!!
Pines!de!entrada!analógica.!! 6!!
Corriente!continua!por!pin!IO!! 40!mA!!
Corriente! continua! en! el! pin!
3.3V!!50!mA!!
Memoria!Flash!!32!KB!(0,5!KB!ocupados!por!el!
bootloader)!!
SRAM!! 2!KB!!
EEPROM!! 1!KB!!
Frecuencia!de!reloj!! 16!MHz!!
Microcontrolador!! Atmega328!!
Voltaje!de!operación!! 5V!!
Medidas!(Alto!x!Ancho)! 68,6!mm!x!53,4mm!
Peso! 25!g!
Figura&3.2!Características!de!Arduino!Uno!Rev.!3.!
!
Aunque! existen! infinidad! de! modelos! de! placas! Arduino,! cada! una! con!
ciertas! características! para! adecuarlas! a! la! aplicación! a! desarrollar,! en! general!
están!construidas!en!base!a!un!microcontrolador!firmado!por!la!empresa!AVR.!Es!
un!microcontrolador!que!integra!las!partes!esenciales!de!una!computadora:!unidad!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 31!
central!de!procesamiento,!memoria!primaria,!memoria!secundaria!y!periféricos!de!
entrada!y!salida.!
Existen!multitud!de!variantes!de!placas!Arduino.!Además,!al!ser!hardware!
de!código!abierto,!los!planos!de!dichas!placas!son!accesibles,!por!lo!que!es!habitual!
realizar!placas!a!medida!una!vez!un!prototipo!ha!sido!desarrollado!por!completo.!
La!placa!más!representativa!es!la!Arduino!UNO,!la!cual!en!su!versión!actual!(rev!3)!
tiene!las!siguientes!especificaciones.!
Como!complemento!a!estas!placas,!se!les!puede!añadir!una!(o!varias)!tarjeta!
(s)!de!expansión!llamadas!Shields.!Estos!escudos!consisten!en!un!circuito!integrado!
que!conecta!con!los!pines!estándar!de!la!placa!Arduino!y!le!proporciona!diversas!
funcionalidades,!como!son!conectividad!WiFi,!Bluetooth,! localización!GPS,!control!
de!motores!y!relés,!pantallas!LCD,!etc.![W1]!
!
3.2&Comparativa&frente&a&la&competencia.&Arduino&vs&PIC&
&
! !
a)!Atmel!AVR!Atmega!328P! b)!Microchip!PIC!16F877A!
Figura&3.3&Comparación!física!entre!microcontroladores!AVR!y!PIC!en!
formato!DIP.!
!
En! el! mercado,! existen! infinidad! de! fabricantes! de! microcontroladores!
(Intel,! Motorola,! Texas! Instruments,! Zilog,! etc.).! Entre! todos! ellos! destacan! por!
relación!calidadWprecio,!tanto!los!microcontroladores!Atmel!de!AVR,!como!los!PIC!
de!Microchip.! Ambos! coinciden! en! utilizar! un! conjunto! de! instrucciones!RISC!de!
8bits,!memorias!flash!y!SRAM,!periféricos!y!conversores!AD.!Lo!que!les!diferencia!
es:!
• Su! entorno! de! programación,! lenguaje! de! programación! y! compiladores!
disponibles.!En!el!caso!de!AVR,!tanto!el!entorno!de!desarrollo!Atmel!Studio!
como!en!este!caso!Arduino!IDE!son!gratuitos.!Por!el!contrario,!en!el!caso!de!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!32!
los! PIC! se! desarrolla! en! lenguaje! ensamblador! de!manera! nativa.! Existen!
compiladores!para!C/C++!aunque!no!son!gratuitos.!
• Interfaz!de!programación:!los!micocontroladores!de!Arduino!se!programan!
con!un!ISP!que!siempre!viene!integrado!en!la!propia!placa.!Para!el!resto,!se!
pueden!utilizar!programadores!por!puerto!RSW232,!USB!etc.!En!el! caso!de!
los!PIC,!su! interfaz!de!programación! funciona!en!alto!voltaje!(>5V),!por! lo!
que!hay!que!recurrir!a!periféricos!especiales!para!realizar!dicha!función.!
• La!eficiencia!energética.!Es!un!aspecto!a!tener!muy!en!cuenta!tratándose!de!
dispositivos! que!muy! probablemente! queramos! utilizar! sin! una! fuente! de!
alimentación! ilimitada!para!su!aplicación!en!el! Internet!de! las!Cosas,! tales!
como!baterías!o!placas!fotovoltaicas.!En!este!sentido! los!chips!de!AVR!son!
sensiblemente!superiores!a!los!de!Microchip.!
• En!ambos!casos!su!popularidad!han!hecho!posible!que!exista!una!gran!masa!
social! que! soporte,! ayude! y! comparta! código! para! facilitar! el! empleo! de!
dichos!sistemas.!AvrFreks.net!vs!PIClist.com!
!
Recientemente! la! empresa! Microchip,! fabricante! de! la! gama! de!
microcontroladores! PIC,! ha! comprado! la! empresa! Atmel,! fabricante! de! los! chips!
AVR!Atmega!utilizados!en!Arduino![W3].!!!!
!
Fuente!del!apartado![W2]!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 33!
Capitulo&4:&Software&
4.1&Estado&del&arte.&Estudio&de&las&diferentes&opciones&
El! objetivo! de! esta! sección! es! establecer! una! relación! de! ventajas! e!
inconvenientes! de! las! diferentes! maneras! de! afrontar! el! desarrollo! software! del!
proyecto.!Se!diferencian!dos!formas!de!afrontar!la!programación!de!este!proyecto:!
a! través! de! un! sistema! operativo! reducido! o! microkernel,! y! utilizando!
programación!concurrente!sin!recurrir!a!esta!gestión.!Todo!esto!para!el!harware!
seleccionado;! es! decir,! Arduino! (aunque! algunos! de! estos! desarrollos! funcionan!
igualmente!en!otras!plataformas).!
!
4.2&Basadas&en&Sistemas&Operativos&
4.2.1&QPTMWnano&
La!solución!propuesta!por!Quantum!Leaps!se! llama!QPTMWnano! framework!
como!pseudo!sistema!operativo!de!tiempo!real!RTOS!y!QMTM!modeling,tool,como!
herramienta!de!programación!visual.!
QPWnano! es! un! marco! de! trabajo,! o! framework! en! lengua! inglesa,! que!
proporciona!bibliotecas!de!funciones!para!el!desarrollo!de!código!de!programación!
basado! en! maquinas! de! estado! finitas,! dirigidas! por! eventos,! jerarquizados! por!
prioridad.!!
!
Figura&4.1&Diagrama!de!funcionamiento!del!planificador!QVWnano.!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!34!
!
Para! la! versión! gratuita! disponible! para! el! entorno! de! desarrollo! de!
Arduino,!el!planificador!utilizado!es!cooperativo,!por!lo!que!es!responsabilidad!del!
programador!cuidar!que!el!código!de!su!programa!ceda!el!control!al!planificador!
para!no!acaparar!el!tiempo!de!CPU.!
El!diagrama!de!la!Figura!4.1!muestra!el!funcionamiento!de!este!planificador!
llamado!QVWnano.!El!planificador!buscará!el! evento!más!prioritario! (prioridad!n)!
utilizando!un!mecanismo!FIFO,!y!lo!despachará!a!la!máquina!de!estado!asociada!a!
dicho!evento.!El!siguiente!evento!a!tratar!lo!buscará!utilizando!el!mismo!método,!
por!lo!que!corremos!el!riesgo!de!no!manejar!nunca!los!eventos!menos!prioritarios.!
En!caso!de!encontrarse!todas! las!colas!de!eventos!vacías,!el!planificador!quedará!
en! estado! IDLE! (ocioso)! y! dormirá! (modo! sleep)! al! procesador! para! ahorro!
energético.!
La!versión!de!pago!implementa!un!planificador!más!sofisticado!llamado!QKW
nano,!proporcionando!un!mecanismo!de!multiprogramación!apropiativa,!como!en!
los!sistemas!operativos!modernos.!
!
!
Figura&4.2&Cambios!de!contexto!en!un!sistema!operativo!apropiativo!con!
prioridades.!
!
QPTMWnano! utiliza! las! interrupciones! hardware! de! Arduino,! para! hacer!
funcionar! el! planificador! en! intervalos! relativamente! cortos! de! tiempo.! Para! ello!
hace!uso!del!Timer2!en!el!caso!de!la!placa!Arduino!UNO,!dejando!el!Timer1!libre!
para!poder!ser!utilizado,!entre!otras,!por!la!función milis().!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 35!
El! framework! también! hace! uso! de! aserciones! para! capturar! errores! en!
tiempo!de!ejecución!y!ayudar!al!programador!en!su!depuración.!
&
QMTM&modeling)tool&
La! herramienta! de! modelado! gráfico! QMTM! es! un! entorno! de! desarrollo!
gratuito,! para! diseñar! e! implementar! aplicaciones! embebidas! basadas! en! el!
framework! QPTM.! Está! disponible! para! entornos!Windows! 64Wbit,! Linux! 64Wbit,! y!
macOS.!
Figura&4.3&Herramienta!de!programación!visual!QMTMmodeling!tool.
Esta! herramienta! no! es! imprescindible,! pero! si! altamente! recomendada!
para!la!comprensión,!diseño!y!desarrollo!de!las!aplicaciones!bajo!este!framework.!
La!nula!integración!de!esta!herramienta!con!el!IDE!de!Arduino!hace!que!sustituir!el!
entorno,!en!lugar!de!complementarlo,!para!la!fase!de!desarrollo!sea!inviable.!
!
&
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!36!
&
&
Conclusión&
Es!un!framework!que!contiene!casi!todas!los!requisitos!de!nuestro!proyecto!
y!objetivo.!Cito!a!continuación!los!pros!y!contras!encontrados!en!esta!plataforma.!
PROS:!
• Programación!concurrente!basada!en!eventos.!
• Compatible!con!placas!Arduino.!
• Multiplataforma!
• Coste!cero.!
• Flexibilidad!de!programación.!!
!
CONTRAS:&
• El!desarrollo!sobre!esta!plataforma!es!complejo,!en!oposición!de!uno!de!los!
valores!del!proyecto!Arduino.!!
• No! hay! soporte! nativo,! ni! librerías! para! proporcionar! conectividad,!
requisito!indispensable!para!su!aplicación!para!el!Internet!de!las!Cosas.!
Fuente[W4].!
4.2.2&RTuinOS&
RTuinOS! es! un! Sistema! Operativo! de! Tiempo! Real! (RTOS! en! inglés)! para!
Arduino.!Un!sistema!operativo!de!tiempo!real!es!indicado!para!entornos!en!los!que!
ciertas! actuaciones! deben! ser! realizadas! en! determinado! lapso! de! tiempo! con!
precisión!y!fiabilidad.!Por!ejemplo,!si!queremos!implementar!un!sistema!operativo!
de! tiempo! real! en! la! centralita! de! un! vehículo! para! controlar! la! inyección! de!
combustible,!esta!tarea!tiene!una!condición!crítica!temporal.!Solo!se!puede!dar!con!
un!error!de!nanosegundos.!!
La!ejecución!normal!de!un!programa!o!sketch!de!Arduino!tiene!dos!rutinas!
diferenciadas:!setup()!y loop().!La!primera!de!ellas!consiste!en!la!configuración!
inicial!necesaria!para!ejecutar!el!código!de!programa.!La!segunda!es!un!código!que!
se! ejecuta! indefinidamente! desde! la! ejecución! de! setup()! hasta! que! se! apaga! o!
reinicia!el!hardware.!La!cadencia!con!la!que!el!bucle!se!ejecuta!no!es!determinada!a!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 37!
priori,!si!no!que!depende!de!la!duración!de!la!ejecución!del!código!en!dicho!bucle!y!
de!su!flujo!de!programa.!
Usando!RTuinOS,!las!dos!funciones!mencionadas!siguen!existiendo!y!siguen!
teniendo! el! mismo! significado.! Sin! embargo,! como! parte! de! la! configuración! se!
definen! una! serie! de! tareas! que! son! las! que! nuestro! sistema! va! a! ejecutar!
concurrentemente.! Dichas! tareas! se! ejecutan! de! forma! semi! paralela! y! RTuinOS!
brinda! primitivas! de! sincronización! y! exclusión! mutua! para! coordinarlas.! Las!
tareas! se! ejecutan! repetidamente! dentro! del! bucle! de! la! función! principal.! La!
función!loop()!se!convierte!en!la!tarea!ociosa!(IDLE)!de!RTuinOS.!
Una! característica!de!RTuinOS!es!que! el! comportamiento!de!una! tarea!no!
está! totalmente! predeterminada! en! tiempo! de! compilación.! A! su! vez,! soporta!
tareas!comunes,!controladas!por!tiempo,!o!controladas!por!eventos;!y!que!pueden!
tener!diferentes!prioridades.!
RTuinOS!está!organizado!en!un!paquete!que!combina!la!fuente!del!sistema!
operativo!con!algunas!aplicaciones!de!ejemplo.!El!código!fuente!de!cada!aplicación!
están!separados!en!carpetas.!Cualquiera!de!estos!ejemplos!puede!ser!seleccionado!
para!la!compilación.!
Tareas!en!RTuinOS!
En!este!sistema!una! tarea!está!representada!por!un!objeto!task.!Todos! los!
objetos!task!se!asignan!estáticamente,!no!hay!creación!o!eliminación!dinámica!de!
tareas.!Estas! tareas! se!parametrizan!en! la! función!setup()! de!Arduino!y!quedan!
determinadas!en!tiempo!de!compilación.!
RTuinOS!administra!una!lista!que!define!las!tareas!y!sus!prioridades.!Todas!
las! tareas! tienen! una! prioridad! específica! todas! las! tareas! que! tienen! la! misma!
prioridad! forman!una! lista!asociada.!Las!prioridades!de! las! tareas!se!determinan!
en! tiempo!de! compilación!de! la! aplicación.!Una! lista! adicional! contiene! todas! las!
tareas!(de!cualquier!prioridad)!que!se!encuentran!en!estado!de!suspensión!en!ese!
momento! indicado.!El!planificador!puede!ser!cooperativo,!o!utilizando!quantums!
de!tiempo!siguiendo!un!patrón!Round,Robin,o!una!combinación!de!ambos.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!38!
Figura&4.4&Diagrama!del!planificador!utilizado!por!RTuinOS.
Una! de! los! atributos! que! caracteriza! un! objeto! Tarea! es! la! condición! que!
expresa! bajo! qué! circunstancia! se! reanuda! su! ejecución.! En! el! momento! de!
inicialización!del!sistema!todas!las!tareas!son!puestas!en!estado!de!suspensión.!Es!
por! esto! que! la! condición! inicial! de! ejecución! es! parte! de! la! inicialización! de! la!
tarea.! Habitualmente! las! tareas! se! configuran! para! que! comiencen! su! actividad!
inmediatamente! al! inicio! del! sistema.! Sin! embargo,! pueden! ser! utilizadas!
condiciones! temporales,! eventuales! y! lógicas.! Aplicar! retardos! en! el! inicio! de! las!
tareas!puede!evitar!tener!muchas!tareas!regulares!ejecutándose!al!mismo!tiempo,!
no!favoreciendo!el!retardo!de!actuación!de!dichas!tareas.!
Para!crear!una!aplicación!RTuinOS!se!debe:!
• Crear!una!carpeta!vacía!para!el!nuevo!proyecto.!
• Un! fichero! fichero.c!donde! se!definen! las! funciones!setup( ),!loop( )! las!
tareas!
• Un!fichero!rtos.config.c!con!las!configuraciones!de!RTuinOS.!
• Configuración!de!makefile!teniendo!en!cuenta!la!placa!Arduino!utilizada,!su!
puerto!y!el!compilador!a!utilizar!
!
Es! importante! aclarar! puede!para! realizar! la! aplicación! se! podrán!utilizar!
las!funciones!provistas!por!la!librerías!estándar!de!Arduino,!y!a!su!vez,!utilizar!las!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 39!
funciones! que! brinda! RTuinOS! para! garantizar! la! exclusión! mutua! y! la!
sincronización!entre!tareas.!
!
!
Figura&4.5&Placa!Arduino!Mega.
!
El! sistema!operativo!RTuinOS! está!diseñado!para! ser! implementado! en! la!
placa!Arduino!Mega,!basado!en!el!chip!AVR!ATmega2560.!!Se!diferencia!de!la!placa!
UNO!en:!
• La!disposición!de!sus!pines!y!puertos.!
• 256KB!de!memoria!flash!en!lugar!de!32KB!en!Uno.!
• 8!KB!SRAM!vs!2!KB.!
• 4k!EEPROM!vs!1k.!
• 4!Puertos!Serie!Hardware!en!lugar!de!1!en!el!caso!de!la!placa!UNO.!
• Muchos!más!pines!con!capacidad!PWM!(15!en!Mega!y!6!en!UNO). &
Conclusión&
Es! un! sistema! operativo! creado! a! partir! de! cero,! sin! la!madurez! de! otros!
similares!como!FreeRTOS,!pero!que!provee!de!las!herramientas!para!cumplir!con!
casi!todos!los!requisitos!de!este!proyecto.!A!continuación!enumero!sus!ventajas!y!
desventajas:!
&PROS:&
• Permite!programación!concurrente.!
• Compatible!con!placas!Arduino.!
• Compilador!multiplataforma!desde!la!versión!1.0.2.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!40!
• Coste!cero.!
• Flexibilidad!de!programación.!!
!
CONTRAS:&
• El!desarrollo!sobre!esta!plataforma!es!complejo,!en!oposición!de!uno!de!los!
valores!del!proyecto!Arduino.!!
• No! hay! soporte! nativo,! ni! librerías! para! proporcionar! conectividad,!
requisito!indispensable!para!su!aplicación!para!el!Internet!de!las!Cosas.!
• Los!recursos!necesarios!para!hacer!correr!el!sistema!operativo!no!han!sido!
optimizados!aún.!
Fuente![W5].!
4.2.3&Contiki&OS&
Contiki! es! un! sistema! operativo! de! código! abierto,! altamente! portátil! y!
multitarea! para! sistemas! embebidos! y! redes! de! sensores! inalámbricos.! Está!
diseñado! para! microcontroladores! con! pequeñas! cantidades! de! memoria.! Una!
configuración!típica!de!Contiki!es!2!kilobytes!de!RAM!y!40!kilobytes!de!ROM.!Está!
escrito!en!el!lenguaje!de!programación!C!y!está!libremente!disponible!como!código!
abierto!bajo!una!licencia!de!tipo!BSD.!Funciona!en!una!variedad!de!la!plataforma!
que!se!extiende!de!microcontroladores!tales!como!el!MSP430!y!el!AVR!a!antiguos!
ordenadores!personales.!
Contiki! se! basa! en! un! kernel! controlado! por! eventos,! pero! proporciona!
soporte! tanto! para! multiWsubprocesos! como! para! una! construcción! ligera! y! sin!
pilas!llamada!protothreads.!
Ofrece! una! comunicación! a! Internet! potente! y! de! bajo! consumo,! es!
completamente! compatible! con! IPv6! e! IPv4! y! con! los! últimos! estándares!
inalámbricos! para! dispositivos! de! bajo! consumo:! 6LoWPAN,! RPL,! COAP.!
Utilizando! ContikiMAC,! incluso! dispositivos! enrutadores! pueden! operar! a!
baja! potencia! y! ser! alimentados! por! baterías.! Contiene! dos! pilas! de!
comunicación:!uIP!y!Rime.:!
• uIP!es!una!pequeña!pila!TCP!/!IP!compatible!con!RFC!que!hace!posible!que!
se!comunique!a!través!de!Internet.!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 41!
• Rime! es! una! pila! de! comunicaciones! ligeras! diseñada! para! radios! de! baja!
potencia.! Rime! proporciona! una! amplia! gama! de! primitivas! de!
comunicación! adecuadas! para! implementar! aplicaciones! vinculadas! a! la!
comunicación!o!protocolos!de!red!
!
El! sistema!de!desarrollo! está!diseñado!para! facilitar! la! compilación!de! las!
aplicaciones! de,! ya! sea! para! una! plataforma! de! hardware! o! una! plataforma! de!
simulación,!simplemente!suministrando!diferentes!parámetros!al!comando!make,!
sin!tener!que!editar!ficheros!makefile!ni!modificar!el!código!de!la!aplicación.!
!
Figura&4.5&Herramienta!de!simulación!Cooja!para!el!sistema!operativo!Contiki.!
!
Para! utilizar! el! sistema,! hay! que! descargar! una! máquina! virtual! con!
distribución!Linux!Ubuntu!y!arrancarla!con!el!programa!VMWare!Player.!Dentro!de!
dicho!sistema!virtualizado!se!encuentra!un!emulador!de!redes!de!sensores!escrito!
en!Java!llamado!Cooja,!y!los!compiladores!base!para!que!compiles!y!subas!el!código!
a!tu!hardware.! !Cuando!deseas!escribir!un!programa!propio!–o!variosW!y!hacerlos!
funcionar! con! este! sistema,! en! realidad! el! compilador! incluye! tanto! el! sistema!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!42!
operativo!Contiki,!como!tu!código!a!medida!compilado!como!diferentes!programas!
que!corren!bajo!dicho!sistema.!
Para! ofrecer! homogeneidad! al! método! de! programación! bajo! hardware!
heterogéneo! ,! utiliza! el! comando! make! previamente! parametrizado! al! hardware!
deseado.!Esto!tiene!la!contrapartida!de!que!solo!cierta!hardware!es!compatible!de!
manera!nativa.!Además!de!diferentes!propuestas!hardware!de!los!propios!autores,!
encontramos! un! abanico! de! posibilidades! para! utilizar! como! nodos! de! dichas!
redes,!o!motas,! como!se! las!conoce!en!este!ámbito.!La!siguiente! tabla!muestra! la!
compatibilidad! con! estos! microcontroladoresWtransceptores! con! el! sistema!
operativo!y!con!su!herramienta!de!simulación:!
!
MCU/SoC& Radio& Plataforma& Cooja(simulación)&
TI!CC2538! Integrated!/!CC1200! REWMote! ✗!
nRF52832! Integrated! nRF52!DK! ✗!
RL78! ADF7023! EVALWADF7023DB1! ✗!
TI!CC2538! Integrada! cc2538dk! ✗!
TI!MSP430x! TI!CC2420! exp5438,!z1! ✓!TI!MSP430x! TI!CC2520! wismote! ✓!Atmel!AVR! Atmel!RF230! avrWraven,!avrWrcb,!avrWzigbit,!iris! ✗!
Atmel!AVR! TI!CC2420! micaz! ✓!Freescale!MC1322x! Integrada! redbeeWdev,!redbeeWeconotag! ✗!
TI!MSP430! TI!CC2420! sky! ✓!TI!MSP430! TI!CC1020! msb430! ✗!
TI!MSP430! RFM!TR1001! esb! ✓!Atmel!Atmega128!RFA1! Integrado! avrWatmega128rfa! ✗!
Microchip!pic32mx795f512l! Microchip!mrf24j40! seedWeye! ✗!
TI!CC2530! Integrado! cc2530dk! ✗!
6502! ✗! apple2enh,!atari,!c128,!c64! ✗!
Native! ✗! native,!minimalWnet,!cooja! ✓!
Figura&4.6&Tabla!de!compatibilidad!de!hardware!con!Contiki. !
En!la!tabla!no!aparece!información!relativa!al!hardware!propio!de!Arduino,!
ni!con!su!entorno!de!desarrollo.!En!el!momento!actual,!hay!ciertos!proyectos!para!
portar! este! sistema! a! las! placas! de! Arduino,! pero! no! hay! disponible! ninguna!
versión!beta!o!borrador.!Cito!del!repositorio!de!GitHub!de!Contiki!
!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 43!
“La,familia,Arduino,
Arduino,Uno,con,Atmega328P:PU.,+,placa,Openlabs,Radio,basada,en,AT86RF233.,
(Esto,es,mucho,trabajo,,espero,que,al,final,funcione)”,
christofferholmstedt,!4!Nov!2014!
Conclusión&
Es! un! sistema! operativo! diseñado!para! redes! de! sensores! desplegados! en!
nodos! o! motas,! que! implementa! gran! parte! de! los! requisitos! del! proyecto.! A!
continuación!se!indican!sus!ventajas!y!desventajas:!
&PROS:&
• Permite!programación!concurrente.!
• Se!puede!utilizar!desde!cualquier!plataforma!al!correr!bajo!máquina!virtual.!
• Coste!cero.!
CONTRAS:&
• La! comunidad! tras! este! sistema! operativo,! está! organizada! mediante!
mailing, lists.! Un! sistema! áspero! para! la! difusión! y! el! aprendizaje! a! día! de!
hoy.!!
• No!hay! soporte!nativo,!ni! librerías!de! terceros!para! las!placas!Arduino,!ni!
siquiera!para!las!que!están!basadas!en!conectividad.!
• La!arquitectura!que!mejor!se!adapta!a!este!sistema!operativo!es!la!de!la!red!
de! sensores! inalámbrica! (WSN! por! sus! siglas! en! ingles),! no! a! todo! el!
conjunto!del!Internet!de!las!Cosas.!
Fuente![W6].!
4.3&Basadas&en&lenguaje&de&programación&
4.3.1&OccamW&π&
El! lenguaje! de! programación! Occam! data! del! año! 1983.! Fue! creado! para!
poder! y! desarrollar! y! vender! una! gama! de! procesadores! especializados! de! la!
empresa! Inmos! llamados! transputer.! Estos! procesadores! eran! especiales! porque!
tenían! la! capacidad! de! cambiar! de! contexto!muy! rápidamente! entre!multitud! de!
procesos.!Además,!disponían!de!una!interfaz!física!de!enlace!para!operar!con!otros!
procesadores!semejantes!de!manera!paralela.!De!esa!manera!se!obtenía!un!cluster!
de!procesadores!distribuidos,!lo!que!para!esa!época!era!una!proeza.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!44!
A! día! de! hoy,! la!multiprogramación! real,! el!multinúcleo! y! la! concurrencia!
son! habituales! en! los! ordenadores! personales.! No! obstante,! en! los!
microcontroladores!basados!en!procesadores!sencillos!como!Arduino!no!se! tiene!
acceso! a! este! forma! de! programar! de! manera! nativa.! Para! hacerlo! posible,! un!
grupo! de! desarrolladores! ha! portado! el! sistema! de! los! transputers! para! estas!
placas!de!prototipado.!Este!proyecto!recibe!el!nombre!de!concurrency.cc.!
!
!
Figura&4.6&Diagrama!de!funcionamiento!de!OccamWπ!sobre!el!hardware.!
!
Esta! adaptación! se! ha! llevado! a! cabo! mediante! la! realización! de! una!
máquina! virtual,! que! abstrae! a! las! instrucciones! compiladas! por! el! programador!
del!hardware!sobre!el!que!corre!el!programa.!Es!un!concepto!similar!a! Java!y!su!
máquina! virtual.! Esta! máquina! virtual! se! conoce! por! el! nombre! Transterpeter!
[W7].!En!suma,!estos!desarrolladores!han!generado!una!librería!llamada!Plumbing!
para!poder!realizar!con!ella!programaciones!más!complejas![W8].!
Esta! librería! está! escrita! en! occamWπ.! También! han! creado! un! entorno! de!
desarrollo!mediante!un!port!de!JEdit.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 45!
!
Figura&4.7&Detalle!de!un!ejemplo!de!código!escrito!en!OccamWπ.!
!
El! lenguaje! está! orientado! particularmente! a! la! programación! paralela.!
Podemos!analizar!sus!características!principales!con!el!fragmento!de!la!figura!(x).!
En! la! línea!1!observamos! la!declaración!de!un!procedimiento!o!un! función.!Para!
ello! se! utiliza! la! palabra! reservada! PROC! en! letras! mayúsculas.! Se! trata! de! una!
función!sin!parámetros.!En!la!línea!2!tras!utilizar!dos!espacios!como!sangría!se!ha!
declarado! un! canal! de! tipo! señal! llamado! s,! utilizando! las! palabras! reservadas!
CHAN!y!SIGNAL.!En!la!línea!3!,!al!mismo!nivel!que!la!línea!que!le!precede,!se!indica!
que!las!sentencias!que!se!invoquen!debajo!se!realizarán!de!manera!paralela.!Para!
ello! utiliza! la! palabra! reservada! PAR.! Otra! opción! podría! ser! utilizar! SEQ! para!
instrucciones!secuenciales,!o!ALT!para!manejar!un!flujo!condicional.!En!la!línea!4!
con!dos!espacios!de!sangría!adicionales!se!realiza!una! llamada!a!una! función.!En!
concreto! es! la! llamada! a! un! botón! colocado! en! el! Pin! 2! de! Arduino,! que! al!
presionarlo! realiza! una! comunicación! por! el! canal! s,! declarado! en! la! línea! 2.! El!
símbolo!de!exclamación!‘!’!indica!que!es!emisor!de!la!información!de!ese!canal.!En!
la! línea!siguiente!5!encontramos!otra! llamada!a! función.!Aquí!el!pin!digital!13!de!
Arduino,! se! apagará.! Esta! operación! se! llevará! a! cabo! cuando! la! señalización!del!
botón! por! el! canal! s! sea! recibida.! Para! indicar! que! esta! acción! es! receptora! del!
canal! se! utiliza! el! carácter! ‘?’.! En! la! línea! número! 6! se! concluye! la! función! main!
mediante! los! dos! puntos! ‘:’! utilizando! la! misma! sangría! que! la! del! inicio! de! su!
procedimiento.!
La!sintaxis!de!este!lenguaje!de!programación!es!altamente!precisa.!Hay!que!
tener! especial! cuidado! con! la! sangría! y! el! formato,! pues! repercute! en! la!
compilación!del!código.!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!46!
Existe!una! limitación!de!uso!en!cuanto!al!hardware!compatible,!que!no!se!
actualiza! desde! Junio! de! 2013.! En! el!momento! de! escritura! de! este! proyecto! se!
encuentra!así:!
!
Soportadas&
Placas& MHz& CPU& Tensión&
Duemilanove,!Freeduino,!Nano!3.0,!Pro!Mini! 16! Atmega!328! 5V!
No&soportadas&(en&progreso)&
Placas& MHz& CPU& Tensión&
Uno,!Moteino! 16! Atmega328! 5V!
Mini! 8! Atmega328! 3.3V!
Mega! 16! Atmega2560! 5V!
Leonardo! 16! Atmega32u8! 5V!
&
Conclusión&
Tras!el!estudio!de!las!características!de!esta!vía!de!desarrollo,!se!enumeran!
sus!virtudes!y!defectos!para!la!empresa!de!este!proyecto.!!
&PROS:&
• Permite!programación!concurrente.!
• Coste!cero!
CONTRAS:&
• No! se! puede! utilizar! desde! cualquier! placa! Arduino! al! necesitar! una!
máquina!virtual!específica!para!cada!placa.!!
• No!hay!soporte!nativo,!ni!librerías!basadas!en!conectividad.!
Fuente![W8].!
4.3.2&Protothreads&
Un! Protothread! es! un! hilo! extremadamente! liviano! (solo! dos! bytes),!
diseñados! para! sistemas! con! restricciones! de! memoria,! como! sucede! en!
microcontroladores! y! nodos! de! una! red! de! sensores! inalámbricos! (motas).! Los!
Protothreads!proporcionan!ejecución!de!código!lineal!para!sistemas!dirigidos!por!
eventos! implementados! en! C.! Pueden! utilizarse! con! o! sin! un! sistema! operativo!
subyacente!para!proporcionar!bloqueo!de!y!manejar!de!esta!manera!eventos.!Los!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 47!
Protothreads! proporcionan! flujo! secuencial! de! control! sin! máquinas! de! estado!
complejas!o!multihilo!real.!
En!un!fragmento!de!código!escrito!por!Adam!Dunkels!en!2004.!Está!escrito!
en! lenguaje! C! nativo! y! es! una! pieza! de! código! independiente! de! timers,!
interrupciones! y! sistemas! operativos,! lo! que! le! otorga! total! portabilidad.! Aquí!
podemos!ver!un!ejemplo!de!protothread!original!escrito!en!lenguaje!C.!
#include "pt.h" struct pt pt; struct timer timer; PT_THREAD(protothread(struct pt *pt)) { PT_BEGIN(pt); while(1) { if(initiate_io()) { timer_start(&timer); PT_WAIT_UNTIL(pt, io_completed() || timer_expired(&timer)); read_data(); } } PT_END(pt); }
Código&4.1&Ejemplo!de!código!de!protothreads.!
!
Y! la! forma!de! utilizarlos! en! una! función! principal! tiene! que! ser! similar! al!
siguiente!código:!
#include "pt.h" static int counter; static struct pt example_pt; static PT_THREAD(example(struct pt *pt)) { PT_BEGIN(pt); while(1) { PT_WAIT_UNTIL(pt, counter == 1000); printf("Threshold reached\n"); counter = 0; } PT_END(pt); } int main(void) { counter = 0; PT_INIT(&example_pt); while(1) {
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!48!
example(&example_pt); counter++; } return 0; }
Código&4.2&Ejemplo!de!código!de!protothreads!II.!
!
¿Cómo! funciona! realmente?! La! clave! está! en! el! uso! de! macros! en! C.! Se!
utilizan! macros! en! lugar! de! funciones! para! aprovechar! cómo! los! expande! el!
preprocesador!de!C.!Las!MACROS!son!los!segmentos!de!código!que!se!han!utilizado!
para!construir!el!protothread!y!para!implementarlo!en!la!función!principal.!Lo!que!
el! preprocesador! de! C! realiza! es! la! siguiente! transformación! previa! a! la!
compilación.!
# struct pt { unsigned short lc; }; #define PT_THREAD(name_args) char name_args #define PT_BEGIN(pt) switch(pt->lc) { case 0: #define PT_WAIT_UNTIL(pt, c) pt->lc = __LINE__; case __LINE__: \ if(!(c)) return 0 #define PT_END(pt) } pt->lc = 0; return 2 #define PT_INIT(pt) pt->lc = 0
Código&4.3&Macros!de!la!cabecera!en!biblioteca!protothreads.!
!
Vemos! que! la! estructura! pt! consta! de! un! solo! unsigned, short! llamado! lc,!
contracción!de!continuación!local!en!inglés.!Esta!variable!es!el!origen!del!tamaño!
utilizado!por! cada!protothread! ! (de!dos!bytes)! para! almacenar! su! estado,! que! es!
mencionada! con! frecuencia! en! la! literatura! sobre! protothreads.! Trasladado! al!
código!del!protothread!inicial!y!comparándolo!queda!así:!
!
static PT_THREAD(example(struct pt *pt)) { PT_BEGIN(pt); while(1) { PT_WAIT_UNTIL(pt, counter == 1000); printf("Threshold reached\n"); counter = 0; } PT_END(pt); }
!static char example(struct pt *pt) { switch(pt->lc) { case 0: while(1) { pt->lc = 12; case 12: if(!(counter == 1000)) return 0; printf("Threshold reached\n"); counter = 0; } } pt->lc = 0; return 2; }
Código&4.4&Transformación!de!las!Macros!en!biblioteca!protothreads.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 49!
En! la! primera! línea! del! código! vemos! cómo! se! ha! expandido! la! macro!
PT_THREAD!para!que!el!protothread!llamado!example!se!haya!convertido!en!una!
función! C! normal! que! devuelve! un! char.! El! valor! de! retorno! de! la! función!
protothread! se! puede! usar! para! determinar! si! el! protothread! está! bloqueado! en!
espera!o!si!ha!terminado.!
La! macro! PT_BEGIN! se! ha! expandido! a! una! instrucción! switch! donde! se!
evalúa! la! variable! lc! de! la! estructura! pt! y! una! apertura! de! corchete.! Si!miramos!
hacia! abajo! al! final! de! la! función,! vemos! que! la! expansión! de! la! macro! PT_END!
contiene! la! llave! de! cierre! para! el! switch.! Tras! la! llave! de! apertura,! observamos!
cómo! la! traducción! de! PT_BEGIN! es! case, 0:! .! Esto! es! para! asegurarse! de! que! el!
código!posterior!a!la!instrucción!PT_BEGIN!es!el!primero!en!ejecutarse!la!primera!
vez!que!se!ejecuta!el!protothread.!Anteriormente!PT_INIT!estableció!ptW>lc!a!cero.!
Atravesando!el!bucle!while,(1),!la!macro!PT_WAIT_UNTIL!se!ha!expandido!en!algo!
que! contiene! el! número! 12.! A! la! variable! ptW>lc! se! le! asigna! el! valor! 12! y! acto!
seguido!se!añade!la!instrucción!case!12:!.!Después!de!esto,!la!variable!del!contador!
se!comprueba!para!ver!si!es!1000!o!no.!Si!no!es!así,!la!función!example!()!ejecuta!
ahora!un!retorno!explícito.!
¿De!dónde!proviene!el!número!12!y!por!qué!la!función!retorna!en!el!medio!
del! bucle!while, (1)?! Para! entender! es! necesario! ejecutar! el! código! en! la! función!
example!()!una!segunda!vez.!
La!próxima!vez!que!se!llama!a!la!función!example!()!desde!la!función!main!
(),!la!variable!ptW>!lc!no!será!cero!sino!12,!como!se!estableció!en!la!expansión!de!la!
macro!PT_WAIT_UNTIL.!Esto!hace!que!el!switch,(pt:>,lc)!salte!a!la!instrucción!case,
12:! .! Esta! sentencia! está! justo! antes! de! la! instrucción! if! donde! se! comprueba! la!
variable! del! contador! para! ver! si! ha! llegado! a! 1000.! Por! lo! tanto,! la! variable!
contador!se!comprueba!de!nuevo.!Si!no!ha!alcanzado!1000,!la!función!example!()!
regresa!de!nuevo.!La!próxima!vez!que!se!invoque!la!función,!al!evaluar!la!variable!
salta!al!caso!12!de!nuevo!y!reevalúa!el!contador!para!saber!si!es!1000.!El!flujo!del!
programa!continuará!haciéndolo!hasta!que!la!variable!del!contador!llegue!a!1000.!
Cuando!esto!suceda,!saltamos!la!asignación!de!variable!ptW>lc!a!cero,!hasta!que!se!
ejecuta!la!sentencia!printf!y!la!variable!del!contador!se!pone!a!cero,!antes!de!que!el!
bucle!while!(1)!vuelva!a!empezar.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!50!
Pero,!¿de!dónde!viene!el!número!12?!Es!el!número!de!línea!de!la!instrucción!
PT_WAIT_UNTIL! como! consta! en! el! código! completo.! Lo! importante! es! que! los!
números! de! línea! aumentan! irrevocablemente! en! la! codificación.! Es! decir,! si!
ponemos!otra!declaración!PT_WAIT_UNTIL!más!adelante!en!nuestro!programa,!el!
número!de!línea!será!diferente!de!la!primera!declaración!PT_WAIT_UNTIL.!Por!lo!
tanto,! el! switch, (pt:>, lc)! sabe! exactamente! a! qué! línea! saltar.! De! esta! forma! el!
control!de!flujo!es!robusto!y!no!hay!ambigüedades.!
Es!infrecuente!en!programación!ver!un!salto!de!línea,!mas!aún!en!el!interior!
de!un!bucle!while.!Este!truco!de!programación!funciona!y!su!descubrimiento!se!le!
atribuye! al! programador! Tom! Duff,! en! su! código! bautizado! Dispositivo! de! Duff.!
Luego!fue!utilizado!por!Simon!Tatham!en!las!corutinas!de!C.!
Este! mecanismo! de! concurrencia! basado! en! una! condición! o! evento! se!
utiliza!en:!
• Sistemas!con!restricción!de!memoria.!
• Pilas!de!protocolo!de!programación!dirigida!por!eventos.!
• Pequeños!sistemas!embebidos.!
• Nodos!de!redes!de!sensores.!
• Aplicaciones!de!C!transportables.!
El! autor! de! este! código! Adam! Dunkels,! ha! empleado! está! técnica! para!
proveer! a! su! sistema! operativo! Contiki! (estudiado! en! este! proyecto),! para! el!
planificador!de!tareas.!
!
Fuente![W19]!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 51!
Capitulo&5.&Conectividad&
!
IoT! es! posible! gracias! a! la! conectividad:! la! manera! en! que! las! diferentes!
“cosas”! intercambian! información.! Para! esto! es! muy! importante! la! ruta! física! y!
lógica!que!sigue! la! información!entre!un!punto!y!otro!y! también!el! formato!de! la!
información:!la!manera!en!que!esta!información!es!“empaquetada”.!
&
5.1&Consideraciones&previas&
5.1.1&Modelo&OSI&
El! modelo! OSI! (Open! Systems! Interconnection)! (ISO/IEC! 7498W1)! es! un!
referencia! fruto!de! la!Organización! Internacional!de!Estándares! (ISO),!que!desde!
su! nacimiento! ha! tenido! soporte! por! parte! de! la! Unión! Internacional! de!
Telecomunicaciones! (UIT).!En!esta! especificación! se!detallan! las! funciones!de!un!
sistema! de! comunicaciones! en! términos! de! abstracción! de! capas.! Funciones!
similares!de!comunicación!son!agrupadas!en!capas!lógicas.!Una!capa!sirve!a!la!capa!
superior,!y!!a!su!vez,!esta!es!servida!por!la!capa!debajo!de!ella.!Como!se!observa!en!
la!siguiente!figura,!se!divide!en!7!capas:!
!
Figura&5.1&Comparativa!entre!TCP/IP!y!el!modelo!OSI.
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!52!
El!modelo! la! información!viaja!en! las!capas!verticalmente!(de!arriba!hacia!
abajo!en!el!transmisor!y!de!abajo!hacia!arriba!en!el!receptor).!Cada!capa!incorpora!
información! redundante! para! cumplimentar! determinada! función.! A! nivel!
horizontal! las! capas! añadenWeliminan! información! e! implementan! determinados!
mecanismos! para! asegurar! determinada! funcionalidad.! Funcionan! como! un!
sándwich!donde!cada!capa!es!independiente!del!resto.!
Capa!1.!Física:!La!capa! física!define! las!especificaciones!eléctricas!y! físicas!
de!los!dispositivos.!En!particular,!define!la!relación!entre!un!dispositivo!y!un!medio!
de!transmisión,!como!un!cable!de!cobre!o!de!fibra!óptica.!Esto!incluye!el!layout!de!
los! pins,! voltajes,! impedancia! de! las! líneas,! especificaciones! de! los! cables,!
concentradores,! repetidores,! adaptadores! de! red! y! más.! Incluye! las! técnicas! de!
modulación!o! conversión! entre! la! representación!de!datos!digitales! en! el! equipo!
del! usuario! y! las! señales! correspondientes! transmitidas! a! través! de! un! canal! de!
comunicación.!Éstas!son!señales!operando!a!través!de!un!cable!físico!(cobre!o!fibra!
óptica)!o!sobre!un!enlace!de!radio.!
Capa! 2.! Capa! de! enlace! de! datos:! La! capa! de! enlace! de! datos! provee! los!
medios! funcionales! y! de! procedimiento! para! transferir! información! entre!
entidades! de! red! y! para! detectar! y! posiblemente! corregir! errores! que! puedan!
ocurrir!en! la!capa! física.!Se!especifica!el!entramado,!el!direccionamiento! físico,!el!
control!de!flujo!y!errores,!y!el!acceso!al!medio.!
Capa! 3.! Red:! La! capa! de! red! provee! los! medios! funcionales! y! de!
procedimiento!! para! transferir! secuencias! de! datos! de! diferente! longitud! de! un!
host! origen!en!una! red!a!un!host! destino!en!una! red!diferente! (en! contraste! a! la!
capa!de!enlace!de!datos!que!conecta!host!en!la!misma!red),!mientras!mantiene!la!
calidad! de! servicio! pedida! por! la! capa! de! transporte.! La! capa! de! red! realiza!
funciones!de!ruteo.!Los!routers!trabajan!en!esta!capa,!enviando!datos!a!través!de!la!
red!extendida!y!haciendo!posible!Internet.!
Estas! tres! primeras! capas! forman! lo! que! se! denomina! subred.! La!
información!puede!circular!a!través!de!diversas!subredes!para!llegar!de!un!punto!a!
otro! pero,! desde! un! punto! de! vista! lógico,! la! subred! funciona! como! si! la!
comunicación!fuese!sólo!entre!los!dos!extremos;!es!decir,!punto!a!punto.!
Capa! 4.! Transporte:! La! capa! de! transporte! provee! una! transferencia! de!
datos! transparente!y!confiable!para!el!usuario! final.!Para!ello!utiliza!mecanismos!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 53!
de! control! de! flujo,! segmentación,! y! control! de! errores.! Algunos! protocolos! son!
orientados!a!la!conexión.!Esto!significa!que!la!capa!de!transporte!puede!mantener!
un! seguimiento! de! los! datos! enviados! con! éxito! y! retransmitir! los! que! fallan,!
garantizando!la!entrega!ordenada.!
Capa! 5.! Sesión:! Este! nivel! controla! los! diálogos! (conexiones)! entre!
computadoras.! Establece,! administra! y! termina! las! conexiones! entre! las!
aplicaciones!locales!y!remotas.!La!capa!de!sesión!es!implementada!comúnmente!en!
aplicaciones!con!que!utilizan!llamadas!a!procedimientos!remotos.!
Capa! 6.! Presentación:! La! capa! de! presentación! establece! contexto! entre!
entidades! de! la! capa! de! aplicación,! en! los! cuales! las! entidades! de! capas! de!más!
arriba! pueden! usar! una! sintaxis! y! semántica! diferente! si! el! servicio! de!
presentación!provee!traducción!entre!ellas!
Esta! capa! provee! independencia! de! representación! de! datos,! como! el!
cifrado,!ente!los!formatos!de!aplicación!y!red.!La!capa!de!presentación!transforma!
los!datos!en!la!forma!que!la!aplicación!acepta!
Capa!7.!Aplicación:!La!capa!de!aplicación!es!la!más!cercana!al!usuario!final,!
lo!que!significa!que!la!capa!de!aplicación!del!modelo!OSI!y!el!usuario!interactúan!
directamente!con!la!aplicación!de!software.!
!
5.1.2&Modelo&TCP/IP&
Normalmente,! los! tres! niveles! superiores! del! modelo! OSI! (Aplicación,!
Presentación!y!Sesión)!son!considerados!simplemente!como!el!nivel!de!aplicación!
en!el!conjunto!TCP/IP.!Como!TCP/IP!no!tiene!un!nivel!de!sesión!unificado!sobre!el!
que! los! niveles! superiores! se! sostengan,! estas! funciones! son! típicamente!
desempeñadas!(o!ignoradas)!por!las!aplicaciones!de!usuario.!Este!modelo!“reposa”!
sobre!los!dos!primeros!niveles!del!modelo!OSI.!Por!lo!que!sus!dos!primeras!capas!
son!representadas!por!la!capa!1!del!modelo!TCP/IP:!
Capa!1.!Interfaz!de!red:!Corresponde!con!las!dos!primeras!capas!del!modelo!
OSI,!aunque!en!origen!se!pretende!desvincular!el!modelo!TCP/IP!del!medio!físico!
dando!independencia!sobre!el!hardware.,
Capa!2.!Internet:!Como!fue!definido!originalmente,!el!nivel!de!red!soluciona!
el! problema! de! conseguir! transportar! paquetes! a! través! de! una! red! sencilla.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!54!
Ejemplos!de!protocolos!son!X.25,!Host/IMP!Protocol!de!ARPANET!o! IPv4.!Con! la!
llegada! del! concepto! de! Internet,! nuevas! funcionalidades! fueron! añadidas! a! este!
nivel,!basadas!en!el!intercambio!de!datos!entre!una!red!origen!y!una!red!destino,!
con! independencia! de! su! escala.! Engloba!desde!dos! redes! situadas! en!un!mismo!
edificio!o!a!través!de!una!red!de!redes,!conocida!como!Internet.!
Capa! 3.! Transporte:! Corresponde! con! la! misma! utilidad! del! nivel! 4! del!
modelo!OSI!pero!particularizando!en!dos!protocolos!de!transporte.!Uno!orientado!
a!la!conexión,!y!con!gran!control!de!flujo,!errores!y!orden!de!llegada,!como!es!TCP!
(Transmission,Control,Protocol),!!y!otro!más!sencillo!y!anárquico!,!como!UDP!(User,
Datagram,Protocol).!
Capa!4.!Aplicación:!El!nivel!de!aplicación!es!el!nivel!que!los!programas!más!
comunes!utilizan!para!comunicarse!a!través!de!una!red!con!otros!programas.!Los!
procesos! que! acontecen! en! este! nivel! son! aplicaciones! específicas! que! pasan! los!
datos!al!nivel!de!aplicación!en!el! formato!que!internamente!use!el!programa!y!es!
codificado! de! acuerdo! con! un! protocolo! estándar.! Estos! programas! y! sus!
correspondientes!protocolos! incluyen!a!HTTP! (HyperText,Transfer,Protocol),!FTP!
(Transferencia! de! archivos),! SMTP! (correo! electrónico),! SSH! (intérprete! de!
comandos!remoto!y!seguro),!DNS!(Resolución!de!nombres!de!dominio)!y!a!otros.!
!
5.1.3&Internet.&IPv4&e&IPv6.&
A! principios! de! los! años! 80,! surge! ARPANET! como! primer! intento! del!
Departamento! de! Defensa! de! Estados! Unidos! (DoD)! para! diseñar! una! red! de!
ordenadores!capaz!de!interconectar!completamente!diferentes!sistemas.!El!primer!
protocolo! de! uso! amplio! para! este! propósito! se! llamó! IPv4! (Internet, Protocol!
versión!4),!que!dio!lugar!a!la!Internet!civil.!Inicialmente!sólo!se!conectaron!centros!
de! investigación!y!universidades,!apoyados!por! la!NSF!(Fundación!Nacional!de! la!
Ciencia).! Las! aplicaciones! comerciales! no! eran! permitidas,! pero! cuando! la! red!
empezó! a! crecer! exponencialmente,! la! NSF! decidió! transferir! su! control! a!
operadores! privados! con! fines! comerciales.! Mientras! que! las! principales!
aplicaciones!eran!el!correo!electrónico!y!las!transferencias!de!archivos,!fue!con!el!
desarrollo! de! la! World! Wide! Web! (WWW)! HTML! y! específicamente! con! el!
navegador! de! Internet!MOSAIC! con! interfaz! gráfica,! que! Internet! comenzó! a! ser!
utilizado!por!las!masas!y!el!tráfico!creció!exponencialmente.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 55!
!
Figura&5.2&Mapa!lógico!de!ARPANET,!marzo!de!1977.!
!
Dado!que!el!protocolo!IPv4!fue!desarrollado!para!direccionar!una!escala!no!
mundial! de! equipos,! tiene! una! limitación! clave.! El! formato! de! cabecera! de! IPv4,!
contiene!direcciones!de!red!de!32!bits.!Esto!permite!direccionar!como!máximo!232!
destinos!de!red.!Esta!cifra!en!origen!suficiente,!rápidamente!dejó!de!serlo.!Con!el!
auge!de!Internet!y!del!ordenador!personal,!el!crecimiento!de!la!población!mundial!
(que!ya!en!la!década!de!1980!supero!los!4.500!millones!de!personas,!por!las!cerca!
de!4.300!millones!de!direcciones!asignables!en!IPv4)!si!todas!las!personas!tuvieran!
su!propio!dispositivo!y!quisieran!conectado!a!Internet,!simplemente!no!podrían.!
Para! ello! se!han! ido! realizando!parches! al! sistema,! como! la! traducción!de!
direcciones! de! red! (NAT),! que! se! utiliza! para! enmascarar! direcciones! de! red! de!
ámbito! local! mediante! una! (o! varias)! direcciones! reales! (públicas).! Incluso! es!
habitual! recurrir! a! un! NAT! doble! en! ciertos! escenarios,! o! NAT! realizado! por! el!
operador! (Carrier:grade, NAT)! siendo! transparente! para! el! usuario! final! (o!
intentando!serlo).!
Dada! la! inflexibilidad! de! un! protocolo! como! IPv4! con! cabecera! de!
dimensiones!fijas!para!el!campo!de!dirección,!con!el!consiguiente!problema!de!falta!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!56!
de! direcciones,! y! con! objeto! de! modernizar! un! protocolo! de! red! invariable! (ni!
mucho! menos! comparable! al! desarrollo! de! su! ámbito! de! aplicación),! en! el! año!
1992!comenzó!a!desarrollarse!en!la!ITF!(Internet!Engineering!Task!Force)!el!que!
hoy!se!conoce!como!protocolo!IPv6.!
Para! tener!más!direcciones!de! red!se!necesitan!más!bits,!una!dirección! IP!
más! larga,! lo! que! significa! un! nuevo! protocolo! y! arquitectura,! lo! que! implica!
cambios!en!todos!los!routers!y!el!software!de!la!red.!Después!de!examinar!una!serie!
de!propuestas,! la! IETF!estableció!el!borrador!del!precursor!de! IPv6,!en!enero!de!
1995!en! la!RFC!1752,! llamado!Internet!Protocol!Next!Generation,!o! IPng.!El! IETF!
actualizó!el!estándar!IPv6!en!1998!con!la!definición!actual! incluida!en!RFC!2460.!
En!2004,!IPv6!estaba!ampliamente!disponible!en!la!industria!y!en!la!mayoría!de!los!
nuevos!equipos!de!red.!Hoy!en!día,!IPv6!coexiste!con!IPv4!en!Internet!y!la!cantidad!
de! tráfico! IPv6! está! creciendo! rápidamente! a! medida! que! más! proveedores! de!
servicios!y!de!contenidos!se!unen!al!nuevo!estándar.!
!
5.1.4&Conceptos&de&IPv6&
���IPv6!opera!en! la!capa!3!del!modelo!OSI,! también! llamada!capa!de!red.!Las!
unidades! de! datos! manejadas! por! el! nivel! de! red! se! llaman! paquetes.! Los!
dispositivos!conectados!a!Internet!pueden!ser!hosts!o!enrutadores.!Un!host!puede!
ser!un!PC,!un!ordenador!smartphone!o!un!sensor!IoT.!Los!hosts!serán!la!fuente!o!el!
destino!de!los!paquetes.!En!su!lugar,!los!enrutadores!están!a!cargo!del!reenvío!de!
paquetes!y!son!responsables!de!elegir!el!próximo!enrutador!que!los!reenvíe!hacia!
el! destino! final.! Internet! se! compone! de! una! gran! cantidad! de! enrutadores!
interconectados,!que!reciben!paquetes!de!datos!en!una! interfaz!y!deben!enviar!a!
continuación,! tan! rápido! como! sea! posible! utilizando! otra! interfaz! hacia! otro!
enrutador!de!reenvío.!En!la!siguiente!figura!se!compara!el!formato!de!cabecera!de!
IPv4!e!IPv6.!
Dada!la!Figura!5.3,!se!puede!observar!que:!
•!El!número!de!campos!se!ha!reducido!de!12!a!8.!
•!El!encabezado!básico!IPv6!se!puede!alinear!con!64!bits,!lo!que!permite!un!
reenvío!de!paquetes!basado!en!hardware!más!rápido!en!routers.!
•!El!tamaño!de!las!direcciones!ha!aumentado!de!32!a!128!bits.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 57!
!
!
Figura&5.3&Comparación!entre!formato!de!cabecera!IPv4!e!IPv6.!
!
Los! campos!más! importantes! son! las! direcciones! de! origen! y! de! destino.!
Como!se!sabe,!cada!dispositivo!IP!tiene!una!dirección!IP!única!que!lo!identifica!en!
Internet.!Esta!dirección!IP!es!utilizada!por!los!routers!para!tomar!sus!decisiones!de!
reenvío.! Ahora! se! pueden! direccionar! 2128! direcciones! (aproximadamente! 2,4!
seguido!de!38!ceros).!A!esta!cabecera!básica!se!le!puede!añadir!extensiones.!
La!notación!de!las!direcciones!IPv6,!de!128!bits!de!longitud,!se!realiza!como!
ocho!grupos!de!cuatro!dígitos!hexadecimales!separados!por!dos!puntos!‘:’.!Si!en!la!
dirección,!uno!o!más!grupos!consecutivos!son!nulos,!también!pueden!comprimirse!
mediante! “::”.! ! Lo! ceros! iniciales! de! cada! grupo! también! se! pueden! omitir.! Esta!
serie!de!direcciones!son!análogas.!
2001:0DB8:0000:0000:0000:0000:1428:57ab 2001:0DB8:0000:0000:0000::1428:57ab 2001:0DB8:0:0:0:0:1428:57ab 2001:0DB8:0::0:1428:57ab 2001:0DB8::1428:57ab 2001:DB8::1428:57ab
!
Existen!ciertas!direcciones!especiales!reservadas:!
::/128
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!58!
La!dirección!con!todo!ceros!se!utiliza!para!indicar!la!ausencia!de!dirección,!y!
no!se!asigna!ningún!nodo.!
::1/128
La! dirección! de! loopback! es! una! dirección! que! puede! usar! un! nodo! para!
enviarse! paquetes! a! sí! mismo! (corresponde! con! 127.0.0.1! de! IPv4).! No!
puede!asignarse!a!ninguna!interfaz!física.!
::1.2.3.4/96
La!dirección!IPv4!compatible!se!usa!como!mecanismo!de!transición!en! las!
redes!duales!IPv4/IPv6.!Es!un!mecanismo!que!no!se!usa.!
::ffff:0:0/96
La! dirección! IPv4! mapeada! se! usa! como! mecanismo! de! transición! en!
terminales!duales!IPv4WIPv6.!
fe80::/10
El!prefijo!de!enlace!local!específica!que!la!dirección!solamente!es!válida!en!
el!enlace!físico!local.!
fec0::
El!prefijo!de!emplazamiento!local!específica!que!la!dirección!únicamente!es!
válida!dentro!de!una!organización! local.! La!RFC!3879! lo!declaró!obsoleto,!
estableciendo! que! los! sistemas! futuros! no! deben! implementar! ningún!
soporte! para! este! tipo! de! dirección! especial.! Se! deben! sustituir! por!
direcciones!Local!IPv6!Unicast.!
fc00::/7
El!prefijo!de!dirección!local!única!está!definido!por!la!RFC!4193.!Se!usa!en!
sustitución!de!las!direcciones!con!prefijo!de!emplazamiento!local.!
ff00::/8
El!prefijo!de!multicast.!Se!usa!para!las!direcciones!multicast.!
En!función!de!los!destinatarios!de!un!paquete!IPv6,!se!puede!diferenciar!entre!tres!
tipos:!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 59!
• Unicast&(una!a!una):!usada!para!el!envío!y!recepción!desde!un!host!origen!a!un!único!host!destino.!!!
• Multicast&(una!a!varias):!usada!para!el!envío!desde!un!host!con!destino!varios!host!destino.!!!
• Anycast)(una!a!la!más!cercana):!usada!para!el!envío!desde!un!host!al!host!más!cercano!en!términos!temporales.!
5.1.5&Autoconfiguración&de&dirección&IPv6.&SLAAC&
Las!direcciones!IPv6!están!compuestas!por!dos!partes!lógicas:!un!prefijo!de!
red!y!el!resto!que!corresponde!a!la!identificación!de!host.!El!valor!decimal!tras!la!
barra!en!las!direcciones!indicadas!en!las!direcciones!especiales,!indican!qué!parte!
corresponde! a! cada! cual.! Existe! un!método! de! autoconfiguración! de! direcciones!
IPv6!llamado!SLAAC!por!las!siglas!en!inglés!de!Stateless,Address,Autoconfiguration.!
Este!método!utiliza!direcciones!/64,!donde!los!primeros!64!bits!identifican!la!red!y!
otra!parte!de!64!bits!que!corresponde!al! identificador!de! interfaz,!que!se!genera!
automáticamente!a!partir!de!la!dirección!física!de!la!interfaz!a!la!que!está!asignada!
la!dirección.!
!
!Figura&5.4&Dirección!IPv6!con!64!bits!como!id!de!red!y!otros!64!bits!para!el!host.!
!
La! dirección! física! o!MAC! de! una! interfaz! de! red! consta! de! 48! bits.! Para!
hacerla! de! 64! bits! mediante! un! método! simple! sin! carga! computacional,! se!
intercala!en!mitad!de!la!dirección!la!cadena!0xFFFE,!como!se!puede!advertir!en!la!
siguiente!figura:!
!
Figura&5.4&Transformación!de!dirección!48!bits!en!dirección!de!64!bits.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!60!
Una!vez!realizado!este!proceso,!se!invierte!el!7º!bit!de!la!nueva!dirección!de!
64! bits.! La! razón! por! la! cuál! se! hace! esto! ! es! porque! en! la! arquitectura! de!
direcciones!MAC,!el!bit!7!significa!si!la!dirección!MAC!se!asignó!universalmente!o!
localmente.!Un!valor!de!0!indica!que!la!dirección!es!universalmente!administrada.!!
Cuando! IANA! asigna! un! Identificador! Único! de! Organización! (OUI)! a! un!
proveedor!de!tarjetas!de!interfaz!de!red!(NIC),!el!bit!7!es!0,!indicando!que!la!OUI!se!
asignó!universalmente.!Si!un!usuario!cambia!manualmente!su!dirección!MAC,!este!
7º!bit! se!establecería!en!1,! indicando!que! la!dirección!Ethernet! fue!administrada!
localmente.!Se!puede!observar!en!la!siguiente!Figura!este!cambio.!
!
Figura&5.5&Transformación!de!dirección!MAC!48!bits!en!dirección!EUIW64.!
!
El!mecanismo!SLAAC!consigue!asignar!la!dirección!mediante!estos!pasos:!
!
1)!R1!es!el!router!que!da!conectividad!al!host!en! la!LAN!y!periódicamente!
publica!su!servicio!mediante!mensajes!RA!(Router,Advertisement).!
!
Figura&5.6&Dialogo!tipo!del!mecanismo!de!autoconfiguración!de!red!SLAAC!IPv6.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 61!
2)! Tanto! R1! como! el! Host! tienen! una! dirección! local! de! enlace! en! sus!
interfaces! conectadas! a! la! LAN,! esta! dirección! se! configura! automáticamente!
cuando! la! interfaz! está! lista.! Nuestro! host! crea! su! dirección! de! enlace! local!
combinando!los!64!bits!de!la!izquierda!del!prefijo!del!enlace!local!(fe80!::!/!64)!y!
los!64!bits!de!la!derecha!de!un!IID!generado!localmente!(:!3432:!7ff1:!c001:!c2a1).!
Estas!direcciones!de!enlace! local! se!pueden!utilizar! en! la!LAN!para! intercambiar!
paquetes!locales,!pero!no!para!enviar!paquetes!fuera!de!la!LAN.!
3)!Los!hosts!necesitan!dos!cosas!básicas!para!poder!enviar!paquetes!a!otras!
redes:!una!dirección!IPv6!global!y!la!dirección!de!una!puerta!de!enlace,!es!decir,!un!
enrutador!al!que!enviar!los!paquetes!que!desea!que!sean!encaminados!fuera!de!su!
red.!
4)!Aunque!R1!está!enviando!RAs!periódicamente!(generalmente!cada!varios!
segundos)!cuando!el!host!está!conectado!y!ha!configurado!su!dirección!de!enlace!
local,! envía!un!mensaje!RS! (Router,Solicitation),!que!R1!responde!con!un!RA!que!
contiene! dos! cosas:! 4.1)! Un! prefijo! global! de! longitud! 64! que! está! destinada! a!
SLAAC.! El! host! toma! el! prefijo! recibido! y! le! agrega! un! IDI! generado! localmente,!
usualmente! el! mismo! que! el! utilizado! para! la! dirección! local! de! enlace.! De! esta!
manera! se! configura! una! dirección! IPv6! global! en! el! host! y! ahora! se! puede!
comunicar! con! Internet.! 4.2)! La! dirección! de! la! puerta! de! enlace! es! la! dirección!
local! de! enlace! de! R1,! porque! es! la! dirección! de! origen! de! la! RA.! Nuestro! host!
puede!usar!esta!dirección!para!configurar! la!puerta!de!enlace!predeterminada,!el!
lugar!al!que!enviar! los!paquetes!por!defecto,!para! llegar!a!un!host! IPv6!en!algún!
lugar!de!Internet.!
5)!Una!vez!configurada!la!dirección!IPv6!global!y!la!puerta!de!enlace,!el!host!
puede!recibir!o!enviar!información.!
!
5.1.6&Topologías&de&Red&
Por! la! estructura! física,! lógica! y! posibilidades! de! comunicación,! se! pueden!
diferencias!varias!tipologías!de!red!local:!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!62!
!
Figura&5.5&Topologías!de!red!típicas.!
• Punto a punto!: Es!la!topología!más!sencilla.!Define!la!comunicación!entre!
dos!dispositivos.!
• Estrella!: Todos!los!dispositivos!de!la!red!se!interconectan!a!través!de!un!
nodo!central.!Este!puede!ser!un!concentrador!(hub)!o!un!conmutador!(switch).!!Si!
el!nodo!central!cae,!no!se!podrá!comunicar!un!dispositivo!de!un!extremo!con!otro.
• Malla !: Se! trata! de! una! comunicación! total! de! los! nodos! de! la! red.
Cualquier!dispositivo!puede! comunicarse! con!otro.! Suele!darse!una! red!en!malla!
donde!no!todos!los!dispositivos!tienen!conexión!con!el!resto!(pero!mantiene!varios!
caminos!para!llegar!a!otro!nodo!de!la!red.!En!este!tipo!de!redes,!si!cae!un!nodo,!la!
red!se!recupera!eligiendo!otro!camino!disponible.
• Árbol:!La!topología!en!árbol!es!una!variante!de!la!de!estrella.!Como!en!la!
estrella,! los! nodos! del! árbol! están! conectados! a! un! concentrador! central! que!
controla! el! tráfico! de! la! red.! Sin! embargo,! no! todos! los! dispositivos! se! conectan!
directamente!al!concentrador!central.!La!mayoría!de!los!dispositivos!se!conectan!a!
un! concentrador! secundario!que,! a! su!vez,! se! conecta! al! concentrador! central.!El!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 63!
controlador! central! del! árbol! es! un! concentrador! activo.! Un! concentrador! activo!
contiene!un!repetidor,!es!decir,!un!dispositivo!hardware!que!regenera!los!patrones!
de!bits!recibidos!antes!de!retransmitidos.!
Internet!es!un!tipo!de!red!libre!de!escala!(sacleWfree!network);!es!decir,!una!
red!compuesta!de!nodos!y!enlaces!distribuidos!de!forma!muy!dispareja!similar!a!la!
malla!de! la!Figura!5.5.!Las!redes! libres!de!escala!son!un! tipo!de! redes!en!que! los!
nodos! no! están! igualmente! conectados! sino! que! presentan! grandes! diferencias!
entre!unos!y!otros.!La!distribución!del!número!de!conexiones!se!modela!por!la!ley!
potencial:!
! ! ~!!!!donde!k,es!un!número!de!conexiones,!p(k)!la!probabilidad!de!que!un!nodo!
tenga!k,conexiones.,g!varía!entre!2!y!3.!
Este! tipo!de!conectividad!sigue!una! ley!de!potencias! (power:law)!y!es!una!
distribución! estadística! muy! frecuente.! Esto! tiene! consecuencias! a! la! hora! de!
entender! la! robustez! y! resistencia! ante! fallos! o! ataques!de! Internet.! Según! se!ha!
podido! comprobar! en!modelos! teóricos,! las!redes! libres! de! escala!presentan! una!
alta!robustez;! es! decir,! aunque! se! eliminen! nodos! o! conexiones,! la! red,! como!
conjunto.!sigue!funcionando.!Y!esto!sucede!incluso!eliminando!un!elevado!número!
de!nodos.!Incluso!ciertas!redes!son!casi!inmunes!a!los!fallos.!
Si! la! arquitectura! de! Internet! y! su! desarrollo! casi! espontáneo! según! un!
modelo!de!red!libre!de!escala!le!dota!de!una!altísima!robustez!ante!fallos,!también!
es! cierto! que! tiene! su! talón! de! Aquiles.! En! Internet,! como! en! toda! red! libre! de!
escala,! los! nodos! no! son! iguales.! En! concreto,! existen! unos! relativamente! pocos!
nodos! con! un! nivel! de! interconexión! mucho! más! alto! que! el! resto.! Son! los!
denominados!hubs,y! la! conectividad!masiva! y! el! funcionamiento! global! de! la! red!
depende!mucho!de!su!existencia.!Todo!el!sistema!es!muy!dependiente!de!ellos.!Es!
virtualmente!imposible!que!errores!espontáneos!o!aleatorios!consigan!ese!efecto!y,!
en! ese! sentido,! Internet! parece! casi! indestructible,! pero! un! ataque! dirigido! y!
ordenado! contra! los! nodos! principales! de! Internet! podrían! llegar! a! provocar! el!
colapso.!No!es!fácil!sin!embargo!que!un!ataque!malicioso!consiga!sus!objetivos.!Por!
suerte! no! es! suficiente! dañar! un! hub! sino! que! varios! de! ellos! deben! ser!
desactivados!a!un!tiempo!y!eso!no!es!fácil,!nada!fácil.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!64!
Fuente![L2].!
5.2&Tecnologías&de&red&local&inalámbrica&
5.2.1&WiWFi&
WiWFi! es! una! marca! comercial,! que! se! ha! convertido! popularmente! en!
sinónimo!de! red! de! área! local! inalámbrica! (WLAN).! Esta!marca,! propiedad! de! la!
Wi:Fi,Alliance!prueba!y!certifica!a!los!equipos!que!cumplen!con!los!estándares!IEEE!
802.11! para! asegurar! interoperabilidad! entre! dispositivos! y! fomentar! su! uso! y!
distribución.!
!
!
Figura&5.6&Logotipo!de!certificación!WiWFi.!
!
El! estándar! IEEE! 802.11! define! los! niveles! inferiores! del! modelo! OSI!
correspondientes! a! la! capa! de! nivel! física! y! la! de! nivel! de! enlace! de! datos,! para!
estas!redes!inalámbricas.!El!diseño!de!esta!norma!hace!que!los!niveles!superiores!
del! modelo! OSI,! del! nivel! de! red! en! adelante! (y! TCP/IP)! pueden! operar! sin!
distinción! a! una! red! LAN! que! siga! el!modelo! IEEE! 802.3! Ethernet.! Por! tanto! las!
WLAN! y! LAN! son! totalmente! compatibles! entre! sí.! Existen! varios! estándares!
finales.!Los!más!utilizados!son!el!802.11a,b,g,n!y!ac.!
A!nivel!práctico,!IEEE!802.11b!y!g!utilizan!enlaces!por!radiofrecuencia!en!la!
banda! ISM! de! 2,4! GHz.! Como! operan! en! una! banda! de! frecuencia! ampliamente!
usada! por! otros! dispositivos! radio,! deben! controlar! dicha! susceptibilidad! a! las!
interferencias! mediante! métodos! de! señalización! de! espectro! ensanchado! por!
secuencia!directa!(DSSS)!y!de!multiplexación!por!división!de!frecuencia!ortogonal!
(OFDM),! respectivamente.!Todas! las! tecnologías!802.11!dividen!el! espectro!en!el!
que!pueden!operar!en!canales.!En!el!caso!de!802.11b!y!g.!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 65!
Por!otro! lado!la!versión!802.11a!utiliza! la!banda!UWNII!de!5!GHz!que,!para!
gran!parte!del!mundo,!ofrece!al!menos!23!canales!que!no!se!superponen!en!lugar!
de! la!banda!de! frecuencia! ISM!de!2,4!GHz!que!ofrece!sólo! tres!canales!que!no!se!
superponen.!802.11n!puede!utilizar!la!banda!de!2,4!GHz!o!la!de!5!GHz.!El!segmento!
del!espectro!de!radiofrecuencia!utilizado!por!la!802.11!varía!de!un!país!a!otro.!Las!
frecuencias!utilizadas!por!los!canales!uno!a!seis!de!802.11b!y!802.11g!caen!dentro!
de!la!banda!de!radioaficionados!de!2,4!GHz.!La!norma!802.11ac!opera!dentro!de!la!
banda! de! 5!GHz! e! incluye! modulación! de! alta! densidad! (256!QAM).! Para!
comprender!sus!diferencias,!se!sugiere!consultar!la!Figura!5.2.!
!
802.11!
protocolo!Fecha! Frecuencia!
Ancho!
de!
banda!
Tasa!de!
transferencia!
Transmisiones!
MIMO!
permitidas!
Tecnología!
de!
modulación!
Alcance!
máximo!
! ! (GHz)! (MHz)!MinWMax!
(Mbit/s)!! !
In!
(m)!
Out!
(m)!
802.11!Jun!
1997!2.4! 22! 1W2! 1! DSSS,!FHSS! 20! 100!
a!Sep!
1999!
5!20! 6W54! 1! OFDM!(SISO)!
35! 120!
3.7! —! 5K!
b!Sep!
1999!2.4! 22! 1W11! 1! DSSS!(SISO)! 35! 140!
g!Jun!
2003!2.4! 20! 6W54! 1!
OFDM,!DSSS!
(SISO)!38! 140!
n!Oct!
2009!2.4/5!
20!7.2!W72.2!
(6.5W!65)!4!
OFDM!
(MIMO)!
70! 250!
40!15!W!150!
(13.5!W!135)!70! 250!
ac!Dic!
2013!5!
20!7.2!W!96.3!
(6.5!W!86.7)!
8!OFDM!(MUW
MIMO)!
35! !
40!15!W!200!
(13.5!W!180)!35! !
80!32.5!W!433.3!
(29.2!W!390)!35! !
160!65!W!866.7!
(58.5!W!780)!35! !
Figura&5.7&Comparativa!entre!IEEE!802.11a,b,g,n!y!ac!
&
Este! tipo! de! redes! de! área! local! inalámbrica! permite! operar! bajo! las!
topologías! de! red! punto! a! punto! y! estrella! de!manera! nativa,! pero! se! realizan! a!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!66!
menudo!implementaciones!en!malla,!para!mejorar!la!resistencia!a!fallos!completos!
de!red,!por!el!fallo!de!un!solo!nodo.&
!
5.2.2&Bluetooth&4.0&
Bluetooth!es!un!estándar!de!tecnología!inalámbrica!para!el!intercambio!de!
datos! a! cortas! distancias! desarrollado! en! 1998! por! Bluetooth! SIG! (Bluetooth!
Special!Interest!Group),!alianza!de!los!grandes!grupos!industriales!Intel,!Ericsson,!
IBM,!Nokia!y!Toshiba.!Fue!creado!por!Ericsson!en!1994.!A!nivel!técnico!emplea!un!
enlace! por! radiofrecuencia! en! la! banda! ISM! de! 2,4! GHz,! pudiendo! utilizar! 79!
canales!de!1MHz!de!ancho!de!banda!cada!uno!en!el!estándar!original.!En!el!caso!de!
la! versión!Bluetooth!4.0! se!utilizan!40! canales!de!2!MHz!de! ancho!de!banda, sin
bandas de guarda entre canales. !
La!distancia!nominal!del!enlace!está!comprendida!entre!10!cm!y!10!m,!pero!
aumentando!la!potencia!de!transmisión!se!puede!llegar!a!100!m.!!
La!modulación!empleada!por!Bluetooth!es!GFSK!(Gaussian,Frequency,Shift,
Keying),!es!decir,!modulación!por!cambio!de!frecuencia!gaussiana.!Lo!que!se!hace!
es!modular! una! señal! portadora,! atrasando! o! adelantando! cambio! de! flanco! del!
pulso!en!función!de!si!queremos!transmitir!un!1!o!un!0!respectivamente.!!
Respecto!al!estándar!Bluetooth!original,!se!ha!considerado!como!objetivo!el!
bajo!consumo!energético!y! la!baja! latencia,!en!detrimento!de! la!alta!velocidad!de!
transferencia!de!datos!y!asumir!distancias!más!grandes.!Las!topologías!de!red!que!
puede!adoptar!este!protocolo!son:!punto!a!punto,!estrella!y!malla.!
Para!conectar!dos!aparatos!con!esta!tecnología,!es!necesario!un!proceso!de!
"emparejamiento".! Ambos! aparatos! se! reconocen! en! respuesta! a! una! llamada!de!
uno!hacia!el!otro!y!en!respuesta!a!un!envío!de!un!código!común.!Existen!dos!casos!
posibles:!el!código!es!enviado!por!ambos!aparatos,!el!código!es!enviado!por!uno!de!
ellos,!especialmente!cuando!el!segundo!no!tiene!teclado.!!Luego!de!que!el!primer!
contacto! se! efectúa,! los! códigos! son! memorizados! y! la! conexión! se! realiza!
automáticamente.!
!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 67!
5.2.3&ZigBee
ZigBee!surge!en!2003!como!respuesta!a!la!necesidad!de!complementar!los!
estándares! WiWFi! y! Bluetooth.! Se! establece! con! el! principal! objetivo! el! de!
comunicar!aplicaciones!que!requieren!una!comunicación!segura,!con!baja!tasa!de!
envío!y!bajo!consumo.!Se!basa!en!dispositivos!inalámbricos!operando!en!la!banda!
ISM!para!usos! industriales,! científicos!y!médicos! (868!MHz,!915!MHz!y!2.4!GHz)!
con!una!modulación!en!espectro!ensanchado!por!secuencia!directa!(DSSS)!también!
conocida! como! acceso!múltiple! por! división! de! código! en! secuencia! directa! (DSW
CDMA).!En!el!rango!de!frecuencias!de!2.4!GHz!(banda!más!extendida)!se!definen!16!
canales!con!un!ancho!de!banda!de!5!MHz.!!
Figura 5.8 Topologías de red ZigBee.
ZigBee!define!diferentes!roles!para!los!dispositivos!que!conforman!a!red:!
• Coordinador:! Controla! el! encaminamiento! y! la! administración! de! la! red.!
Existe!uno!por!red.!!
• Router:! Interconecta! diferentes! nodos! mediante! direccionamiento.! Todos!
los! dispositivos! que! no! sean! extremos! de! la! red! serán! router! (y! uno!
coordinador).!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!68!
• Dispositivo! final:! Elemento! pasivo! que! responde! ante! peticiones! de! otros!
dispositivos.!Se!pasa!la!mayor!parte!del!tiempo!inactivo.!!
!
ZigBee! sigue! el! modelo! OSI! (Interconexión! de! Sistemas! Abiertos)!
reduciendo! las! 7! capas! de! la! pila! de! protocolos! a! únicamente! 4.! El! estándar!
802.15.4!define!las!dos!primeras!capas,!la!capa!física!y!de!enlace!de!datos,!mientras!
que!ZigBee!define!la!capa!de!red!y!la!capa!de!aplicación.!
Figura 5.9 Pila de protocolos ZigBee.
WCapa!Física:!Define!las!funciones!con!la!capa!de!enlace!de!datos,!los!niveles!
de!potencia!del! transmisor! y! la! sensibilidad!del! receptor,! transfiriendo! los!datos!
por! medio! de! un! entero! de! 8! bits.! Sus! funciones! son:! canales,! numeración! de!
canales,! detección! de! energía,! medición! de! portadora,! indicador! de! calidad! del!
enlace,! evaluación!de! canal! libre,! cliente,! servidor! entre! capas! e! interfaz/área!de!
datos!capa!física,!enlace!de!datos.!!!
WCapa!de!enlace!de!datos:!Provee!la!interfaz!entre!la!capa!física!y!la!capa!de!
red.!Maneja!los!servicios!y!los!datos.!Sus!funciones!son:!operación!de!la!red!usando!
balizas,!espaciado!entre! tramas,!CSMAWCA,!nodo!oculto!y!nodo!expuesto,! formato!
de!la!trama.!!!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 69!
WCapa!de!red!ZigBee:!Otorga!las!funcionalidades!para!el!armado!y!manejo!de!
redes! y! una! interfaz! simple! para! las! aplicaciones! de! usuarios.! Se! encarga! de:!
establece!la!red,!configuración!de!dispositivos,!encaminamiento,!y!seguridad.!!!
WCapa! de! aplicación:! Nivel! más! alto! de! la! especificación.! Es! la! interfaz!
efectiva! entre! el! nodo! y! el! usuario.! En! él! se! ubican! la! mayor! parte! de! los!
componentes!definidos!por! la!especificación.!El! estándar!ZigBee!ofrece! la!opción!
de! emplear! perfiles! en! el! desarrollo! de! aplicaciones.! Un! perfil! de! aplicación!
permite! la! interoperabilidad! entre! productos! de! diferentes! fabricantes! como! si!
fuesen!del!mismo.!!
!
ZigBee!es!sencillo!y!de!bajo!coste.!Mucho!más!sencillo!que!Bluetooth!por!ejemplo.!
De! hecho,! según! datos,! se! requiere! un!10%! del! hardware! total! necesario! para!
producir!un!dispositivo!con!Bluetooth.!ZigBee!es!una!alternativa!interesante!para!
la! comunicación! entre! distintos! dispositivos! que! necesiten! de! un! consumo!
energético!reducido.!Al!contrario!que!el!Bluetooth!o!el!WiFi,!ZigBee!es!una!opción!a!
tener! en! cuenta! a! la! hora! de!domotizar& una! casa.! Además,! el!Internet! de! las!Cosas!puede! recurrir! a! esta! tecnología! en! lugar!de! a!dispositivos! conectados!por!
WiFi.!
!
5.2.4&ANT&
ANT!es!una!tecnología!propietaria!de!libre!consulta!para!redes!inalámbricas!
de! difusión! múltiple! o! multicast,! que! ofrece! una! pila! de! protocolos! de!
comunicación!inalámbrica!para!dispositivos!que!operan!en!la!banda!ISM!2,4!GHz.!
Proporciona! reglas! estándar! de! coexistencia,! representación! de! datos,!
señalización,!autentificación!y!detección!de!errores.!
Esta! tecnología! está! pensada! para! la! interconexión! de! dispositivos! que!
requieran! transferencias! periódicas! y! constantes! de! pequeñas! cantidades! de!
información.! Las! topologías! de! red! que! permite! ANT! son:! de! punto! a! punto,! en!
estrella,!en!malla!o!en!árbol.!
Las! aplicaciones!más! conocidas! y! difundidas! de! ANT! se! encuentran! en! el!
sector!del!deporte,!en!concreto!en!fitness!y!ciclismo.!En!estas,!los!transceptores!se!
integran! en! elementos! como! relojes! o! cinturones! que! miden! parámetros! tales!
como! velocidad! y! distancia! permitiendo! al! usuario! una! monitorización! de! su!
rendimiento.!También!se!utiliza!en!aplicaciones!industriales,!científicas!y!médicas.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!70!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 71!
5.2.5&Comparativa&entre&WiWFi,&Bluetooth&4.0,&ZigBee&y&ANT&
En! una! comparativa! sobre! estas! tecnologías! inalámbricas,! no! se! puede!
asegurar! que! una! opción! sea! mejor! que! las! demás! y! viceversa.! Cada! tecnología!
puede!ser!apropiada!para!ciertos!casos!de!uso.!Es!necesario!observar!que!siempre!
que! se! analiza! una! tecnología,! o! un! conjunto! de! ellas,! se! realiza! en! función! del!
estado!presente!de!la!misma!(o!mismas).!En!este!campo!todo!tiende!a!bajar!el!coste!
y! el! tamaño,! aumentar! la! velocidad! de! transferencia! y! reducir! el! consumo.! Para!
realizar! la!comparativa!se!divide!entre!diferentes!aspectos!tales!como!el!coste,!el!
tamaño,!el!consumo!energético,!el!alcance,!la!velocidad!y!la!latencia:!
!
! Coste! Antena! PCB!tamaño! Consumo! Alcance! Velocidad! Latencia!
WiFi! $3! 8!mm! 60!mm2! 0,21W! 150m! 6!Mbps! 1,5!ms!
BT! $2.95! 8mm! 20!mm2! 0,147mW! 10W100m! 305!kbps! 2,5!ms!
ZigBee! $3.20! (F)15!mm! 305!mm2! 0,035W! 100m! 100!kbps! 20!ms!
ANT! $3.95! (F)!15!mm! 125!mm2! 0,183mW! 30m! 20!kbps! <1!ms!
Figura&5.10&Comparativa!entre!las!diferentes!tecnologías!de!red!inalámbricas!de!
área!local.!
!
En!la!tabla!anterior,!se!puede!observar!que!el!coste!de!implementación!de!
estas! tecnologías! es! parejo,! siendo! ANT! la! tecnología!más! costosa.! Además,! esta!
tecnología!se!encuentra!bajo!patente!no!libre!de!implementación.!
Las! dimensiones! de! las! antenas,! son! todas! integradas! en! el! plano! del!
circuito!impreso,!por!lo!que!aunque!ZigBee!y!ANT!necesitan!el!doble!de!espacio!en!
este!apartado,!lo!que!realmente!les!diferencia!es!el!tamaño!de!su!circuito!impreso.!
No! podemos! utilizar! el! mismo! espacio! para! un! chaleco! salvavidas! que! para! un!
marcapasos!cardiaco.!
En!el!apartado!de!consumo,!la!tecnología!WiWFi!es!la!que!menos!cuida!este!
aspecto.! Su! origen! y! propósito! inicial! no! ha! contemplado! su! implementación! en!
Internet!de!las!Cosas.!No!obstante,!a!continuación!se!matiza!este!resultado.!
La! velocidad,! aunque! dispar,! no! será! determinante! en! la! elección! de! la!
tecnología!a!usar!para!la!mayoría!de!los!casos.!Internet!de!las!Cosas!está!pensado!
para!ráfagas!cortas!de!datos,!separadas!en!el!tiempo!y!de!poca!carga.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!72!
Con!la!latencia!se!tiene!el!mismo!caso.!Solo!para!su!uso!en!ámbito!específico!
será! determinante.! Por! ejemplo,! si! necesitásemos! reactividad! en! tiempo! real! y!
precisión,!como!el!que!podría!ser!utilizado!en!la!telemetría!de!un!automóvil.!
Independientemente! de! los! números! ! que! se! muestran! en! tabla,! es!
necesario!que!se!matice!que:!
• Las!velocidades!son!tenidas!en!cuenta!para!la!carga!útil!de!la!comunicación.!
En! función! del! protocolo! que! se! utilice,! esta! velocidad! podrá! verse!
modificada.!!
• El! alcance! de! las! tecnologías! es! variable,! y! función! de! factores! como! la!
humedad,!la!temperatura,!los!obstáculos,!etc.!
• El! consumo! que! se! muestra! en! la! tabla,! corresponde! con! el! desempeño!
eléctrico!en!fase!de!transmisión!y!recepción.!El!estándar!WiWFi!permanece!
activo!en!todo!momento,!por!lo!que!ese!consumo!se!entiende!absoluto.!En!el!
caso! del! resto! de! tecnologías,! los! transceptores! descansan! entre!
transmisiones! para! lograr! ahorrar! preciada! energía.! Es! importante! sobre!
todo!para!aplicaciones!donde!la!fuente!de!energía!es!una!batería,!una!placa!
solar,!etc.!
!
!
Figura&5.11&Espectro!de!WiWFi!y!Bluetooth!4.0.!
!
Se! debe! tener! en! cuenta,! que! las! tecnologías! de! red! inalámbrica! son!
susceptibles!de!interferir!tanto!con!el!entorno,!como!con!ellas!mismas,!como!con!
sus! transmisiones! circundantes.! En! la! Figura! 5.11! y! 5.12! se! puede! observar! la!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 73!
compartición!de!canales!entre!tecnologías.!Esto!da!lugar!a!interferencias!cocanal.!
&
!
Figura&5.12&Espectro!de!WiWFi!y!ZigBee.!
!
Estas!tecnologías!de!comunicación!inalámbrica!son!empleadas!en!redes!de!
área! local.! Para! conectar! estas! redes! con! el! mundo,! es! decir,! para! aplicarlo! a!
Internet! de! las! Cosas,! se! necesita! un! dispositivo! que!medie! entre! los! protocolos!
locales! y! de! área! extensa.! En! el! caso! de!WiWFi! y! las! normas! IEEE! 802.11,! al! ser!
compatibles! con! la! pila! de! protocolos! TCP/IP! para! IEEE! 802.3! Ethernet,! no! es!
necesario! este! equipamiento! extra.! Por! tanto,! para! redes! de! sensores! puede!
interesar! ZigBee! por! sus! características,! pero! para! un! objeto! aislado,! o! para! un!
pequeño! conjunto! de! objetos! puede! no! tener! sentido! según! que! tecnologías! si!
tenemos!que!contar!con!estas!puertas!de!enlace.!
!
Fuente![W11]!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!74!
! &
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 75!
Capitulo&6.&&Caso&práctico.&Aplicación&Semáforo&Conectado&
!
El! proyecto! culmina! con! el! desarrollo! de! una! aplicación! que! sea!
representativa!para!el! contexto!de! Internet!de! las!Cosas.!Para!ello! se!presenta!el!
marco!de!trabajo!elegido,!el!diseño!de!la!aplicación!y!su!implementación.!
&
6.1&Automaton&framework)
Automaton!framework!es!un!entorno!de!trabajo!para!la!plataforma!Arduino,!
que! consiste! en! utilizar! máquinas! de! estado! finitas! reactivas! ejecutándose!
concurrentemente!(pseudoparalelismo),!que!interactúan!entre!sí.!Su!autor!es!Peter!
van!der!Landen.!
Es!un! framework,!dado!que!no!solo!consta!de!una!biblioteca,!sino!también!
de!una!herramienta!de!edición!de!máquinas!de!estado,! llamadas!componentes,! a!
modo!de!entorno!de!desarrollo!simple,!y!además!porque!modifica!en!cierto!grado!
la!forma!de!programar!el!código!para!las!placas!Arduino.!
!
Las!características!principales!son:!
• Máquinas!de!estado!con!mecanismo!de!multitarea!cooperativa.!
• Reactividad.!
• Planificador!ligero.!
• Temporizadores!y!contadores!integrados.!
• Comunicación!entre!componentes!a!través!de!disparadores!de!eventos!y!
conectores!push.!
• Posibilidad!de!poner!en!reposo!un!componente!para!cuida!el!uso!de!CPU.!
• Sistema!de!depuración.!
• Utiliza!un!diseño!modular.!
• Cualquier!componente!creado!funcionará!en!otro!contexto!con!la!única!
dependencia!de!la!biblioteca!Automaton.!
• Compatibilidad!completa!con!Arduino;!tanto!con!el!entorno!de!desarrollo!como!con!sus!placas.!
La!biblioteca!de!Automaton!está! escrita! en!C++.!Utiliza! la!programación!a!
objetos!y!en!este!caso,!la!programación!dirigida!por!eventos.!El!flujo!de!programa!y!
las! estructuras! de! control! hay! que! llevarlas! a! cabo! teniendo! en! cuenta! este!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!76!
paradigma.! Asimismo,! se! ponen! a! disposición! del! programador! una! serie! de!
máquinas!de!estado!sencillas,!para!su!uso!o!su!modificación:!
• Atm_analog:!monitoriza!los!valores!de!un!pin!analógico!con!posibilidad!de!utilizar!un!filtro!paso!bajo.!
• Atm_bit:!es!un!conmutador!binario!que!puede!disparar!eventos!en!sus!cambios!de!estado.!
• Atm_button:!para!gestionar!las!acciones!de!un!botón,!incluyendo!pulsaciones!largas,!rebotes,!repeticiones,!etc.!
• Atm_command:!monitor!serie!con!parser!incluido,!capaz!de!disparar!eventos!en!función!de!la!entrada.!
• Atm_comparator:!es!un!monitor!de!tensión!analógico!más!avanzado!que!Atm_analog,!que!permite!capturar!patrones!en!base!a!límites.!También!puede!hacer!uso!de!un!filtro!paso!bajo.!
• Atm_controller:!es!un!componente!que!almacena!un!bit!de!estado,!que!es!modificable!por!el!estado!o!llamada!de!otro!componente!y!de!una!operación!lógica!AND,!OR!o!XOR.!
• Atm_digital:!es!un!monitor!de!un!pin!digital.!Útil!cuando!quieres!notificar!el!cambio!de!estado!de!una!entrada!digital.!
• Atm_encoder:!Sirve!para!utilizar!un!codificador!rotativo!como!entrada.!Como!el!usado!en!una!rueda!para!regular!el!volumen!de!un!equipo!de!
sonido.!
• Atm_fade:!controla!mediante!modulación!de!ancho!de!pulso!la!iluminación!de!un!LED,!sus!tiempos!de!parpadeo,!atenuación!degradada,!
etc.!
• Atm_fan:!sirve!para!a!partir!de!un!evento!dado,!generar!múltiples!eventos!de!salida.!!
• Atm_LED:!se!utiliza!para!administrar!un!LED!a!través!de!un!pin!digital.!Velocidad!de!parpadeo,!tiempo!de!pausa!y!número!de!repeticiones.!
Puede!ser!empleado!para!cualquier!dispositivo!que!espere!una!entrada!similar,!como!un!relé.!!
• Atm_player:!es!un!reproductor!de!patrones!musicales!sencillos!para!generar!sonido!a!través!de!un!altavoz!piezoeléctrico.!Como!en!los!otros!componentes,!se!puede!utilizar!para!cualquier!otro!uso!basado!en!el!
mismo!funcionamiento.!
• Atm_servo:!puede!controlar!uno!o!más!servomotores.!Un!servomotor!es!un!motor!capaz!de!orientarse.!Ampliamente!utilizado!en!robótica.!
• Atm_step:!es!un!secuenciador!de!pasos.!Puede!manejar!hasta!8!pasos!diferentes,!y!puede!recorrerse!hacia!delante!o!hacia!atrás.!Es!el!concepto!
mismo!de!máquina!de!estado!finito!personalizable.!
• Atm_timer:!Es!un!temporizador!programable!en!tiempo!y!repetición.!Cuando!el!temporizador!llegue!a!cero,!se!puede!disparar!el!evento!a!
cualquier!componente.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 77!
6.1.1&“Hola&mundo”&en&Automaton&
Para! analizar! el! funcionamiento! de! Automaton,! se! puede! recurrir! a! un!
ejemplo! de! código.! El! “hola! mundo”! de! la! programación! de! microcontroladores!
suele! ser! hacer!parpadear!un!LED.!En! este! caso,! y! para! ver! alguna! capacidad!de!
este!marco!de!trabajo,!se!va!a!recurrir!a!un!botón!para!la!activación!y!desactivación!
del!LED.!
#include <Automaton.h> // Conmutar un LED que parpadea mediante un boton int LEDPin = 5; int buttonPin = 2; Atm_LED LED; Atm_button button; void setup() { LED.begin( LEDPin ) .blink( 200, 200 ); // Configura el LED para que parpadee cada 200 ms button.begin( buttonPin ) .onPress( LED, LED.EVT_TOGGLE_BLINK ); // Conmutar el LED cuando se presiona el boton } void loop() { automaton.run(); }
Código&6.1&“Hola!mundo”!en!el!framework!automaton.!
!
Como!se!puede!observar!en!el!código!anterior,!lo!primero!que!hay!que!hacer!
para!poder!utilizar! estas! funciones! es! referenciar! a! la!biblioteca!de! funciones!de!
Automaton! mediante! la! directiva! #include <Automaton.h>.! Esto! le! indica! al!
compilador!que! además!de! la! librería! estándar!de!C/C++,!debe!buscar! aquí!para!
encontrar!las!clases!contenidas!en!el!código.!Una!vez!hecho,!ya!podemos!llamar!a!
los!componentes!de!Automaton!con!total!libertad.!
Se!declaran!previo!a!la!función!setup()!dos!valores!enteros!conforme!a!los!
números!de!los!pines!digitales!elegidos!para!el!LED!y!para!el!botón.!Además!vamos!
a!reservar!espacio!a!los!componentes!(objetos)!LED!y!botón.!
Ya!en!la!función!setup() llamamos!al!método!begin() de!cada!objeto!para!
inicializarlo.!!En!ambos!casos!se!indica!como!parámetro!en!este!método!el!número!
de!pin!asociado!al!componente.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!78!
Ahora! se! puede! caracterizar! cada! componente.! En! el! caso! del! LED,! una!
configuración! básico! es! declarar! que! parpadee! en! intervalos! ! (200! ms! en! el!
ejemplo).! Se! realiza! con!el! fragmento!.blink(200,200).! En!el! caso!del!botón,! lo!
que!se!va!a!utilizar!es!un!disparador,!para!que!cuando!sea!pulsado,!actúe!sobre!el!
LED,! activando! o! desactivando! su! rutina.! En! el! ejemplo! lo! indica! el! código!
.onPress(LED,! LED.EVT_TOGGLE_BLINK).! ! Como! parámetros! se! indican! el!
componente!destino!en!primer! lugar,! y! en! segundo! lugar! se! referencia! el! evento!
que!queremos!que!sea!dado.!Con!esto!se!termina!el!cuerpo!de!la!función!setup(),!
que!se!ejecutara!solo!una!vez!con!cada!inicio!del!microcontrolador.!
Por!último,!en!la!función!loop()!propia!de!Arduino,!solamente!se!llama!a!la!
función!automaton.run(),! que!es! lo!que! se! ejecutará! tras! la! configuración! inicial!
hasta!que!se!apague!el!microcontrolador.!!
Para!hacer!un!desarrollo!sencillo,!conocer!el!funcionamiento!del!ecosistema!
a! este! nivel! podría! ser! suficiente.! En! cambio,! para! conocer! de! verdad! cómo! se!
consigue!que!estas!pocas!líneas!hagan!lo!esperado,!se!debe!analizar!la!clase!madre!
de!los!componentes!llamada!Machine!y!el!método!automaton.run().!
!
6.1.2&¿Cómo&funciona?&
Para!entender!el!funcionamiento!del!sistema,!se!tiene!que!analizar!la!clase!
Machine!y!el!método!automaton.run().!
!
6.1.2.1&La&clase&Machine&
La!clase!Machine!es!una!clase!abstracta,!lo!que!en!lenguaje!C++!quiere!decir!
que!para!poder!instanciarla,!se!debe!crear!una!subclase!que!herede!de!ella.!Todos!
los!componentes!que!se!han!documentado!en!el!inicio!de!este!capítulo,!son!clases!
que! heredan! de! Machine.! Esto! garantiza! que! los! métodos! (funciones),! atributos!
(variables)!y!dependencias!básicos!son!respetados.!!Además,!mediante!herencia!se!
puede!crear!un!componente!a!partir!de!otro!con!facilidad.!Solo!se!debe!heredar!de!
la!clase!que!más!se!aproxime!a!lo!que!se!quiere!tener,!y!luego!sobrescribir!o!añadir!
los!métodos!que!necesitemos.!
Esta! clase! (o! la! que! herede! de! ella)! representa! una! máquina! de! estados!
finita.!Lo!hace,!mediante!la!declaración!de!estados,!eventos!y!su!interacción!en!una!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 79!
tabla! estática.! En! las! siguientes! figuras! se! observa! el! código! y! su! diagrama! de!
estados!correspondiente:!
const static state_t state_table[] PROGMEM = { /* ON_ENTER ON_LOOP ON_EXIT EVT_INPUT EVT_EOL ELSE */ /* IDLE */ -1, -1, -1, READCHAR, -1, -1, /* READCHAR */ ENT_READCHAR, -1, -1, READCHAR, SEND, -1, /* SEND */ ENT_SEND, -1, -1, -1, -1, IDLE, }; Machine::begin( state_table, ELSE );
Código&6.2&Tabla!de!estados!de!un!componente!Automaton.!
!
Figura&6.1&Diagrama!de!estados!a!partir!de!la!tabla!anterior.!
Como!se!advierte!en! las! figuras!anteriores.!Los!estados! corresponden!a! la!
columna!de!la!izquierda,! los!eventos!a!la!primera!fila!y!las!acciones!y!cambios!de!
estado!son!el!contenido!de!la!tabla.!Una!acción!vacía!se!define!con!“W1”.!En!realidad,!
todas!los!estados,!eventos!y!acciones,!serán!reemplazados!por!los!números!0,!1,!2,!
3,!etc.!Los!eventos!ON_ENTER,!ON_LOOP!y!ON_EXIT!son!predefinidos!y!corresponden!
con!0,!1!y!2! respectivamente.!Mediante!esas!macros! se!mapea! cada!estado,! cada!
evento!y!cada!acción.!Por!eso!se!utiliza!el!evento!ELSE,!para!delimitar!la!fila.!
!
El&manejador&de&eventos&int event( int id ) &
El!manejador! de! eventos! debe! ser! implementado! por! cada! sublcase! de! la!
clase!Machine,!dado!que!es!un!método!abstracto!Por!cada!evento,!se!llamará!a!este!
método!en!informarse!si!ese!evento!ha!ocurrido!o!no.!Primero,!comprobara!si!para!
el!estado!en!el!que!se!encuentra!la!máquina,!se!maneja!dicho!evento!(valor!>W1),!si!
es!así!entrará!en!el!bloque!de!código!correspondiente,!consultando!si!ese!evento!a!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!80!
ocurrido,! devolviendo! 0! si! no! ha! ocurrido! y! 1! si! sí.! Estos! eventos! se! recorren!
secuencialmente.!
int Atm_command::event( int id ) { switch ( id ) { case EVT_INPUT : return _stream->available(); case EVT_EOL : return _buffer[_bufptr-1] == _eol || _bufptr >= _bufsize; } return 0; }
Código&6.3&Manejador!de!eventos!de!un!componente!Automaton.!
&
El&manejador&de&acciones&&void action( int id )
Como!en!el!caso!anterior,!el!manejador!de!acciones!debe!ser!implementado!
por!cada!máquina!que!hereda!de!la!clase!Machine.!Su!funcionamiento!es!igual!que!
en! el! caso! del! manejador! de! eventos! explicado! anteriormente! a! su! entrada.! La!
diferencia!es!que!no!devuelve!ningún!valor,!ya!que!aquí!es!donde!se! realizan! las!
acciones.!En!el!siguiente!código!se!puede!comprender!el!comportamiento!de!este!
método:!
void Atm_LED::action( int id ) { switch ( id ) { case ENT_INIT : counter.set( repeat_count ); digitalWrite( pin, LOW ); return; case ENT_ON : decrement( counter ); digitalWrite( pin, HIGH ); return; case ENT_OFF : digitalWrite( pin, LOW ); return; } }
Código&6.4&Manejador!de!acciones!de!un!componente!Automaton.!
&
Los&disparadores&&int trigger( int event )
Cuando! se! llama! al! disparador! de! un! componente,! lo! que! hacemos!
realmente! es! utilizar! forzar!un! evento!de! esa!máquina!para!que! se! ejecute! en! la!
siguiente! iteración,!es!decir,!cuando!el!manejador!de!eventos!recorra! los!eventos!
de!dicha!máquina,!aparecerá!este!evento!a!realizar.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 81!
!
La&depuración&trace() &
El!método!setTrace()!toma!tres!argumentos.!El!tercero!es!una!cadena!que!
comienza!con!el!nombre!de!la!clase!y!luego!contiene!los!nombres!(separados!por!
null o “\0”)!de!los!eventos!y!estados!tal!como!se!definen!en!la!máquina.!Luego,!
cuando! se! quiere! monitorizar! una! máquina! de! estados,! llamamos! al! método!
trace().!Típicamente!el!argumento!para!la!salida!tipo!stream!será!trace(Serial).!
La! definición! del!método! y! un! ejemplo! de! salida! se! puede! ver! en! las! siguientes!
figuras:
!!
Atm_blink & Atm_blink::trace( Stream & stream ) { Machine::setTrace( &stream, atm_serial_debug::trace, "BLINK\0EVT_TIMER\0EVT_ON\0EVT_OFF\0ELSE\0IDLE\0LED_ON\0LED_OFF" ); return *this; }
Código&6.5&Método!trace!de!un!componente!Automaton.!
&
0 Switch BLINK@52E from *NONE* to IDLE on *NONE* (1 cycles in 0 ms) 1 Switch BLINK@52E from IDLE to LED_ON on EVT_ON (2 cycles in 0 ms) 26 Switch BLINK@52E from LED_ON to LED_OFF on EVT_TIMER (44 cycles in 200 ms) 47 Switch BLINK@52E from LED_OFF to LED_ON on EVT_TIMER (98 cycles in 200 ms)
Código&6.6&Salida!de!depuración!de!un!componente!Automaton!por!puerto!Serie.!
!
El&método&cycle&cycle(time)
Este!método!es!vital!para!el!funcionamiento!del!sistema.!Básicamente!lo!que!
hace!es!realizar!un!ciclo!de!la!máquina!de!estado.!
El!parámetro!de!tiempo!por!defecto!es!0!en!su!llamada.!Si!fuese!mayor!que!
cero,!antes!de!hacer!nada,!se!evalúa!si!ha!cumplido!ese!tiempo!utilizando!la!función!
millis() nativa! de! Arduino.! Si! no,! retorna! inmediatamente.! Si! es! cero! o! se! ha!
cumplido,!realiza!lo!siguiente.!
• Si!cambia!de!estado!en!este!ciclo:!
!W!Llama!a!la!acción!de!ON_SWITCH!
!W!Llama!a!la!función!de!depuración!(si!estuviese!activa)!
!W!Llama!a!la!acción!del!estado!anterior!colocada!en!el!estado!ON_EXIT!
!W!Cambia!el!estado!actual!por!el!nuevo!estado!
!W!Llama!a!la!acción!que!haya!en!la!casilla!ON_ENTER!!de!este!nuevo!estado!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!82!
• Si!se!trata!de!un!ciclo!normal!(sin!cambio!de!estado):!
!W!Realiza!la!acción!contenida!en!la!casilla!ON_LOOP!del!estado!actual!
!W!Revisa!los!eventos!usando!el!método!event()!del!estado!actual!y!los!trata!!
!
6.1.2.2&La&clase&Automaton&
La! clase! Automaton! apenas! tiene! contenido! en! comparación! con! la! clase!
Machine.!Mantiene!una!lista!enlazada!de!las!máquinas!de!estado!del!programa.!A!
parte,!posee!tres!métodos!que!lo!que!hacen!es:!
• add():añade!una!máquina!a!la!lista!enlazada!de!máquinas.!Es!llamada!
por!el!método!add()de!la!clase!Machine!y!también!por!el!begin().!Solo!
se!inserta!una!vez.!
• delay(time):para! el! planificador! hasta! que! se! cumpla! el! tiempo.!
Similar!a! la! función!add()!de! la! clase!Machine.!Hasta!que!se!cumple!el!
tiempo!time!no!se!ejecuta!ninguna!máquina!de!estado.!
• run():es!al!que!se! llama!en!el!método!loop() del!sketch!Arduino.!Lo!
que!hace!es! recorrer! la! lista!de!máquinas! inventariadas!y! llamar!a! sus!
métodos!cycle()!una!por!una.!
!
6.1.2.3&La&comunicación&entre&máquinas&
Cuando!se!quiere!publicar!un!cambio!a!otro!componente!o!componentes,!se!
tiene!que!añadir!un!método!para!en!la!clase!de!la!nueva!máquina!que!contenga!en!
su!interior!una!llamada!al!método!onPush().!Aquí!un!ejemplo:!
/* onStart() push connector variants ( slots 1, autostore 0, broadcast 0 ) * * Usage in action() handler: push( connectors, ON_START, 0, v, up) */ Atm_ejemplo& Atm_ejemplo::onStart( Machine& machine, int event ) { onPush( connectors, ON_START, 0, 1, 1, machine, event ); return *this; } Atm_ejemplo& Atm_ejemplo::onStart( atm_cb_push_t callback, int idx ) { onPush( connectors, ON_START, 0, 1, 1, callback, idx ); return *this; }
Código&6.7&Ejemplo!de!conector!push!en!componente!Automaton.!
!
Para!que!funcione,!se!tiene!que!conectar!desde!el!método!action(id):
void Atm_smarttrafficlight::action( int id ) { switch ( id ) {
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 83!
case ENT_ESTADO1: digitalWrite( 8, HIGH ); push( connectors, ON_START, 0, 0, 0); push( connectors, ON_CHANGE, 0, 0, 0 ); return; case EXT_ESTADO1: digitalWrite( 8, LOW ); return; case ENT_ESTADO2: digitalWrite( 9, HIGH ); push( connectors, ON_CHANGE, 0, 1, 0 ); return; case EXT_ESTADO2: digitalWrite( 9, LOW ); return; } }
Código&6.8&Enlace!de!conector!push!desde!el!método!de!acciones.!
!
Se!revela!en!el!código!anterior!que!en!el!ESTADO1!se!publicará!el!tanto!de!un!
cambio!de!estado!onChange(),!como!que!además!es!el!estado!inicial!onStart().!En!
la!figura!6.7,!se!puede!diferenciar!entre!un!conector!push!con!parámetro!callback!y!
otro! con! evento.! Esto! quiere! decir! que! cuando! se! declare! a! ese! conector! push,!
cuando! ocurra,! llamará! a! la! función! que! callback! que! se! haya! indicado,! o! bien!
disparará! el! evento! del! componente! que! se! designe.! En! el! siguiente! código! se!
aprecian!los!dos!casos!implementados:!
void callback( int idx, int v, int up ) { LED.toggle(); } void setup() { LED.begin( 1 ); button.begin( 2 ) .onPress( callback ); button2.begin( 3 ) .onPress( LED, LED.EVT_START ); button3.begin( 4 ) .onPress( [] ( int idx, int v, int up ) { Serial.print(“into a lambda expression); }); }
Código&6.9&Diferentes!formas!de!utilizar!los!conectores!push.!
En!el!primer!botón,! cuando! se!presione,! se! llama!a! la! función!callback()!
definida!al!principio.!En!el!segundo!botón,!al!presionarlo,!se!dispara!un!evento!en!
el! LED.! En! el! tercer! botón,! se! ejecuta! la! línea! que! escribe! en! puerto! serie.! Esta!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!84!
última! forma!de! codificar,! se! llama!expresión!Lambda,! y! sirve!para! compactar! el!
código!y!facilitar!la!lectura!al!programador.!Esta!disponible!su!uso!desde!la!versión!
1.6.6!del!entorno!de!desarrollo!Arduino.!Fuente![W12].!
6.1.3&Creación&de&componentes&propios&
En!el!marco!de!trabajo!de!Automaton,!se!incluyen!unos!sencillos!pero!útiles!
componentes,! con! los! que! se! pueden! elaborar! estructuras! de! control! más!
complejas.! Estas! máquinas! de! estado! pueden! satisfacer! las! necesidades! del!
programador,! pero! en! caso! contrario,! se! facilita! la! de! otras! nuevas! en! una!
herramienta!basada!en!entorno!web! [W13]!que!permite! tanto! la!creación!de!una!
máquina!de!estados!partiendo!de!cero,!o!como!la!modificación!de!una!ya!existente.!!
!
Figura&6.2&Herramienta!de!creación!de!máquinas!de!estado.!
En! la!Figura!6.2!se!aprecia!el!estado! inicial!de! la!herramienta.!Para!comenzar,!se!
debe!pulsar!en!“Crear!una!máquina!de!estado!nueva”!o!en!“Modificar!una!máquina!
de!estado!existente”.!!Si!se!elige!la!primera!opción,!el!navegador!mostrará!esto:!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 85!
Figura&6.3&Herramienta!de!creación!de!máquinas!de!estado.!
Para!insertar!estados!y!eventos,!basta!con!escribir!el!nombre!en!la!caja!de!
texto!y!pulsar!sobre!el!botón!correspondiente.!A!modo!de!ejemplo,!se!genera!una!
máquina! de! estados! propia! de! un! juego! de! hundir! la! flota.! En! la! Figura! 6.4! se!
pueden! identificar! los! estados! OK,! TOCADO! y! HUNDIDO;! y! los! eventos! FUEGO! y!
AUTODESTRUCCION.! En! la! casilla! correspondiente! al! evento! y! estado! deseado,! se!
debe! indicar!el!estado! futuro!al!que!se!migra.!En!este!caso,!en!caso!de!FUEGO,!un!
barco! en! estado! OK! pasa! a! estar! TOCADO,! y! si! está! TOCADO! pasa! a! estar! HUNDIDO.!
También!se!puede!modificar!el!ámbito!de!acceso!de!cada!evento.!Aquí!se!diferencia!
un! evento! solamente! accesible! desde! la! propia!máquina! de! estados,! como! en! el!
caso!del!evento!AUTODESTRUCCION,!o!de!acceso!exterior,!como!en!el!evento!FUEGO.!Al!
barco!se!le!debe!poder!disparar!desde!fuera,!pero!solo!se!puede!autodestruir!desde!
dentro.!En!los!“subeventos”!autogenerados!ENTER,!LOOP!y!EXIT!se!encuentran!unas!
casillas!de!verificación!para!generar!acciones.!Es!necesario!para!realizar!tareas!en!
los!cambios!de!estado!y!enlazar!los!conectores!push.!
!
!
Figura&6.4&Tabla!de!transiciones!de!estado.!
!
Por!último,!es!posible!añadir!conectores!para!poder!comunicarse!con!otros!
componentes,! o! realizar! llamadas! a! funciones! (callbacks)! en! el! cuerpo! del!
programa!principal.!Una!muestra!de!ello!se!encuentra!en!la!Figura!6.5.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!86!
!
Figura&6.5&Conectores!de!máquina!de!estado.!
!
En!el!botón!.hpp!y!en!.cpp!se!puede!encontrar!la!cabecera!escrita!en!C++,!y!
el! código! respectivamente.! Para! descargar! el! código! en! nuestro! ordenador,!
encontramos! los! botones! en! la! pantalla! inicial! o! el! botón! File.! En! la! práctica,!
apenas!se!ha!realizado!el!esqueleto!de!la!máquina!de!estado.!Para!que!haga!cosas,!
se! tiene! que! detallar! el! código! en! la! función! action()! y! en! event().! En! este!
supuesto!el!método!action()!podría!ser!así:!
void Atm_machine::action( int id ) { switch ( id ) { case ENT_OK: digitalWrite( pin1, HIGH ); digitalWrite( pin2, HIGH ); digitalWrite( pin3, HIGH ); push( connectors, ON_CHANGE, 0, 0, 0 ); return; case EXT_OK: digitalWrite( pin2, LOW ); return; case ENT_TOCADO: push( connectors, ON_CHANGE, 0, 1, 0 ); return; case EXT_TOCADO: return; case ENT_HUNDIDO: digitalWrite( pin1, LOW ); digitalWrite( pin2, LOW ); digitalWrite( pin3, LOW ); push( connectors, ON_CHANGE, 0, 2, 0 ); return; } }
Código&6.10&Detalle!del!método!action()!en!componente!creado.!
A!esto!hay!que!añadirle!las!variables!internas!de!la!máquina!de!estado,!los!
métodos!que!se!quieran!definir!y!los!disparadores!a!eventos.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 87!
6.2&Microcontrolador&ESP8266&
!
Figura&6.6&Módulo!ESP8266.!
!
Existe!un!componente!!de!comunicación,!a!parte!de!los!documentados!en!la!
presentación! de! Automaton.! Consiste! en! una! implementación! de! la! biblioteca!
Arduino! WiFi,! para! microcontroladores! basados! en! el! chip! ESP8266.! Este!
microcontrolador,!y!toda!la!gama!ESPWXX,!se!han!vuelto!muy!populares!gracias!a!su!
bajo!costo,!potencia!y!capacidad!de!comunicación!inalámbrica!bajo!el!estándar!WiW
Fi.!En! realidad,! estos!microcontroladores! consisten!en!un!microcontrolador!y!un!
transceptor!en!la!banda!ISM!2,4GHz.!Tiene!la!ventaja!de!superar!a!cualquier!placa!
Arduino!en!rendimiento!bruto,!utilizando!una!arquitectura!hardware! similar.!Sus!
características!son:!
• CPU!RISC!de!32Wbit:!Tensilica!Xtensa!LX106!a!un!reloj!de!80!MHz.!
• RAM!de!instrucción!de!64!KB,!RAM!de!datos!de!96!KB.!
• Capacidad!de!memoria!externa!flash!QSPI!W!4!MB.!
• IEEE!802.11!b/g/n!WiWFi.!
• Soporte!de!autenticación!WEP!y!WPA/WPA2.!
• 16!pines!GPIO!(Entradas/Salidas!de!propósito!general).!
• SPI,!I²C.!
• Interfaz!I²S!con!DMA!(comparte!pines!con!GPIO).!
• Pines! dedicados! a!UART,!mas! una!UART!únicamente! para! transmisión!
que!puede!habilitarse!a!través!del!pin!GPIO2.!
• 1!conversor!ADC!de!10!bits.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!88!
El! problema!de! este!módulo! es! que! aunque! su! chip!disponga!de!16!pines!
GPIO!para! la!entrada/!salida,! físicamente!solo!hay!dos!disponibles.!Además,!para!
su!programación!es!necesario!un!adaptador!a!USB,!conectado!mediante!un!circuito!
sencillo!llamado!FTDI.!Además!no!era!compatible!nativamente!con!Arduino.!
No!obstante,!dado!el!potencial!de!aplicación!de!este!módulo,!se!han!creado!
multitud!de!placas!basadas!en!este!chip,!con!los!pines!de!entrada/salida!accesibles!
y! programador! mediante! puerto! microUSB! incorporado.! Con! ello! se! permite!
facilidad! de! programación! y! versatilidad! en! su! interacción! con! instrumentación!
externa!(botones,!sensores,!relés,!LEDs,!etc).!En!este!proyecto,!se!ha!optado!por!la!
placa! Wemos! D1! mini.! Respecto! a! la! compatibilidad! con! Arduino,! los! propios!
desarrolladores!de!Arduino!han!incluido!esta!placa!como!soportada!en!su!entorno!
de!desarrollo.!Se!puede!acceder!al!código!fuente!en!su!repositorio!de!GitHub.!
!
Figura&6.7&Microcontrolador!Wemos!D1!Mini.!
Fuente![W14].!
6.3&Diseño&
El!caso!práctico!consiste!en!sistema!de!semáforos! inteligente!y!conectado.!
El! semáforo! es! capaz! de! en! función! del! tráfico! de! peatones! y! vehículos! que! lo!
crucen,!notificar!los!valores!obtenidos!a!la!nube,!o!a!un!servidor!dedicado.!Con!los!
datos!registrados!en!la!nube!o!en!el!servidor,!se!elabora!una!respuesta!lógica!dados!
los! datos! actuales! y! su! histórico.! Una! vez! hecho! se! reajustan! los! valores! del!
semáforo!con!el!fin!de!optimizar!el!tráfico!tanto!de!peatones!como!de!vehículos.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 89!
El! semáforo! podrá! ser! constituido! por! un! solo! elemento! de! hardware!
integrado,!o!por!varios.!Por!ejemplo,!el!captador!de!tráfico!peatonal!y!de!vehículos!
puede!estar!en!un!módulo,!y!el!sistema!de!luces!en!otro.!O!bien!el!sistema!de!luces!
puede! estar! repartido! en! dos! módulos! separados.! Cabe! pensar! en! cualquier!
combinación!de!estos!casos.!En!este!ejemplo!se!utilizará!LEDs! individuales!como!
señalizadores!del! semáforo.!El!esquema!de! luces!es!el!habitual! rojoWámbarWverde!
para!vehículos!y!rojo!verde!para!peatones.!El!captador!de!tráfico!tanto!de!peatones!
como!de!vehículos!podría!ser!realizado!mediante!un!sensor!de!ultrasonidos!o!un!
sistema!láser.!Como!no!es!objeto!de!este!proyecto!el!desarrollo!de!dichos!sistemas,!
se!simplifica!la!entrada!de!información!mediante!un!pulsador!para!cada!tráfico.!
!
Figura&6.8&Diagrama!semáforo!IoT.!
El! semáforo! y/o! las! partes! que! lo! integren,! se! comunicarán! utilizando! el!
sistema! IEEE! 802.11!WiWFi.! Uno! de! los! requisitos! del! semáforo! es! funcionar! del!
mismo!modo!tanto!si!el!semáforo!es!completo!como!si!es!distribuido!en!diferentes!
subsistemas.!!Para!ello!la!latencia!y!tiempo!del!respuesta!de!la!comunicación!deben!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!90!
estar! en! una! tolerancia! del! orden! de! milisegundos.! En! este! sistema,! ni! los!
semáforos,!ni!las!partes!que!los!integren!contendrán!la!lógica!computacional.!Esta!
tarea!será!designada!a!un!(o!varios)!servidor(es),!mediante!un!servicio!en!la!nube.!
En!el!siguiente!apartado!se!profundiza!en!las!particularidades!de!la!comunicación.!
Cada! semáforo! o! parte! que! lo! conforme,! será! gobernado! por! un!
microcontrolador!con!capacidades!de!comunicación!inalámbrica!fabricados!por!la!
empresa!china!Wemos.!En!concreto! la!placa!utilizada!es! la!Wemos!D1!Mini![Wx],!
documentada!en!el!capítulo!6.7.!
La!programación!de! estos!microcontroladores! es! llevada! a! cabo!mediante!
un! ordenador! con! sistema! operativo! indiferente,! macOS,! Windows! o! Linux.! La!
conexión! entre! el! ordenador! y! el!microcontrolador! se! realiza!mediante! un! cable!
estándar!USB!–!microUSB.!El!entorno!de!desarrollo!utilizado!es!Arduino!IDE!en!su!
versión!actual!1.8.3.!Las!bibliotecas!implicadas!en!la!programación!son!las!propias!
de!Automaton!framework,!la!máquina!de!estados!creada!a!medida!(el!semáforo)!y!
la! correspondiente! a! la! comunicación! a! través! de! la! placa! basada! en! el! chip!
ESP8266.!
El! sistema! conecta! con! un! servicio! de! nube! para! Internet! de! las! Cosas,!
donde! deposita! la! información! obtenida.! El! plano! lógico! donde! se! extrae! esta!
información,!se!procesa,!y!se!retornan!los!resultados!se!encuentra!en!un!servidor!
conectado!a!la!nube!también.!
6.4&Protocolo&de&comunicaciones&de&red.&REST&
En!un! sistema!de! Internet! de! las! Cosas,! la! heterogeneidad! intrínseca! a! su!
concepto,! es! necesaria! limitarla! en! términos! de! comunicación,! o! por! lo! menos,!
lograr! la! interacción!de! las!diferentes!partes!del! sistema!de!manera! cooperativa,!
con!independencia!de!los!que!haya!por!debajo.!
En! este! caso,! a! nivel! de! interfaz! de! red! entre! los! objetos! IoT! se! utiliza! la!
norma! IEEE! 802.11! hasta! el! punto! de! acceso! que! haga! de! puerta! de! enlace! con!
Internet.!A!partir!del!punto!de!acceso,!lo!habitual!es!emplear!la!norma!IEEE!802.3!
Ethernet!ya!sea!a! través!de!cobre!o! fibra!del!proveedor!de!servicio.!No!obstante,!
esta!conexión!podría!ser!realizada!mediante!una!red!celular!GSM!o!cualquier!otro!
método.!Lo!realmente!interesante,!es!que!se!transporte!a!la!nube!llegue!en!tiempo!
y!forma,!de!tal!manera!que!pueda!haber!entendimiento!entre!las!dos!partes.!Para!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 91!
ello,!es!deseable!emplear!un!método!simple,!ligero!y!robusto.!El!método!elegido!es!
la!arquitectura!REST.!
REST! es! una! arquitectura! que! utiliza! sencillos! métodos! encapsulados! en!
mensajes!HTTP!para!interactuar!con!un!recurso!web!desarrollada!por!Roy!Fielding!
en! el! año! 2000.! En! estos! mensajes! HTTP! se! pueden! publicar! datos! (crear! y/o!
actualizar),!leerlos!(por!ejemplo,!realizar!consultas)!y!eliminar!datos.!Por!lo!tanto,!
REST! utiliza! HTTP! para! las! cuatro! operaciones! CRUD! (Create, /, Read, /,Update, /,
Delete)!propias!de!las!bases!de!datos.!
A!pesar!de!ser!simple,!REST!es!ampliamente!utilizado!en!la!actualidad!como!
alternativa!a!protocolos!formales!de!servicios!web!como!SOAP.!La!ventaja!de!REST!
es!la!interoperabilidad!con!cualquier!dispositivo!al!funcionar!sobre!HTTP.!Además!
es! sencillo! de! operar! y! flexible,! en! detrimento! de! SOAP.! Los! principios! de! esta!
arquitectura!son:!
• Todo!lo!que!se!mueve!a!través!de!las!comunicaciones!web!es!un!recurso.!
• Los!recursos!web!pueden!ser!clasificados!por!su!tipo:!video,! imagen,!docx,!
etc.!
• Los!recursos!de!la!web!deben!tener!un!identificador!único,!el!cual!va!a!estar!
dado!por!su!URL,!y!estos!deben!estar!accesibles!e!identificables.!
• El!método!REST!se!apoya!en!las!8!acciones!principales!definidas!en!HTTP:!
GET,!POST,!PUT,!DELETE,!HEAD,!OPTIONS,!TRACE!y!CONNECT.!
• Cada! recurso! puede! tener!múltiples! representaciones,! con! independencia!
de!su!almacenamiento.!Por!ejemplo,!podría!tenerse!un!recurso!en!formato!
XML!y!poder!solicitarlo!en!formato!JSON.!
• La! comunicación! entre! cliente! y! servidor,! no! contempla! estado! alguno!
(aunque!se!puede!cachear).!Por! tanto,! cada!petición!al! servidor!es! tratada!
de!manera!totalmente!independiente.!
!
REST!no!es!un!protocolo,!ni!un!estándar,!es!un!concepto!de!arquitectura!que!
sigue!los!criterios!anteriormente!mencionados!y!que!se!sirven!de!buenas!practicas!
en! su! implementación! para! lograr! esa! interoperabilidad.! Por! ello,! es! habitual!
encontrar! discrepancias! entre! los! métodos! de! obtención! y! modificación! de!
recursos,!como!en!el!caso!de!este!proyecto.!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!92!
Por!último,! cabe!mencionar!que!RESTful! son! los! servicios!web! que! siguen!
los!principios!REST.!
A! nivel! de! red,! se! va! a! utilizar! la! pila! de! protocolos! TCP/IPv4,! dada! la!
compatibilidad! del! hardware! actual,! y! poder! prescindir! de! puertas! de! enlace! de!
doble!pila!(IPv4!e!IPv6).!Gracias!a!la!estratificación!de!la!red!en!niveles,!bien!podría!
ser!utilizado!IPv6!sin!apenas!modificaciones.!
6.5&Implementación&
Dados! los! requisitos! previos! de! la! aplicación! a! diseñar,! y! sus!métodos! de!
implementación,!entorno!de!desarrollo,! lenguaje!de!programación!y!hardware,!se!
estudia!una!estrategia!para!el!desarrollo!de!la!misma.!
Para! ello,! lo! ideal! es! crear! una! máquina! de! estados! en! el! framework!
Automaton,! donde! se! resuelva! el! sistema! de! iluminación! gobernado! por!
temporizadores! variables.! A! su! vez,! esta! programación! debe! tanto! manejar! la!
entrada!de!valores!de!tráfico!de!personas!y!peatones.!Por!último,!se!necesita!una!
capa!de!conectividad!para!publicar!esos!valores!obtenidos!y!recibir!la!información!
tras!su!proceso!para!modificar!los!valores!de!temporización.!
En!primer!lugar,!se!define!un!diagrama!de!estados!para!este!componente.!
!
Figura&6.9&Diagrama!de!estados!semáforo.!
!
Que!trasladado!a!una!tabla!de!transición!de!la!máquina!de!estado!finito,!se!
tiene:!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 93!
! verde! ámbar! rojo!
WW>!VERDE! ÁMBAR! ! !
ÁMBAR! ! ROJO! !
*ROJO! ! ! VERDE!
Figura&6.10&Tabla!de!transiciones!semáforo.!
!
En!la!Figura!6.10,!se!puede!advertir!la!similitud!de!esta!tabla!de!transición!
con!la!tabla!vista!en!el!apartado!dedicado!al!framework!Automaton,!concretamente!
en! la! Figura! 6.2.! La! diferencia! radica! en! que! las! máquinas! de! estados! de!
Automaton,! incorporan! “subeventos”! de! entrada,! salida! y! permanencia! por!
defecto;!correspondiendo!respectivamente!a!ON_ENTER,!ON_EXIT!y!ON_LOOP.!
En! estos! diagramas! solo! se! tiene! en! cuenta! el! estado! del! semáforo! para!
vehículos.!No!obstante,!los!estados!para!peatones!están!directamente!relacionados!
con!ellos.!Un!representación!de!ello!se!puede!observar!en!la!Figura!6.11.!
!
!
Figura&6.11&Diagrama!de!estados!semáforo!completo.!
!
Con! este! diseño! ya! se! puede! desarrollar! la!máquina! de! estado.! El! código!
fuente!de!la!máquina!de!estado!se!encuentra!en!los!Códigos!6.11!y!6.12.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!94!
#pragma once #include <Automaton.h> class Atm_smarttrafficlight: public Machine { public: enum { GREEN, YELLOW, RED }; // STATES enum { EVT_TIMER_G, EVT_TIMER_Y, EVT_TIMER_R, EVT_NEXT, EVT_GREEN, EVT_YELLOW, EVT_RED, ELSE }; // EVENTS Atm_smarttrafficlight( void ) : Machine() {}; Atm_smarttrafficlight& begin( void ); Atm_smarttrafficlight& trace( Stream & stream ); Atm_smarttrafficlight& trigger( int event ); int state( void ); Atm_smarttrafficlight& onStart( Machine& machine, int event = 0 ); Atm_smarttrafficlight& onStart( atm_cb_push_t callback, int idx = 0 ); Atm_smarttrafficlight& onChange( Machine& machine, int event = 0 ); Atm_smarttrafficlight& onChange( atm_cb_push_t callback, int idx = 0 ); Atm_smarttrafficlight& next( void ); Atm_smarttrafficlight& green( void ); Atm_smarttrafficlight& yellow( void ); Atm_smarttrafficlight& red( void ); Atm_smarttrafficlight& begin( int pin_g, int pin_y, int pin_r, int pin_gp, int ping_rp); Atm_smarttrafficlight& setTimers( int g, int y, int r ); Atm_smarttrafficlight& setTimers( int g, int r ); private: enum { ENT_GREEN, EXT_GREEN, ENT_YELLOW, EXT_YELLOW, ENT_RED, EXT_RED }; // ACTIONS enum { ON_START, ON_CHANGE, CONN_MAX }; // CONNECTORS atm_connector connectors[CONN_MAX]; int pin_g, pin_y, pin_r, pin_gp, pin_rp; int countp, countc; atm_timer_millis timer_g, timer_y, timer_r; int event( int id ); void action( int id ); };
Código&6.11&Cabecera!de!la!máquina!de!estados!smarttrafficlight.hpp.!
!!
En!el!código!de!cabecera!se!comienza!heredando!de!la!clase!madre!Machine,!
utilizada! de! base! para! la! modelación! del! nuevo! componente.! Se! declaran! los!
estados!y!eventos!mediante!una!enumeración!estática!y!se!incluyen!los!prototipos!
de!los!métodos.!Todo!ello!corresponde!al!ámbito!público!de!la!clase.!Para!el!ámbito!
privado,! se! declaran! las! acciones! y! conectores! push,! así! como! las! variables!
necesarias! para! la! lógica! de! la! máquina! de! estados.! En! el! código! fuente!
smarttrafficlight.cpp,! se! resuelve! el! contenido! de! los! métodos! y! el! enlace! de!
estados,!eventos,!acciones!y!conectores.!Se!puede!observar!en!el!Código!6.12.!
!!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 95!
#include "Atm_smarttrafficlight.h" /* Add optional parameters for the state machine to begin() * Add extra initialization code */ Atm_smarttrafficlight& Atm_smarttrafficlight::begin( int pin_g, int pin_y, int pin_r, int pin_gp, int pin_rp) { // clang-format off const static state_t state_table[] PROGMEM = { /* ON_ENTER ON_LOOP ON_EXIT EVT_TIMER_G EVT_TIMER_Y EVT_TIMER_R EVT_NEXT EVT_GREEN EVT_YELLOW EVT_RED ELSE */ /* GREEN */ ENT_GREEN, -1, EXT_GREEN, YELLOW, -1, -1, YELLOW, -1, YELLOW, RED, -1, /* YELLOW */ ENT_YELLOW, -1, EXT_YELLOW, -1, RED, -1, RED, GREEN, -1, RED, -1, /* RED */ ENT_RED, -1, EXT_RED, -1, -1, GREEN, GREEN, GREEN, YELLOW, -1, -1, }; // clang-format on Machine::begin( state_table, ELSE ); this->pin_g = pin_g; // Save the pins this->pin_y = pin_y; this->pin_r = pin_r; this->pin_gp = pin_gp; this->pin_rp = pin_rp; pinMode( pin_g, OUTPUT ); // Set the pin modes pinMode( pin_y, OUTPUT ); pinMode( pin_r, OUTPUT ); pinMode( pin_gp, OUTPUT ); pinMode( pin_rp, OUTPUT ); timer_g.set( -1 ); // Initialize the timers timer_y.set( -1 ); timer_r.set( -1 ); countc=0; countp=0; return *this; } /* Add C++ code for each internally handled event (input) * The code must return 1 to trigger the event */ int Atm_smarttrafficlight::event( int id ) { switch ( id ) { case EVT_TIMER_G: return timer_g.expired( this ); case EVT_TIMER_Y: return timer_y.expired( this ); case EVT_TIMER_R: return timer_r.expired( this ); } return 0; } /* Add C++ code for each action * This generates the 'output' for the state machine * * Available connectors: * push( connectors, ON_CHANGE, 0, <v>, <up> ); */ void Atm_smarttrafficlight::action( int id ) { switch ( id ) { case ENT_GREEN: digitalWrite( pin_g, HIGH );
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!96!
digitalWrite( pin_rp, HIGH ); push( connectors, ON_START, 0, 0, 0); push( connectors, ON_CHANGE, 0, 0, 0 ); return; case EXT_GREEN: digitalWrite( pin_g, LOW ); return; case ENT_YELLOW: digitalWrite( pin_y, HIGH ); digitalWrite( pin_rp, HIGH ); push( connectors, ON_CHANGE, 0, 1, 0 ); return; case EXT_YELLOW: digitalWrite( pin_y, LOW ); digitalWrite( pin_rp, LOW); return; case ENT_RED: digitalWrite( pin_r, HIGH ); digitalWrite( pin_gp, HIGH ); push( connectors, ON_CHANGE, 0, 2, 0 ); return; case EXT_RED: digitalWrite( pin_r, LOW ); digitalWrite( pin_gp, LOW ); return; } } Atm_smarttrafficlight& Atm_smarttrafficlight::setTimers( int g, int r ) { timer_g.set( g ); timer_r.set( r ); return *this; } Atm_smarttrafficlight& Atm_smarttrafficlight::setTimers( int g, int y, int r ) { timer_g.set( g ); timer_y.set( y ); timer_r.set( r ); return *this; } /* Optionally override the default trigger() method * Control how your machine processes triggers */ Atm_smarttrafficlight& Atm_smarttrafficlight::trigger( int event ) { Machine::trigger( event ); return *this; } /* Optionally override the default state() method * Control what the machine returns when another process requests its state */ int Atm_smarttrafficlight::state( void ) { return Machine::state(); } /* Public event methods * */ Atm_smarttrafficlight& Atm_smarttrafficlight::next() { trigger( EVT_NEXT ); return *this; }
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 97!
Atm_smarttrafficlight& Atm_smarttrafficlight::green() { trigger( EVT_GREEN ); return *this; } Atm_smarttrafficlight& Atm_smarttrafficlight::yellow() { trigger( EVT_YELLOW ); return *this; } Atm_smarttrafficlight& Atm_smarttrafficlight::red() { trigger( EVT_RED ); return *this; } /* onStart() push connector variants ( slots 1, autostore 0, broadcast 0 ) * * Usage in action() handler: push( connectors, ON_SATART, 0, v, up) */ Atm_smarttrafficlight& Atm_smarttrafficlight::onStart( Machine& machine, int event ) { onPush( connectors, ON_START, 0, 1, 1, machine, event ); return *this; } Atm_smarttrafficlight& Atm_smarttrafficlight::onStart( atm_cb_push_t callback, int idx ) { onPush( connectors, ON_START, 0, 1, 1, callback, idx ); return *this; } /* * onChange() push connector variants ( slots 1, autostore 0, broadcast 0 ) */ Atm_smarttrafficlight& Atm_smarttrafficlight::onChange( Machine& machine, int event ) { onPush( connectors, ON_CHANGE, 0, 1, 1, machine, event ); return *this; } Atm_smarttrafficlight& Atm_smarttrafficlight::onChange( atm_cb_push_t callback, int idx ) { onPush( connectors, ON_CHANGE, 0, 1, 1, callback, idx ); return *this; } /* State trace method * Sets the symbol table and the default logging method for serial monitoring */ Atm_smarttrafficlight& Atm_smarttrafficlight::trace( Stream & stream ) { Machine::setTrace( &stream, atm_serial_debug::trace, "TRAFFICLIGHT\0EVT_TIMER_G\0EVT_TIMER_Y\0EVT_TIMER_R\0EVT_NEXT\0EVT_GREEN\0EVT_YELLOW\0EVT_RED\0ELSE\0GREEN\0YELLOW\0RED" ); return *this; }
Código&6.12&Código!fuente!de!la!máquina!de!estados!smarttrafficlight.cpp.!
!
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!98!
En!este!código!se!detalla!el!funcionamiento!de!la!máquina!de!estado.!Como!
particularidad!se!puede!observar!que!se!ha!escrito!una!función!para!modificar!los!
intervalos! de! tiempo! entre! cambio! de! luz! del! semáforos.! Se! realiza!mediante! la!
función!setTimers()!y!puede!ser! llamada!con!valores!para!vede,!rojo!y!ámbar,!o!
bien!con!solo!verde!y!rojo,!manteniendo!el!valor!de!ámbar!por!defecto.!
Han! sido! generados! eventos! para! cambiar! el! estado! del! componente! de!
manera! abrupta.! Esto! permite! inicializar! la! secuencia! de! luces! una! vez! han! sido!
configurados! los! temporizadores,! o! bien,! para! darle! sincronismo! con! otros!
semáforos.! Por! ejemplo,! sincronizar! toda! una! calle,! indicando! a! la! vez! que! se!
pongan! en! verde.! Corresponde! con! los!métodos! green(),! yellow()! y! red();! los!
eventos!EVT_GREEN,!EVT_YELLOW!y!EVT_RED.
Es! importante! advertir! que! a! diferencia! del! ejemplo! del! apartado! de!
generación!de!máquinas!de!estado!aquí!si!ocurren!eventos!internos!en!la!máquina.!
Estos! corresponden! con! la! finalización! de! los! temporizadores! para! cada! luz! del!
semáforo.!Para!ello!la!máquina!de!estados,!hace!uso!de!componentes!atm_timer!a!
los!que!les!asigna!los!valores!de!temporizador,!y!a!los!que!se!encarga!de!consultar!
su!finalización!en!el!método!event().!
La! comunicación! de! este! componente! para! su! posterior! utilización! es!
similar!a!la!vista!en!el!ejemplo!del!apartado!donde!se!creaba!un!nuevo!componente!
en! este! proyecto! (Sección! 6.1.3! Creación! de! componentes! propios).! Consiste! en!
publicar! cada! cambio! de! estado! mediante! el! conector! onChange(),! y! además,!
publicando!un!nuevo!ciclo!usando!el!conector!onStart().!!
Todas! estas! particularidades! son! empleadas! por! la! lógica! del! programa!
principal!para!detectar!el!estado!en!curso!de!la!máquina!de!estados!y!modificar!su!
comportamiento.!Como!se!puede!demostrar!en!este!comportamiento,!se!hace!uso!
de! programación! dirigida! por! eventos! (externos! e! internos! de! la! máquina! de!
estados)! y! programación! concurrente! cooperativa! entre! diferentes! componentes!
del!sistema.!El!programa!principal!queda!reflejado!en!el!Código!6.13!que!sigue.!
! !
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 99!
#include <Automaton.h> #include <Atm_esp8266.h> #include "Atm_smarttrafficlight.h" #include <ESP8266WiFi.h> Atm_smarttrafficlight smarttrafficlight; Atm_esp8266_httpd_simple server( 80 ); Atm_esp8266_httpc_simple client; Atm_button button, bPeople, bCars; String mac; String request; char brain_host[] = "52.1.229.129"; int countP=2; int countC=4; String key = "0YNJMN1QZTXR8IPJ"; String url = ""; String preurl = ""; void setup() { Serial.begin( 9600 ); Serial.println( "Connecting to WIFI" ); // The traffic light to be controlled on pins D5, D6 & D7 smarttrafficlight.begin( D5, D6, D7, D1, D2 ) .setTimers(5000,2000,4000) //valores por defecto de tiempo de verde, amarillo y rojo .onStart([] ( int idx, int v, int up ) { url = ""; url += "api_key="; url += key; url += "&field1="; url += countP; url += "&field2="; url += countC; Serial.println(url); client.setCounters(countP,countC); client.start(); countP=0; countC=0; }); /*DEBUG cambios * .onChange([] ( int idx, int v, int up ) { switch (v){ case 0: Serial.println("Verde"); break; case 1: Serial.println("Ambar"); break; case 2: Serial.println("Rojo"); break; } });*/ button.begin(D8) .onPress(smarttrafficlight, smarttrafficlight.EVT_NEXT ); bPeople.begin(D3) .onPress([] ( int idx, int v, int up ) { Serial.println("+ persona"); countP ++; }); bCars.begin(D4)
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
!100!
.onPress([] ( int idx, int v, int up ) { Serial.println("+ coche"); countC ++; }); // The Wifi machine manages the wifi connection /* Static IP Config IPAddress ip(172,20,10,10); IPAddress gw(172,20,10,1); IPAddress mask (255,255,255,240); IPAddress dns1 (8,8,8,8); IPAddress dns2 (8,8,4,4); WiFi.config(ip,gw,mask,dns1,dns2); */ wifi.begin( "iPhone", "probando" ) .onChange( true, [] ( int idx, int v, int up ) { Serial.print( "Connected to Wifi, browse to http://" ); Serial.println( wifi.ip() ); Serial.println(WiFi.macAddress()); mac = WiFi.macAddress(); for(int i=2;i<=10;i+=2) mac.remove(i,1); Serial.println(mac); server.start(); }) .start(); //The Http client machine handles de outgoing posts client.begin(brain_host) .get("/update","api_key=0YNJMN1QZTXR8IPJ"); // The Http server machine handles incoming requests server.begin() .onRequest( "/red", smarttrafficlight, smarttrafficlight.EVT_RED ) .onRequest( "/yellow", smarttrafficlight, smarttrafficlight.EVT_YELLOW ) .onRequest( "/green", smarttrafficlight, smarttrafficlight.EVT_GREEN ) .onRequest( "/next", smarttrafficlight, smarttrafficlight.EVT_NEXT ) .onRequest( [] ( int idx, int v, int up) { Serial.print( "Request: " ); Serial.println( server.uri() ); request = server.uri(); Serial.println( request.length()); Serial.print(mac.c_str()); if (request.startsWith("/bbb")){ Serial.println("La peticion empieza por bbb"); Serial.println( server.arg( "green" ) ); int green=server.arg("green").toInt(); Serial.println( server.arg( "red" ) ); int red=server.arg("red").toInt(); if (red>=1000 && red<=600000 && green>=1000 && green<=600000){ //si el valor asignado a rojo y verde es entre un seg y 10 min Serial.println( "Valores en rango"); smarttrafficlight.setTimers(green,red); smarttrafficlight.red(); }else{ Serial.println( "Valores no validos"); } } }); }
Aitor&Cantero&Romero&&&&&&&&&&&&&&&&&&&&&&&Programación&concurrente&orientada&a&eventos&en&Arduino¶&el&Internet&de&las&Cosas&&
! 101!
Código&6.13&Código!fuente!Arduino!de!la!aplicación!principal!semáforo.ino.!
El!diagrama!de!bloques!que!sigue!en!la!Figura!6.12!representa!la!interacción!
entre! máquina! de! estado! del! sistema! y! la! gestión! que! hace! de! ellas! la! clase!
Automaton.!
!
Figura&6.12&Diagrama!de!uso!de!máquinas!de!estado.!
!
En!el!código!anterior!se!ve!que!el!sistema!tras!iniciar!una!conexión!de!red!
inalámbrica,! se! conecta! mediante! un! cliente! http! a! un! servidor.! Este! servidor!
proporciona!un!servicio!en!nube!para!Internet!de!las!Cosas.!La!comunicación!con!
este!servicio!es!RESTful!y!la!plataforma!es!ThingSpeak![W15].!
!