ÍNDICE - 148.206.53.84148.206.53.84/tesiuami/UAMI17147.pdf · microcontrolador Atmel AVR y puertos...

181
1

Transcript of ÍNDICE - 148.206.53.84148.206.53.84/tesiuami/UAMI17147.pdf · microcontrolador Atmel AVR y puertos...

1

2

ÍNDICE

Contenido

1. Introducción…………………………………………………………(4) 1.1 Motivación………………………………………………………………........(4)

1.2 Conocimientos previos…………… ……………………………………….....(4)

1.3 Objetivos…………………………………………………………………...….(6)

2. Hardware.............................................................................................(6) 2.1 Arduino con Ethernet Shield……………………………………………….....(6)

2.2 Temporizador 555 modo astable a 38khz ciclo de trabajo del 60%..................(7)

2.3 Transistor bipolar npn 2n2222………………………………………………...(9)

2.4 2 Leds infrarrojos……………...………………………………………….…(10)

2.5 Receptor infrarojo Tsop 1738……………………………………………….(11)

3. Equipo…………………………………………………………………………..(12)

3.1 Osciloscopio…………………………………………………………………(12)

3.2 Controles remotos infrarrojos (Sony, Panasonic, Denon, Optoma,

TotalPlay)……………………………………………………………………(12)

3.3 Fuente de alimentación………………………………………………………(13)

3.4 Tablet Samsung galaxy wifi 5.0 con Sistema Operativo android 2.3.5……..(14)

4. Software…………………………………………………………….(15) 4.1 Android ……………………………………………………………………...(15)

4.2 Arduino software de desarrollo………………………………………….…..(17)

4.3 Titanium Appcelerator……………………………………………………….(18)

4.4 SDK Android…………………………………………………………….…..(19)

4.5 Java JDK 1.6………………………………………………………………....(19)

5. Diseño del Hardware……………………………………………….(20) 5.1 Temporizador 555 modo astable a 38khz……………………………..….….(20)

5.2 Circuito amplificador con 2N2222………………………………………......(24)

5.3 Placa Arduino + Ethernet Shield………………………………………….....(26)

6. Protocolos infrarrojos……………………………………………...(27) 6.1 Comunicación serial……………………………………………………..…..(27)

6.2 Protocolo Sony (Sirc)…………………………………………………..……(27)

6.3 Protocolo NEC………………………………………………………...……..(32)

6.4 Protocolo Denon CD Changer…………………………………………….....(38)

6.5 Protocolo Pioneer AVR…………………………………………………...…(41)

7. Servidor WEB Arduino e implementación de los protocolos IR.(48)

8. Aplicación Android IrNetwork en Titanium Appcelerator……..(65) 8.1 Descripción del programa Titanium Appcelerator…………………………..(65)

3

8.2 Desarrollo de la aplicación………………………………………………..…(67)

9. Conclusiones…………………………………………………..……(93)

10. Bibliografía…………………………………………………….….(94)

11. Anexos……………………………………………………….…….(95) 11.1 Apéndice A. Códigos en Arduino……………………..……………………(95)

11.2 Apéndice B. Códigos en Titanium Studio………………………………...(107)

4

CAPÍTULO 1. INTRODUCCIÓN

1.1 Motivación.

Desde el punto de vista de las nuevas tecnologías y el avance de los dispositivos

móviles, es muy interesante aprender a desarrollar sobre estas tecnologías ya que la

mayor parte de estas se está desplazando hacia los móviles ya que dentro de nuestros

dispositivos podemos tener el control de muchas actividades relacionadas con la vida

diaria.

El sistema operativo Android es uno de los que está cambiando gran parte de la

forma en la que podemos ver el mundo de los dispositivos ya no como un simple

aparato de comunicación y envío de mensajes, sino que en un dispositivo con este

sistema operativo y el hardware necesario se puede tener todo un mundo de

información, gracias a que contamos con aplicaciones desarrolladas para cubrir cada

una de las necesidades que se nos puedan presentar, desde una simple calculadora, hasta

un sistema de localización GPS y basta decir que este sistema operativo es de software

libre, por lo tanto podemos desarrollar las aplicaciones que se nos ocurran siempre y

cuando el sistema y el dispositivo lo permitan.

Por otro lado también está el hardware libre llamado Arduino el cual es un

microcontrolador montado en una tableta programadora, utilizada para realizar tareas de

procesamiento de información mediante su programación en C.

Esto me dio como idea el desarrollo de una aplicación Android de un control remoto

universal, el cual envía información hacia el Arduino por medio del protocolo HTTP,

este a su vez decodifica la instrucción recibida y la convierte a comandos infrarrojos a

cualquier dispositivo que se desee manipular (TV’s, Minicomponentes, DVD’s, etc.)

siempre y cuando reciban comandos infrarrojos.

1.2 Conocimientos previos.

El sistema operativo Android es uno de los que está cambiando gran parte de la

forma en la que podemos ver el mundo de los dispositivos, ya no como un simple

aparato de comunicación y envió de mensajes, sino que en un dispositivo con este

sistema operativo y el hardware necesario se puede tener todo un mundo de

información. Y basta decir que este sistema operativo es de software libre, por lo tanto

podemos desarrollar cualquier aplicación que se nos ocurra.

Existen varios entornos de desarrollo para programar aplicaciones en Android,

desde la manera nativa utilizando el entorno de desarrollo de “Eclipse” o sea java,

appInventor y en nuestro caso Titanium Appcelerator por medio de su Titanium Studio,

el cual se programa por medio de java script.

El hardware libre Arduino contiene un microcontrolador ATMEGA, el cual

podemos programar para que realice tareas de procesamiento de información, y en los

cursos de sistemas digitales se ocupó uno de estos circuitos para el desarrollo de las

prácticas de laboratorio, por lo tanto la implementación de nuestro circuito transmisor

de infrarrojo no es muy complicada, ya que el manejo de este hardware es muy parecido

5

al utilizado en dichos cursos y mejor aún programado en C por medio de bibliotecas

creadas por los desarrolladores de este hardware y personas que han aportado sus

propias bibliotecas. Aunque el conocimiento sobre el protocolo de comunicación

infrarrojo, no es muy claro, se puede adquirir mediante circuitos decodificadores de

infrarrojos que trabajan a las frecuencias de los controles remotos caseros, con ayuda de

un simple osciloscopio.

El protocolo de comunicación HHTP servirá como enlace entre el dispositivo con

Android y la placa Arduino; ya que en la placa se podrá montar un servidor HTTP que

estará esperando las peticiones a ser procesadas por el Arduino para enviar, al

dispositivo correcto, el comando infrarrojo que nuestra aplicación solicita. Para ello

será necesario decodificar y analizar previamente todos los comandos infrarrojos

relevantes de cada uno de los controles remotos de los dispositivos que nos interese

controlar. La Figura 1 muestra a grandes rasgos el diagrama a bloques del proyecto a

realizar.

6

Figura 1.- Diagrama a bloques y sus comunicaciones.

1.3 Objetivos

Comunicar un dispositivo Android via LAN con un servidor WEB

Arduino.

Controlar los 5 dispositivos asociados a las diferentes actividades,

que se realizan dentro de un centro de entretenimiento.

Reproducir los códigos infrarrojos de cada uno de los dispositivos

propuestos.

Desarrollar una aplicación para el dispositivo Android que se

conecte al servidor y haga peticiones http.

Capítulo 2. Hardware.

2.1 Arduino con Ethernet Shield

Arduino es una plataforma de hardware libre, basada en una placa con un

microcontrolador y un entorno de programación, diseñada para facilitar el uso de la

electrónica en proyectos de cualquier tipo. Este hardware consiste en una placa con un

microcontrolador Atmel AVR y puertos de entrada/salida. Los microcontroladores más

usados son el Atmega168, Atmega328, Atmega1280, ATmega8 por su sencillez y bajo

coste que permiten el desarrollo de múltiples diseños. Por otro lado el software consiste

en un entorno de desarrollo que implementa el lenguaje de programación

Processing/Wiring y el cargador de arranque (boot loader) que corre en la placa.

Arduino se puede utilizar para desarrollar objetos interactivos autónomos o puede

ser conectado a software del ordenador (por ejemplo: Macromedia Flash, Processing,

Max/MSP, Pure Data). Las placas se pueden montar a mano o adquirirse. El entorno de

desarrollo integrado libre se puede descargar gratuitamente.

Al ser open-hardware, tanto su diseño como su distribución son libres. Es decir,

puede utilizarse libremente para el desarrollo de cualquier tipo de proyecto sin tener que

adquirir ninguna licencia.

La Arduino Ethernet Shield permite a una placa Arduino conectarse a internet.

Está basada en el chip ethernet Wiznet W5100. El Wiznet W5100 provee de una pila de

red IP capaz de TCP y UDP, soporta hasta cuatro conexiones de sockets simultáneas y

se usa la biblioteca Ethernet para escribir programas que se conecten a internet usando

la shield. La Ethernet Shield dispone de unos conectores que permiten conectar a su vez

otras placas encima y apilarlas sobre la placa Arduino.

Arduino usa los pines digitales 10, 11, 12, y 13 (SPI) para comunicarse con el

W5100 en la Ethernet Shield. Estos pines no pueden ser usados para e/s genéricas.

7

La Shield provee un conector ethernet estándar RJ45.

El botón de reset en la shield resetea ambos, el W5100 y la placa Arduino.

La shield contiene un número de LEDs para información:

PWR: indica que la placa y la shield están alimentadas.

LINK: indica la presencia de un enlace de red y parpadea cuando la shield envía o

recibe datos.

FULLD: indica que la conexión de red es full dúplex.

100M: indica la presencia de una conexión de red de 100 Mb/s (de forma opuesta a

una de 10Mb/s).

RX: parpadea cuando la shield recibe datos.

TX: parpadea cuando la shield envía datos.

COLL: parpadea cuando se detectan colisiones en la red.

El jumper soldado marcado como "INT" puede ser conectado para permitir a la

placa Arduino recibir notificaciones de eventos por interrupción desde el W5100, pero

esto no está soportado por la librería Ethernet. El jumper conecta el pin INT del W5100

al pin digital 2 de Arduino. La figura 2 muestra la placa Arduino junto con la Ethernet

Shield.

Figura 2.- Arduino (abajo) y Ethernet Shield (arriba).

8

2.2 Temporizador 555 modo astable a 38khz ciclo de trabajo del 60%.

El temporizador 555 es uno de los Circuitos Integrados más famosos, de los más

utilizados. Según el tipo de fabricante recibe una designación distinta tal como TLC555,

LMC555, uA555, NE555C, MC1455, NE555, LM555, etc.

Respecto al formato o encapsulado, puede ser circular metálico, hasta los SMD,

pasando los DIL de 8 y 14 pines.

Existen versiones de bajo consumo con el mismo patillaje y versiones dobles, es

decir que contienen 2 circuitos iguales en su interior, que comparten los terminales de

alimentación y se conocen con la designación genérica de 556, observa la Figura 3.

Figura 3.- CI 555 de 8 y 14 pines.

Este circuito es un Temporizador de precisión, en sus orígenes se presentó como un

circuito de retardos de precisión, pero pronto se le encontraron otra aplicaciones tales

como osciladores astables, generadores de rampas, temporizadores secuenciales, etc.,

consiguiéndose unas temporizaciones muy estables frente a variaciones de tensión de

alimentación y de temperatura.

El circuito puede alimentarse con tensión continua comprendida entre 5 y 15

voltios, aunque hay versiones que admiten tensiones de alimentación hasta 2 V., pero

no son de uso corriente. Si se alimenta a 5V es compatible con la familia TTL.

La corriente de salida máxima es de 200 mA, muy elevada para un circuito. La

estabilidad en frecuencia es de 0.005% por grado centígrado.

Necesita un número mínimo de componentes exteriores para su polarización, la

frecuencia de oscilación se controla con dos resistencias y un capacitor. Cuando

funciona como monoestable el retardo se determina con los valores de una resistencia y

de un capacitor.

El funcionamiento y las posibilidades de este circuito se pueden comprender

estudiando el diagrama de bloques. Básicamente se compone de dos amplificadores

operacionales montados como comparadores, un circuito biestable (flip-flop), del tipo

RS del que se utiliza su salida negada, un buffer de salida inversor que puede entregar o

9

absorber una corriente de 200mA y un transistor que se utiliza para descarga del

capacitor de temporización; tal diagrama se muestra en la Figura 4.

Figura 4.- Diagrama 555.

Una red de tres resistencias iguales fija los niveles de referencia en la entrada

inversora del primer amplificador operacional, y en la no inversora del segundo

amplificador operacional, a 2/3 y 1/3 respectivamente de la tensión de alimentación.

Cuando la tensión en el terminal umbral (THRESHOLD) supera los 2/3 de la

tensión de alimentación, la salida del amplificador correspondiente pasa a nivel lógico

"1", que se aplica a la entrada R del biestable (flip-flop), con lo cual su salida negada, la

utilizada en este caso, pasa a nivel "1", saturando el transistor y comenzando la

descarga del condensador, al mismo tiempo, la salida del 555 pasa a nivel "0".

Con el otro amplificador operacional, si la tensión aplicada a la entrada inversora,

terminal de disparo (TRIGGER), desciende por debajo de 1/3 de la tensión de

alimentación, la salida de este operacional pasa a nivel alto, que se aplica al terminal de

entrada S del biestable (flip-flop) RS, con lo que su salida se pone a nivel bajo, el

transistor de descarga deja de conducir y la salida del 555 pasa a nivel lógico alto.

La gama de aplicaciones del circuito se incrementa, pues se dispone de un terminal

de reset, activo a nivel bajo, que se puede utilizar para poner a nivel bajo la salida del

555 en cualquier momento.

2.3 Transistor NPN 2N2222.

Es un transistor de silicio y baja potencia, diseñado para aplicaciones de

amplificación lineal y conmutación. Puede amplificar pequeñas corrientes a tensiones

pequeñas o medias y trabajar a frecuencias medianamente altas. Es fabricado en

diferentes formatos, los más comunes son los TO-92,TO-18,SOT-23, y SOT-223.

Voltaje colector emisor en corte 60V (Vceo).

Corriente de colector constante 800mA (Ic).

10

Potencia total disipada 500mW(Pd).

Ganancia o hfe 35 mínima.

Frecuencia de trabajo 250 Mhz (Ft).

Encapsulado de metal TO-18.

Estructura NPN.

Su complementario PNP es el Transistor 2N2907.

En la Figura 6 se muestran su distribución de pines. Aunque como se mencionó

anteriormente se pueden encontrar con diferentes encapsulados.

Figura 6.- Esquema de pines del 2n2222 NPN.

2.4 Led’s Infrarrojos (transmisores).

El diodo IRLED (del inglés lnfrared Light Emitting Diode). Este LED emite un tipo

de radiación electromagnética llamada infrarroja, que es invisible para el ojo humano

porque su longitud de onda es mayor a la del espectro visible como se ve en la Tabla I.

11

Tabla I.- Espectro de luz.

Ya que no podremos ver a simple vista si nuestro emisor esta funcionando (al

polarizarlo), tendremos que comprobarlo utilizando alguna cámara de fotografía o video

digital, como lo muestra la Figura 7.

Figura 7.- Led IR transmisor polarizado visto por la cámara del celular

Este tipo de led puede trabajar a diferentes frecuencias de pero en el caso de nuestro

proyecto funcionara a 38kHz, como funcionan la mayoría de los controles remotos

comerciales, con un ciclo de trabajo del 80%.

2.5 Receptor infrarrojo Tsop 1738.

Es un mini-receptor para ser usados en sistemas con control remoto infrarrojo. El

mismo soporta casi la totalidad de los códigos de transmisión. La señal de salida puede

ser aplicada directamente a un pin de entrada de un microcontrolador. Lo interesante de

este receptor es que no se ve afectado por la luz del medio ambiente ya que solo permite

el paso de señales moduladas a 38KHz (de ahí su prefijo 1738). Esa señal modulada son

pulsos y serán transmitidas vía control remoto en nuestro caso.

A la salida del receptor tendremos señales de 0V a 5V las cuales podemos utilizar

para alimentar un circuito TTL o un microcontrolador, o simplemente para ver y

decodificar el código de cada uno de los diferentes controles que se utilizaran a lo largo

del proyecto, con el uso de un osciloscopio podremos ver dicho código recibido, para

posteriormente reproducirlo con el Arduino. En la Figura 8 podemos ver el diagrama a

bloques de este receptor.

12

Figura 8.- Diagrama a bloques Tsop 1738

Capítulo 3. Equipo

3.1 Osciloscopio Tectronix TDS 210.

Los osciloscopios son de gran utilidad en el análisis de circuitos. Permiten el estudio

de tensiones variables con el tiempo, y de forma indirecta, de otras magnitudes

relacionadas con la tensión.

Este equipo nos es de gran ayuda ya que podemos analizar las señales obtenidas por

el receptor infrarrojo, para cada uno de los controles utilizados , para ver que los datos

transmitidos por el Arduino sean los correctos, con respecto a cada código reproducido,

y para calibrar el 555 y obtener la frecuencia de 38kHz.

Presenta los valores de las señales eléctricas en forma de coordenadas en una

pantalla, en la que normalmente el eje X (horizontal) representa tiempos y el eje Y

(vertical) representa tensiones. La imagen así obtenida se denomina oscilograma.

Ya que este aparato tiene memoria podemos guardar de manera instantánea lo que

se está mostrando en la pantalla y así trabajar con las señales por medio del tiempo

haciéndolo más pequeño o más grande, de igual forma con las tensiones de salida de

nuestros circuitos, dependiendo de lo que se necesite en el momento del análisis.

3.2 Controles remotos infrarrojos (Sony, Panasonic, Denon, Optoma, TotalPlay ).

El control remoto envía pulsos de luz infrarroja (hace parpadear los LEDS)

representando códigos específicos. Estos códigos corresponden a cada determinado

comando, como encender o apagar, regular el volumen, etc. Después el sensor

infrarrojo decodifica los pulsos de luz en datos que el aparato puede identificar para

luego realizar las acciones.

Aunque la comunicación infrarroja tiene un estándar que debe de seguirse, cada

fabricante de dispositivos electrónicos que ocupa un control remoto infrarrojo

13

desarrollo su propio protocolo de comunicación infrarrojo, esto hace que se deba de

estudiar y analizar cada uno de los controles, que se desea reproducir en el proyecto.

Por ejemplo Sony tiene su protocolo llamado SIRC el cual consta de 12, 15 y 20 bits

de transmisión, Panasonic cuenta con una modificación del protocolo NEC el cual

consta de 32 bits enviados y cada comando envía dos tramas de 64 bits, Denon maneja

su propio protocolo que consta de dos tramas de 14 bits, por ultimo Optoma y TotalPlay

manejan el protocolo NEC que consta de 32 bits. En la Figura 9 se muestra la imagen

de cada uno de los controles utilizados para el proyecto.

Figura Q.- Controles para reproducir sus señales IR.

3.3 Fuente de alimentación.

La fuente de alimentación nos servirá para alimentar el circuito decodificador Tsop-

1738, con un voltaje de 5V, esta alimentación es la única que será externa a nuestro

circuito desarrollado y solo servida para decodificar los diferentes protocolos infrarrojos

que maneja cada uno de los controles antes mencionados.

Arduino y el timer 555 estarán alimentados por la conexión USB del mismo

Arduino ya que este nos ofrece una fuente de voltaje de 5V por lo que podemos

14

polarizar el 555 desde esta fuente, así como también el transistor 2N2222 que nos

servirá como conmutador y al mismo tiempo como amplificador de corriente.

3.4 Tablet Samsung Galaxy S WIFI 5.0

Este dispositivo es en donde se alojara nuestra aplicación desarrollada para el

sistema operativo que mantiene alojado en su interior. Este dispositivo posee una tarjeta

WIFI con la cual podremos comunicarnos con el Arduino a través de una red local por

medio del protocolo de comunicación HTTP.

La Galaxy S contiene el sistema operativo Android 2.3.5 Gingerbread, mencionado

más adelante. Tiene un procesador de 1GHz, memoria RAM de 512Mb y una memoria

interna de 8Gb; con lo que nos basta y sobra para las necesidades de nuestro proyecto.

La Figura 10 nos muestra como es físicamente la Samsung Galaxy WIFI 5.0.

Figura 10.-Samsung Galaxy WIFI 5.0

15

Capítulo 4. Software.

4.1 Android.

Es un sistema operativo basado en Linux, diseñado principalmente para móviles

con pantalla táctil como teléfonos inteligentes o tabletas. Se presentó en 2007 junto la

fundación del Open Handset Alliance: un consorcio de compañías de hardware,

software y telecomunicaciones para avanzar en los estándares abiertos de los

dispositivos móviles; a nivel mundial alcanzó una cuota de mercado del 50,9% durante

el cuarto trimestre de 2011, más del doble que el segundo sistema operativo (iOS de

Apple, Inc.) con más cuota.

Tiene una gran comunidad de desarrolladores escribiendo aplicaciones para

extender la funcionalidad de los dispositivos móviles. A la fecha, se tienen más de

700.000 aplicaciones (de las cuales, dos tercios son gratuitas) disponibles en la tienda de

aplicaciones oficial de Android: Google Play, sin tener en cuenta aplicaciones de otras

tiendas no oficiales. La mayoría de programas están escritos en el lenguaje de

programación Java.

La estructura del sistema operativo Android se compone de aplicaciones que se

ejecutan en un framework Java de aplicaciones orientadas a objetos sobre el núcleo de

las bibliotecas de Java en una máquina virtual Dalvik con compilación en tiempo de

ejecución.

Los componentes principales del sistema operativo de Android:

Aplicaciones: las aplicaciones base incluyen un cliente de correo electrónico,

programa de SMS, calendario, mapas, navegador, contactos y otros.

Marco de trabajo de aplicaciones: los desarrolladores tienen acceso completo a

los mismos APIs del framework usados por las aplicaciones base. La arquitectura

está diseñada para simplificar la reutilización de componentes; cualquier aplicación

puede publicar sus capacidades y cualquier otra aplicación puede luego hacer uso de

esas capacidades.

Bibliotecas: incluye un conjunto de bibliotecas de C/C++ usadas por varios

componentes del sistema. Estas características se exponen a los desarrolladores a

través del marco de trabajo de aplicaciones de Android; algunas son: System C

library (implementación biblioteca C estándar), bibliotecas de medios, bibliotecas

de gráficos, 3D y SQLite, entre otras.

Runtime de Android: Android incluye un set de bibliotecas base que

proporcionan la mayor parte de las funciones disponibles en las bibliotecas base del

lenguaje Java. Cada aplicación corre su propio proceso, con su propia instancia de

la máquina virtual Dalvik. Dalvik ha sido escrito de forma que un dispositivo puede

correr múltiples máquinas virtuales de forma eficiente.

Núcleo Linux: Android depende de Linux para los servicios base del sistema como

seguridad, gestión de memoria, gestión de procesos, pila de red y modelo de

controladores. El núcleo también actúa como una capa de abstracción entre el

hardware y el resto de la pila de software.

16

4.1.1 Nombres de las versiones.

Las versiones de Android reciben el nombre de postres en inglés. En cada

versión el postre elegido empieza por una letra distinta siguiendo un orden

alfabético:

o A: Apple Pie (v1.0), Tarta de manzana

o B: Banana Bread (v1.1), Pan de plátano

o C: Cupcake (v1.5), Magdalena glaseada.

o D: Donut (v1.6), Rosquilla.

o E: Éclair (v2.0/v2.1), pastel francés conocido en España como pepito,

petisú, suso o canuto.

o F: Froyo (v2.2), (Abreviatura de «frozen yogurt») Yogur helado.

o G: Gingerbread (v2.3), Pan de jengibre.

o H: Honeycomb (v3.0/v3.1/v3.2), Panal de miel.

o I: Ice Cream Sandwich (v4.0), Sándwich de helado.

o J: Jelly Bean (v4.1/v4.2), Judía de gominola.

o K: Key Lime Pie (v5), Tarta de lima.

4.1.2 Diseño y desarrollo.

Android, al contrario que otros sistemas operativos para dispositivos móviles

como iOS o Windows Phone, se desarrolla de forma abierta y se puede acceder

tanto al código fuente como a la lista de incidencias donde se pueden ver problemas

aún no resueltos y reportar problemas nuevos.

El que se tenga acceso al código fuente no significa que se pueda tener siempre la

última versión de Android en un determinado móvil, ya que el código para soportar

el hardware (controladores) de cada fabricante normalmente no es público, así que

faltaría un trozo básico del firmware para poder hacerlo funcionar en dicho

terminal, y porque las nuevas versiones de Android suelen requerir más recursos,

por lo que los modelos más antiguos quedan descartados por razones de memoria

(RAM), velocidad de procesador, etc.

17

4.2 Arduino.

La plataforma Arduino se programa mediante el uso de un lenguaje propio basado

en el popular lenguaje de programación de alto nivel Processing. Sin embargo, es

posible utilizar otros lenguajes de programación y aplicaciones populares en Arduino.

Algunos ejemplos son:

Java

Flash (mediante ActionScript)

Processing

Pure Data

MaxMSP (entorno gráfico de programación para aplicaciones musicales, de audio y

multimedia)

VVVV (síntesis de vídeo en tiempo real)

Adobe Director

Python

Ruby

C

C++ (mediante libSerial o en Windows)

C#

Cocoa/Objective-C (para Mac OS X)

Linux TTY (terminales de Linux)

3DVIA Virtools (aplicaciones interactivas y de tiempo real)

SuperCollider (síntesis de audio en tiempo real)

Instant Reality (X3D)

Liberlab (software de medición y experimentación)

BlitzMax (con acceso restringido)

Squeak (implementación libre de Smalltalk)

Mathematica

Matlab

Minibloq (Entorno gráfico de programación, corre también en OLPC)

Isadora (Interactividad audiovisual en tiempo real)

Perl

Physical Etoys (Entorno gráfico de programación usado para proyectos de robótica

educativa)

18

Scratch for Arduino (S4A) (entorno gráfico de programación, modificación del

entorno para niños Scratch, del MIT)

Visual Basic .NET

VBScript

Gambas

Esto es posible debido a que Arduino se comunica mediante la transmisión de datos

en formato serie que es algo que la mayoría de los lenguajes anteriormente citados

soportan. Para los que no soportan el formato serie de forma nativa, es posible utilizar

software intermediario que traduzca los mensajes enviados por ambas partes para

permitir una comunicación fluida. Es bastante interesante tener la posibilidad de

interactuar Arduino mediante esta gran variedad de sistemas y lenguajes puesto que

dependiendo de cuales sean las necesidades del problema que vamos a resolver

podremos aprovecharnos de la gran compatibilidad de comunicación que ofrece.

4.3 Titanium Appcelerator.

Titanium es un Open Source Framework, para construir aplicaciones Desktop y

Móviles nativas utilizando tecnologías web abiertas como JavaScript, HTML5 y CSS;

nos permite desarrollar sobre una API JavaScript y portar el proyecto fácilmente a

Android. En realidad se trata de un runtime que ejecuta línea por línea nuestro

JavaScript que ejecuta nuestro código y provee de un puente común para ejecutar

código nativo de cada sistema operativo móvil. Lo positivo es que permite utilizar

HTML5 y CSS e insertar con una baja curva de inducción desarrolladores web a la

plataforma Mobile.

Toda nuestra aplicación puede ser desarrollada en JavaScript y HTML5/CSS, pero

como en todos los frameworks de este estilo el gran problema se plantea cuando se

requiere alguna funcionalidad o control out of the box. Dado que provee un puente que

permite ejecutar código nativo por detrás, si deseamos un control especifico que solo

puede ser implementado en código nativo Objective-C o Android, debemos utilizar lo

que ellos denominan desarrollo de Titanium+Plus Modules que son extensiones para

poder invocar código nativo propio.

Plataforma.

Nuestra aplicación será desarrollada principalmente en JavaScript, utilizando la API

que Titanium provee en común para las plataformas móviles. Titanium pre-compila el

JS y lo empaqueta junto con un runtime y las clases nativas iPhone o Android.

El runtime ejecutara nuestro código línea por línea y cada invocación JS a la API de

Titanium deriva en una llamada a código nativo Figura 11.

Figura 11.-Vista a bloques

de la plataforma de

desarrollo.

19

Teniendo una visión simplificada de eñ´ç

ste framework, podríamos decir que es como tener lenguaje de alto nivel JS que

terminan invocando por detrás código de nativo. Hay que tener en claro que el

compilador de Titanium pre-compila el JS para una ejecución rápida y empaqueta el

proyecto, pero NO convierte nuestro código en código nativo al momento de la

compilación, esto solo sucede durante la ejecución y por medio del bridge (puente).

Este framework no puede funcionar por si solo para la realización de las

aplicaciones móviles ya que necesita los complementos Android SDK con todas las

herramientas instaladas, como lo son las Api’s de las diferentes versiones de los OS de

Android y el java SDK mencionados más adelante, aunque en nuestro caso

programaremos para la api 2.2 “Froyo” visto anteriormente ya que es muy normal verla

instalada en la mayoría de los dispositivos con Android.

4.4 SDK Android.

El SDK ( Software Development Kit ) de Android, incluye un conjunto de

herramientas de desarrollo. Comprende un depurador de código, biblioteca, un

simulador de teléfono basado en QEMU, documentación, ejemplos de código y

tutoriales. Las plataformas de desarrollo soportadas incluyen Linux ( cualquier

distribución moderna ), Max OS X 10.4.9 o posterior, y Windows XP o posterior. La

plataforma integral de desarrollo (IDE, Integrated Development Environment)

soportada oficialmente es Eclipse junto con el complemento ADT ( Android

Development Tools plugin ), aunque también puede utilizarse un editor de texto para

escribir ficheros Java y Xml y utilizar comandos en un terminal ( se necesitan los

paquetes JDK, Java Development Kit y Apache Ant ) para crear y depurar aplicaciones.

Además, pueden controlarse dispositivos Android que estén conectados (e.g.

reiniciarlos, instalar aplicaciones en remoto).

Las Actualizaciones del SDK están coordinadas con el desarrollo general de

Android. El SDK soporta también versiones antiguas de Android, por si los

programadores necesitan instalar aplicaciones en dispositivos ya obsoletos o más

antiguos. Las herramientas de desarrollo son componentes descargables, de modo que

una vez instalada la última versión, pueden instalarse versiones anteriores y hacer

pruebas de compatibilidad.

Una aplicación Android está compuesta por un conjunto de ficheros empaquetados

en formato .apk y guardada en el directorio /data/app del sistema operativo Android

(este directorio necesita permisos de súper-usuario, root, por razones de seguridad). Un

paquete APK incluye ficheros .dex (ejecutables Dalvik, un código intermedio

compilado), recursos, etc.

20

4.5 Java JDK.

JDK es el acrónimo de "Java Development Kit", es decir Kit de desarrollo de Java. Se

puede definir como un conjunto de herramientas, utilidades, documentación y ejemplos

para desarrollar aplicaciones Java. Sin este paquete no podríamos realizar ninguna de

las aplicaciones ya que es muy importante para el desarrollo de las mismas. En nuestro

caso usamos el java jdk 1.6

Capítulo 5. Diseño del hardware

5.1 Temporizador 555 modo astable a 38kHz

Cuando se conecta la alimentación, el capacitor está descargando y la salida del 555

pasa a nivel alto hasta que el capacitor, que se va cargando, alcanza los 2/3 de la tensión

de alimentación, con esto la salida del biestable (flip-flop) RS pasa a nivel "1", y la

salida del 555 a cero y el capacitor C1 comienza a descargarse a través de la resistencia

RB. Cuando la tensión en el capacitor C1 llega a 1/3 de la alimentación, comienza de

nuevo a cargarse, y asi sucesivamente mientras se mantenga la alimentación. La Figura

5 muestra la configuración del 555 en modo astable.

En las hojas de datos del temporizador 555, se utilizan los valores de 1,44 y 0,7

como constantes en los cálculos de tiempos, dependiendo de la forma en que se escribía

la ecuación. Si bien, estas cifras no son exactamente recíprocas una de la otra, están lo

suficientemente cerca para ser utilizadas sin preocupación.

Frecuencia de oscilación = 1 / (0.7*(R1+2*R2)*C)

Figura 5.- Circuito 555 en modo astable.

Si el circuito está conectado como se muestra en la anterior Figura 5 (pines 2 y 6

unidos), se disparará a sí mismo, como un multivibrador, funcionamiento libre. El

condensador externo, se cargará a través de RA + RB y descargará a través de RL.

21

Así, el ciclo de trabajo se puede ajustar con precisión por la relación entre estas dos

resistencias. En este modo de funcionamiento, el condensador se carga y descarga entre

1/3 VCC y 2/3 VCC. Como en el modo de disparo (monoestable), los tiempos de carga

y descarga, y por lo tanto la frecuencia son independientes de la tensión de

alimentación. El condensador C al que me referiré, se trata del condensador C1.

El tiempo de carga (salida alta) viene dado por: t1 = 0.7 (RA + RB) C …….(1)

Y el tiempo de descarga (salida baja) por: t2 = 0.7 (RB) C …………(2)

Así, el período total es: T = t1 + t2 = 0.7 (RA +2RB) C ……………(3)

La frecuencia de oscilación es: f = 1/T=1.44 / (RA +2RB) * C ……..(4)

Descripción del funcionamiento.

- Inicialmente el condensador C está sin carga, por lo que la tensión en el

condensador es cero. El voltaje del condensador C, es igual a la tensión en

los pines, umbral (pin 6) y de disparo (pin 2), ya que los dos están unidos.

Como los pines 2 y 6 están a 0V, la salida estará a alto.

- Anteriormente hemos dicho que, cuando el pin de disparo está bajo, hace

que el pin de descarga no pueda drenar la carga del condensador. Puesto que

el condensador C está en serie con Vcc, RA y RB, está siendo aplicada la

Vcc y la corriente fluirá a través de las resistencias, hasta el condensador,

empezando a acumular carga. Esto hace que el voltaje a través del

condensador C, aumente de acuerdo con la siguiente ecuación:

(Tensión en el condensador) = (Vcc - V0) * (1 - e-t /((RA + RB) * C)

)

- Donde "tensión en el condensador" es el voltaje actual a través del

condensador en el tiempo t, V0 es el voltaje inicial en el condensador, Vcc es

la tensión total aplicada a las resistencias RA-RB, y la capacidad del

condensador C.

- De modo que, cuando el voltaje a través del condensador C es igual a

2/3Vcc hace que el pin umbral registre un alto (descrito más arriba), que

invierte al comparador (dentro del 555) conectado a la patilla de umbral.

Esto lleva la salida a bajo y habilita el pin descarga. El tiempo que tarda el

condensador en acumular una tensión de 2/3Vcc, viene dada por:

2/3*Vcc = (Vcc - V0) * (1- e-t /((RA+RB)*C)

), reduciendo. Para V0 = 0 V, esto

viene a ser:

t = 1.1*(RA+RB)*C en segundos.

- Estando el pin de descarga activado (pin 7), la carga comienza a fluir,

descargando el condensador, a través de RB, y el pin de descarga (pin 7) del

555. Esto, reduce la tensión en el condensador como se describe por la

ecuación siguiente:

22

(Voltaje en C) = (voltaje pico en el condensador) * (e-t /(RB * C)

)

Donde, la tensión pico en el condensador era el voltaje (2/3Vcc), justo antes

de activar el pin 7 de descarga:

(Tensión en el condensador) = 2/3 * Vcc * (e-t /(RB * C)

)

- El tiempo que se tarda en descargar el condensador desde 2/3Vcc a 1/3Vcc,

se obtiene con:

t = 0.7*RB*C segundos

Por lo tanto la duración total de ambos estados, alto y bajo de la salida es:

0.7*(RA+RB)*C + 0.7*RB*C y 0.7*(RA+2*RB)*C en segundos.

Entonces, la frecuencia se calcula como sigue:

Frecuencia = 1/(0.7*(R1+2*R2)*C)

De esto, se deduce que, la frecuencia de la salida, se controla modificando

los valores de las resistencias R1, R2 y el condensador C. Además, podemos

controlar la anchura del pulso de salida (duración en alto, respecto de la

duración en bajo), puesto que, la duración del estado alto depende tanto de

R1 y R2, mientras que la duración del estado bajo sólo depende de R2.

En realidad, el modo astable, se considera un sencillo generador de frecuencias,

cuya frecuencia se puede controlar, modificando el valor de las resistencias o

cambiando el valor del capacitor, para cambiar el rango de las frecuencias. La

frecuencia se puede calcular con la fórmula:

f = 1/T=1.44 / (R1 +2R2) * C

Por lo tanto para una frecuencia de 38 kHz solo debemos de hacer los cálculos con

los componentes que propongamos, como son:

C=0.01µF, la frecuencia de 38kHZ y un ciclo de trabajo del 60% calculamos el

valor de RA y RB.

Tenemos la frecuencia:

F=38kHZ por lo que calculando el inverso obtenemos el tiempo que es igual a:

23

Ahora si queremos un ciclo de trabajo del 80% tenemos que el tiempo en alto debe

durar 80% del periodo y el otro 20% deberá permanecer en estado bajo la señal como se

muestra en la Figura6.

Figura 6.- Ciclo de trabajo del 80% para una frecuencia de 38kHz

De (2) calculamos RB por lo que nos queda:

Ahora en (1) sustituimos RB obtenida para calcular RA:

Pero como como con estas resistencias no existen valores comerciales ajustamos a

los valores comerciales más próximos y esto nos arrojó:

RA=2.2kΩ RB=680+100Ω=780Ω C=0.01µF C2=10nF

Por lo que el resultado del circuito nos queda como se muestra en la Figura 7 ya

correctamente polarizado para 38kHZ aproximadamente.

Figura 7.- Timer 555 polarizado a 38kHz

24

5.2 Circuito amplificador con 2N2222.

Cuando un transistor se utiliza como interruptor o switch, la corriente de base debe

tener un valor para lograr que el transistor entre en corte y otro para que entre en

saturación

- Un transistor en corte tiene una corriente de colector (Ic) mínima

(prácticamente igual a cero) y un voltaje colector emisor VCE) máximo

(casi igual al voltaje de alimentación). Ver la zona amarilla en el gráfico

- Un transistor en saturación tiene una corriente de colector (Ic) máxima y

un voltaje colector emisor (VCE) casi nulo (cero voltios). Ver zona en verde

en la Figura 8.

Figura 8.-Regiones de operación del transistor.

Para lograr que el transistor entre en corte, el valor de la corriente de base

debe ser bajo o mejor aún, cero

Para lograr que el transistor entre en saturación, el valor de la corriente de

base debe calcularse dependiendo de la carga que se esté operando entre

encendido y apagado (funcionamiento de interruptor)

Si se conoce cuál es la corriente que necesita la carga para activarse (se

supone un LED) se tiene el valor de corriente que habrá de conducir el

transistor cuando este en saturación y con el valor de la fuente de

alimentación del circuito, se puede obtener la recta de carga. Como lo

muestra la Figura 8.

25

Esta recta de carga confirma que para que el transistor funcione en

saturación, Ic debe ser máximo y VCE mínimo y para que esté en corte, Ic

debe ser el mínimo y VCE el máximo.

Por lo tanto el circuito que hacer que el transistor trabaje en modo de

interruptor es el mostrado en la Figura 9.

Figura 9.- Polarización del transistor como interruptor.

Para el análisis del transistor tenemos primero que el voltaje colector emisor en corte

es de 0.2 volts, el voltaje del diodo infrarrojo polarizado es de 1.8V y la coriente que

queremos que pase entre la resistencia y el diodo es de 100mA, haciendo el recorrido

de la maya tenemos la ecuación (A) para encontrar el valor de la resistencia que se

debe colocar en el entre VCC y el diodo.

…….(A)

Por lo que tendríamos que poner una resistencia demasiado pequeña o mejor aún no

poner resistencia alguna para obtener los 100mA de corriente cuando el circuito este

en estado alto.

Por el lado de la base pondremos una resistencia de 10kΩ la cual nos servirá para

excitar el transistor con una corriente muy pequeña obteniendo así la ecuación (B):

26

…(B)

Así estamos asegurando que el transistor estará entrando en corte y saturación a la

vez que nos de la corriente que necesitamos para que el led pueda transmitir a mayor

distancia.

5.3 Placa Arduino + Ethernet Shield

En esta parte del hardware solo se conecto la salida del pin 2 hacia la placa Ethernet

shield, la cual estará conectada al pin de reset del Timer 555 (pin 4) ver Figura 7.

El Arduino cada que este en un nivel alto 5V activara el timer y este empezara a oscilar

a la frecuencia de 38kHz y cuando el pin 2 del Arduino este en un nivel bajo 0V el

timer se desactivara, esto nos da control total sobre la manipulación del timer a

cualquier tiempo que se desee tener encendido o apagado y así manejar los diferentes

protocolos que se necesitaran desarrollar.

Esto nos deja todo el hardware completamente funcional para hacer la transmisión

infrarroja hacia cualquier dispositivo, que se desee su manipulación; aunque el Arduino

todavía no es capas de generar ningún protocolo para dicha manipulación, el diagrama

del circuito terminado se muestra en la Figura 10.

Para esto necesitamos cargarle un programa, el cual será el encargado de enviar dichas

señales y activar o desactivar el Timer y así encender el LED transmisor, hacia el

dispositivo seleccionado.

27

Figura 10.- Diagrama del Hardware polarizado para trabajar a 38Khz

Capítulo 6. Protocolos infrarrojos.

6.1 Comunicación serial.

Al hablar de un sistema de comunicación digital serial nos referimos a que la

información binaria, es decir en forma de unos y ceros, se transfiere bit por bit a través

de un medio, y se recibe de la misma forma, esto trae la ventaja de usar un sólo cable en

el caso de comunicarnos por niveles de voltaje, o en el caso del control remoto, por

pulsos luminosos.

Cuando hablamos de un sistema de comunicación digital serial por ancho de pulso, nos

referimos a que además de que la información se transmite de manera serial, ésta va

codificada por medio de la longitud de los impulsos, ya sean estos de voltaje o

luminosos. En este tipo de codificación por ejemplo, un impulso corto puede

interpretarse como un 1 y uno largo como un 0, o viceversa.

La codificación es bastante importante para la comunicación serial, ya que permite al

receptor determinar, sin lugar a dudas, que lo que está recibiendo es un 1 o un 0, e ir

armando una palabra binaria, como podría ser, por ejemplo: 10110111.

6.2 Protocolo Sony (Sirc).

Sony desarrolló un protocolo de control serial por ancho de pulso, que usa para el

control serial por cable de sus dispositivos, el protocolo SIRC (Serial InfraRed Control)

no es más que su adaptación al infrarrojo.

28

En el caso que estamos estudiando, el protocolo SIRC utiliza un espacio de tiempo que

podríamos llamar “fundamental” de 600µs. La señal se envía en múltiplos de ese

espacio de tiempo, que denominaremos simplemente T, de aquí en adelante.

Codificación:

Bit de inicio Todo protocolo de comunicaciones necesita algún indicador de “inicio” que le indique

al receptor que se prepare a recibir datos, en este caso es un pulso de longitud 4T, es

decir 2.4ms Figura 11. Sólo Después de que se ha enviado este pulso van ordenados

los demás pulsos más cortos que significan 1′s y 0′s, es decir, la información útil.

Figura 11.-Bit de Inicio Sirc

Bit 0 Un bit 0, se codifica mediante un espacio (sin señal) de longitud T, y un pulso también

de longitud T como lo vemos en la Figura 12.

Figura 12.- Representación de un 0 en Sirc.

Bit 1 Un bit 1, se codifica mediante un espacio (sin señal) de longitud T, y un pulso de

longitud 2T igual a 1.2ms como lo vemos en la Figura 13.

29

Figura 12.- Representación de un 1 en Sirc.

Es decir:

Figura 14.- La codificación para los bits en SIRC

Como vemos es bastante simple diferenciar los 1′s de los 0′s y a los bits de inicio. Nos

queda analizar la señal completa enviada por el control remoto.

Como se observa, la codificación en el protocolo SIRC es bastante simple, simplemente

se limita a enviar pulsos de longitud T, 2T y 4T, lo que los hace suficientemente

diferentes entre sí para ser fácilmente detectados en el receptor.

Pero no basta con conocer cómo se diferencia un 0 de un 1, también hay que saber en

qué orden los envía el transmisor, en concreto el protocolo SIRC envía 12, 15 o 20 bits

de información.

Estos bits se dividen en:

Señal de inicio + 7 bits de comando + 5 u 8 bits de dispositivo + 8 bits adicionales (en la versión de 20 bits).

Como lo muestran las Figuras 15a para 12 bits ,15b para 15 bits y 15c para 20 bits.

Figura 15a.- Variante de 12 bits:

30

Figura 15b.-Variante de 15 bits:

Figura 15c.-Variante de 20 bits:

Entre los 7 bits de comando va la información del botón que ha sido presionado en el

control remoto, codificada en binario natural y en orden de menos significativo a más

significativo.

En el caso de nuestro proyecto tendremos un control remoto Sony para un reproductor

de Blue Ray el cual tiene la variante de 20 bits, como lo muestra la Figura 15c. Esta

variante se obtuvo por medio del receptor infrarrojo Tsop 1738 y a la salida del Tsop

solo pusimos una compuerta inversora para así tener la imagen del protocolo como se

esta analizando Figura 16.

Figura 16.- Captura del osciloscopio para el transmisor del Blue Ray Sony de 20 bits

En la Tabla 2 podemos ver los botones que se decodificaron con este protocolo, así

como su valor por cada bit y el valor que obtiene como numero entero para después ser

tratados en el diseño de la reproducción del protocolo.

31

Control

SONY BLUE

RAY SIRC

BITS

Botón 0 1 2 3 4 5 6 7 8 9 1

0

1

1

1

2

1

3

1

4

1

5

1

6

1

7

1

8

1

9

Suma 12 bits LSB Suma 8 bits

MSB

ENTER 1 0 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3389 226

UP 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3385 226

DOWN 0 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3386 226

LEFT 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3387 226

RIGTH 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3388 226

ON 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3374 226

OFF 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3375 226

PLAY 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3354 226

STOP 0 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3352 226

PAUSE 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3353 226

PREV 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3415 226

NEXT 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3414 226

SKIP_BACK 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3355 226

SKIP_NEXT 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3356 226

REPLAY 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3446 226

ADVANCE 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3445 226

RED 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3431 226

BLUE 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3430 226

GREEN 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3432 226

YELLOW 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3433 226

AUDIO 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3428 226

SUBTITLE 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3427 226

TOP MENU 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3372 226

POP

UP/MENU

1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3369 226

RETURN 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 3395 226

OPTIONS 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 3391 226

Tabla 2.- Botones decodificados para el protocolo Sirc de 20 bits.

32

6.3 Protocolo NEC

Características

8 bits de direcciones y 8 bits de longitud de comandos.

Dirección y comando se transmiten dos veces.

Frecuencia de la portadora de 38kHz

Cero lógico de 1.125ms

Uno lógico de 2.25ms

Codificación.

Bit de inicio.

Este protocolo tiene el indicador de “inicio” es un pulso de longitud de 9ms, seguido de

un pulso bajo de 4.5ms, visto en la Figura 17. Sólo Después de que se ha enviado este

pulso van ordenados los demás pulsos más cortos que significan 1′s y 0′s, es decir, la

información útil.

Figura 17.- Bit de inicio protocolo NEC

Bit 0 Un bit 0, se codifica mediante una ráfaga de 560µs estado alto, y un espacio sin pulsos

también de longitud de 560µs como lo vemos en la Figura 18.

Bit 1 Un bit 1, se codifica mediante una ráfaga de 560µs estado alto, y un espacio sin pulsos

de longitud igual a 1.63ms como lo vemos en la Figura 18.

Figura 18.- Bits “1” y “0” del protocolo NEC

33

Las Figuras 19 y 20 muestran el valor real capturado para estos dos bits lógicos

capturados con el osciloscopio y el receptor infrarrojo 1738.

Figura 19.- Bit de inicio NEC capturado con el receptor 1738 y el osciloscopio.

Figura 20.- Izquierda “1” lógico, derecha “0” lógico protocolo NEC capturados con el

1738 y osciloscopio.

Protocolo:

La Figura 21 muestra un tren de pulsos típico del protocolo de NEC. Con este

protocolo el bit LSB se transmite primero. En este caso vemos como se transmite la

dirección 59 y el comando 16. Un mensaje que se inicia por una explosión 9ms, que se

utiliza para establecer la ganancia de los receptores de IR anterior. Esta explosión es

seguido por un espacio 4.5ms, que es seguido por la Dirección y Comando. Dirección y

Comando se transmiten dos veces.

34

La segunda vez para la Dirección y el Comando todos los bits se invierten y se puede

utilizar para la verificación del mensaje recibido correctamente al final de comando se

envía una explosión de 560μs la cual indica el final del comando enviado.

Figura 21.- Ejemplo tren de pulsos protocolo NEC

Un comando se transmite una sola vez, aun cuando la tecla del mando a distancia sigue

siendo presionada. Cada 110ms un código de repetición es transmitida por el tiempo

que la tecla siga siendo presionada. Este código es simplemente una repetición de pulso

9ms seguido de un espacio 2.25ms y una explosión 560μs Figura 22.

Figura 22.- Trama de envió cada 110ms si la tecla sigue presionada.

Protocolo extendido:

El protocolo de NEC es tan ampliamente utilizado que pronto todas las direcciones

posibles, se agotaron. Al sacrificar la redundancia dirección del rango de direcciones se

amplió de 256 posibles valores para aproximadamente 65,000 valores diferentes. De

esta manera el rango de direcciones se amplió de 8 bits a 16 bits sin necesidad de

cambiar cualquier otra propiedad del protocolo.

35

La redundancia de comandos aún se conserva. Por lo tanto cada dirección todavía puede

manejar 256 comandos diferentes Figura 21.

Figura 23.- Protocolo NEC extendido dirección de 16 bits

Las Tablas 3 y 4 muestran los botones que se decodificaron con este protocolo; ya que

dos de los dispositivos utilizados en el proyecto utilizan este protocolo para la

manipulación de sus respectivos equipos electrónicos como lo son:

- Proyector Optoma

- Decodificador Total Play

Cada uno de estos vemos las tablas que representan sus respectivos mandos y botones

decodificados.

Las Figuras 24a y 24b muestran una captura completa del protocolo NEC por medio

del receptor infrarrojo y el osciloscopio.

Figura 24a.- Dirección y dirección complementada.

36

Figura 24b.- Comando y comando complementado

Dirección Dirección complemento.. Comando Comando complemento

Protocolo Nec Proyector

Optpma 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Suma D Suma C

ON 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 52530 64770

OFF 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 52530 63240

RE-SYNC > 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 52530 59925

SOURCE < 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 52530 59670

ARRIBA 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 52530 60435

ABAJO 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 52530 60180

ENTER 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 52530 59415

MENU 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 52530 60945

4;3 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 52530 64260

LBX 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 52530 63495

16;9 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 52530 63750

OVERSCAN 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 52530 61710

NATIVE 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 52530 62985

Tabla 3.- Códigos del proyector Optoma protocolo NEC

37

Dirección Comando Comando complemento

Protocolo Nec Extendido

Total play 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Suma D Suma C

POWER 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 64769 9180

OK 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 64769 12750

UP 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 64769 13770

DOWN 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 64769 11730

LEFT 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 64769 26265

RIGHT 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 64769 16065

GUIA 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 64769 29580

Play >ll 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 64769 31620

STOP 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 64769 9945

<< 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 64769 30345

>> 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 64769 27030

>| 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 64769 28305

EXIT 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 64769 15045

Vod 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 64769 8925

ch+ 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 64769 31365

ch- 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 64769 31110

RED 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 64769 14025

GREEN 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 64769 12495

YELLOW 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 64769 26520

BLUE 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 64769 25245

-><- 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 64769 27285

!pc 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 64769 15555

1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 64769 28050

2 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 64769 27795

3 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 64769 13260

4 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 64769 29070

5 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 64769 28815

6 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 64769 14280

7 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 64769 30090

8 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 64769 29835

9 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 64769 15300

0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 64769 30855

Tabla 4.- Códigos del decodificador Total Play protocolo NEC extendido dirección 16

bits

38

6.4 Protocolo Denon CD Changer

Características

15 bits de transmisión

Frecuencia moduladora de 38kHz

Dos tramas diferentes por comando

Entre cada trama hay un tiempo de retraso diferente para cada tecla presionada

Cero lógico 1.1ms

Uno lógico 2.1 ms

Codificación:

Trama de inicio.

Este protocolo tiene un indicador de “inicio” el cual consta de 5 bits enviados para que

indicar el inicio de una trama, estos son: 00010 Figura 25. Tanto para la primera trama

como para la segunda que complementa el comando seleccionado.

Figura 25.- Trama inicio protocolo Denon

39

Bit 0.

Un bit 0 se codifica mediante una ráfaga de 300µs en estado alto, y un espacio sin

pulsos de 800ms como lo vemos en la Figura 26.

Bit 1.

Un bit 1, se codifica mediante una ráfaga de 300 µs en estado alto, y un espacio sin

pulsos de 1800ms como lo vemos en la Figura 26.

Figura 26.- Representación de los bits “1” y “0” lógicos protocolo Denon recepción del

1738 y el osciloscopio

Protocolo:

La Figura 27 muestra un tren de pulsos del protocolo Denon, tanto para la primera

trama como para la segunda, con este protocolo el LSB bit de transmite primero, en este

ejemplo vemos como se transmite primero el valor 2952 y después de 48ms el valor

29800, los cuales equivalen a la tecla play del CD-Changer, en la Figura 28 vemos una

captura hecha con el osciloscopio y el receptor 1738. Si se observa de manera detenida

en el segundo dato enviado, después de la trama de inicio 00010, vemos que el segundo

dato es el complemento del primer dato.

40

Por lo que este protocolo tiene mucha similitud con el protocolo NEC ya que también

envía el complemento del dato enviado como verificador de código.

Figura 27.- Ejemplo de recepción de la tecla play.

Figura 28.- Captura protocolo Denon tecla play vista en el osciloscopio.

En la Tabla 5 vemos el valor de las teclas decodificadas para el desarrollo del proyecto,

utilizando el protocolo Denon; se observa la relación que tiene el dato 2 con el dato 1 ya

que cada uno es el complemento del otro si se observa en valores binarios.

41

Denon cd-changer inicio Dato 1 retardo

inicio Dato 2= Dato 1 complementado

botón 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 tiempo

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

PLAY 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 45ms

0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 2952 29800

STOP 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 44ms

0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 3016 29736

dis- 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 44ms

0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 3528 29224

dis+ 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 44ms

0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 3432 29320

random 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 42ms

0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 3400 29352

repeat 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 47ms

0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 2696 30056

pause 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 45ms

0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 2984 29768

|<< 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 46ms

0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 2856 29896

>>| 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 43ms

0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 2824 29928

<< 0 0 0 1 0 1 1 0 1 1 0 1 0 0 0 45ms

0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 2920 29832

>> 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 46ms

0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 2888 29864

open/close 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 48ms

0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 2568 30184

off 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 44ms

0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4008 28744

on 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 44ms

0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 3688 29064

Tabla 5.- Códigos del protocolo Denon para manipular el cd-Changer.

6.5 Protocolo Pioneer AVR.

Características

32 bits de transmisión

Frecuencia moduladora a 38kHz

Dos tramas por comando

Entre cada trama hay un tiempo de retraso para cada tecla presionada

Cero lógico 1ms

Uno lógico 2 ms

Codificación:

Bit de inicio.

Este protocolo tiene el indicador de “inicio” es un pulso de longitud de 8ms, seguido de

un pulso bajo de 4ms, visto en la Figura 29. Sólo Después de que se ha enviado este

pulso van ordenados los demás pulsos más cortos que significan 1′s y 0′s, es decir, la

información útil.

42

Figura 29.- Bit de inicio Protocolo Pioneer

Bit 0 Un bit 0, se codifica mediante una ráfaga de 500µs estado alto, y un espacio sin pulsos

también de longitud de 500µs como lo vemos en la Figura 30.

Bit 1 Un bit 1, se codifica mediante una ráfaga de 500µs estado alto, y un espacio sin pulsos

de longitud igual a 1.5ms como lo vemos en la Figura 30.

Figura 30.- Bits “1” y “0” del protocolo Pioneer

Las Figuras 31 y 32 muestran el valor real capturado para estos dos bits lógicos

capturados con el osciloscopio y el receptor infrarrojo 1738.

Figura 31.- Bit de inicio NEC capturado con el receptor 1738 y el osciloscopio.

43

Figura 32.- Izquierda “1” lógico, derecha “0” lógico protocolo Pioneer capturados con

el 1738 y osciloscopio

Protocolo:

La Figura 33 muestra un tren de pulsos típico del protocolo de Pioneer. Con este

protocolo el bit LSB se transmite primero. Un mensaje que se inicia por una explosión

8ms, que se utiliza para establecer la ganancia de los receptores de IR anterior. Esta

explosión es seguido por un espacio 4ms, que es seguido por la Dirección y Comando.

Dirección y Comando se transmiten dos veces.

La segunda vez para la Dirección y el Comando todos los bits se invierten y se puede

utilizar para la verificación del mensaje recibido correctamente al final de comando se

envía una explosión de 500μs la cual indica el final del comando enviado.

Figura 33.- Ejemplo tren de pulsos protocolo Pioneer

Cada comando se envía dos veces al presionar una tecla, separados por un periodo de tiempo

de 54.8ms uno del otro, aunque algunas teclas envían dos comandos diferentes como se

mostrara mas adelante.

Las Figuras 34a y 34b muestran una captura completa del protocolo Pioneer por medio

del receptor infrarrojo y el osciloscopio.

44

Figura 24a.- Dirección y dirección complementada.

Figura 24b.- Comando y comando complementado

Para la opción del manejo del ipod vemos en la Tabla 6 que cada comando tiene dos

valores diferentes, por lo tanto siempre que se quiera manipular un ipod conectado,

cada comando deberá enviar dos comandos diferentes, el primero indica que se quiere

manipular un ipod, y el segundo indica la acción que se desea realizar con dicho

dispositivo.

Para la opción HMG vemos en la Tabla 6 que cada tecla presionada tiene dos valores

diferentes, por lo tanto siempre que se quiera manipular un HMG conectado, cada

comando deberá enviar dos comandos diferentes, el primero indica que se quiere

manipular un el HMG, y el segundo indica la acción que se desea realizar con dicho

dispositivo.

45

Dirección Dirección comp Comando Comando comp

boton 0 1 2 3 4 5 6 7 8 9 10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

entero bajo

entero alto

VOL + 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 23205 62730

VOL- 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 23205 62475

RECIVER 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 23205 58140

ON 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 23205 58650

OFF 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 23205 58395

MUTE 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 23205 60690

DVD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 23205 31365

CD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 23205 45900

VIDEO1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 23205 59670

TV 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 23205 62220

TUNER 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 23205 47175

BD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 23205 41820

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 23205 16320

DVR 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 23205 30345

HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 23205 41820

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 23205 16065

PLAY HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 23205 16320

STOP HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 23205 13770

PAUSE HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 23205 16065

<<HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 23205 15300

>>HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 23205 14986

|<< HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 23205 15810

>>| HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 23205 15555

up HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 23205 12240

DOWN HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 23205 11985

LEFT HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 23205 11475

RIGTH HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 23205 11730

46

ENTER HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 23205 11220

EXIT HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 23205 10965

RETURN HMG 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 23205 26775

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 23205 10965

IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 23205 24990

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 23205 13515

PLAY IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 23205 16320

STOP IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 23205 13770

PAUSE IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 23205 16065

<< IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 23205 15300

>> IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 23205 15045

|<< IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 23205 15810

>>| IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 23205 15555

UP IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 23205 12240

DOWN IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 23205 11985

LEFT IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 23205 11475

RIGTH IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 23205 11730

ENTER IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 23205 11220

REPEAT IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 23205 14790

RANDOM IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 23205 14535

RETURN IPOD 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 23205 26520

1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 23205 10965

TUNER 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 23460 43350

47

UP

TUNER DOWN 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 1 23460 43095

Tabla 6.- Comandos capturados protocolo Pioneer.

Con estas tablas y descripciones de los protocolos ya tenemos lo necesario para poder

reproducir cada uno de los protocolos, sin mas ni menos, cada protocolo tiene

características diferentes, aunque son muy parecidos cuando se observan con gran

detenimiento por lo que reproducirlos ahora es mas claro.

48

Capítulo 7. Servidor WEB Arduino e implementación de los

protocolos IR.

En este capítulo desarrollamos un servidor WEB el cual se cargara dentro del Arduino y

nos servirá para almacenar los 5 protocolos infrarrojos, descritos en el capítulo anterior.

Para esto primero instalamos el software de desarrollo de la placa Arduino, que en nuestro

caso es el Arduino 1.0.4, el cual se puede bajar desde la página oficial de Arduino, existe

tanto para Windows como para Linux, en nuestro caso lo usamos en Fedora 15.

Instalamos el software de desarrollo de Arduino y conectamos nuestra placa a cualquier

puerto USB, para así poder cárgale el nuestro programa con los códigos infrarrojos que

manipularan los dispositivos seleccionados.

Este software de desarrollo contiene varios ejemplos para el desarrollo de ciertos programas

y nos enseña la manera de cómo es que se debería de manipular esta placa. Uno de ellos es

crear un servidor web, y este es el que nos sirvió para el desarrollo del proyecto.

Por lo tanto abrimos el programa de desarrollo en Arduino y creamos un nuevo proyecto

con el cual trabajaremos y le pondremos como nombre protocolos infrarrojos como lo

muestra la Figura 25.

Figura 25.- Programa de

desarrollo Arduino

“Protocolos_Infrarrojos”

49

En la Figura 26 muestra el diagrama de flujo sobre el desarrollo del programa

Protocolos_Infrarrojos y lo que se desea hacer con este cuando este dentro del Arduino.

Figura 26.- Diagrama de flujo para el programa Arduino.

Ahora describiremos pedazo por pedazo el código generado para el programa en el

Arduino.

- Importaciones de bibliotecas

#include <SPI.h>

#include <Ethernet.h>

- Declarando los valores para la dirección MAC y la direccion IP que

tendrá nuestro servidor web

byte mac[] = 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED ;// asignando

dirección MAC

byte ip[] = 192,168,100,34; // asignando la direccion IP del Arduino

- Definimos el puerto por el cual se realizara la comunicación

EthernetServer server(80);//ethernet server port 80

50

- Deficicion de variables, contadores y arreglos para el programa.

int cont;

int led = 2;

unsigned int x=0;

int i,b;

int necA,necB,piA,piB,piC,piD;

int A[12];

int B[32];

int C[32];

boolean flatRed = false;

boolean flatGreen = false;

boolean flatBlue= false;

boolean flatDenon= false;

int steep=15;//paso de intensidad de color en los LEDs

boolean reading = false;

- Creando formulario HTML para pruebas por pagina web //HTML creacion de formulario

const char html[] =

"<html><head>"

"<TITLE> ARDUINO ETHERNET CONTROL REMOTO</TITLE>"

"<head>"

"<body>"

"<h1>control remoto infrarrojo arduino ethernet</h1>"

"<FORM>"

"<P> Seleccione el protocolo a probar>"

"<P><INPUT TYPE='Submit' VALUE='ROJO' NAME='S128' STYLE='width:150px; heigth:100px; background-

color:#ff0000'>"

"<P><INPUT TYPE='Submit' VALUE='Sirc' NAME='S129' STYLE='width:150px; heigth:100px; background-

color:#ff0000'>"

"<P><INPUT TYPE='Submit' VALUE='Nec' NAME='R65280N27795' STYLE='width:150px; heigth:100px;

background-color:#00ff00'>"

"<P><INPUT TYPE='Submit' VALUE='Nec1' NAME='R65280N15045' STYLE='width:150px; heigth:100px;

background-color:#00ff00'>"

"<P><INPUT TYPE='Submit' VALUE='pioneer' NAME='P23205N41820P23205N16065' STYLE='width:150px;

heigth:100px; background-color:#99FFFF'>"

"<P><INPUT TYPE='Submit' VALUE='Denon' NAME='D2952N29800P45N43' STYLE='width:150px;

heigth:100px; background-color:#66FFFF'>"

"</FORM>"

"</body></html>";

- Configurando el Arduino Ethernet con la MAC e IP, el puerto de

comunicación, la velocidad de comunicación y el pin de salida.

void setup()

Serial.begin(9600);

//iniciar conexion

51

Ethernet.begin(mac, ip);

server.begin();

//activar pines

pinMode(led, OUTPUT);

- Ciclo infinito

En este ciclo infinito, el servidor estará esperado que se conecte un cliente

que este dentro de la misma red, este cliente puede conectarse por medio de

un navegador de internet, poniendo en la dirección del navegador la IP de

nuestro servidor “192,168,100,34”, el servidor le enviara la pagina web y se

quedara esperando a que haga peticiones HTTP por medio de los botones de

prueba Figura 27, o por medio de las combinaciones esperadas para las

peticiones de cada uno de los protocolos.

Figura 27.- Pagina web dentro del Arduino.

Cuando el cliente hace una petición HTTP hacia el servidor, este empieza a

leer carácter por carácter la URL que envio el cliente, y va desechando todos

los caracteres hasta que encuentra el signo “?” el cual indica que desde aquí

los que sigue es muy importante. Dependiendo de la letra siguiente a este

signo sabremos que protocolo es el que se desea ejecutar y que el Arduino

deberá de enviar por el pin de salida dicho protocolo, para manipular el

dispositivo seleccionado.

52

Como lo muestra la Figura 27 después del signo “?” tenemos la letra “D” la

cual nos indica que el protocolo que se desea ejecutar es el Denon, para

activar alguna función del CD-Changer, por lo tanto se ejecutara dicha

acción de la siguiente manera:

i) Activara la bandera flatDenon y desactivara las banderas

flatSirc, flatNec, flatPioneer.

flatDenon = true;

flatSirc = false;

flatNec=false;

flatPioneer = false;

ii) Leerá carácter por carácter hasta encontrar una N que nos indica

que aquí termina el valor del primer dato, por lo que el valor se

guarda en el arreglo nec1, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec1) y el valor obtenido se asigna a la variable

piA.

while(c!='N')

c=client.read();

nec1[index]=c;

index++;

nec1[5]='\0';

piA=atoi(nec1);

iii) Leerá carácter por carácter hasta encontrar una P que nos indica

que aquí termina el valor del segundo dato, por lo que el valor se

guarda en el arreglo nec2, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec2) y el valor obtenido se asigna a la variable

piB.

while(c!='P')

c=client.read();

nec2[index]=c;

index++;

nec2[6]='\0';

piB=atoi(nec2);

53

iv) Leerá carácter por carácter hasta encontrar una N que nos indica

que aquí termina el valor del tercer dato, por lo que el valor se

guarda en el arreglo nec3, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec3) y el valor obtenido se asigna a la variable

piC.

while(c!='N')

c=client.read();

nec3[index]=c;

index++;

nec3[2]='\0';

piC=atoi(nec3);

v) Leerá carácter por carácter hasta encontrar un “=” que nos indica

que aquí termina el valor del cuarto dato, por lo que el valor se

guarda en el arreglo nec4, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec4) y el valor obtenido se asigna a la variable piD

al final saldrá del ciclo de lectura y saltara a las comparaciones

para ejecutar el protocolo Denon ya codificado más adelante con

las variables piA, piB, piC y piD.

while(c!='=')

c=client.read();

nec4[index]=c;

index++;

nec4[2]='\0';

piD=atoi(nec4);

break;

Como vimos en la Figura 27 solo estamos utilizando la petición HTTP para

decoficar el tipo de protocolo que se estará manejando; para el protocolo

NEC tenemos esta petición: http://192.168.100.34/?R65280N27795=NEC.

La cual se analiza de la misma manera que la instrucción anterior solo que

después del signo “?” tenemos la letra “R” la cual nos indica que el

protocolo que se desea ejecutar es el NEC, para activar alguna función del

video proyector Optoma o el decodificador Total Pay, por lo tanto se

ejecutara dicha acción de la siguiente manera:

54

i) Activara la bandera flatNec y desactivara las banderas flatSirc,

flatDenon, flatPioneer.

flatDenon = false;

flatSirc = false;

flatNec=true;

flatPioneer = false;

ii) Leerá carácter por carácter hasta encontrar una N que nos indica

que aquí termina el valor del primer dato, por lo que el valor se

guarda en el arreglo nec1, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec1) y el valor obtenido se asigna a la variable

necA.

while(c!='N')

c=client.read();

nec1[index]=c;

index++;

nec1[6]='\0';

necA=atoi(nec1);

index=0;

iii) Leerá carácter por carácter hasta encontrar un “=” que nos indica

que aquí termina el valor del cuarto dato, por lo que el valor se

guarda en el arreglo nec2, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec2) y el valor obtenido se asigna a la variable

necB al final saldrá del ciclo de lectura y saltara a las

comparaciones para ejecutar el protocolo Nec ya codificado más

adelante con las variables necA, necB.

while(c!='=')

c=client.read();

nec4[index]=c;

index++;

nec4[2]='\0';

necB=atoi(nec4);

break;

55

De nuevo como vemos en la Figura 27 solo estamos utilizando la petición

HTTP para decoficar el tipo de protocolo que se estará manejando; para el

protocolo Pioneer tenemos esta petición:

http://192.168.100.34/? P23205N41820P23205N16065=pioneer

La cual se analiza de la misma manera que la instrucción anterior solo que

después del signo “?” tenemos la letra “P” la cual nos indica que el protocolo

que se desea ejecutar es el Pioneer, para activar alguna función del AVR

Pionner, por lo tanto se ejecutara dicha acción de la siguiente manera:

1) Activara la bandera flatPioneer y desactivara las banderas

flatSirc, flatDenon, flatNec.

flatPioneer = true;

flatDenon = false;

flatSirc = false;

flatNec=false;

2) Leerá carácter por carácter hasta encontrar una N que nos indica que

aquí termina el valor del primer dato, por lo que el valor se guarda en

el arreglo nec1, como estos valores son leídos como caracteres, se

deben de convertir a números enteros con la función atoi(nec1) y el

valor obtenido se asigna a la variable necA.

while(c!='N')

c=client.read();

nec1[index]=c;

index++;

nec1[6]='\0';

piA=atoi(nec1);

index=0;

3) Leerá carácter por carácter hasta encontrar una P que nos indica que

aquí termina el valor del segundo dato, por lo que el valor se guarda

en el arreglo nec2, como estos valores son leídos como caracteres, se

deben de convertir a números enteros con la función atoi(nec2) y el

valor obtenido se asigna a la variable piB.

while(c!='P')

c=client.read();

nec2[index]=c;

index++;

56

nec2[6]='\0';

piB=atoi(nec2);

index=0;

4) Leerá carácter por carácter hasta encontrar una N que nos indica que

aquí termina el valor del tercer dato, por lo que el valor se guarda en

el arreglo nec3, como estos valores son leídos como caracteres, se

deben de convertir a números enteros con la función atoi(nec3) y el

valor obtenido se asigna a la variable piC.

while(c!='N')

c=client.read();

nec3[index]=c;

index++;

nec3[6]='\0';

piC=atoi(nec3);

index=0;

5) Leerá carácter por carácter hasta encontrar un “=” que nos indica que

aquí termina el valor del cuarto dato, por lo que el valor se guarda en

el arreglo nec4, como estos valores son leídos como caracteres, se

deben de convertir a números enteros con la función atoi(nec4) y el

valor obtenido se asigna a la variable piD al final saldrá del ciclo de

lectura y saltara a las comparaciones para ejecutar el protocolo

Denon ya codificado más adelante con las variables piA, piB, piC y

piD.

while(c!='=')

c=client.read();

nec4[index]=c;

index++;

nec4[6]='\0';

piD=atoi(nec4);

break;

Continuando con la Figura 27 hacemos una nueva petición HTTP para

decodificar el tipo de protocolo que se estará manejando; para el protocolo

SIRC tenemos esta petición: http://192.168.100.34/?S149=SIRC. La cual

se analiza de la misma manera que la instrucción anterior solo que después

del signo “?” tenemos la letra “S” la cual nos indica que el protocolo que se

57

desea ejecutar es el SIRC de Sony, para activar alguna función del Blue

Ray Sony, por lo tanto se ejecutara dicha acción de la siguiente manera:

i) Activara la bandera flatSirc y desactivara las banderas flatNec,

flatDenon, flatPioneer.

flatSirc = true;

flatDenon = false;

flatNec=false;

flatPioneer = false;

ii) Leerá carácter por carácter hasta encontrar un “=” que nos indica

que aquí termina el valor del comando, por lo que el valor se

guarda en el arreglo nec1, como estos valores son leídos como

caracteres, se deben de convertir a números enteros con la

función atoi(nec1) y el valor obtenido se asigna a la variable

necA.

while(c!='=')

c=client.read();

codigo[index]=c;

index++;

codigo[5]='\0';

x=atoi(codigo);

break;

Cuando terminamos de hacer las lecturas de las peticiones HTTP nos disponemos a enviar

los comandos correspondientes dependiendo la bandera que esta activada.

1) Si la bandera activada es la “flatSirc” enviaremos algún comando hacia el Blue Ray

Sony, volvemos a poner en false a la variable para esperar otra petición, el comando

está guardado en la variable x y mandamos a llamar a la función sirc(x).

if (flatSirc == true)

//digitalWrite(Red,HIGH);

flatSirc=false;

sirc(x);

2) Si la bandera activada es la “flatNec” enviaremos algún comando hacia el proyector

Optoma o hacia el decodificador Total Play, volvemos a poner en false a la variable

58

para esperar otra petición, el comando se divide en dos por lo que se guarda en las

variables necA, necB mandando a llamar a la función nec(necA, necB).

if (flatNec == true)

//digitalWrite(Green,HIGH);

flatNec=false;

nec(necA, necB);

3) Si la bandera activada es la “flatPioneer” enviaremos algún comando hacia el AVR

Pioneer, volvemos a poner en false a la variable para esperar otra petición, este

comando se divide en cuatro por lo que se guarda en las variables piA, piB, piC y

piD, mandamos a llamar a la función Pioneer(piA, piB, piC, piD).

if (flatPioneer == true)

//digitalWrite(Blue,HIGH);

flatPioneer=false;

Pioneer(piA, piB, piC, piD);

4) Si la bandera activada es la “flatDenon” enviaremos algún comando hacia el CD-

Changer Denon, volvemos a poner en false a la variable para esperar otra petición,

este comando se divide en cuatro por lo que se guarda en las variables piA, piB,

piC y piD, mandamos a llamar a la función Denon(piA, piB, piC, piD).

if (flatDenon == true)

//digitalWrite(Yellow,HIGH);

flatDenon=false;

Denon(piA, piB, piC, piD);

Por ultima parte del programa en Arduino tenemos las funciones para cada uno de los

protocolos que se utilizaron, en cada uno de los dispositivos mencionados anteriormente.

Protocolo Sirc de Sony:

Lee el código que viene de la variable x y lo convierte en un número binario y empieza a

enviar el bit LSB hasta el MSB contando 12 bits desde el bit 0 hasta el bit 11.

/*La función que envía el protocolo Sirc*/

void sirc(unsigned int x)

unsigned int y; // variable auxiliar

y=x; // copia el valor de x

cont=3;// contador para veces que se envía el comando

for(i=0;i<12;i++) // ciclo de conversión a 0’s y 1’s

b= y - ((y>>1)<<1); // saca el bit LSB de la copia

y = y>> 1;

A[i]=b; // guarda el bit LSB en un arreglo

59

while(cont!=0) //mientras el contador no es cero envía

comando

trama(); // Bit de inicio

for(i=0;i<12;i++)// ciclo para sacar los bits

b=A[i]; // asigna el bit i ala variable b

switch(b) // pregunta si es uno o cero

case 0:cero();break; //llama a la función cero()

case 1:uno();break;//llama a la función uno

findato(); // llama a la función findato

delay(26); // retardo de 26 milisegundos

delayMicroseconds(800); //retardo de 800 microsegundos

cont=cont-1; //decremento contador

/* Función findato que envía los últimos bits del protocolo*/

void findato()

cero(); //llama cero

uno(); //llama uno

cero(); //llama cero

cero(); //llama cero

cero(); //llama cero

uno(); //llama uno

uno(); //llama uno

uno(); //llama uno

/*Función que envía el bit de inicio*/

void trama()

/*bit de inicio*/

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delayMicroseconds(2400); //retardo de 2400 microsegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(600); //retardo de 600 microsegundos

/* Función que envía el uno del protocolo Sirc*/

void uno()

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delayMicroseconds(1190); //retardo de 1190 microsegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(590); //retardo de 590 microsegundos

/* Función que envía el cero del protocolo Sirc*/

60

void cero()

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delayMicroseconds(595); //retardo de 595 microsegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(595); //retardo de 590 microsegundos

Protocolo NEC:

Lee el código que viene de las variables necA , necB, las convierte en un número binario y

empieza a enviar desde el bit LSB hasta el MSB contando 32 bits desde el bit 0 hasta el bit

31.

/*Funcion que envia el protocolo NEC*/

void nec(int necA, int necB)

for(i=0;i<16;i++) //ciclo para convertir la primer variable en

bits

b= necA - ((necA>>1)<<1);//saca el LSB bit y lo guarda en b

necA= necA>> 1;

B[i]=b; //guarda el LSB bit en la i-esima posición de B

for(i=16;i<32;i++) //ciclo para convertir la segunda variable en

bits

b= necB - ((necB>>1)<<1);//saca el bit LSB y lo guarda en b

necB = necB>> 1;

B[i]=b; //guarda el bit en la i-esima posición de B

tramaNec(); //llama a la función que envía el bit de inicio

for(i=0;i<32;i++)//ciclo que saca los 32 bits del comando

b=B[i]; //saca el bit de la i-esima posición

switch(b) //compara el bit si es uno o cero

case 0:ceroNec();break;//llama a la función ceroNec

case 1:unoNec();break; //llama a la función unoNec

ceroNec(); //llama a la función cero para indicar que se

acaba el comando

delay(54); // retardo de 54 milisegundos

delayMicroseconds(800); //retardo de 800 microsegundos

/*función que envía el bit de inicio */

61

void tramaNec()

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delay(9); //retardo de 9 milisegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(4500); //retardo de 4.5 milisegundos

/*Función que envía el uno del protocolo NEC*/

void unoNec()

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delayMicroseconds(560); //retardo de 560 microsegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(1690); //retardo de 1.690 milisegundos

/*Función que envía el uno del protocolo NEC*/

void ceroNec()

digitalWrite(led, HIGH); //pone el pin LED en uno lógico

delayMicroseconds(560); //retardo de 560 microsegundos

digitalWrite(led, LOW); //pone el pin LED en cero lógico

delayMicroseconds(560); //retardo de 560 microsegundos

Protocolo Pioneer:

Lee el código que viene de las variables piA , piB, piC, piD, las convierte en un número

binario y empieza a enviar desde el bit LSB hasta el MSB contando 32 bits desde el bit 0

hasta el bit 31.

/*Función que envía el protocolo Pioneer*/

void Pioneer(int piA, int piB,int piC, int piD)

for(i=0;i<16;i++)//ciclo que convierte piA en binario ocupando

las primeras 16 localidades del arreglo B

b= piA - ((piA>>1)<<1); //saca el bit LSB de piA

piA= piA>> 1;

B[i]=b; //guarda el bit en la i-esima posición de B

for(i=16;i<32;i++) //ciclo que convierte piB en binario ocupando

las ultimas 16 localidades del arreglo B

b= piB - ((piB>>1)<<1);//saca el bit LSB de piB

piB = piB>> 1;

B[i]=b; //guarda el bit en la i-esima posición de B

62

for(i=0;i<16;i++)//ciclo que convierte piC en binario ocupando

las primeras 16 localidades del arreglo C

b= piC - ((piC>>1)<<1); //saca el bit LSB de piC

piC= piC>> 1;

C[i]=b; //guarda el bit en la i-esima posición de C

for(i=16;i<32;i++)//ciclo que convierte piD en binario ocupando

las ultimas 16 localidades del arreglo B

b= piD - ((piD>>1)<<1); //saca el bit LSB de piC

piD = piD>> 1;

C[i]=b; //guarda el bit en la i-esima posición de C

for (cont=0; cont<2;cont++)// ciclo que saca los bits de los

arreglos

tramaPi();//llama a la función que envía el bit de inicio

for(i=0;i<32;i++) // saca los bits del arreglo B

b=B[i]; //obtiene el bit alojado en la i-esima posición

switch(b)// pregunta si es uno o cero

case 0:ceroPi();break; //llama a la función ceroPi

case 1:unoPi();break; //llama a la fucion uno Pi

ceroPi();//llama a la función que indica el fin de la

primera parte del comando

delay(27);//retardo de 27 milisegundos

tramaPi();//llama de nuevo al bit de inicio

for(i=0;i<32;i++)//saca los bits del arreglo C

b=C[i];//obtiene el bit alojado en la i-esima posición

switch(b)//pregunta si es uno o cero

case 0:ceroPi();break;//llama a la función ceroPi

case 1:unoPi();break; //llama a la función unoPi

ceroPi();//llama a la función ceroPi que indica el fin de la

segunda parte del comando

delay(27); //retardo de 27 milisegundos

63

/*Función que envía el bit de inicio del protocolo Pioneer*/

void tramaPi()

digitalWrite(led, HIGH); //pone en uno lógico al pin LED

delayMicroseconds(8400); //retardo de 8.4 milisegundos

digitalWrite(led, LOW); //pone en cero lógico al pin LED

delayMicroseconds(4200); // retardo de 4.2 milisegundos

/*Función que envía el uno del protocolo Pioneer*/

void unoPi()

digitalWrite(led, HIGH); //pone en uno lógico al pin LED

delayMicroseconds(500); //retardo de 500 microsegundos

digitalWrite(led, LOW); //pone en cero lógico al pin LED

delayMicroseconds(1500); // retardo de 4.2 milisegundos

/*Función que envía el cero del protocolo Pioneer*/

void ceroPi()

digitalWrite(led, HIGH); //pone en uno lógico al pin LED

delayMicroseconds(500); //retardo de 500 microsegundos

digitalWrite(led, LOW); //pone en cero lógico al pin LED

delayMicroseconds(500); //retardo de 500 microsegundos

Protocolo Denon:

Lee el código que viene de las variables piA , piB, piC, piD, las convierte en un número

binario y empieza a enviar desde el bit LSB hasta el MSB contando 30 bits desde el bit 0

hasta el bit 29.

void Denon(int piA, int piB,int piC, int piD)

for(i=0;i<15;i++)//ciclo que convierte piA en binario ocupando

las primeras 15 localidades del arreglo B

b= piA - ((piA>>1)<<1); //saca el bit LSB de piA

piA= piA>> 1;

B[i]=b; //guarda el bit LSB en la i-esima posición de B

for(i=15;i<30;i++)++)//ciclo que convierte piB en binario

ocupando las ultimas 15 localidades del arreglo B

b= piB - ((piB>>1)<<1); //saca el bit LSB de piA

piB = piB>> 1;

64

B[i]=b; //guarda el bit LSB en la i-esima posición de B

for(i=0;i<15;i++)// saca los bits del arreglo B

b=B[i]; //obtiene el bit alojado en la i-esima posición

switch(b)//pregunta si es uno o cero

case 0:ceroDe();break; //llama a la función ceroDe

case 1:unoDe();break; //llama a la función unoDe

ceroDe();//envia bit que indica fin de primer comando

delay(piC);//retardo en milisegundos del valor de piC

delayMicroseconds(400);//retardo de 400microsegundos

for(i=15;i<30;i++)// saca los ultimos bits del arreglo B

b=B[i]; //obtiene el bit alojado en la i-esima posición

switch(b) //pregunta si es uno o cero

case 0:ceroDe();break; //llama a la función ceroDe

case 1:unoDe();break; //llama a la función ceroDe

ceroDe();//envia bit que indica fin de primer comando

delay(piD); //retardo en milisegundos del valor de piD

delayMicroseconds(400); //retardo de 400 microsegundos

/*Funcion que envia el uno del protocolo Denon*/

void unoDe()

digitalWrite(led, HIGH); //pone en uno lógico al pin LED

delayMicroseconds(400); //retardo de 400 microsegundos

digitalWrite(led, LOW); //pone en uno lógico al pin LED

delayMicroseconds(1800); //retardo de 1800 microsegundos

void ceroDe()

digitalWrite(led, HIGH); //pone en uno lógico al pin LED

delayMicroseconds(400); //retardo de 400 microsegundos

digitalWrite(led, LOW); //pone en uno lógico al pin LED

delayMicroseconds(700); //retardo de 700 microsegundos

65

Capítulo 8. Aplicación Android IrNetwork en Titanium

Appcelerator.

8.1 Descripción del programa Titanium Appcelerator.

La aplicación que se conecta con el servidor Arduino vista en el capítulo anterior

se realizó con ayuda del programa Titanium Appcelerator, esta aplicación se

desarrolló para un dispositivo con sistema operativo Android 2.3.5 Gingerbread

como lo muestra la Figura 10.

Esta aplicación se desarrolló con la versión de 2.0 de Titanium Appcelerator,

este programa nos ayuda a crear aplicaciones sencillas para dispositivos con

sistema operativo Android, ya que se programa en java scrip, con esto no

manejamos código nativo al cual causa un poco de problemas si no se sabe nada

de programación orientada a objetos, como lo es ”java”.

El único inconveniente de este programa es que no existe mucha documentación

relacionada con él, y la poca que existe no está explicada de manera entendible.

Para instalarlo en nuestra computadora necesitamos tener instalado el jdk de java

que en el caso del proyecto fue la versión 1.6, en un equipo con Fedora 15,

también es necesario descargar el sdk de Android el cual nos dará las herramientas

necesarias para poder convertir el código de java scrip, a código nativo de Android

y así poder instalar, manipular y utilizar nuestra aplicación creada en Titanium

Appcelarator.

En la página www.appcelerator.com podemos ver como es el método de

instalación y configuración de la plataforma de desarrollo Titanium Studio, que por

ahora ya está en la versión 3.0.

Por lo que ahora abrimos un nuevo proyecto con el nombre de nuestra aplicación y el

programa automáticamente nos genera varios archivos y carpetas que se utilizan

para compilar nuestra aplicación como lo vemos en la Figura 28.

66

Figura 28.- Creación del nuevo proyecto llamado IrNetwork.

Como podemos ver en la Figura 29 el programa por si solo nos crea carpetas y

archivos por defecto que son en los cuales vamos a trabajar, nosotros podemos

crear más carpetas si lo deseamos, así como archivos para cada una de las ventanas

que manejara nuestra aplicación.

Figura 29.- Carpetas y archivos creados por defecto en el programa.

67

Ahora describiremos las carpetas y archivos con los que se trabajó:

-Carpeta Resourses: Contiene todos los archivos y carpetas en las que se

desarrollara la aplicación.

-Carpeta android: Contiene las imágenes que corresponden a el icono y las

pantallas de inicio de la aplicación Figura 31.Ya que dependiendo el dispositivo

se tiene una imagen para cada uno de ellos, dependiendo de su resolución y

densidad de pantalla.

Figura 31.- Carpeta de imágenes iconos y pantalla inicio.

-Carpeta images: Contiene todas las imágenes que se utilizaron dentro de la

aplicación, tanto como imágenes en botones, iconos, fondos, etc.

-Carpeta mobileweb: Esta no se utilizó pero genera archivos que se pueden

utilizar para generar esta misma aplicación y que se ejecute dentro de un

navegador web.

-Archivo app.js: Es el archivo principal o nuestro main, el cual es el primero que

se ejecuta al correr nuestra aplicación, de este archivo dependen todos los demás

archivos, los cuales se explicaran más adelante.

-Archivos .js: Contienen cada una de las ventanas que se generan a partir del main

principal, los cuales tienen sus propias propiedades, eventos y variables,

independientes del main principal.

Con estos archivos y carpetas es con los que nuestra aplicación trabajara ya que los

demás son creados de manera automática y cada que se compila se crean o

modifican nuevos archivos por defecto.

8.2 Desarrollo de la aplicación.

i) Generamos nuestro icono el cual se guarda en la carpeta android con el

nombre appicon.png, si no la aplicación no lo encontrara y fallara en la

ejecución.

ii) Generamos nuestras pantallas de inicio para la aplicación en las diferentes

densidades y tamaños las cuales llevan el nombre por defecto default.png.

68

Cada una de estas imágenes se guarda dentro de su propia carpeta que

describe la densidad a la cual está destinada como se ve en la Figura 32

Figura 32.- Carpetas para las diferentes densidades imagen inicial.

Estas imágenes están hechas en diferentes tamaños ya que como sabemos no

todos los dispositivos android tienen las mismas dimensiones en pantalla por

lo que se crean estas imágenes para cada uno de ellos.

iii) Dentro de la carpeta Resources como ya se había dicho creamos una carpeta

con las imágenes que se utilizaran dentro de nuestra aplicación y la

nombramos images. En la Figura 33 podemos observar todas las imágenes

que contiene esta carpeta y las cuales se utilizaron en cada una de las

pantallas, botones e iconos que tiene esta.

Figura 33.- Imágenes que se utilizan en la aplicación.

69

iv) La aplicación trabaja de la siguiente manera:

1. Desplegara una pantalla principal en la cual estarán las actividades

que el usuario puede ejecutar (tv, radio, cd, movie, ipod, hmg,

googleTV y Bluetooth) y ahí se quedara esperando hasta que el

usuario seleccione alguna de las actividades o presione el botón

regresar del dispositivo móvil y salir de la aplicación.

2. Si selecciona alguna de las actividades el dispositivo empezara a

enviar peticiones http hacia el servidor, dichas peticiones encenderán

los dispositivos asociados a la actividad seleccionada, configurara

dichos dispositivos y apagara los dispositivos que no tengan que ver

con la actividad seleccionada.

3. Dentro de la actividad seleccionada aparecerán botones para poder

manipular los dispositivos seleccionados en esta actividad ya sea

cambiar canal, subir o bajar el volumen, etc.

4. Si el usuario desea seleccionar alguna otra actividad solo debe

presionar el botón back del dispositivo y este lo llevara a la ventana

principal en donde puede seleccionar una nueva actividad. Y así

realizar el paso número 2.

5. Si el usuario decide que ya no desea realizar alguna actividad y salir

de la aplicación, este debe regresar a la pantalla principal en donde se

encuentra el botón de apagado total. Este botón envía una señal de

apagado a todos los dispositivos y ahora si el usuario puede salir de

la aplicación presionando el botón back del dispositivo, o el botón

home.

v) Los archivos *.js que están dentro de la carpeta Resources Figura 34, con

los que se trabajó para el desarrollo de todas las pantallas que muestra

nuestra aplicación. El único archivo creado por defecto es el archivo app.js

del cual se desprenden todos los demás ya que este es el principal con el que

se mueve toda la aplicación.

70

Figura 34.- Archivos *.js utilizados para la aplicación

vi) Empezamos con el archivo app.js el cual como se mencionó anteriormente

es el principal; ya con la explicación de este archivo, los demás archivos

tienen las mismas funciones y no es necesario explicar cada uno de ellos a

detalle.

- Con esta sentencia estamos diciendo que la aplicación siempre va a

estar de manera vertical aunque el dispositivo este horizontal.

Titanium.UI.orientation=Titanium.UI.PORTRAIT

- Aquí estamos escogiendo el color de fondo que tendrá nuestra pantalla

principal

Titanium.UI.setBackgroundColor('GRAY');

- Variable para la dirección de la conexión al servidor http

var dir='192.168.100.34';

- Creamos la venta principal, con una imagen de fondo contenida en la

carpeta images y le damos la posición vertical por defecto. Si no le

damos la función principal.open() aunque nuestra ventana este creada

no será mostrada.

var principal=Titanium.UI.createWindow(

tile:'principal',

backgroundImage:'/images/fondow.png',

orientationModes:[Titanium.UI.PORTRAIT]

);

principal.open();

71

- Ahora crearemos los iconos que representaran a cada una de las

actividades poniéndolas en una posición especifica de la pantalla, para

esto utilizaremos un ImageView al cual podemos agregarle una

imagen como propiedad, explicaremos el primero y asi será con los

otros.

// creamos una variable de tipo ImageView con el nombre gtv

var gtv=Titanium.UI.createImageView(

image:'/images/gtv.png', //seleccionamos la imagen de la carpeta

images

top:'5dp', //asignamos la posición de arriba hacia abajo

left:'220dp' // selecciona posición de izquierda a derecha

); // fin del ImageView

- A cada ImageView le crearemos su etiqueta del tipo Label con el

nombre de la actividad que representaran cada una, se pondrán en una

posición especifica de la pantalla, debajo de su respectiva ImageView,

explicaremos la primera y así será con las demás.

//creamos una variable del tipo Label llamada lgtv

var lgtv=Titanium.UI.createLabel(

text:'googleTV', // le asignamos el texto que mostrara

color:'#000', // le asignamos el color de la fuente en forma RGB

top:'95dp', // seleccionamos posicion de arriba hacia abajo

left:'230dp'// seleccionamos posicion de izquierda a derecha

); // fin de la etiqueta

- Con esto ya tenemos creado el icono de la actividad y su etiqueta

distribuidos dentro de nuestra pantalla, pero para poder verlos es

necesario agregarlos a la pantalla principal, de lo contrario no se

mostraran al correr la aplicación. Para agregar estos dos objetos solo

debemos agregar las instrucciones.

principal.add(gtv); //agrega el ImageView gtv a la pantalla principal

principal.add(lgtv); //agrega la etiqueta lgtv a la pantalla principal.

- Al terminar de agregar cada una de las ImageView y sus etiquetas

respectivas distribuidas a lo largo de la pantalla tenemos la vista

terminada como lo muestra la Figura 35.

72

Figura 35.- Pantalla principal terminada.

- Con la pantalla principal terminada ahora solo nos queda asignarle

eventos a cada uno de los iconos, que representan cada una de las

diferentes actividades, que se pueden realizar con esta aplicación, para

que cuando sean presionados se active cada uno de los dispositivos

relacionados a la actividad seleccionada.

FUNCION PRINCIPAL PARA “gtv”

gtv.addEventListener('click',function(e)// se agrega un

EventListener del tipo click

var wingtv = Ti.UI.createWindow(// creamos una nueva ventana

llamada wingtv

url:'/gtv.js', // el archivo de diseño de esta ventana está localizado en

Resources

backgroundImage:'/images/fondo.png' // le agregamos una imagen

de fondo a la nueva ventana

); // Terminamos de crear la ventana o nueva vista

73

wingtv.open(modal:true); // la abrimos y con ‘modal:true’

podemos regresar a la pantalla principal cuando presionamos el botón

back del dispositivo, ya que si no se pone nos sacara de la aplicación al

presionar el botón back

// Mientras se abre la ventana se activan y desactivan los dispositivos

asociados a la actividad ‘gtv’

/*****Comando para encender el pionner******/

//Creamos una variable que contiene la instrucción para encender el

AVR Pioneer llamada ‘URLonpi’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Conpi’ la cual

significa ‘cliente-on-pioneer’

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLonpi’

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Conpi.send(); //se envía la petición HTTP del cliente ‘Conpi’ dentro

de la red local, hacia el servidor HTTP

retardo(2); // llamamos a una función de retardo

/*****Comando para encender el proyector****/

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLonproy’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Conproy’ la

cual significa ‘cliente-on-proyector’

var Conproy=Ti.Network.create HTTPClient( );

74

Conproy.open("GET",URLoffproy); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable

‘URLoffproy’ que es lo que se enviará como petición HTTP a través

de la red local hacia el servidor HTTP

Conproy.send();//se envía la petición HTTP del cliente ‘Conproy’

dentro de la red local, hacia el servidor HTTP

retardo(2); // llamamos a una función de retardo

/*******Comando para apagar cd Changer******/

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLoffcd’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Coffcd’ la cual

significa ‘cliente-off-cd’

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLoffcd’

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Coffcd.send();//se envía la petición HTTP del cliente ‘Coffcd’ dentro

de la red local, hacia el servidor HTTP

retardo(2); // llamamos a una función de retardo

/******comando para apagar el blue ray******/

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLoffbr’

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Coffcd’ la cual

significa ‘cliente-off-blue ray’

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLoffcd’

75

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Coffbr.send();//se envía la petición HTTP del cliente ‘Coffcd’ dentro

de la red local, hacia el servidor HTTP

retardo(8); // llamamos a una función de retardo

/**Comando para seleccionar entrada del pionner DVR*****/

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLdvr’

varURLdvr='http://'+dir+'/?P23205N30345P23205N30345=pionee

r'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Cdvr’ la cual

significa ‘cliente-pioneer selección dvr’

var Cdvr=Ti.Network.createHTTPClient( );

Cdvr.open("GET",URLdvr); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLdvr’

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Cdvr.send();//se envía la petición HTTP del cliente ‘Coffcd’ dentro de

la red local, hacia el servidor HTTP

);// fin de nuestro EventListener del tipo click

Con esto ya se encendieron y configuraron los diferentes dispositivos

para la actividad GoogleTV seleccionada por lo que al mostrarse la

pantalla de dicha actividad, esta se quedara en espera de que se

seleccione alguno de los botones que tiene esta actividad, para

manipular alguno de los dispositivos activados, esta actividad y el

diseño de su pantalla se explicaran más adelante.

Cada una de las actividades se programó de la misma manera, a cada

variable se le agrego su EventListener, se creó su propia ventana y se

configuraron los diferentes dispositivos asociados.

76

/* EVENTO AL SELECCIONAR BLUETOOTH */

blue.addEventListener('click',function(e)

var winblue = Ti.UI.createWindow(

url:'/blue.js',

backgroundImage:'/images/fondo.png'

);

winblue.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

/**** EVENTO AL SELECCIONAR tv total play***/

tv.addEventListener('click',function(e)

var wintv = Ti.UI.createWindow(

url:'/tv.js',

backgroundImage:'/images/fondo.png'

);

wintv.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

/***** EVENTO AL SELECCIONAR movie ****/

movie.addEventListener('click',function(e)

var winmovie = Ti.UI.createWindow(

url:'/movie.js',

backgroundImage:'/images/fondo.png'

);

winmovie.open(modal:true);

/*configuración de dispositivos*/

.

.

77

.

);//fin del EventListener click

/***** EVENTO AL SELECCIONAR CD *****/

cd.addEventListener('click',function(e)

var wincd = Ti.UI.createWindow(

url:'/cd.js',

backgroundImage:'/images/fondo.png'

);

wincd.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

/* EVENTO AL SELECCIONAR RADIO */

radio.addEventListener('click',function(e)

var winradio = Ti.UI.createWindow(

url:'/radio.js',

backgroundImage:'/images/fondo.png'

);

winradio.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

/* EVENTO AL SELECCIONAR HMG */

78

hmg.addEventListener('click',function(e)

var winhmg = Ti.UI.createWindow(

url:'/hmg.js',

backgroundImage:'/images/fondo.png'

);

winhmg.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

/* EVENTO AL SELECCIONAR IPOD */

ipod.addEventListener('click',function(e)

var winipod = Ti.UI.createWindow(

url:'/ipod.js',

backgroundImage:'/images/fondo.png'

);

winipod.open(modal:true);

/*configuración de dispositivos*/

.

.

.

);//fin del EventListener click

79

/*EVENTO APAGADO GENERAL DE LOS DISPOSITIVOS*/

// este evento apaga todos los dispositivos y prepara la aplicación para

salir de ella si así se desea

off.addEventListener('click',function(e)

//comando para apagar el pioneer

var

URLoffpi='http://'+dir+'/?P23205N58395P23205N58395=pioneer'

var Coffpi=Ti.Network.createHTTPClient( );

Coffpi.open("GET",URLoffpi);

Coffpi.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(2);

//comando para apagar el proyector

var URLoffproy='http://'+ dir +'/?R52530N64770=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(4);

//confirmación para apagar el proyector

var URLoffproy='http://'+ dir +'/?R52530N64770=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

80

// evento para on-off TOTAL PLAY

var URLpower='http://'+ dir +'/?R64769N09180=PRO'

var Cpower=Ti.Network.createHTTPClient( );

Cpower.open("GET",URLpower);

Cpower.send();

);// fin del EventListener apagado general

/** FUNCION DE RETARDO**/

// a esta función le pasamos como parámetro ‘time’ el tiempo que se

desea esperar por segundos

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)// ciclo para retardar la función

a=0;

//termina función retardo

Para cada una de las ventanas tenemos un archivo que se crea con el

mismo nombre de la actividad seleccionada como se ve en la Figura

34, los cuales tienen la extensión “.js” para poder crear las vistas como

se muestran en las Figuras 36-43.

Estas vistas se crean de la misma manera que se creó la pantalla o vista

principal solo que al inicio de cada archivo tenemos lo siguiente

var win = Titanium.UI.currentWindow;

Esta instrucción nos dice que ya existía una ventana previa por lo que

solo se sobrescribirá el diseño del documento “.js” en esta nueva

ventana.

Continuando con la actividad GoogleTV tenemos el archivo “gtv.js”

que lo explicaremos a detalle.

//Reasigna la ventana creada con esta nueva ventana

var win = Titanium.UI.currentWindow;

// variable de dirección del servidor http

var dir='192.168.100.34';

81

//creamos una variable del tipo ImageView para el botón encendido del

proyector con el nombre on

var on = Titanium.UI.createImageView(

image : '/images/on.png', //le asignamos la imagen de la carpeta

images

top : '5dp', // le asignamos una posición en alto

left : '5dp' // le asignamos la posición a la izquierda

);

//creamos una variable del tipo ImageView para el botón apagado del

proyector con el nombre off

var off = Titanium.UI.createImageView(

image : '/images/off.png', //le asignamos la imagen de la carpeta

images

top : '5dp', // le asignamos una posición en alto

left : '70dp'// le asignamos la posición a la izquierda

);

//creamos una variable del tipo Label(Etiqueta) para el texto Volumen

llamada lvol

var lvol=Titanium.UI.createLabel(

text:'Volume', //le asignamos el texto que se va a mostrar

top:'65dp', // le asignamos una posición en alto

left:'240dp'// le asignamos la posición a la izquierda

);

//creamos una variable del tipo ImageView para el botón + del AVR

Pioneer con el nombre vplus

var vplus = Titanium.UI.createImageView(

url : '/images/up.png', //le asignamos la imagen de la carpeta images

top : '15dp', // le asignamos una posición en alto

left : '240dp'// le asignamos la posición a la izquierda

);

//creamos una variable del tipo ImageView para el botón - del AVR

Pioneer con el nombre vminus

var vminus= Titanium.UI.createImageView(

url:'/images/down.png', //le asignamos la imagen de la carpeta

images

top : '90dp', // le asignamos una posición en alto

left : '240dp'// le asignamos la posición a la izquierda);

82

//creamos una variable del tipo ImageView para el botón mute del

AVR Pioneer con el nombre mute

var mute= Titanium.UI.createButton(

image : '/images/mute.png', //le asignamos la imagen de la carpeta

images

height : '45dp',//le asignamos una altura a la imagen

width : '50dp', //le asignamos un ancho a la imagen

top : '145dp', // le asignamos una posición en alto

left : '240dp'//le asignamos la posición a la izquierda

);

//agregamos las variables a la ventana

win.add(on);

win.add(off);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(mute);

/***AGREGANDO EVENTOS A LOS BOTONES****/

// Evento para encender el proyector

on.addEventListener('click',function(e)//se agrega un

EventListener del tipo click

//comando para encender el proyecctor R52530N64770=PRO

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLonproy’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Conproy’ la

cual significa ‘cliente-on-proyector’

var Conproy=Ti.Network.createHTTPClient( );

Conproy.open("GET",URLonproy); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable

‘URLonproy’ que es lo que se enviará como petición HTTP a través de

la red local hacia el servidor HTTP

83

Conproy.send();//se envía la petición HTTP del cliente ‘Conproy’

dentro de la red local, hacia el servidor HTTP

);// fin del evento encender proyector

// evento para apagar el proyector

off.addEventListener('click',function(e) //se agrega un

EventListener del tipo click

//comando para apagar el proyector R52530N63240=PRO

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLoffproy’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Coffproy’ la

cual significa ‘cliente-off-proyector’

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable

‘URLoffproy’ que es lo que se enviará como petición HTTP a través

de la red local hacia el servidor HTTP

Coffproy.send();//se envía la petición HTTP del cliente ‘Coffproy’

dentro de la red local, hacia el servidor HTTP

retardo(8);// retardo para hacer el segundo envió del comando anterior

//segundo comando para apagar el proyector R52530N63240=PRO

//Creamos una variable que contiene la instrucción para encender el

Proyector llamada ‘URLoffproy’ con la dirección del servidor hacia la

cual será enviada nuestra petición HTTP

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Coffproy’ la

cual significa ‘cliente-off-proyector’

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable

‘URLoffproy’ que es lo que se enviará como petición HTTP a través

de la red local hacia el servidor HTTP

84

Coffproy.send();//se envía la petición HTTP del cliente ‘Coffproy’

dentro de la red local, hacia el servidor HTTP

);// fin del evento apagar proyector

// evento para aumentar el volumen

vplus.addEventListener('click',function(e) )//se agrega un

EventListener del tipo click

// comando para seleccionar vol+ del Pioneer

P23205N62730P23205N62730=Pioneer

//Creamos una variable que contiene la instrucción para aumentar el

volumen del Pioneer AVR llamada ‘URLvplus’ con la dirección del

servidor hacia la cual será enviada nuestra petición HTTP

var

URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

//Creamos una variable del tipo ‘HTTPClient’ llamada ‘Cvplus’ la cual

significa ‘cliente-volume-plus’

var Cvplus=Ti.Network.createHTTPClient();

Cvplus.open("GET",URLvplus); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLvplus’

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Cvplus.send();//se envía la petición HTTP del cliente ‘Cvplus’ dentro

de la red local, hacia el servidor HTTP

);// fin del evento aumentar volumen

// evento para disminuir el volumen

vminus.addEventListener('click',function(e) //se agrega un

EventListener del tipo click

// Comando para seleccionar vol- del Pioneer

P23205N62475P23205N62475=Pioneer

//Creamos una variable que contiene la instrucción para aumentar el

volumen del Pioneer AVR llamada ‘URLvminus’ con la dirección del

servidor hacia la cual será enviada nuestra petición HTTP

var

URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pionee

r'

85

var Cvminus=Ti.Network.createHTTPClient( );//Creamos una

variable del tipo ‘HTTPClient’ llamada ‘Cvminus’ la cual significa

‘cliente-volume-minus’

Cvminus.open("GET",URLvminus); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable

‘URLvminus’ que es lo que se enviará como petición HTTP a través

de la red local hacia el servidor HTTP

Cvminus.send();//se envía la petición HTTP del cliente ‘Cvminus’

dentro de la red local, hacia el servidor HTTP

);//fin del evento disminuir volumen

// evento mute

mute.addEventListener('click',function(e) //se agrega un

EventListener del tipo click

// comando para seleccionar mute del Pioneer

P23205N60690P23205N60690=pioneer

//Creamos una variable que contiene la instrucción para aumentar el

volumen del Pioneer AVR llamada ‘URLmute’ con la dirección del

servidor hacia la cual será enviada nuestra petición HTTP

var

URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient( );//Creamos una

variable del tipo ‘HTTPClient’ llamada ‘Cmute’ la cual significa

‘cliente-mute’

Cmute.open("GET",URLmute); //abrimos la variable con los

parámetros “GET” para obtener lo que está en la variable ‘URLmute’

que es lo que se enviará como petición HTTP a través de la red local

hacia el servidor HTTP

Cmute.send();//se envía la petición HTTP del cliente ‘Cvmute’ dentro

de la red local, hacia el servidor HTTP

);//fin del evento mute

/** FUNCION DE RETARDO**/

// a esta función le pasamos como parámetro ‘time’ el tiempo que se

desea esperar por segundos

86

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)// ciclo para retardar la función

a=0;

//termina función retardo

Ahora mostramos la pantalla o vista de la actividad GoogleTV que se

ve en la Figura 36 la cual fue desarrollada y explicada en el paso

anterior. Quedando así lista para ejecutar alguno de los eventos

también antes mencionados.

Si se desea salir de esta actividad solo se debe presionar el botón back

del dispositivo móvil y regresara a la pantalla principal de la

aplicación.

Figura 36.- Pantalla de la actividad GoogleTV

Lo mismo sucede con cada uno de los archivos .js que se encuentran

dentro de la carpeta Resources, por lo que solo pondremos las vistas de

cada una de las pantallas que representan dichos archivos Figuras 37-

87

43, cabe mencionar que cada pantalla es diferente ya que las

actividades no siempre manejan los mismos dispositivos, unas tienen

más funciones que otras, pero al final tienen mucho parecido unas con

otras en términos del diseño e implementación

Figura 37.-Vista de la actividad Bluetooth

88

Figura 38.- Ventana de la actividad Total play

Figura 39.- Vista de la actividad Movie

89

Figura 40.- Ventana de la actividad cd

Figura 41.- Pantalla Radio

90

Figura 42.- Pantalla HMG

91

Figura 43.- Vista actividad ipod

Con esto ya tenemos toda la parte dela aplicación terminada, solo falta presionar el botón

run, o dando click derecho en el archivo app.js nos desplegara un submenú en donde nos da

la opción de ejecutar aplicación en el emulador de android. Y con esto se nos creara el

archivo de la aplicación app.akp dentro de la carpeta bin, como se muestra en la Figura

44, esta carpeta se encuentra dentro del proyecto que nos genera Titanium Studio por

defecto, dentro de la ruta IrNetwork/build/android/bin.

Figura 44.- Localización del archivo app.apk para ser instalado

Este archivo app.apk es el que se instalara dentro de nuestro dispositivo Tablet Samsung

galaxy wifi 5.0 con Sistema Operativo android 2.3.5, ya sea conectado al programa

Titanium Studio se instalara automáticamente, o por medio de copiar el archivo en la

memoria del dispositivo, utilizamos el explorador de archivos del dispositivo y al encontrar

la aplicación la seleccionamos y esta ejecutara el instalador con lo que ya la veremos

instalada dentro de nuestro dispositivo. Como se muestra en la Figura 45, donde se ve la

aplicación corriendo y esperando a ser utilizada para las diferentes actividades.

92

Figura 45.- Aplicación instalada en el dispositivo Samsung Galaxy S 5.0

Y con esto llegamos al final del proyecto Control Remoto Universal Arduino y Android.

93

9. Conclusiones.

Con este proyecto se aprendió de manera clara como es que funcionan los protocolos

infrarrojos, así de cómo es que la comunicación serial se ocupa en cada uno de ellos.

Aprendimos el manejo del software de desarrollo de Arduino el cual se manejó como el

lenguaje de programación C lo cual nos fue de gran ayuda ya que no se programó el

microcontrolador en ensamblador, y esto nos a la larga nos benefició en el desarrollo del

servidor WEB, así como en la programación de las funciones para cada uno de los

protocolos Ir.

Al trabajar con las nuevas tecnologías, podemos estar al día ya que cualquiera que tenga

un dispositivo con SO Android puede ejecutar nuestra aplicación, y con esto ya podemos

realizar un proyecto más ambicioso, si se desearía producirlo para el desarrollo

empresarial.

Trabajar con el framework Titanium Appcelerator nos facilitó la manera de programar

ya que al estar diseñado para soportar java script nos ahorra mucho tiempo de

programación y esto se vio reflejado en el desarrollo de la aplicación, ya que se avanzó

muy rápido una vez entendido lo que se deseaba realizar, y entendiendo como funcionan

cada una de las funciones utilizadas en esta aplicación.

Podemos decir que el objetivo se alcanzó de manera muy satisfactoria ya que todas y

cada una de las metas propuestas por el asesor Miguel Angel Pizaña, se fueron

cumpliendo poco a poco como el proyecto lo iba pidiendo.

Con la experiencia adquirida en este proyecto se puede decir que programar para las

nuevas tecnologías no es muy complicado, solo es cuestión de estudiar bien el problema

y dividirlo en pequeñas metas para irlas cumpliendo una por una.

La bibliografía y la página principal de la tecnología Arduino, está muy bien explicada y

con ejemplos propios del desarrollo de esta placa. Por otra parte la bibliografía y página

principal de Titanium Appcelerator no es tan clara, ya que al ser una nueva plataforma

de desarrollo esta no tiene muchos ejemplos pero al final haciendo pruebas se obtuvo la

mejor solución al problema.

94

10. Bibliografia

- Arduino

Página principal en español http://www.arduino.cc/es/

- Titanium Appcelerator

Pagina principal

http://docs.appcelerator.com/titanium/latest/#!/guide/Quick_Start

Libro Appcelerator Titanium Smartphone App Development Cookbook

- Protocolos infrarrojos

Pagina de referencia

http://www.espelectronicdesign.com/Protocolos/protocolo_SIRC.php

95

11. Anexos

11.1 Apéndice A. Códigos en Arduino. //bibliotecas

#include <SPI.h>

#include <Ethernet.h>

//asignando mac

byte mac[] = 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED ;

/* -------------- DIRECCION IP ----------------*/

byte ip[] = 192,168,100,34; // aqui es donde debe cambiar la

direccion IP del arduino

EthernetServer server(80);//ethernet servidor por el puerto 80

/***** deficion de variables******/

int cont; // contador

int led = 2; // variable para el pin de salida digital numero 2

unsigned int x=0; // variable sin signo para guarder el dato del

protocolo sirc

int i,b;//variables auxiliaries

int necA,necB,piA,piB,piC,piD; // variables para los datos de los

protocolos NEC, Pioneer

// Arreglos para guardar los bits de cada protocolo

int A[12];

int B[32];

int C[32];

//banderas para los protocolos

boolean flatNEC = false;

boolean flatSirc = false;

boolean flatDenon= false;

boolean flatPioneer= false;

boolean reading = false;

//HTML creacion de formulario

const char html[] =

"<html><head>"

"<TITLE> ARDUINO ETHERNET CONTROL REMOTO</TITLE>"

"<head>"

"<body>"

"<h1> control remoto infrarrojo arduino ethernet </h1>"

"<FORM>"

"<P><INPUT TYPE='Submit' VALUE='ROJO' NAME='S128'

STYLE='width:150px; heigth:100px; background-color:#ff0000'>"

"<P><INPUT TYPE='Submit' VALUE='ROJO' NAME='S129'

STYLE='width:150px; heigth:100px; background-color:#ff0000'>"

96

P><INPUT TYPE='Submit' VALUE='VOL+' NAME='S144' STYLE='width:150px;

heigth:100px; background-color:#ff0000'>"

"<P><INPUT TYPE='Submit' VALUE='VOL-' NAME='S145'

STYLE='width:150px; heigth:100px; background-color:#ff0000'>"

"<P><INPUT TYPE='Submit' VALUE='VERDE' NAME='R65280N27795'

STYLE='width:150px; heigth:100px; background-color:#00ff00'>"

"<P><INPUT TYPE='Submit' VALUE='VERDE1' NAME='R65280N15045'

STYLE='width:150px; heigth:100px; background-color:#00ff00'>"

"<P><INPUT TYPE='Submit' VALUE='pioneer'

NAME='P23205N41820P23205N16065' STYLE='width:150px; heigth:100px;

background-color:#99FFFF'>"

"<P><INPUT TYPE='Submit' VALUE='Denon' NAME='D2952N29800P45N43'

STYLE='width:150px; heigth:100px; background-color:#66FFFF'>"

"</FORM>"

"</body></html>";

//Función de configuración

void setup()

Serial.begin(9600);// velocidad de comunicación

Ethernet.begin(mac, ip);// asignando la mac e ip al puerto

Ethernet

server.begin(); //iniciando el servidor

//activar pin de salida

pinMode(led, OUTPUT);

/***** ciclo infinito o programa principal****/

void loop()

// Escuchar a los clientes que entran

EthernetClient client = server.available();

if (client)

// una peticion http termina con una linea en blanco

boolean currentLineIsBlank = true;

boolean sentHeader = false;

server.print(html);//puesta HTML en servidor

//arreglos de tipo char para la lectura

char codigo[9]="";

char nec1[6]="";

char nec2[6]="";

char nec3[6]="";

char nec4[6]="";

int index=0;// indice para los arreglos

while (client.connected())// mientras hay un cliente

if (client.available()) // si el cliente esta

activo

if(!sentHeader) // si se ha enviado el

formulario

97

sentHeader = true;

//lee un character de la url o peticion

char c = client.read();

if(reading && c == ' ') reading = false; // si la bandera reading

esta activa y el character leido es vacio pone la bandera rading en

falso

if(c == '?') reading = true; //encuentra ?

donde inicia la informacion

if(reading)//sigue leyendo

Serial.print(c);//imprime lo que

recibe del cliente

if(c == 'R')//si lo que se lee después

de ?

// es igual a la letra R

flatNec = true;//activa la bandera Nec

//desactiva las banderas de los protocolos

flatSirc = false;

flatPioneer = false;

flatDenon = false;

//mientras el carácter leído sea diferente de 'N'

while(c!='N')

c=client.read();//lee el

carácter

nec1[index]=c;//lo guarda en

la

//posición

index++; //incrementa la

posición

nec1[6]='\0';// asigna un fin de

cadena

// en la posición 6

necA=atoi(nec1);//convierte el

arreglo en entero

//y lo guarda en la variable

index=0;//limpia el índice

while(c!='=')//continua leyendo hasta encontar un =

c=client.read();//lee el

carácter

nec2[index]=c; //lo guarda el

la

//posición

index++;//incrementa la

posición

98

nec2[6]='\0';//asigna un fin de

cadena

// en la posicion 6

necB=atoi(nec2);//convierte el

arreglo

//en entero y lo guarda en la

variable

break;//sale del ciclo de

lectura

if(c == 'P') //si lo que se lee después de ?

// es igual a la letra P

flatPioneer = true;//activa la bandera Pioneer

//desactiva las banderas de los protocolos

flatSirc = false;

flatPioneer = false;

flatNec=false;

//mientras el carácter leído sea diferente

de 'N'

while(c!='N')

c=client.read();//lee el carácter

nec1[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec1[6]='\0'; // asigna un fin de cadena

// en la posición 6

piA=atoi(nec1); //convierte el arreglo en

entero

//y lo guarda en la variable

index=0; //limpia el índice

//mientras el carácter leído sea diferente

de 'P'

while(c!='P')

c=client.read();//lee el carácter

nec2[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec2[6]='\0'; // asigna un fin de cadena

// en la posición 6

piB=atoi(nec2); //convierte el arreglo

// en entero y lo guarda

index=0; //limpia el índice

//mientras el carácter leído sea diferente

de 'N'

while(c!='N')

99

c=client.read();//lee el carácter

nec3[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec3[6]='\0'; // asigna un fin de cadena

// en la posición 6

piC=atoi(nec3); //convierte el arreglo

// en entero y lo guarda

index=0; //limpia el índice

//mientras el carácter leído sea diferente

de '='

while(c!='=')

c=client.read();//lee el carácter

nec4[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec4[6]='\0'; // asigna un fin de cadena

// en la posición 6

piD=atoi(nec4); //convierte el arreglo en

entero

//y lo guarda en la variable

break;// Sale del ciclo de lectura

if(c == 'D') //si lo que se lee después de ?

// es igual a la letra D

flatDenon = true;//activa la bandera Denon

//desactiva las banderas de los protocolos

flatSirc = false;

flatPioneer = false;

flatNec = false;

//mientras el carácter leído sea diferente de 'N'

while(c!='N')

c=client.read();//lee el carácter

nec1[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec1[5]='\0'; // asigna un fin de cadena

// en la posición 5

piA=atoi(nec1); //convierte el arreglo en

entero

//y lo guarda en la variable

index=0; //limpia el índice

//mientras el carácter leído sea diferente

de 'P'

100

while(c!='P')

c=client.read();//lee el carácter

nec2[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec2[6]='\0'; // asigna un fin de cadena

// en la posición 6

piB=atoi(nec2);//convierte el arreglo en

entero

//y lo guarda en la variable

index=0;//limpia el índice

//mientras el carácter leído sea diferente de 'N'

while(c!='N')

c=client.read();//lee el carácter

nec3[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec3[2]='\0'; // asigna un fin de cadena

// en la posición 3

piC=atoi(nec3);//convierte el arreglo

en entero

//y lo guarda en la variable

index=0; //limpia el índice

//mientras el carácter leído sea diferente de '='

while(c!='=')

c=client.read();//lee el carácter

nec4[index]=c; //lo guarda el la

//posición

index++;//incrementa la posición

nec4[2]='\0'; // asigna un fin de cadena

// en la posición 2

piD=atoi(nec4); //convierte el arreglo

en entero

//y lo guarda en la variable

break;// sale del ciclo de lectura

if(c == 'S') )//si lo que se lee después

de ?

// es igual a la letra S

flatSirc = true;//activa la bandera Sirc

//desactiva las banderas de los protocolos

flatNec = false;

flatPioneer = false;

flatDenon = false;

101

while(c!='=')//mientras el carácter

//leído sea diferente de '='

c=client.read();//lee el

carácter

codigo[index]=c; //lo guarda en

la

//posición

index++;//incrementa la posición

codigo[5]='\0';//asigna un fin

de cadena

// en la posición 5

x=atoi(codigo); //convierte el

arreglo en entero

break;// fin del ciclo de

lectura

if (c == '\n' && currentLineIsBlank)

break;//si carácter es un salto de linea y la bandera esta activada

regresa al ciclo principal para esperar una nueva petición HTTP

if (c == '\n')// si el caracter es igual a

un salto de linea

currentLineIsBlank = true;// cambia la

bandera a verdadero

else if (c != '\r') // otro caso si

character es igual a salto de carro

currentLineIsBlank = false; //

desactiva la bandera

delay(1); // retardo

client.stop(); // cierra la conexión con el cliente

if (flatSirc == true) //si la bandera Sirc esta activada

flatSirc=false;// desactiva la bandera

sirc(x);// llama a la función que implementa el protocolo

sirc con la variable x

// fin del protocolo sirc

if (flatNec == true) //si la bandera Nec esta activada

flatNec=false; // desactiva la bandera Nec

nec(necA, necB); //llama a la función que implementa el

protocolo Nec

//fin del protocolo Nec

102

if (flatPioneer == true) //si la bandera Pioneer esta

activada

flatPioneer=false;// desactiva la bandera

Pioneer(piA, piB, piC, piD);//llama a la función que

implementa el protocolo Pioneer

//fin del protocolo Pioneer

if (flatDenon == true) //si la bandera Denon esta activada

flatDenon=false;//desactiva la bandera

Denon(piA, piB, piC, piD); );//llama a la función que

implementa el protocolo Denon

Fin del protocolo Denon

//Fin del programa principal ciclo infinito

void sirc(unsigned int x)

unsigned int y;

y=x;

cont=3;

for(i=0;i<12;i++)

b= y - ((y>>1)<<1);

y = y>> 1;

A[i]=b;

while(cont!=0)

trama();

for(i=0;i<12;i++)

b=A[i];

switch(b)

case 0:cero();break;

case 1:uno();break;

findato();

delay(26);

delayMicroseconds(800);

cont=cont-1;

void findato()

cero();

uno();

cero();

cero();

cero();

uno();

uno();

uno();

void trama()

/*trama de inicio*/

103

digitalWrite(led, HIGH);

delayMicroseconds(2400);

digitalWrite(led, LOW);

delayMicroseconds(600);

void uno()

digitalWrite(led, HIGH);

delayMicroseconds(1190);

digitalWrite(led, LOW);

delayMicroseconds(590);

void cero()

digitalWrite(led, HIGH);

delayMicroseconds(595);

digitalWrite(led, LOW);

delayMicroseconds(595);

void nec(int necA, int necB)

for(i=0;i<16;i++)

b= necA - ((necA>>1)<<1);

necA= necA>> 1;

B[i]=b;

for(i=16;i<32;i++)

b= necB - ((necB>>1)<<1);

necB = necB>> 1;

B[i]=b;

tramaNec();

for(i=0;i<32;i++)

b=B[i];

switch(b)

case 0:ceroNec();break;

case 1:unoNec();break;

ceroNec();

delay(54);

delayMicroseconds(800);

104

void tramaNec()

digitalWrite(led, HIGH);

delay(9);

digitalWrite(led, LOW);

delayMicroseconds(4500);

void unoNec()

digitalWrite(led, HIGH);

delayMicroseconds(560);

digitalWrite(led, LOW);

delayMicroseconds(1690);

void ceroNec()

digitalWrite(led, HIGH);

delayMicroseconds(560);

digitalWrite(led, LOW);

delayMicroseconds(560);

void Pioneer(int piA, int piB,int piC, int piD)

for(i=0;i<16;i++)

b= piA - ((piA>>1)<<1);

piA= piA>> 1;

B[i]=b;

for(i=16;i<32;i++)

b= piB - ((piB>>1)<<1);

piB = piB>> 1;

B[i]=b;

for(i=0;i<16;i++)

b= piC - ((piC>>1)<<1);

piC= piC>> 1;

C[i]=b;

for(i=16;i<32;i++)

b= piD - ((piD>>1)<<1);

piD = piD>> 1;

C[i]=b;

105

for (cont=0; cont<2;cont++)

tramaPi();

for(i=0;i<32;i++)

b=B[i];

switch(b)

case 0:ceroPi();break;

case 1:unoPi();break;

ceroPi();

delay(27);

tramaPi();

for(i=0;i<32;i++)

b=C[i];

switch(b)

case 0:ceroPi();break;

case 1:unoPi();break;

ceroPi();

delay(27);

void tramaPi()

digitalWrite(led, HIGH);

delayMicroseconds(8400);

digitalWrite(led, LOW);

delayMicroseconds(4200);

void unoPi()

digitalWrite(led, HIGH);

delayMicroseconds(500);

digitalWrite(led, LOW);

delayMicroseconds(1500);

void ceroPi()

digitalWrite(led, HIGH);

delayMicroseconds(500);

digitalWrite(led, LOW);

delayMicroseconds(500);

void Denon(int piA, int piB,int piC, int piD)

106

for(i=0;i<15;i++)

b= piA - ((piA>>1)<<1);

piA= piA>> 1;

B[i]=b;

for(i=15;i<30;i++)

b= piB - ((piB>>1)<<1);

piB = piB>> 1;

B[i]=b;

for(i=0;i<15;i++)

b=B[i];

switch(b)

case 0:ceroDe();break;

case 1:unoDe();break;

ceroDe();

delay(piC);

delayMicroseconds(400);

for(i=15;i<30;i++)

b=B[i];

switch(b)

case 0:ceroPi();break;

case 1:unoPi();break;

ceroDe();

delay(piD);

delayMicroseconds(400);

void unoDe()

digitalWrite(led, HIGH);

delayMicroseconds(400);

digitalWrite(led, LOW);

delayMicroseconds(1800);

void ceroDe()

digitalWrite(led, HIGH);

delayMicroseconds(400);

digitalWrite(led, LOW);

107

delayMicroseconds(700);

11.2 Apéndice B. Códigos en Titanium Studio.

app.js //seleccionando la orientación siempre vertical (PORTRAIT)

Titanium.UI.orientation=Titanium.UI.PORTRAIT

// SELECCIONANDO EL COLOR DE FONDO (GRAY)

Titanium.UI.setBackgroundColor('GRAY');

// variable para la direccion de la conexion http

var dir='192.168.100.34';

// FUNCION PARA CREAR UNA VENTANA CON EL NOMBRE (PRINCIPAL)

CAMBIANDO SOLO SUS PROPIEDADES

var principal=Titanium.UI.createWindow(

tile:'principal',//SELECCIONA EL TITULO

backgroundImage:'/images/fondow.png',//SELECCIONA LA IMAGEN

DE LA CARPETA IMAGES

orientationModes:[Titanium.UI.PORTRAIT]//RETOMA LA

ORIENTACION EN VERTICAL

);

principal.open();// INSTRUCCION PARA MOSTRAR LA VENTANA

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE GoogleTV

var gtv=Titanium.UI.createImageView(

image:'/images/gtv.png',//SELECCIONANDO EL ICONO GoogleTV

top:'5dp',// POSICION A LO ALTO

left:'220dp'// POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO GoogleTV

var lgtv=Titanium.UI.createLabel(

text:'googleTV',// TEXTO A MOSTRARSE

color:'#000',// COLOR DE LA FUENTE

top:'95dp',// POSICION A LO ALTO

left:'230dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE TV

var tv=Titanium.UI.createImageView(

image:'/images/tv1.png',//SELECCIONANDO EL ICONO

top:'5dp',// POSICION A LO ALTO

left:'110dp'//POSCION A LA IZQUIERDA

);

108

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE TV

var ltv=Titanium.UI.createLabel(

text:'TV',// TEXTO A MOSTRARSE

color:'#000',// COLOR DE LA FUENTE

top:'95dp',//POSICION A LO ALTO

left:'135dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO MOVIE

var movie=Titanium.UI.createImageView(

image:'/images/movie.png',// SELECCION DEL ICONO

top:'140dp',//POSICION A LO ALTO

left:'5dp'//POSCION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO MOVIE

var lmov=Titanium.UI.createLabel(

text:'Movie',//TEXTO A MOSTRAR

color:'#000',//COLOR DE LA FUENTE

top:'230dp',//POSICION A LO ALTO

left:'20dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE CD

var cd=Titanium.UI.createImageView(

image:'/images/cd.png',//SELECION DEL ICONO

top:'140dp',// POSICION A LO ALTO

left:'110dp'//POSCION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE CD

var lcd=Titanium.UI.createLabel(

text:'CD',//TEXTO A MOSTRAR

color:'#000',//COLOR DE LA FUENTE

top:'230dp',//POSICION A LO ALTO

left:'135dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE IPOD

var ipod=Titanium.UI.createImageView(

image:'/images/ipod.png',// SELECCIONANDO EL ICONO

top:'140dp',//POSCION A LO ALTO

left:'220dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE IPOD

var lipod=Titanium.UI.createLabel(

text:'ipod',//TEXTO A MOSTRAR

109

color:'#000',//COLOR DE LA FUENTE

top:'230dp',//POSICION A LO ALTO

left:'230dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE

BLUETOOTH

var blue=Titanium.UI.createImageView(

image:'/images/bluetoth.png',//SELECCIONANDO EL ICONO

top:'280dp',//POSICION A LO ALTO

left:'5dp'// POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE BLUETOOTH

var lblue=Titanium.UI.createLabel(

text:'Bluetooth',//TEXTO A MOSTRAR

color:'#000',//COLOR DE LA FUENTE

top:'370dp',//POSICION A LO ALTO

left:'20dp'// POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE RADIO

var radio=Titanium.UI.createImageView(

image:'/images/radio.png',4// SELECCIONANDO EL ICONO

top:'280dp',//POSICION A LO ALTO

left:'110dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE RADIO

var lradio=Titanium.UI.createLabel(

text:'Radio',//TEXTO A MOSTRAR

color:'#000',//COLOR DE LA FUENTE

top:'370dp',//POSICION A LO ALTO

left:'135dp'// POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO DE HGMG

var hmg=Titanium.UI.createImageView(

image:'/images/hmg.png',//SELECION DEL ICONO

top:'280dp',//POSICION A LO ALTO

left:'220dp'//POSCION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO DE HMG

var lhmg=Titanium.UI.createLabel(

text:'HMG',// TEXTO A MOSTRAR

color:'#000',//COLOR DE FUENTE

top:'370dp',//POSICION A LO ALTO

110

left:'230dp'//POSICION A LA IZQUIERDA

);

//CREANDO UNA VARIABLE IMAGEVIEW PARA MOSTRAR EL ICONO OFF

var off = Titanium.UI.createImageView(

image : '/images/off.png',//SELECCION DEL ICONO

top : '400dp',// POSICION A LO ALTO

);

//CREANDO UNA VARIABLE LABEL PARA EL ICONO OFF

var loff=Titanium.UI.createLabel(

text:'OFF',//TEXTO A MOSTRAR

font:fontSize:48,//TAMAÑO DE LA FUENTE

color:'#F00',//COLOR DE LA FUENTE

top:'400dp',//POCSICION A LO ALTO

left:'85dp'// POSICION A LA IZQUIERDA

);

//AGREGANDO CADA UNO DE LOS ELEMENTOS CREADOS A LA VENTANA

PRINCIPAL

principal.add(loff);

principal.add(hmg);

principal.add(lhmg);

principal.add(radio);

principal.add(lradio);

principal.add(lblue);

principal.add(blue);

principal.add(ipod);

principal.add(lipod);

principal.add(cd);

principal.add(lcd);

principal.add(movie);

principal.add(lmov);

principal.add(tv);

principal.add(ltv);

principal.add(lgtv);

principal.add(gtv);

principal.add(off);

/***************** AGREGAR EVENTOS A LOS ICONOS*************/

/* EVENTO AL SELECCIONAR BLUETOOTH */

blue.addEventListener('click',function(e)// AGREGANDO UN

EventListener DEL TIPO click

var winblue = Ti.UI.createWindow(//CREANDO UNA NUEVA VENTANA

PARA LA ACTIVIDAD BLUETOOTH

url:'/blue.js',//UBICACION DEL ARCHIVO js EL CUAL YA

TIENE EL DISEÑO DE LA NUEVA VENTANA

111

backgroundImage:'/images/fondo.png'//SELECCION DE LA

IMAGEN DE FONDO PARA LA NUEVA VENTANA

);

winblue.open(modal:true);// MOSTRANDO LA VENTANA CON LA

OPCION DE REGRESO A LA PANTALLA ANTERIOR

/*CONFIGURACION, ENCENDIDO Y APAGADO DE LOS DIFERENTES

DISPOSITIVOS PARA LA ACTIVIDAD BLUETOOTH*/

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'//

CREANDO VARIABLE DEL TIPO URL

var Conpi=Ti.Network.createHTTPClient( ); // CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Conpi.open("GET",URLonpi);// PONIENDO LA URL EN EL CLIENTE

Conpi.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'//

CREANDO VARIABLE DEL TIPO URL

var Coffcd=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffcd.open("GET",URLoffcd);// PONIENDO LA URL EN EL CLIENTE

Coffcd.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE'// CREANDO

VARIABLE DEL TIPO URL

var Coffbr = Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffbr.open("GET", URLoffbr);// PONIENDO LA URL EN EL CLIENTE

Coffbr.send(); // ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(8);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para seleccionar entrada del pionner VIDEO1 RECIBER

var

URLv1='http://'+dir+'/?P23205N59670P23205N59670=pioneer'// CREANDO

VARIABLE DEL TIPO URL

var Cv1=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Cv1.open("GET",URLv1);// PONIENDO LA URL EN EL CLIENTE

Cv1.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar el proyecctor

112

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'// CREANDO

VARIABLE DEL TIPO URL

var Coffproy=Ti.Network.createHTTPClient();// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffproy.open("GET",URLoffproy);// PONIENDO LA URL EN EL

CLIENTE

Coffproy.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(4);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'// CREANDO

VARIABLE DEL TIPO URL

var Coffproy=Ti.Network.createHTTPClient();// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffproy.open("GET",URLoffproy);// PONIENDO LA URL EN EL

CLIENTE

Coffproy.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

);//TERMINA EL EventListener BLUETOOTH

/* EVENTO AL SELECCIONAR Google TV */

gtv.addEventListener('click',function(e)// AGREGANDO UN

EventListener DEL TIPO click

var wingtv = Ti.UI.createWindow(//CREANDO UNA NUEVA VENTANA

PARA LA ACTIVIDAD GoogleTV

url:'/gtv.js',//UBICACION DEL ARCHIVO js EL CUAL YA

TIENE EL DISEÑO DE LA NUEVA VENTANA

backgroundImage:'/images/fondo.png'//SELECCION DE LA

IMAGEN DE FONDO PARA LA NUEVA VENTANA

);

wingtv.open(modal:true);// MOSTRANDO LA VENTANA CON LA

OPCION DE REGRESO A LA PANTALLA ANTERIOR

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'//

CREANDO VARIABLE DEL TIPO URL

var Conpi=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Conpi.open("GET",URLonpi);// PONIENDO LA URL EN EL CLIENTE

Conpi.send();// ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para encender el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N64770=PRO'// CREANDO

VARIABLE DEL TIPO URL

var Coffproy=Ti.Network.createHTTPClient();// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

113

Coffproy.open("GET",URLoffproy);// PONIENDO LA URL EN EL

CLIENTE

Coffproy.send(); //ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'//

CREANDO VARIABLE DEL TIPO URL

var Coffcd=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffcd.open("GET",URLoffcd);// PONIENDO LA URL EN EL CLIENTE

Coffcd.send();//ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);// ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';// CREANDO

VARIABLE DEL TIPO URL

var Coffbr = Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffbr.open("GET", URLoffbr);// PONIENDO LA URL EN EL CLIENTE

Coffbr.send(); //ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(8);//ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

// comando para seleccionar entrada del pionner DVR

var

URLdvr='http://'+dir+'/?P23205N30345P23205N30345=pioneer'//

CREANDO VARIABLE DEL TIPO URL

var Cdvr=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Cdvr.open("GET",URLdvr);// PONIENDO LA URL EN EL CLIENTE

Cdvr.send();//ENVIANDO LA PETICION HTTP AL SERVIDOR

);//TERMINA EL EventListener GoogleTV

/* EVENTO AL SELECCIONAR tv total play*/

tv.addEventListener('click',function(e)// AGREGANDO UN

EventListener DEL TIPO click

var wintv = Ti.UI.createWindow(//CREANDO UNA NUEVA VENTANA

PARA LA ACTIVIDAD GoogleTV

url:'/tv.js',//UBICACION DEL ARCHIVO js EL CUAL YA

TIENE EL DISEÑO DE LA NUEVA VENTANA

backgroundImage:'/images/fondo.png'//SELECCION DE LA

IMAGEN DE FONDO PARA LA NUEVA VENTANA

);

wintv.open(modal:true);// MOSTRANDO LA VENTANA CON LA

OPCION DE REGRESO A LA PANTALLA ANTERIOR

//comando para encender el pionner

114

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'//

CREANDO VARIABLE DEL TIPO URL

var Conpi=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Conpi.open("GET",URLonpi);// PONIENDO LA URL EN EL CLIENTE

Conpi.send();//ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);//ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para encender el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N64770=PRO'// CREANDO

VARIABLE DEL TIPO URL

var Coffproy=Ti.Network.createHTTPClient();// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffproy.open("GET",URLoffproy);// PONIENDO LA URL EN EL

CLIENTE

Coffproy.send();//ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(4);//ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'//

CREANDO VARIABLE DEL TIPO URL

var Coffcd=Ti.Network.createHTTPClient( );// CREANDO UNA

VARIABLE DEL TIPO CLIENTE HTTP

Coffcd.open("GET",URLoffcd);// PONIENDO LA URL EN EL CLIENTE

Coffcd.send();//ENVIANDO LA PETICION HTTP AL SERVIDOR

retardo(2);//ESPERANDO A QUE SE REALICE LA PETICION ANTERIOR

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(8);

// comando para seleccionar entrada del pionner DVD

var URLdvd='http://'+dir+'/?P23205N31365P23205N31365=pioneer'

var Cdvd=Ti.Network.createHTTPClient(

);

Cdvd.open("GET",URLdvd);

Cdvd.send();

);

/* EVENTO AL SELECCIONAR movie */

movie.addEventListener('click',function(e)

var winmovie = Ti.UI.createWindow(

url:'/movie.js',

backgroundImage:'/images/fondo.png'

115

);

winmovie.open(modal:true);

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para encender el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N64770=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para encender el blue ray

var URLoffbr = 'http://'+dir+'/?S3374=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(8);

// comando para seleccionar entrada del pionner BD

var URLbd='http://'+dir+'/?P23205N41820P23205N16320=pioneer'

var Cbd=Ti.Network.createHTTPClient( );

Cbd.open("GET",URLbd);

Cbd.send();

);

/* EVENTO AL SELECCIONAR CD */

cd.addEventListener('click',function(e)

var wincd = Ti.UI.createWindow(

url:'/cd.js',

backgroundImage:'/images/fondo.png'

);

wincd.open(modal:true);

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

116

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para encender cd changer

var URLoffcd='http://'+dir+'/?D3688N29064P44N45=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(12);

// comando para seleccionar entrada del pionner TV

var URLtv='http://'+dir+'/?P23205N62220P23205N62220=pioneer'

var Ctv=Ti.Network.createHTTPClient( );

Ctv.open("GET",URLtv);

Ctv.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(4);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

/* EVENTO AL SELECCIONAR IPOD */

ipod.addEventListener('click',function(e)

var winipod = Ti.UI.createWindow(

url:'/ipod.js',

backgroundImage:'/images/fondo.png'

);

winipod.open(modal:true);

117

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(8);

// comando para seleccionar entrada del pionner IPOD

var

URLipod='http://'+dir+'/?P23205N24990P23205N13515=pioneer'

var Cipod=Ti.Network.createHTTPClient( );

Cipod.open("GET",URLipod);

Cipod.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

/* EVENTO AL SELECCIONAR RADIO */

radio.addEventListener('click',function(e)

var winradio = Ti.UI.createWindow(

url:'/radio.js',

118

backgroundImage:'/images/fondo.png'

);

winradio.open(modal:true);

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(8);

// comando para seleccionar entrada del pionner TUNER

var

URLtuner='http://'+dir+'/?P23205N47175P23205N47175=pioneer'

var Ctuner=Ti.Network.createHTTPClient( );

Ctuner.open("GET",URLtuner);

Ctuner.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

119

hmg.addEventListener('click',function(e)

var winhmg = Ti.UI.createWindow(

url:'/hmg.js',

backgroundImage:'/images/fondo.png'

);

winhmg.open(modal:true);

//comando para encender el pionner

var

URLonpi='http://'+dir+'/?P23205N58650P23205N58650=pioneer'

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(8);

// comando para seleccionar entrada del pionner HMG

var URLhmg='http://'+dir+'/?P23205N41820P23205N16065=pioneer'

var Chmg=Ti.Network.createHTTPClient( );

Chmg.open("GET",URLhmg);

Chmg.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

120

);

off.addEventListener('click',function(e)

//comando para apagar el pionner

var

URLonpi='http://'+dir+'/?P23205N58395P23205N58395=pioneer'

var Conpi=Ti.Network.createHTTPClient( );

Conpi.open("GET",URLonpi);

Conpi.send();

retardo(2);

//comando para apagar cd changer

var URLoffcd='http://'+dir+'/?D4008N28744P44N46=Denon'

var Coffcd=Ti.Network.createHTTPClient( );

Coffcd.open("GET",URLoffcd);

Coffcd.send();

retardo(2);

//comando para apagar el blue ray

var URLoffbr = 'http://'+dir+'/?S3375=BLUE';

var Coffbr = Ti.Network.createHTTPClient( );

Coffbr.open("GET", URLoffbr);

Coffbr.send();

retardo(2);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(4);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(2);

// evento para on-off TOTAL PLAY

var URLpower='http://'+ dir +'/?R64769N09180=PRO'

var Cpower=Ti.Network.createHTTPClient( );

Cpower.open("GET",URLpower);

Cpower.send();

);

// funcion de retardo

121

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)

a=0;

Blue.js var win = Titanium.UI.currentWindow;

// variable para la direccion IP de la conexion http

var dir='192.168.100.34';

var lbt=Titanium.UI.createLabel(

text:'Bluetooth',

top:'5dp',

font:fontSize:40,

color:'#DDD'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'105dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

top : '55dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '130dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '185dp'

);

win.add(lvol);

122

win.add(vplus);

win.add(vminus);

win.add(mute);

win.add(lbt);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient( );

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient( );

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient( );

Cmute.open("GET",URLmute);

Cmute.send();

);

Cd.js var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var lcd=Titanium.UI.createLabel(

text:'CD',

top:'5dp',

font:fontSize:48,

123

color:'#DDD'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

var play= Titanium.UI.createButton(

title : 'Play',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '250dp',

left : '165dp'

);

var Dmas= Titanium.UI.createButton(

title : 'D+',

font :

124

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '150dp',

left : '5dp'

);

var Dmenos= Titanium.UI.createButton(

title : 'D-',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '150dp',

left : '65dp'

);

var next = Titanium.UI.createImageView(

image : '/images/next.png',

top : '40dp',

left : '65dp'

);

var back = Titanium.UI.createImageView(

url : '/images/back.png',

top : '40dp',

left : '5dp'

);

var skipl = Titanium.UI.createImageView(

url : '/images/lskip.png',

//height : '50dp',

//width : '55dp',

top : '90dp',

left : '5dp'

);

125

var pause= Titanium.UI.createImageView(

url:'/images/pause.png',

top : '250dp',

left : '220dp'

);

var skipr = Titanium.UI.createImageView(

url : '/images/rskip.png',

//height : '50dp',

//width : '55dp',

top : '90dp',

left : '65dp'

);

var open = Titanium.UI.createImageView(

url:'/images/open.png',

//height : '50dp',

//width : '55dp',

top : '250dp',

left : '60dp'

);

var bstop= Titanium.UI.createImageView(

url : '/images/stop.png',

//height : '50dp',

//width : '55dp',

top : '250dp',

left : '110dp'

);

win.add(skipr);

win.add(play);

win.add(skipl);

win.add(pause);

win.add(back);

win.add(next);

win.add(bstop);

win.add(open);

win.add(mute);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(Dmas);

win.add(Dmenos);

win.add(lcd);

126

// evento <<

skipl.addEventListener('click',function(e)

// comando para seleccionar << denon

var URLskipl='http://'+dir+'/?D2920N29832P45N45=Denon'

var Cskipl=Ti.Network.createHTTPClient( );

Cskipl.open("GET",URLskipl);

Cskipl.send();

);

// evento >>

skipr.addEventListener('click',function(e)

// comando para seleccionar >> denon

var URLskipr='http://'+dir+'/?D2888N29864P46N44=Denon'

var Cskipr=Ti.Network.createHTTPClient( );

Cskipr.open("GET",URLskipr);

Cskipr.send();

);

// evento |<<

back.addEventListener('click',function(e)

// comando para seleccionar |<< denon

var URLback='http://'+dir+'/?D2856N29896P43N43=Denon'

var Cback=Ti.Network.createHTTPClient( );

Cback.open("GET",URLback);

Cback.send();

);

// evento >>|

next.addEventListener('click',function(e)

// comando para seleccionar >>| denon

var URLnext='http://'+dir+'/?D2824N29928P43N43=Denon'

var Cnext=Ti.Network.createHTTPClient( );

Cnext.open("GET",URLnext);

Cnext.send();

);

// evento disc+

Dmas.addEventListener('click',function(e)

// comando para seleccionar disc+ denon

var URLdmas='http://'+dir+'/?D3432N29320P44N43=Denon'

var Cdmas=Ti.Network.createHTTPClient( );

Cdmas.open("GET",URLdmas);

Cdmas.send();

);

127

// evento disc-

Dmenos.addEventListener('click',function(e)

// comando para seleccionar disc- denon

var URLdmenos='http://'+dir+'/?D3528N29224P44N43=Denon'

var Cdmenos=Ti.Network.createHTTPClient( );

Cdmenos.open("GET",URLdmenos);

Cdmenos.send();

);

// evento play

play.addEventListener('click',function(e)

// comando para seleccionar play denon

var URLplay='http://'+dir+'/?D2952N29800P45N43=Denon'

var Cplay=Ti.Network.createHTTPClient( );

Cplay.open("GET",URLplay);

Cplay.send();

);

// evento pause

pause.addEventListener('click',function(e)

// comando para seleccionar pause denon

var URLpause='http://'+dir+'/?D2984N29768P45N43=Denon'

var Cpause=Ti.Network.createHTTPClient( );

Cpause.open("GET",URLpause);

Cpause.send();

);

// evento stop

bstop.addEventListener('click',function(e)

// comando para seleccionar stop denon

var URLstop='http://'+dir+'/?D3016N29736P44N43=Denon'

var Cstop=Ti.Network.createHTTPClient( );

Cstop.open("GET",URLstop);

Cstop.send();

);

// evento open

open.addEventListener('click',function(e)

// comando para seleccionar stop denon

var URLopen='http://'+dir+'/?D2568N30184P45N43=Denon'

var Copen=Ti.Network.createHTTPClient( );

Copen.open("GET",URLopen);

Copen.send();

);

128

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient( );

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient( );

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient( );

Cmute.open("GET",URLmute);

Cmute.send();

);

Gtv.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var lgtv=Titanium.UI.createLabel(

text:'Google TV',

top:'5dp',

font:fontSize:30,

color:'#DDD'

);

var on = Titanium.UI.createImageView(

image : '/images/on.png',

129

top : '5dp',

left : '5dp'

);

var off = Titanium.UI.createImageView(

image : '/images/off.png',

top : '5dp',

left : '70dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

win.add(on);

win.add(off);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(mute);

win.add(lgtv);

//AGREGANDO EVENTOS A LOS BOTONES

130

// evento para ENCENDER PROYECTOR

on.addEventListener('click',function(e)

//comando para encender el proyecctor

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

var Conproy=Ti.Network.createHTTPClient( );

Conproy.open("GET",URLonproy);

Conproy.send();

);

// evento para ENCENDER PROYECTOR

off.addEventListener('click',function(e)

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(8);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient(

);

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient(

131

);

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient(

);

Cmute.open("GET",URLmute);

Cmute.send();

);

// funcion de retardo

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)

a=0;

Hmg.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var lhmg=Titanium.UI.createLabel(

text:'HMG',

top:'5dp',

font:fontSize:40,

color:'#DDD'

);

var on = Titanium.UI.createImageView(

image : '/images/on.png',

height : '42dp',

132

width : '45dp',

top : '5dp',

left : '5dp'

);

var off = Titanium.UI.createImageView(

image : '/images/off.png',

height : '42dp',

width : '45dp',

top : '5dp',

left : '70dp'

);

var up = Titanium.UI.createImageView(

url : '/images/up.png',

top : '65dp',

left : '65dp'

);

var left = Titanium.UI.createImageView(

url : '/images/left.png',

top : '120dp',

left : '5dp'

);

var ok = Titanium.UI.createButton(

title : 'Ok',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '47dp',

top : '120dp',

left : '65dp'

);

var right = Titanium.UI.createImageView(

url : '/images/right.png',

top : '120dp',

left : '125dp'

);

133

var down = Titanium.UI.createImageView(

url : '/images/down.png',

top : '180dp',

left : '65dp'

);

var exit = Titanium.UI.createButton(

title : 'Exit',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '125dp'

);

var back = Titanium.UI.createImageView(

url : '/images/back.png',

top : '250dp',

left : '5dp'

);

var play= Titanium.UI.createButton(

title : 'Play',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '250dp',

left : '65dp'

);

var next = Titanium.UI.createImageView(

image : '/images/next.png',

top : '250dp',

left : '125dp'

);

134

var back = Titanium.UI.createImageView(

url : '/images/back.png',

top : '250dp',

left : '5dp'

);

var skipl = Titanium.UI.createImageView(

url : '/images/lskip.png',

top : '300dp',

left : '5dp'

);

var bstop= Titanium.UI.createImageView(

url:'/images/stop.png',

top : '300dp',

left : '65dp'

);

var skipr = Titanium.UI.createImageView(

url : '/images/rskip.png',

top : '300dp',

left : '125dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

135

top : '145dp',

left : '240dp'

);

var pause= Titanium.UI.createImageView(

url:'/images/pause.png',

top : '350dp',

left : '65dp'

);

var ret = Titanium.UI.createButton(

image : '/images/return.png',

height : '42dp',

width : '45dp',

top : '95dp',

left : '185dp',

);

win.add(lhmg);

win.add(ret);

win.add(pause);

win.add(back);

win.add(next);

win.add(bstop);

win.add(mute);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(skipr);

win.add(play);

win.add(skipl);

win.add(down);

win.add(exit);

win.add(right);

win.add(ok);

win.add(left);

win.add(up);

win.add(on);

win.add(off);

// evento para retunrn

ret.addEventListener('click',function(e)

// comando para seleccionar return ipod del pionner

var URLret='http://'+dir+'/?P23205N26775P23205N10965=pioneer'

136

var Cret=Ti.Network.createHTTPClient( );

Cret.open("GET",URLret);

Cret.send();

);

// evento para ok

ok.addEventListener('click',function(e)

// comando para seleccionar ok del pionner

var URLok='http://'+dir+'/?P23205N26775P23205N11220=pioneer'

var Cok=Ti.Network.createHTTPClient( );

Cok.open("GET",URLok);

Cok.send();

);

// evento para |<<

back.addEventListener('click',function(e)

// comando para seleccionar |<< del pionner

var URLback='http://'+dir+'/?P23205N26775P23205N15810=pioneer'

var Cback=Ti.Network.createHTTPClient(

);

Cback.open("GET",URLback);

Cback.send();

);

// evento para >>|

next.addEventListener('click',function(e)

// comando para seleccionar |<< del pionner

var URLnext='http://'+dir+'/?P23205N26775P23205N15555=pioneer'

var Cnext=Ti.Network.createHTTPClient( );

Cnext.open("GET",URLnext);

Cnext.send();

);

// evento para <<

skipl.addEventListener('click',function(e)

// comando para seleccionar << del pionner

var URLskipl='http://'+dir+'/?P23205N26775P23205N15300=pioneer'

var Cskipl=Ti.Network.createHTTPClient( );

137

Cskipl.open("GET",URLskipl);

Cskipl.send();

);

// evento para >>

skipr.addEventListener('click',function(e)

// comando para seleccionar >> del pionner

var URLskipr='http://'+dir+'/?P23205N26775P23205N14986=pioneer'

var Cskipr=Ti.Network.createHTTPClient( );

Cskipr.open("GET",URLskipr);

Cskipr.send();

);

// evento para play

play.addEventListener('click',function(e)

// comando para seleccionar >> del pionner

var URLplay='http://'+dir+'/?P23205N26775P23205N16320=pioneer'

var Cplay=Ti.Network.createHTTPClient( );

Cplay.open("GET",URLplay);

Cplay.send();

);

pause.addEventListener('click',function(e)

// comando para seleccionar || del pionner

var URLpause='http://'+dir+'/?P23205N26775P23205N16320=pioneer'

var Cpause=Ti.Network.createHTTPClient( );

Cpause.open("GET",URLpause);

Cpause.send();

);

bstop.addEventListener('click',function(e)

// comando para seleccionar stop del pionner

var URLstop='http://'+dir+'/?P23205N26775P23205N13770=pioneer'

var Cstop=Ti.Network.createHTTPClient( );

Cstop.open("GET",URLstop);

Cstop.send();

);

up.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLup='http://'+dir+'/?P23205N26775P23205N12240=pioneer'

138

var Cup=Ti.Network.createHTTPClient( );

Cup.open("GET",URLup);

Cup.send();

);

down.addEventListener('click',function(e)

// comando para seleccionar down del pionner

var URLdown='http://'+dir+'/?P23205N26775P23205N11985=pioneer'

var Cdown=Ti.Network.createHTTPClient( );

Cdown.open("GET",URLdown);

Cdown.send();

);

left.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLleft='http://'+dir+'/?P23205N26775P23205N11475=pioneer'

var Cleft=Ti.Network.createHTTPClient( );

Cleft.open("GET",URLleft);

Cleft.send();

);

right.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLright='http://'+dir+'/?P23205N26775P23205N12240=pioneer'

var Cright=Ti.Network.createHTTPClient( );

Cright.open("GET",URLright);

Cright.send();

);

exit.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLexit='http://'+dir+'/?P23205N26775P23205N10965=pioneer'

var Cexit=Ti.Network.createHTTPClient( );

Cexit.open("GET",URLexit);

Cexit.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

139

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient( );

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient( );

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient( );

Cmute.open("GET",URLmute);

Cmute.send();

);

// evento para ENCENDER PROYECTOR

on.addEventListener('click',function(e)

//comando para encender el proyecctor

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

var Conproy=Ti.Network.createHTTPClient( );

Conproy.open("GET",URLonproy);

Conproy.send();

);

// evento para APAGAR PROYECTOR

off.addEventListener('click',function(e)

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(8);

140

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

Ipod.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var lipod=Titanium.UI.createLabel(

text:'ipod',

top:'5dp',

font:fontSize:45,

color:'#DDD'

);

var up = Titanium.UI.createImageView(

url : '/images/up.png',

top : '65dp',

left : '65dp'

);

var left = Titanium.UI.createImageView(

url : '/images/left.png',

top : '120dp',

left : '5dp'

);

var ok = Titanium.UI.createButton(

title : 'Ok',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '47dp',

top : '120dp',

left : '65dp'

141

);

var right = Titanium.UI.createImageView(

url : '/images/right.png',

top : '120dp',

left : '125dp'

);

var rep = Titanium.UI.createButton(

title : 'Rep',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '5dp'

);

var down = Titanium.UI.createImageView(

url : '/images/down.png',

top : '180dp',

left : '65dp'

);

var rand = Titanium.UI.createButton(

title : 'Rand',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '125dp'

);

var back = Titanium.UI.createImageView(

url : '/images/back.png',

top : '250dp',

left : '5dp'

);

142

var play= Titanium.UI.createButton(

title : 'Play',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '250dp',

left : '65dp'

);

var next = Titanium.UI.createImageView(

image : '/images/next.png',

top : '250dp',

left : '125dp'

);

var skipl = Titanium.UI.createImageView(

url : '/images/lskip.png',

top : '300dp',

left : '5dp'

);

var pause= Titanium.UI.createImageView(

url:'/images/pause.png',

top : '300dp',

left : '65dp'

);

var skipr = Titanium.UI.createImageView(

url : '/images/rskip.png',

top : '300dp',

left : '125dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

143

url : '/images/up.png',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

var ret = Titanium.UI.createButton(

image : '/images/return.png',

height : '42dp',

width : '45dp',

top : '95dp',

left : '185dp',

);

win.add(lipod);

win.add(ret);

win.add(back);

win.add(next);

win.add(pause);

win.add(mute);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(skipr);

win.add(play);

win.add(skipl);

win.add(down);

win.add(rep);

win.add(rand);

win.add(right);

win.add(ok);

win.add(left);

144

win.add(up);

// evento para retunrn

ret.addEventListener('click',function(e)

// comando para seleccionar return ipod del pionner

var URLret='http://'+dir+'/?P23205N26520P23205N10965=pioneer'

var Cret=Ti.Network.createHTTPClient( );

Cret.open("GET",URLret);

Cret.send();

);

// evento para ok

ok.addEventListener('click',function(e)

// comando para seleccionar ok del pionner

var URLok='http://'+dir+'/?P23205N26520P23205N11220=pioneer'

var Cok=Ti.Network.createHTTPClient( );

Cok.open("GET",URLok);

Cok.send();

);

// evento para random

rand.addEventListener('click',function(e)

// comando para seleccionar ok del pionner

var URLrand='http://'+dir+'/?P23205N26520P23205N14535=pioneer'

var Crand=Ti.Network.createHTTPClient( );

Crand.open("GET",URLrand);

Crand.send();

);

// evento para repeat

rep.addEventListener('click',function(e)

// comando para seleccionar repeat ipod del pionner

var URLrep='http://'+dir+'/?P23205N26520P23205N14790=pioneer'

var Crep=Ti.Network.createHTTPClient( );

Crep.open("GET",URLrep);

Crep.send();

);

// evento para |<<

back.addEventListener('click',function(e)

145

// comando para seleccionar |<< del pionner

var URLback='http://'+dir+'/?P23205N26520P23205N15810=pioneer'

var Cback=Ti.Network.createHTTPClient(

);

Cback.open("GET",URLback);

Cback.send();

);

// evento para >>|

next.addEventListener('click',function(e)

// comando para seleccionar |<< del pionner

var URLnext='http://'+dir+'/?P23205N26520P23205N15555=pioneer'

var Cnext=Ti.Network.createHTTPClient( );

Cnext.open("GET",URLnext);

Cnext.send();

);

// evento para <<

skipl.addEventListener('click',function(e)

// comando para seleccionar << del pionner

var URLskipl='http://'+dir+'/?P23205N26520P23205N15300=pioneer'

var Cskipl=Ti.Network.createHTTPClient( );

Cskipl.open("GET",URLskipl);

Cskipl.send();

);

// evento para >>

skipr.addEventListener('click',function(e)

// comando para seleccionar >> del pionner

var URLskipr='http://'+dir+'/?P23205N26520P23205N15045=pioneer'

var Cskipr=Ti.Network.createHTTPClient( );

Cskipr.open("GET",URLskipr);

Cskipr.send();

);

// evento para play

play.addEventListener('click',function(e)

// comando para seleccionar >> del pionner

146

var URLplay='http://'+dir+'/?P23205N26520P23205N16320=pioneer'

var Cplay=Ti.Network.createHTTPClient( );

Cplay.open("GET",URLplay);

Cplay.send();

);

pause.addEventListener('click',function(e)

// comando para seleccionar || del pionner

var URLpause='http://'+dir+'/?P23205N26520P23205N16065=pioneer'

var Cpause=Ti.Network.createHTTPClient( );

Cpause.open("GET",URLpause);

Cpause.send();

);

up.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLup='http://'+dir+'/?P23205N26520P23205N12240=pioneer'

var Cup=Ti.Network.createHTTPClient( );

Cup.open("GET",URLup);

Cup.send();

);

down.addEventListener('click',function(e)

// comando para seleccionar down del pionner

var URLdown='http://'+dir+'/?P23205N26520P23205N11985=pioneer'

var Cdown=Ti.Network.createHTTPClient( );

Cdown.open("GET",URLdown);

Cdown.send();

);

left.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLleft='http://'+dir+'/?P23205N26520P23205N11475=pioneer'

var Cleft=Ti.Network.createHTTPClient( );

Cleft.open("GET",URLleft);

Cleft.send();

);

right.addEventListener('click',function(e)

// comando para seleccionar up del pionner

var URLright='http://'+dir+'/?P23205N26520P23205N11730=pioneer'

147

var Cright=Ti.Network.createHTTPClient( );

Cright.open("GET",URLright);

Cright.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient( );

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient( );

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient( );

Cmute.open("GET",URLmute);

Cmute.send();

);

Movie.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var lmov=Titanium.UI.createLabel(

text:'Movie',

top:'5dp',

font:fontSize:30,

148

color:'#DDD'

);

var on = Titanium.UI.createImageView(

image : '/images/on.png',

height : '42dp',

width : '45dp',

top : '5dp',

left : '5dp'

);

var off = Titanium.UI.createImageView(

image : '/images/off.png',

height : '42dp',

width : '45dp',

top : '5dp',

left : '70dp'

);

var menu = Titanium.UI.createButton(

title : 'Menu',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '65dp',

left : '5dp'

);

var up = Titanium.UI.createImageView(

url : '/images/up.png',

//height : '50dp',

//width : '55dp',

top : '65dp',

left : '65dp'

);

var exit = Titanium.UI.createButton(

title : 'Exit',

font :

fontSize : '15dp',

149

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '65dp',

left : '125dp'

);

var left = Titanium.UI.createImageView(

url : '/images/left.png',

//height : '50dp',

//width : '55dp',

top : '120dp',

left : '5dp'

);

var ok = Titanium.UI.createButton(

title : 'Ok',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '47dp',

top : '120dp',

left : '65dp'

);

var right = Titanium.UI.createImageView(

url : '/images/right.png',

//height : '50dp',

//width : '55dp',

top : '120dp',

left : '125dp'

);

var audio = Titanium.UI.createButton(

title : 'Audio',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

150

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '5dp'

);

var down = Titanium.UI.createImageView(

url : '/images/down.png',

//height : '50dp',

//width : '55dp',

top : '180dp',

left : '65dp'

);

var sub = Titanium.UI.createButton(

title : 'Subs',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '125dp'

);

var back = Titanium.UI.createImageView(

url : '/images/back.png',

//height : '50dp',

//width : '55dp',

top : '250dp',

left : '5dp'

);

var play= Titanium.UI.createButton(

title : 'Play',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

151

height : '45dp',

width : '50dp',

top : '250dp',

left : '65dp'

);

var next = Titanium.UI.createImageView(

image : '/images/next.png',

//height : '50dp',

//width : '55dp',

top : '250dp',

left : '125dp'

);

var skipl = Titanium.UI.createImageView(

url : '/images/lskip.png',

//height : '50dp',

//width : '55dp',

top : '300dp',

left : '5dp'

);

var pause= Titanium.UI.createImageView(

url:'/images/pause.png',

top : '300dp',

left : '65dp'

);

var skipr = Titanium.UI.createImageView(

url : '/images/rskip.png',

//height : '50dp',

//width : '55dp',

top : '300dp',

left : '125dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

//height : '50dp',

//width : '55dp',

152

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

//height : '50dp',

//width : '55dp',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

var open = Titanium.UI.createImageView(

url:'/images/open.png',

//height : '50dp',

//width : '55dp',

top : '200dp',

left : '240dp'

);

var bstop= Titanium.UI.createImageView(

url : '/images/stop.png',

//height : '50dp',

//width : '55dp',

top : '255dp',

left : '240dp'

);

var Pmenu = Titanium.UI.createButton(

title : 'pop up/menu',

font :

fontSize : '13dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '100dp',

153

top : '350dp',

left : '5dp'

);

var opt = Titanium.UI.createButton(

title : 'options',

font :

fontSize : '16dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '70dp',

top : '350dp',

left : '110dp'

);

var ret = Titanium.UI.createButton(

image : '/images/return.png',

height : '42dp',

width : '45dp',

top : '350dp',

left : '180dp',

);

win.add(lmov);

win.add(Pmenu);

win.add(opt);

win.add(ret);

win.add(pause);

win.add(back);

win.add(next);

win.add(bstop);

win.add(open);

win.add(mute);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(skipr);

win.add(play);

win.add(skipl);

win.add(audio);

win.add(down);

win.add(exit);

win.add(right);

154

win.add(ok);

win.add(left);

win.add(sub);

win.add(up);

win.add(on);

win.add(off);

win.add(menu);

//AGREGANDO EVENTOS A LOS BOTONES

// evento para options

Pmenu.addEventListener('click',function(e)

// comando para seleccionar pop up menu del blue ray

var URLPmenu='http://'+dir+'/?S3369=BLUE'

var CPmenu=Ti.Network.createHTTPClient( );

CPmenu.open("GET",URLPmenu);

CPmenu.send();

);

// evento para options

opt.addEventListener('click',function(e)

// comando para seleccionar options del blue ray

var URLopt='http://'+dir+'/?S3391=BLUE'

var Copt=Ti.Network.createHTTPClient( );

Copt.open("GET",URLopt);

Copt.send();

);

// evento para retunrn

ret.addEventListener('click',function(e)

// comando para seleccionar return del blue ray

var URLret='http://'+dir+'/?S3395=BLUE'

var Cret=Ti.Network.createHTTPClient( );

Cret.open("GET",URLret);

Cret.send();

);

//EVENTO ok

ok.addEventListener('click',function(e)

155

// comando para seleccionar OK del BLUE RAY

var URLok='http://'+dir+'/?S3389=BLUE'

var Cok=Ti.Network.createHTTPClient( );

Cok.open("GET",URLok);

Cok.send();

);

//EVENTO SUBTITULOS

sub.addEventListener('click',function(e)

// comando para seleccionar subtitulos del BLUE RAY

var URLsub='http://'+dir+'/?S3427=BLUE'

var Csub=Ti.Network.createHTTPClient( );

Csub.open("GET",URLsub);

Csub.send();

);

//EVENTO AUDIO

audio.addEventListener('click',function(e)

// comando para seleccionar audio del BLUE RAY

var URLaudio='http://'+dir+'/?S3428=BLUE'

var Caudio=Ti.Network.createHTTPClient( );

Caudio.open("GET",URLaudio);

Caudio.send();

);

//EVENTO EXIT

exit.addEventListener('click',function(e)

// comando para seleccionar exit del BLUE RAY

var URLexit='http://'+dir+'/?S3372=BLUE'

var Cexit=Ti.Network.createHTTPClient( );

Cexit.open("GET",URLexit);

Cexit.send();

);

menu.addEventListener('click',function(e)

// comando para seleccionar RIGHT del BLUERAY

var URLmenu='http://'+dir+'/?S3372=BLUE';

var Cmenu=Ti.Network.createHTTPClient( );

156

Cmenu.open("GET",URLmenu);

Cmenu.send();

);

// evento para |<<

back.addEventListener('click',function(e)

// comando para seleccionar |<< del BLU RAY

var URLback='http://'+dir+'/?S3415=BLUE'

var Cback=Ti.Network.createHTTPClient(

);

Cback.open("GET",URLback);

Cback.send();

);

// evento para >>|

next.addEventListener('click',function(e)

// comando para seleccionar |<< del pionner

var URLnext='http://'+dir+'/?S3414=BLUE'

var Cnext=Ti.Network.createHTTPClient( );

Cnext.open("GET",URLnext);

Cnext.send();

);

// evento para <<

skipl.addEventListener('click',function(e)

// comando para seleccionar << del BLUE RAY

var URLskipl='http://'+dir+'/?S3355=BLUE';

var Cskipl=Ti.Network.createHTTPClient( );

Cskipl.open("GET",URLskipl);

Cskipl.send();

);

// evento para >>

skipr.addEventListener('click',function(e)

// comando para seleccionar >> del BLUE RAY

var URLskipr='http://'+dir+'/?S3356=BLUE';

var Cskipr=Ti.Network.createHTTPClient( );

Cskipr.open("GET",URLskipr);

157

Cskipr.send();

);

// evento para play

play.addEventListener('click',function(e)

// comando para seleccionar >> del BLUE RAY

var URLplay='http://'+dir+'/?S3354=BLUE';

var Cplay=Ti.Network.createHTTPClient( );

Cplay.open("GET",URLplay);

Cplay.send();

);

pause.addEventListener('click',function(e)

// comando para seleccionar || del BLUE RAY

var URLpause='http://'+dir+'/?S3353=BLUE';

var Cpause=Ti.Network.createHTTPClient( );

Cpause.open("GET",URLpause);

Cpause.send();

);

up.addEventListener('click',function(e)

// comando para seleccionar up del BLUE RAY

var URLup='http://'+dir+'/?S3385=BLUE';

var Cup=Ti.Network.createHTTPClient( );

Cup.open("GET",URLup);

Cup.send();

);

down.addEventListener('click',function(e)

// comando para seleccionar down del BLUE RAY

var URLdown='http://'+dir+'/?S3386=BLUE'

var Cdown=Ti.Network.createHTTPClient( );

Cdown.open("GET",URLdown);

Cdown.send();

);

left.addEventListener('click',function(e)

// comando para seleccionar LEFT del BLUE RAY

var URLleft='http://'+dir+'/?S3387=BLUE'

var Cleft=Ti.Network.createHTTPClient( );

Cleft.open("GET",URLleft);

158

Cleft.send();

);

right.addEventListener('click',function(e)

// comando para seleccionar RIGHT del pionner

var URLright='http://'+dir+'/?S3388=BLUE';

var Cright=Ti.Network.createHTTPClient( );

Cright.open("GET",URLright);

Cright.send();

);

// evento para ENCENDER PROYECTOR

on.addEventListener('click',function(e)

//comando para encender el proyecctor

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

var Conproy=Ti.Network.createHTTPClient( );

Conproy.open("GET",URLonproy);

Conproy.send();

);

// evento para APAGAR PROYECTOR

off.addEventListener('click',function(e)

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(8);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

159

var Cvplus=Ti.Network.createHTTPClient(

);

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient(

);

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient(

);

Cmute.open("GET",URLmute);

Cmute.send();

);

// funcion de retardo

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)

a=0;

Radio.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

160

var dir='192.168.100.34';

var lradio=Titanium.UI.createLabel(

text:'Radio',

top:'5dp',

font:fontSize:30,

color:'#DDD'

);

var up = Titanium.UI.createImageView(

url : '/images/up.png',

top : '65dp',

left : '65dp'

);

var down = Titanium.UI.createImageView(

url : '/images/down.png',

top : '180dp',

left : '65dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

url : '/images/down.png',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

161

win.add(up);

win.add(down);

win.add(lvol);

win.add(vplus);

win.add(vminus);

win.add(mute);

win.add(lradio);

//AGREGANDO EVENTOS A LOS BOTONES

// evento para disminuir estacion

down.addEventListener('click',function(e)

// comando para seleccionar down-tuner del pionner

var URLdown='http://'+dir+'/?P23460N43095P23460N43095=pioneer'

var Cdown=Ti.Network.createHTTPClient(

);

Cdown.open("GET",URLdown);

Cdown.send();

);

// evento para aumentar estacion

up.addEventListener('click',function(e)

// comando para seleccionar up-tuner del pionner

var URLup='http://'+dir+'/?P23460N43350P23460N43350=pioneer'

var Cup=Ti.Network.createHTTPClient(

);

Cup.open("GET",URLup);

Cup.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient(

);

Cvplus.open("GET",URLvplus);

Cvplus.send();

162

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient(

);

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient(

);

Cmute.open("GET",URLmute);

Cmute.send();

);

// funcion de retardo

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)

a=0;

Tv.js

var win = Titanium.UI.currentWindow;

// variable para la direccion de la conexion http

var dir='192.168.100.34';

var ltv=Titanium.UI.createLabel(

text:'Total play',

top:'435dp',

font:fontSize:40,

163

color:'#DDD'

);

var on = Titanium.UI.createImageView(

image : '/images/on.png',

height : '42dp',

width : '45dp',

top : '5dp',

left : '5dp'

);

var off = Titanium.UI.createImageView(

image : '/images/off.png',

height : '42dp',

width : '45dp',

top : '5dp',

left : '70dp'

);

var power = Titanium.UI.createImageView(

image : '/images/shutdown.png',

top : '5dp',

left : '120dp'

);

var plus = Titanium.UI.createButton(

title:'+',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '40dp',

width : '45dp',

top : '5dp',

left : '185dp'

);

var minus=Titanium.UI.createButton(

title:'-',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

164

textAlign:'center'

,

height:'40dp',

width:'45dp',

top:'50dp',

left:'185dp'

);

var ret = Titanium.UI.createButton(

image : '/images/return.png',

height : '42dp',

width : '45dp',

top : '95dp',

left : '185dp',

);

var guide = Titanium.UI.createButton(

title : 'Guide',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '65dp',

left : '5dp'

);

var up = Titanium.UI.createImageView(

url : '/images/up.png',

//height : '50dp',

//width : '55dp',

top : '65dp',

left : '65dp'

);

var vod = Titanium.UI.createButton(

title : 'VOD',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

165

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '65dp',

left : '125dp'

);

var left = Titanium.UI.createImageView(

url : '/images/left.png',

//height : '50dp',

//width : '55dp',

top : '120dp',

left : '5dp'

);

var ok = Titanium.UI.createButton(

title : 'Ok',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '120dp',

left : '65dp'

);

var right = Titanium.UI.createImageView(

url : '/images/right.png',

//height : '50dp',

//width : '55dp',

top : '120dp',

left : '125dp'

);

var pip = Titanium.UI.createButton(

title : 'PIP',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

166

height : '45dp',

width : '50dp',

top : '180dp',

left : '5dp'

);

var down = Titanium.UI.createImageView(

url : '/images/down.png',

//height : '50dp',

//width : '55dp',

top : '180dp',

left : '65dp'

);

var exit = Titanium.UI.createButton(

title : 'Exit',

font :

fontSize : '15dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '180dp',

left : '125dp'

);

var skipl = Titanium.UI.createImageView(

url : '/images/lskip.png',

//height : '50dp',

//width : '55dp',

top : '230dp',

left : '5dp'

);

var playpause = Titanium.UI.createButton(

title : '>/||',

font :

fontSize : '20dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

167

top : '230dp',

left : '65dp'

);

var skipr = Titanium.UI.createImageView(

url : '/images/rskip.png',

//height : '50dp',

//width : '55dp',

top : '230dp',

left : '125dp'

);

var lvol=Titanium.UI.createLabel(

text:'Volume',

top:'65dp',

left:'240dp'

);

var vplus = Titanium.UI.createImageView(

url : '/images/up.png',

//height : '50dp',

//width : '55dp',

top : '15dp',

left : '240dp'

);

var vminus= Titanium.UI.createImageView(

image : '/images/down.png',

//height : '50dp',

//width : '55dp',

top : '90dp',

left : '240dp'

);

var mute= Titanium.UI.createButton(

image : '/images/mute.png',

height : '45dp',

width : '50dp',

top : '145dp',

left : '240dp'

);

var num = Titanium.UI.createButton(

title : '99',

font :

fontSize : '20dp',

168

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '200dp',

left : '185dp'

);

var bstop= Titanium.UI.createImageView(

url : '/images/stop.png',

top : '145dp',

left : '185dp'

);

var red= Titanium.UI.createImageView(

url : '/images/red.png',

top : '280dp',

left : '25dp'

);

var green= Titanium.UI.createImageView(

url : '/images/green.png',

top : '280dp',

left : '80dp'

);

var yellow= Titanium.UI.createImageView(

url : '/images/yellow.png',

top : '280dp',

left : '140dp'

);

var blue= Titanium.UI.createImageView(

url : '/images/blue.png',

top : '280dp',

left : '200dp'

);

var uno = Titanium.UI.createButton(

title : '1',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

169

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '330dp',

left : '2dp'

);

var dos= Titanium.UI.createButton(

title : '2',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '330dp',

left: '52dp'

);

var tres = Titanium.UI.createButton(

title : '3',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '330dp',

left : '104dp'

);

var cuatro = Titanium.UI.createButton(

title : '4',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

170

width : '50dp',

top : '330dp',

left : '156dp'

);

var cinco= Titanium.UI.createButton(

title : '5',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '330dp',

left: '208dp'

);

var seis = Titanium.UI.createButton(

title : '6',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '330dp',

left : '260dp'

);

var siete= Titanium.UI.createButton(

title : '7',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

171

left : '2dp'

);

var ocho= Titanium.UI.createButton(

title : '8',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

left: '52dp'

);

var nueve = Titanium.UI.createButton(

title : '9',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

left : '104dp'

);

var once = Titanium.UI.createButton(

title : '11',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

left : '208dp'

);

172

var cero= Titanium.UI.createButton(

title : '0',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

left: '156dp'

);

var vdos = Titanium.UI.createButton(

title : '22',

font :

fontSize : '30dp',

fontFamily : 'Helvetica Neue',

fontColor : '#FFF',

textAlign:'center'

,

height : '45dp',

width : '50dp',

top : '385dp',

left : '260dp'

);

win.add(ltv);

win.add(power);

win.add(once);

win.add(vdos);

win.add(cero);

win.add(nueve);

win.add(ocho);

win.add(siete);

win.add(seis);

win.add(cinco);

win.add(cuatro);

win.add(tres);

win.add(dos);

win.add(uno);

win.add(blue);

173

win.add(yellow);

win.add(green);

win.add(red);

win.add(bstop);

win.add(num);

win.add(mute);

win.add(vplus);

win.add(vminus);

win.add(lvol);

win.add(skipr);

win.add(playpause);

win.add(skipl);

win.add(pip);

win.add(down);

win.add(exit);

win.add(right);

win.add(ok);

win.add(left);

win.add(vod);

win.add(up);

win.add(on);

win.add(off);

win.add(guide);

win.add(plus);

win.add(minus);

win.add(ret);

/***** AGREGANDO EVENTOS A LOS BOTONES*/

// evento para on-off TOTAL PLAY

power.addEventListener('click',function(e)

var URLpower='http://'+ dir +'/?R64769N09180=PRO'

var Cpower=Ti.Network.createHTTPClient( );

Cpower.open("GET",URLpower);

Cpower.send();

);

// evento para 11 TOTAL PLAY

once.addEventListener('click',function(e)

var URLonce='http://'+ dir +'/?R64769N28050=PRO'

var Conce=Ti.Network.createHTTPClient( );

Conce.open("GET",URLonce);

Conce.send();

retardo(2);

var URLonce='http://'+ dir +'/?R64769N28050=PRO'

174

var Conce=Ti.Network.createHTTPClient( );

Conce.open("GET",URLonce);

Conce.send();

retardo(2);

var URLonce='http://'+ dir +'/?R64769N28050=PRO'

var Conce=Ti.Network.createHTTPClient( );

Conce.open("GET",URLonce);

Conce.send();

);

// evento para 22 TOTAL PLAY

vdos.addEventListener('click',function(e)

var URLonce='http://'+ dir +'/?R64769N28050=PRO'

var Conce=Ti.Network.createHTTPClient( );

Conce.open("GET",URLonce);

Conce.send();

retardo(2);

var URLvdos='http://'+ dir +'/?R64769N27795=PRO'

var Cvdos=Ti.Network.createHTTPClient( );

Cvdos.open("GET",URLvdos);

Cvdos.send();

retardo(2);

var URLvdos='http://'+ dir +'/?R64769N27795=PRO'

var Cvdos=Ti.Network.createHTTPClient( );

Cvdos.open("GET",URLvdos);

Cvdos.send();

);

// evento para 9 TOTAL PLAY

nueve.addEventListener('click',function(e)

var URLnueve='http://'+ dir +'/?R64769N15300=PRO'

var Cnueve=Ti.Network.createHTTPClient( );

Cnueve.open("GET",URLnueve);

Cnueve.send();

);

// evento para 8 TOTAL PLAY

ocho.addEventListener('click',function(e)

var URLocho='http://'+ dir +'/?R64769N29835=PRO'

var Cocho=Ti.Network.createHTTPClient( );

Cocho.open("GET",URLocho);

Cocho.send();

);

// evento para 7 TOTAL PLAY

175

siete.addEventListener('click',function(e)

var URLsiete='http://'+ dir +'/?R64769N30090=PRO'

var Csiete=Ti.Network.createHTTPClient( );

Csiete.open("GET",URLsiete);

Csiete.send();

);

// evento para 6 TOTAL PLAY

seis.addEventListener('click',function(e)

var URLseis='http://'+ dir +'/?R64769N14280=PRO'

var Cseis=Ti.Network.createHTTPClient( );

Cseis.open("GET",URLseis);

Cseis.send();

);

// evento para 5 TOTAL PLAY

cinco.addEventListener('click',function(e)

var URLcinco='http://'+ dir +'/?R64769N28815=PRO'

var Ccinco=Ti.Network.createHTTPClient( );

Ccinco.open("GET",URLcinco);

Ccinco.send();

);

// evento para 4 TOTAL PLAY

cuatro.addEventListener('click',function(e)

var URLcuatro='http://'+ dir +'/?R64769N29070=PRO'

var Ccuatro=Ti.Network.createHTTPClient( );

Ccuatro.open("GET",URLcuatro);

Ccuatro.send();

);

// evento para 3 TOTAL PLAY

tres.addEventListener('click',function(e)

var URLtres='http://'+ dir +'/?R64769N13260=PRO'

var Ctres=Ti.Network.createHTTPClient( );

Ctres.open("GET",URLtres);

Ctres.send();

);

// evento para 2 TOTAL PLAY

dos.addEventListener('click',function(e)

var URLdos='http://'+ dir +'/?R64769N27795=PRO'

var Cdos=Ti.Network.createHTTPClient( );

Cdos.open("GET",URLdos);

Cdos.send();

);

176

// evento para uno TOTAL PLAY

uno.addEventListener('click',function(e)

var URLuno='http://'+ dir +'/?R64769N28050=PRO'

var Cuno=Ti.Network.createHTTPClient( );

Cuno.open("GET",URLuno);

Cuno.send();

);

// evento para cero TOTAL PLAY

cero.addEventListener('click',function(e)

var URLcero='http://'+ dir +'/?R64769N30855=PRO'

var Ccero=Ti.Network.createHTTPClient( );

Ccero.open("GET",URLcero);

Ccero.send();

);

// evento para blue TOTAL PLAY

blue.addEventListener('click',function(e)

var URLblue='http://'+ dir +'/?R64769N25245=PRO'

var Cblue=Ti.Network.createHTTPClient( );

Cblue.open("GET",URLblue);

Cblue.send();

);

// evento para yellow TOTAL PLAY

yellow.addEventListener('click',function(e)

var URLyellow='http://'+ dir +'/?R64769N26520=PRO'

var Cyellow=Ti.Network.createHTTPClient( );

Cyellow.open("GET",URLyellow);

Cyellow.send();

);

// evento para green TOTAL PLAY

green.addEventListener('click',function(e)

var URLgreen='http://'+ dir +'/?R64769N12495=PRO'

var Cgreen=Ti.Network.createHTTPClient( );

Cgreen.open("GET",URLgreen);

Cgreen.send();

);

// evento para red TOTAL PLAY

red.addEventListener('click',function(e)

var URLred='http://'+ dir +'/?R64769N14025=PRO'

var Cred=Ti.Network.createHTTPClient( );

177

Cred.open("GET",URLred);

Cred.send();

);

// evento para >/|| TOTAL PLAY

playpause.addEventListener('click',function(e)

var URLppause='http://'+ dir +'/?R64769N31620=PRO'

var Cppause=Ti.Network.createHTTPClient( );

Cppause.open("GET",URLppause);

Cppause.send();

);

// evento para skipr TOTAL PLAY

skipr.addEventListener('click',function(e)

var URLskipr='http://'+ dir +'/?R64769N27030=PRO'

var Cskipr=Ti.Network.createHTTPClient( );

Cskipr.open("GET",URLskipr);

Cskipr.send();

);

// evento para skipl TOTAL PLAY

skipl.addEventListener('click',function(e)

var URLskipl='http://'+ dir +'/?R64769N30345=PRO'

var Cskipl=Ti.Network.createHTTPClient( );

Cskipl.open("GET",URLskipl);

Cskipl.send();

);

// evento para 99TOTAL PLAY

num.addEventListener('click',function(e)

var URLnum='http://'+ dir +'/?R64769N15300=PRO'

var Cnum=Ti.Network.createHTTPClient( );

Cnum.open("GET",URLnum);

Cnum.send();

retardo(2);

var URLnum='http://'+ dir +'/?R64769N15300=PRO'

var Cnum=Ti.Network.createHTTPClient( );

Cnum.open("GET",URLnum);

Cnum.send();

);

// evento para stop TOTAL PLAY

bstop.addEventListener('click',function(e)

178

var URLstop='http://'+ dir +'/?R64769N09945=PRO'

var Cstop=Ti.Network.createHTTPClient( );

Cstop.open("GET",URLstop);

Cstop.send();

);

// evento para exit TOTAL PLAY

exit.addEventListener('click',function(e)

var URLexit='http://'+ dir +'/?R64769N15045=PRO'

var Cexit=Ti.Network.createHTTPClient( );

Cexit.open("GET",URLexit);

Cexit.send();

);

// evento para down TOTAL PLAY

down.addEventListener('click',function(e)

var URLdown='http://'+ dir +'/?R64769N11730=PRO'

var Cdown=Ti.Network.createHTTPClient( );

Cdown.open("GET",URLdown);

Cdown.send();

);

// evento para pip TOTAL PLAY

pip.addEventListener('click',function(e)

var URLpip='http://'+ dir +'/?R64769N28305=PRO'

var Cpip=Ti.Network.createHTTPClient( );

Cpip.open("GET",URLpip);

Cpip.send();

);

// evento para rightTOTAL PLAY

right.addEventListener('click',function(e)

var URLright='http://'+ dir +'/?R64769N16065=PRO'

var Cright=Ti.Network.createHTTPClient( );

Cright.open("GET",URLright);

Cright.send();

);

// evento para ok TOTAL PLAY

ok.addEventListener('click',function(e)

var URLok='http://'+ dir +'/?R64769N12750=PRO'

var Cok=Ti.Network.createHTTPClient( );

Cok.open("GET",URLok);

Cok.send();

);

179

// evento para left TOTAL PLAY

left.addEventListener('click',function(e)

var URLleft='http://'+ dir +'/?R64769N26265=PRO'

var Cleft=Ti.Network.createHTTPClient( );

Cleft.open("GET",URLleft);

Cleft.send();

);

// evento para return TOTAL PLAY

ret.addEventListener('click',function(e)

var URLret='http://'+ dir +'/?R64769N27285=PRO'

var Cret=Ti.Network.createHTTPClient( );

Cret.open("GET",URLret);

Cret.send();

);

// evento para minus TOTAL PLAY

minus.addEventListener('click',function(e)

var URLminus='http://'+ dir +'/?R64769N31110=PRO'

var Cminus=Ti.Network.createHTTPClient( );

Cminus.open("GET",URLminus);

Cminus.send();

);

// evento para plus TOTAL PLAY

plus.addEventListener('click',function(e)

var URLplus='http://'+ dir +'/?R64769N31365=PRO'

var Cplus=Ti.Network.createHTTPClient( );

Cplus.open("GET",URLplus);

Cplus.send();

);

// evento para UP TOTAL PLAY

up.addEventListener('click',function(e)

var URLup='http://'+ dir +'/?R64769N13770=PRO'

var Cup=Ti.Network.createHTTPClient( );

Cup.open("GET",URLup);

Cup.send();

);

// evento para VOD TOTAL PLAY

vod.addEventListener('click',function(e)

var URLvod='http://'+ dir +'/?R64769N08925=PRO'

var Cvod=Ti.Network.createHTTPClient( );

Cvod.open("GET",URLvod);

180

Cvod.send();

);

// evento para GUIA TOTAL PLAY

guide.addEventListener('click',function(e)

var URLguide='http://'+ dir +'/?R64769N29580=PRO'

var Cguide=Ti.Network.createHTTPClient( );

Cguide.open("GET",URLguide);

Cguide.send();

);

// evento para ENCENDER PROYECTOR

on.addEventListener('click',function(e)

//comando para encender el proyecctor

var URLonproy='http://'+ dir +'/?R52530N64770=PRO'

var Conproy=Ti.Network.createHTTPClient( );

Conproy.open("GET",URLonproy);

Conproy.send();

);

// evento para APAGAR PROYECTOR

off.addEventListener('click',function(e)

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

retardo(8);

//comando para apagar el proyecctor

var URLoffproy='http://'+ dir +'/?R52530N63240=PRO'

var Coffproy=Ti.Network.createHTTPClient( );

Coffproy.open("GET",URLoffproy);

Coffproy.send();

);

// evento para aumentar el volumen

vplus.addEventListener('click',function(e)

// comando para seleccionar vol+ del pionner

var URLvplus='http://'+dir+'/?P23205N62730P23205N62730=pioneer'

var Cvplus=Ti.Network.createHTTPClient(

181

);

Cvplus.open("GET",URLvplus);

Cvplus.send();

);

// evento para disminuir el volumen

vminus.addEventListener('click',function(e)

// comando para seleccionar vol- del pionner

var URLvminus='http://'+dir+'/?P23205N62475P23205N62475=pioneer'

var Cvminus=Ti.Network.createHTTPClient(

);

Cvminus.open("GET",URLvminus);

Cvminus.send();

);

// evento mute

mute.addEventListener('click',function(e)

// comando para seleccionar mute del pionner

var URLmute='http://'+dir+'/?P23205N60690P23205N60690=pioneer'

var Cmute=Ti.Network.createHTTPClient(

);

Cmute.open("GET",URLmute);

Cmute.send();

);

// funcion de retardo

function retardo(time)

var i;

var a;

var tiempo;

tiempo=time*100000000;

for (i=0;i<tiempo;i++)

a=0;