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
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;