miércoles, 23 de mayo de 2012

[CÓMPUTO INTEGRADO] Domótica

Ya que varios están presentando proyectos de este tipo, me he dado a al tarea de investigar sobre el tema.

Se entiende por domótica el conjunto de sistemas capaces de automatizar una vivienda, aportando servicios de gestión energética, seguridad, bienestar y comunicación, y que pueden estar integrados por medio de redes interiores y exteriores de comunicación, cableadas o inalámbricas, y cuyo control goza de cierta ubicuidad, desde dentro y fuera del hogar. Se podría definir como la integración de la tecnología en el diseño inteligente de un recinto cerrado.

Los servicios que ofrece la domótica se pueden agrupar según cinco aspectos o ámbitos principales:

Ahorro energético

El ahorro energético no es algo tangible, sino un concepto al que se puede llegar de muchas maneras. En muchos casos no es necesario sustituir los aparatos o sistemas del hogar por otros que consuman menos sino una gestión eficiente de los mismos.

Confort

El confort conlleva todas las actuaciones que se puedan llevar a cabo que mejoren el confort en una vivienda. Dichas actuaciones pueden ser de carácter tanto pasivo, como activo o mixtas.

Seguridad



Consiste en una red de seguridad encargada de proteger tanto los bienes patrimoniales como la seguridad personal.







Comunicaciones

Son los sistemas o infraestructuras de comunicaciones que posee el hogar.

Accesibilidad

Bajo este epigrafe se incluyen las aplicaciones o instalaciones de control remoto del entorno que favorecen la autonomía personal de personas con limitaciones funcionales, o discapacidad.
El concepto "diseño" para todos es un movimiento que pretende crear la sensibilidad necesaria para que al diseñar un producto o servicio se tengan en cuenta las necesidades de todos los posibles usuarios, incluyendo las personas con diferentes capacidades o discapacidades, es decir, favorecer un diseño accesible para la diversidad humana. El objetivo no es que las personas con discapacidad puedan acceder a estas tecnologías, porque las tecnologías en si no son un objetivo, sino un medio. El objetivo de estas tecnologías es favorecer la autonomía personal. Los destinatarios de estas tecnologías son todas las personas, ya que por enfermedad o envejecimiento, todos somos o seremos discapacitados, más pronto o más tarde.

La inteligencia es una medida:
  • De la satisfacción de las necesidades de los habitantes y su administración.
  • De la posibilidad de respetar y adaptarse al medio ambiente que lo rodea.
Los elementos que deben considerarse como parte del programa arquitectónico independientemente del género al que éste se refiera, son éstos:
  • La protección, contra contingencias contra accidentes caseros hasta problemas en edificios de varios niveles de oficinas desde la intrusión, el robo, el plagio, el clima, el incendio, entre otros. En todos estos casos existe la potencialidad de que cualquier falla desencadene un incendio destructor. El prever y superar tales sucesos es parte del programa del Edificio Inteligente.
  • Manejo preventivo de contingencias, es primordial dotar desde el diseño arquitectónico de aquellos elementos necesarios para superar las fallas en el control de humo y aire caliente, (efecto de chimenea) tanto en cubos de escaleras y de elevadores, ductos de instalaciones, vestíbulos y pasillos largos y falsos plafones. Para todo ello es necesario la compartimentación vertical para ductos de instalaciones. Sellos en los pasos de tubería de ventilación en muros y losas. Así como también el control automatizado en puestas de compartimentación, vestibulación y salidas de emergencia en las instalaciones y los ductos. 
  • Diseño Arquitectónico lógico, los edificios altos resuelven necesidades y problemas del programa arquitectónico, sin embargo crean nuevos problemas como su desalojo en un tiempo razonable, la falta de ventilación al no existir ventanas que puedan abrirse.
  • Acabados y decoración, básicamente habría que considerar el control de los materiales combustibles, empleando retardantes en los acabados del edificio, y dejando claramente indicadas la localización de rampas y escaleras.
El principal problema de los detectores es la falsa alarma que se ha tratado de resolver en la combinación de los diversos tipos de censores. Por otro lado existen los sistemas operados por detectores para compuertas de compartimentación, el control de la presión positiva en ductos de escaleras y elevadores, el control programado de sistemas de acondicionamiento de aire, la iniciación de las alarmas y el voceo a la par de los sistemas de supresión de fuego por agua, espuma, polvo químico y gas. Dando a su vez aviso a la estación de bomberos.

Grados de inteligencia

Existen tres grados de inteligencia, catalogados en función de la automatización de las instalaciones o desde el punto de vista tecnológico:
  • Inteligencia mínima o básica. Un sistema básico de automatización del edificio, el cual no está integrado.
    • Existe una automatización de la actividad y los servicios de telecomunicaciones, aunque no están integrados.
  • Inteligencia media. Tiene un sistema de automatización del edificio totalmente integrado.
    • Sistemas de automatización de la actividad, sin una completa integración de las telecomunicaciones.
  • Inteligencia máxima o total. Los sistemas de automatización del edificio, la actividad y las telecomunicaciones, se encuentran totalmente integrados. El sistema de automatización del edificio se divide en: sistema básico de control, sistema de seguridad y sistema de ahorro de energía.
    • El sistema básico de control es el que permite monitorear el estado de las instalaciones, como son: eléctricas, hidrosanitarias, elevadores y escaleras eléctricas, y suministros de gas y electricidad.
    • El sistema de seguridad protege a las personas, los bienes materiales y la información. En la seguridad de las personas, destacan los sistemas de detección de humo y fuego, fugas de gas, suministro de agua, monitoreo de equipo para la extinción de fuego, red de rociadores, extracción automática de humo, señalización de salidas de emergencia y el voceo de emergencia. Para la seguridad de bienes materiales o de información, tenemos el circuito cerrado de televisión, la vigilancia perimetral, el control de accesos, el control de rondas de vigilancia, la intercomunicación de emergencia, la seguridad informática, el detector de movimientos sísmicos y el de presencia.
    • El sistema de ahorro de energía es el encargado de la zonificación de la climatización, el intercambio de calor entre zonas, incluyendo el exterior, el uso activo y pasivo de la energía solar, la identificación del consumo, el control automático y centralizado de la iluminación, el control de horarios para el funcionamiento de equipos, el control de ascensores y el programa emergente en puntos críticos de demanda.

[DISPOSITIVOS MÓVILES] Comparativa entre sistemas operativos móviles

El mercado de smartphones esta en continuo movimiento: nacen nuevos sistemas operativos, desaparecen sistemas operativos, algunos marcan tendencias nuevas, otros pasan desapercibidos.

Aquí se muestran las principales características de los SO moviles actuales:
Windows Phone 7 Windows Mobile 6.5 iPhone OS 1.0 iOS 4.0 Android Symbian Maemo 5
Requerimientos mínimos del sistema SI NO SI SI NO NO NO
Tipo de pantalla Capacitiva Cap/Res Capacitiva Capasitiva Cap/Res Cap/Res
ResistivaFabricante único NO NO SI SI NO NO NO
Tipo de sistema operativo Cerrado Cerrado Cerrado Cerrado Abierto Abierto Abierto
Soporte de memoria externa Si Si No No SI SI SI
Copiar y pegar NO SI NO SI SI SI SI
Multitarea NO SI NO SI SI SI SI
Multitouch SI NO SI SI SI SI NO
Fragmentación NO SI NO NO SI NO NO
Tienda de apps Marketplace Marketpalce NO App Store Android Market (Google Play) Ovi Store Ovi Store
Tono personalizable NO SI NO SI SI SI SI
MMS SI SI NO SI SI SI NO
Soporte Adobe Flash NO SI NO NO SI SI SI
Tethering NO SI NO SI SI SI SI
Interfaz personalizable SI SI NO NO SI SI SI


En  la tabla de arriba vemos una comparación de algunos elementos fundamentales de los siete sistemas operativos y a continuación vamos a profundizar un poco más en cada uno de ellos.

Los requerimientos mínimos del sistema son una de los elementos clave de éxito según Apple y Microsoft. Estos requerimientos garantizan un comportamiento óptimo de todos los móviles que corran el sistema operativo y así un mayor grado de satisfacción del cliente. Algunos requerimientos mínimos impuestos por Microsoft a los fabricantes son estos: pantalla táctil capacitiva con resolución WVGA o HVGA, cámara de 5Mpx con grabación de vídeo HD y procesador de 1GHz.

Google y Nokia en este sentido han creado sistemas operativos capaces de correr con “cualquier hardware” aunque en la práctica esto puede perjudicar bastante la experiencia del usuario final.

En lo que se refiere al tipo de pantalla táctil está todo claro, Microsoft y Apple eligen pantallas táctiles de alta calidad capacitivas y Google y Nokia utilizan tanto pantallas resisitivas como capacitivas.

Entre los siete sistemas operativos sólo iOS y el antiguo iPhone OS están ligados a un hardware propietario.

Hablando del tipo de sistema operativo (abierto o cerrado) de nuevo se diferencian del resto Microsoft y Apple que prefieren no desvelar su código a los demás.

El soporte de memoria externa o ampliable está más o menos claro con todas las plataformas menos con Windows Phone 7. Microsoft ha utilizando una nueva táctica con este SO. Windows Phone 7 acepta tarjetas de memoria microSD, pero no permite cambiarlas. Es decir, la tarjeta de memoria debe insertarse en el móvil antes del primer arranque del sistema y una vez insertada ya no puede ser sacada sin pérdida de información. Esto se debe a que Windows Phone 7 añade la memoria de una tarjeta de memoria a la memoria interna y la trata como una memoria global del teléfono.

Con la función “copiar y pegar” que todo el mundo demanda pero a la hora de la verdad casi nadie utiliza también está todo claro. Las principales plataformas móviles soportan dicha función, menos el iPhone de primera generación con sus primeras versiones de iPhone OS y Windows Phone 7.

Multitarea. De nuevo iPhone OS y Windows Phone 7 están al margen.

Soporte de multitouch o capacidad multitáctil de pantalla. Los únicos sistemas operativos que no lo soportan son Windows Mobile 6.5 y Maemo 5.






El siguiente punto fragmentación es muy importante ya que representa un dolor de cabeza para algunas compañías. Con el iPhone está todo claro, las actualizaciones llegan desde Apple al mismo tiempo para todos, con Maemo 5 pasa lo mismo. La situación de Symbian es interesante, hasta ahora Nokia lanzaba actualizaciones previa aprobación por parte de la operadora que comercializaba el móvil y tampoco actualizaba de una versión de Symbian a la otra, pero a partir de ahora el fabricante finalndés promete actualizar todos los nuevos smartphones a la versión más reciente. Ya veremos si se cumple.

Windows Mobile también está bastante fragmentado, las actualizaciones dependen de tres factores: si Microsoft quiere, si el fabricante lo hace y si la operadora lo permite.

Con Android la cosa está peor aún. Es un sistema operativo no maduro que no para de recibir actualizaciones. Los fabricantes y las operadoras deciden actualizar o no los móviles. Ni a unos ni a otros les interesa, ambos quieren vender modelos nuevos y dejar los modelos antiguos sin soporte. Además algunos móviles de gama baja no aceptan actualizaciones físicamente.

Con Windows Phone 7 la cosa no está muy clara a primera vista. Por un lado Microsoft quiere actualizar el 100% de los modelos y teóricamente es posible al tener el hardware idéntico. Pero por otro lado también están las operadoras. Microsoft ha llegado a una decisión bastante interesante. La operadora puede retener una actualización, pero si antes de estar aprobada ésta llega una actualización nueva, el usuario podrá actualizar el teléfono con las nuevas funcionalidades de ambas actualizaciones ya que las actualizaciones para Windows Phone 7 son acumulativas.

Con tiendas de aplicaciones está todo claro.

Los sistemas operativos actuales admiten tonos de llamada personalizados, menos el Windows Phone 7. Aunque en WP7 está función está planificada y llegará con una de las próximas actualizaciones.

El único sistema operativo que no soportaba los mensajes multimedia MMS fue el iPhone OS en su día y Maemo 5 actualmente. Pero en Maemo existe una aplicación gratuita que habilita los MMS.






Llegamos a un tema del que se ha hablado mucho últimamente, el soporte de Adobe Flash. Apple no lo quiere ni ver en su iOS, los sistemas operativos abiertos lo permiten, el antiguo Windows Mobile 6.x también lo soporta, pero Windows Phone 7 no.

Tethering, o lo que es lo mismo, utilizar el móvil como módem en un PC. Todos lo soportan, menos Windows Phone 7. Al menos de manera oficial. De manera no oficial los móviles de Samsung si lo permiten, activando la función a través de un menú oculto.

Y llegamos al último punto de nuestra comparativa, la interfaz de usuario. Es personalizable hasta cierto punto en todos los sistemas operativos, menos en iOS.

[DISTRIBUIDOS Y PARALELOS] Replicación y consistencia

Esta es una entrada que se me olvidó publicarpero aquí está para complementar los temas de lo que trató la segunda parte del curso.
___________________________________________________________________________________


La replicación es el proceso de copiar y de mantener los objetos de la base de datos en las múltiples bases de datos que incorporan un sistema de base de datos distribuida. Las bases de datos distribuidas y la replicación de la base de datos son términos cercanos pero diferentes. En una base de datos distribuida pura, el sistema maneja una sola copia de toda la información y soporta los objetos de la base de datos.

Mientras que la replicación confía en tecnología de la base de datos distribuida para funcionar, la replicación de la base de datos puede ofrecer las ventajas de las aplicaciones que no son posibles dentro de un ambiente de base de datos distribuida puro. La replicación es útil para mejorar el funcionamiento y para proteger la disponibilidad de aplicaciones porque existen las opciones alternas del acceso de los datos.

Las aplicaciones transaccionales distribuidas de la base de datos, típicamente usa transacciones distribuidas para tener acceso a datos locales y remotos y modificar la base de datos global en tiempo real.

La replicación copia y mantiene los objetos de las bases de datos en las múltiples bases de datos que levantan un sistema distribuido.

Puede mejorar el funcionamiento y proteger la disponibilidad de las aplicaciones, porque alterna opciones de acceso de los datos existente.

Replicación básica

Con la replicación básica, la replicación de los datos proporciona el acceso a sólo-lectura a los datos de las tablas que provienen de un sitio primario. Sin embargo, las aplicaciones a través del sistema deben tener acceso a los datos en el sitio primario cuando las actualizaciones sean necesarias.

Replicación (Simétrica) Avanzada

Permite que las aplicaciones hagan actualizaciones a las réplicas de las tablas, a través de un sistema replicado de la base de datos. Con la replicación avanzada, los datos pueden proveer lectura y acceso a actualizaciones a los datos de las tablas.

Conceptos fundamentales

1. Aplicaciones de la replicación básica

La replicación básica es útil para la distribución de la información, tambien sirve como manera de replicar bases de datos enteras o información off-load. Por ejemplo, cuando el funcionamiento de grandes cantidades transacciones es crítico, puede ser ventajoso mantener una base de datos duplicada para aislar las preguntas exigentes de las aplicaciones de ayuda de decisión.

2.- Sólo lectura de las tablas de Snapshots

Sólo-lectura de las tablas de snapshots, es una copia local de los datos de la tabla que originan de unas o más tablas principales remotas. Una aplicación puede preguntar los datos en un snapshots de la tabla, pero no puede insertar, actualizar, o eliminar filas en los snapshots.

3.- Refresco de Snapshots

Los datos que un snapshots presenta, no necesariamente coinciden con los datos actuales de sus tablas principales. Una tabla de snapshots es un reflejo de transacciones consistentes de sus datos principales, como esos datos existieron en un punto específico en el tiempo. Para mantener los datos del Snapshots relativamente actuales con los datos de su master, el servidor debe restaurar periódicamente el Snapshot.

Objetos de la Replicación

Un objeto de replicación es un objeto de la base de datos que existe en los servidores múltiples en un sistema de la base de datos distribuida. Las facilidades avanzadas de la replicación, le permite replicar las tablas y los objetos de soporte tales como vistas, triggers de la base de datos, paquetes, índices, y sinónimos.

Grupos de Replicación

En un ambiente avanzado, se manejan objetos de replicación usando grupos de replicación. Organizando objetos relacionados de la base de datos dentro de un grupo de replicación, es más fácil administrar muchos objetos juntos. Típicamente, se crea y utiliza un grupo de replicación para organizar el esquema de objetos necesarios para apoyar una aplicación particular de la base de datos. La restricción básica es que un objeto de la replicación puede ser un miembro de solamente un grupo.

Sitios de Replicación

Un grupo de la replicación puede existir en múltiples sitios de replicación. Los ambientes avanzados de replicación soportan dos tipos básicos de sitios: Sitios maestros y sitios de snapshot.
Catálogo de Replicación

Cada sitio maestro y de snapshot en un ambiente avanzado de replicación tiene un catálogo de replicación. El catálogo de replicación de un sitio es un sistema distinto de diccionario de tablas y vistas que mantienen información administrativa sobre objetos de la replicación y grupos de replicación en el sitio. Cada servidor que participa en un ambiente avanzado de replicación, puede automatizar la replicación de objetos en grupos usando la información en su catálogo de la replicación.

Consistencia

Se dice que un sistema soporta un determinado modelo, si las operaciones en memoria siguen normas específicas. La consistencia de los datos es definida entre el programador y el sistema, que garantiza que si el programador sigue las reglas, la memoria será consistente y el resultado de las operaciones de memoria será predecible.


Una base de datos distribuida está en un estado consistente si obedece todas las restricciones de integridad (significa que cuando un registro en una tabla haga referencia a un registro en otra tabla, el registro correspondientes debe existir) definidas sobre ella.

Los cambios de estado ocurren debido a actualizaciones, inserciones y supresiones de información. Por supuesto, se quiere asegurar que la base de datos nunca entre en un estado de inconsistencia.

Sin embargo, durante la ejecución de una transacción, la base de datos puede estar temporalmente en un estado inconsistente.

El punto importante aquí es asegurar que la base de datos regresa a un estado consistente al fin de la ejecución de una transacción.


El control de consistencia es la parte más difícil de la replicación, para ello existen muchas herramientas actuales que poseen mecanismos sofisticados para realizar dicha tarea. Desde este punto de vista, se debe evaluar la posibilidad de utilizar algunos de estos software propietarios, o realizar un software propio para el correcto control de las réplicas.




[DISPOSITIVOS MÓVILES] Android ROM's

Como todos saben, Android es un sistema operativo basado en linux para moviles, ademas que junto con iOS lidera el mercado de sistems operativos móviles.

Android tiene sus ventajas y desventajas que pienso que hemos visto a lo largo del semestre al desarrollar nuestra aplicación (los que desarrollaron en android claro). Sin embargo, como todos saben, Android es de código abierto, por lo que suelen desarrollar versiones distintas para modelos especificos de móviles.


Cuando una compañía decide crear un nuevo terminal, debe instalarle un SO, a veces la compañía es la propietaria del mismo como por ejemplo Nokia con Symbian o Maemo o bien usa un SO de un tercero como el caso de todos los móviles que traen Android.

Google ha creado este SO y las fabricantes de los terminales lo implementan. A veces lo introducen tal y como venía de Google como en el caso de la HTC Magic o los Nexus y otras veces lo modifican como en los casos de las HTC Desire, Motorola Dext… en las que le aplican una capa por encima para añadirle algunas funcionalidades propias que no traía el SO original, en los casos citados son las famosas capas Sense y Motoblur respectivamente.

Cuando adquirimos nuestro móvil Android nos encontramos ante dos posibilidades, que sea un terminal libre o que venga bloqueado para una sola operadora de telefonía. Dependiendo de en cual de los casos nos encontremos, veremos que la interfaz del SO puede variar mucho.

Si el terminal es libre lo encontraremos tal y como la empresa que lo ha fabricado ha decidido ponerlo, modificando el SO original de Google o no, mientras que si el terminal no es libre sino que proviene de tu compañía de telefonía, ésta le habrá hecho una serie de modificaciones para adaptarlo a sus gustos/necesidades.

Estas modificaciones que realizan las compañías, tanto las fabricantes de los terminales (HTC; Motorola…) como las que realizan las operadoras se realizan sobre la ROM, de modo que dos teléfonos que en principio llevan el mismo SO pueden ser muy diferentes tanto visualmente como estructuralmente gracias a estas modificaciones de las ROMS.

por mencionar algunas caracteristicas:


  • El uso de una ROM personalizada por lo general resulta más eficiente en cuanto a correcciones de errores y otros problemas que surgen, a diferencia del fabricante que no siempre publica actualizaciones. Las actualizaciones se publican más rápido.
  • Un desarrollador de una ROM por lo general gana una comunidad dispuesta a probar versiones beta y que comunican de una forma más segura los errores que la versión tenga, por lo que es más segura que la version de fabricante.
  • Mejor rendimiento y eficiencia. Las ROMs personalizadas son a menudo más rápidas, más eficientes y usan menos memoria porque el desarrollador ha quitado cosas poco útiles, como por ejemplo aplicaciones de soporte de instalación.



Algunos ejemplos de estas son:

CyanogenMod


CyanogenMod es un firmware no oficial disponible para más de treinta teléfonos móviles y tabletas basados en el sistema operativo de código abierto Android. Ofrece características que no se encuentran en las versiones oficiales basadas en Android suministradas por los fabricantes, incluyendo, entre otras mejoras:

  • Soporte para Free Lossless Audio Codec (FLAC)
  • Multi-touch
  • Caché comprimida (compcache)
  • Una larga lista de APNs
  • Menú de reinicio
  • Soporte para tethering mediante Wi-Fi, Bluetooth o USB

CyanogenMod asegura que sus modificaciones mejoran el rendimiento y la fiabilidad frente a las versiones oficiales del software.



MIUI


MIUI (pronunciado "miyuai") es un firmware no oficial para smartphones basado en el sistema operativo de código abierto Android desarrollado por Xiaomi Tech. Cuenta con una interfaz de usuario muy modificada que elimina el cajón de aplicaciones Android y ha sido comparado con el iOS de Apple.

Incluye funciones adicionales que no se encuentran en Android, incluyendo conmutadores en la ventana de notificaciones, nuevas aplicaciones como el reproductor de música, la galería de imágenes o la cámara de fotos, y un marcador telefónico alterado que muestra los contactos que coinciden mientras el usuario marca números.







Replicant


Replicant es un clon de software libre de Android, eliminando componentes y APIs propietarias del SDK. Intenta reemplazar los controladores (drivers) propietarios de hardware requeridos en algunos teléfonos con controladores libres y de código abierto3
Su nombre es un juego de palabras con replicantes, una variante de un robot androides (sinónimo = bioroid) en la película Blade Runner.


[CÓMPUTO INTEGRADO] Consejos y técnicas de optimización

Cuando realizé mi proyecto PIC, este trataba sobre calcular los primos de 0 a 255 y me vi en un gran lio con el algoritmo para calcular los primos, ya que, aunque no hay que subestimar el poder de uno de esos microcontroladores, la memoria es un factor importante para el correcto funcionamiento de una rutina en un PIC.

Existen algoritmos para calcular los primos, pero involucran un gran gasto de memoria, así que pondré las etapas por las que pasé para resolver el problema.

1. Memoria

La memoria es el factor importante como se mencionó antes, así que para hacer un proyecto con PICs siempre hay que tener en cuenta un estimado de la memoria que podría usar, para poder escoger el microcontrolador adecuado.

En caso de que tu proyecto dependa de un microcontrolador específico pero la memoria sea insuficiente, puedes utilizar memorias EEPROM mediante el protocolo I2C. Proporcionan memoria adicional y la comunicación es sencilla.

La plataforma Arduino tiene librerías para el manejo de memorias EEPROM y flash, por lo que es mucho más sencillo su uso.

En mi caso, no tuve problemas con la memoria ya que mi algoritmo fue simple al final.

2. Código

Lo siguiente en la lista es el código que ejecuta. Quizá el problema no sea la memoria insuficiente, quizá sea que el código simplemente no esté bien optimizado, este fue el primer problema que tuve, ya que el primer algoritmo que utilizé no era del todo óptimo.

Al principio utilizé MPASM, pero luego me cambié a MikroBasic, luego hablaremos de los lenguajes. Debido a que en MPASM no existen operadores matemáticos más grandes que la suma y la resta mi algoritmo se basó en restas:

Si por ejemplo tengo un 9, le digo a mi programa que a 9 le reste 9-1

  • 9 - (9 - 1) = 1
Si el resultado es menor a 9 - 1 se resta 1 a 9 - 1 y ahora es 9 - 2, se repite el proceso hasta que el resultado sea mayor que 9 - el número que le toque. De ser así sucede lo siguiente:
  • 9 - (9 - 5) = 5 ---> 5 - (9 - 5) = 1
Se sigue hasta que el número que se resta sea un número 2 unidades menor que 9, en este caso 7, después de eso, se acaba y sigue con el siguiente número a saber si es primo o no.

De encontrar un 0 de resultado en este proceso, se sale del ciclo y le dice al programa que el número NO es primo, de llegar al final sin 0 entonces e programa sabe que el número es primo

Al pasarme a MikroBasic, encontré las multiplicaciones y divisiones, inclusive encontré la función para sacar el módulo sin la necesidad de hacer una división.

Mi algoritmo cambió de hacer largas restas a buscar un módulo y saber si es 0 o no:
  • Se pasan directamente los números 0, 1, 2, 3, 5 y 7
  • Se saca el módulo del número dividido entre  2
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 3
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 5
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 7
    • Es 0?; SI, se sale y anuncia que no es primo; NO, el número es primo
De ambos, el segundo parece más óptimo, ya que solo usa unas cuantas condiciones, en cambio el primero  parece que llenará la memoria con restas y más restas.

La verdad, MikroBasic al traducir el código a un .hex realizará lo mismo que hice al principio, solo que agregará cosas que no se habían contemplado, ya que después de todo, los microcontroladores funcionan con puras sumas y restas. Se puede decir que la primera idea pudo ser mejor que la segunda de haberla escrito en forma más organizada y mejor planteada.

Como recomendación, siempre hay que utilizar lo que nos ofrezca  una mayor optimización aunque esto requiera de escribir y pensar un poco más.

3. Lenguaje

La tercera cosa más importante que yo considero es la selección del lenguaje. En mi proyecto yo utilicé el lenguaje MikroBasic, ya que es muy practico para pequeños proyectos, pero si nuestro poryecto consiste en ahorrar memoria y realizar operaciones matemáticas muy largas, recomendaría, desde mi punto de vista, utilizar MPASM.

Con MPASM tenemos control total de la memoria y es cosa de nosotros como la utilizaremos. Podemos utilizar y reutilizar registros, etc.

Los lenguajes de más alto nivel son útiles si no tenemos experiencia con assembler (como yo), pero incluso el mismo lenguaje nos permite escribir parte del código en assembler.

Las ventajas de MPASM:
  • Set de instrucciones fácil de comprender.
  • Control total de los recursos.
  • Más óptimo.
Las desventajas de MPASM:
  • El código se vuelve difícil de comprender al escribir varias lineas.
  • Solo hay 2 operandos, suma y resta.
  • Hay que portar el código de un microcontrolador a otro.
Las ventajas de lenguajes de alto nivel:
  • Fácil uso.
  • Disponemos de todos los operandos.
  • Portabilidad entre microcontroladores muy practica.
  • Detección y solución de errores más práctica.
Las desventajas de lenguajes de alto nivel:
  • El .hex resultante no es del todo optimizado.
  • No sabemos como queda distribuido el uso de la memoria.
Estos 3 temas son importantes a la hora de hacer nuestro proyecto PIC, Arduino o inclusive algun programa de computadora que requiera de optimización de memoria.

martes, 22 de mayo de 2012

[CÓMPUTO INTEGRADO] Multiplexación

En mi proyecto utilicé 3 displays y un solo decodificador, sin embargo un decodificador solo tiene 7 salidas para los 7 pines del display, y comprar un decodificador por display es algo no muy óptimo tanto en cuestión de energía como en cuestión económica.

La forma correcta de utilizar estos es utilizando una técnica llamada multiplexación. La multiplexación es la combinación de dos o más canales de información en un solo medio de transmisión usando un dispositivo llamado multiplexor.

La multiplexación permite utilizar un decodificador para una cantidad de displays dada, esta cantidad depende del total de microsegundos que asignes entre cada display.

Una vez que ya tengas tu programa que haga algo relacionado con contar números puedes proceder a multiplexar. La técnica funciona de esta manera:
  1. Se enciende el pin del display a utilizar.
  2. Se llama a la parte del programa que muestra el primer dígito.
  3. Se encienden los pines del decodificador.
  4. Se hace un delay de unos cuantos microsegundos.
  5. Se apaga el pin del display.
  6. Se repite el proceso.
Algo importante a tomar en cuenta es que el delay que se hace entre displays afecta la forma en que se muestran los dígitos. Para 3 displays, un delay de 10 ms funciona perfecto, pero al aumentarlo a 15, se puede ver como parpadean los leds de los displays.

Para una cantidad mayor de displays se requiere un delay menor, 6 displays se verían bien con 5 ms. para cantidades mayores de displays, podría haber problemas de visualización, por lo que se puede agregar un segundo decodificador y hacer una doble multiplexación, o bien mediante el mismo método multiplexar los decodificadores, ya que sirve para cualquier componente, no solo displays.

Existen multiplexores TTL que ya hacen el trabajo por nosotros, pero bien se pueden programar multiplexores en cualquier microcontrolador.

Desde el mismo arduino se puede hacer este proceso, y de una manera más sencilla.

En el siguiente sketch de arduino se muestra la forma en que se multiplexa 3 displays para un contador, está basado en mi proyecto que es precisamente un contador de correos pero modificado para que solo sea un contador por tiempo, cabe destacar que entre mayor sea el delay entre displays, el contador se vuelve más lento y se nota el parpadeo.

// Pines del decodificador
int A = 13;
int B = 12;
int C = 11;
int D = 10;

int x = 0, y = 0, z = 0; // Cifras del valor serial individuales
int time1 = millis();
int time2= time1;
void setup()
{
  pinMode(A, OUTPUT); // Pines del decodificador como salidas
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
  
}

void loop() {
    display_values();
    multiplex();
}

void display_values() {
    x++;
    if (x == 10){
      x = 0;
      y++;
    }
    if (y == 10){
      y=0;
      z++;
    }
    if (z == 10){
      x=0;
      y=0;
      z=0;
    }
}

void dec_bin(int value){
  if (value == 0){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 1){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 2){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 3){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 4){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 5){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 6){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 7){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 8){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
    else if (value == 9){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
}

void multiplex(){
        dec_bin(x);
        digitalWrite(3, HIGH);
        delay(10);
        dec_bin(y);
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        delay(10);
        dec_bin(z);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        delay(10);
        digitalWrite(5, LOW);
      }

[CÓMPUTO INTEGRADO] Proyecto arduino

Para mi proyecto hice un contador de mails nuevos en Gmail, consiste en un código que ejecuta en la computadora en python y en el código de Arduino.

La lista de materiales consiste en :
  • 1 Arduino UNO
  • Decodificador 7447
  • 3 displays ánodo común
  • 3 resistencias 330Ω
  • Cable USB
  • Muchos otros cables
Algunas imagenes de como quedó:



El proyecto tiene 2 códigos, el código en python ejecuta localmente y utiliza las librerias pyserial y feedparser; el primero se encarga de establecer conexión serial via USB con el Arduino, el segundo se encarga de conectarse con el RSS de Gmail para contar el total de correos.

El código es:

import serial, sys, feedparser, os
from time import sleep

#Ajustes de cuenta

USERNAME="**************@gmail.com"
PASSWORD="***********"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "/dev/tty.usbmodemfa131" # Puerto a utilizar para establecer conexión

def serialgmail():

# Ajustando el puerto

	try:
            ser = serial.Serial(SERIALPORT, 9600)
            sleep(1)
            ser.write(chr(1))
	except serial.SerialException:
		print "No hay dispositivo conectado"
		sys.exit()

	newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   

	for i in range(newmails): 
            sleep(.01)
            ser.write(str(0))
            sleep(.01)
            
#ser.close()

while True:
	serialgmail()
	sleep(15)

El código de Arduino es el siguiente:
// Pines del decodificador
int A = 13;
int B = 12;
int C = 11;
int D = 10;

int mail; // Nuevos mails?
int val; // Valor del puerto serial a mostrar en los displays

int x = 0, y = 0, z = 0; // Cifras del valor serial individuales

void setup()
{
  pinMode(A, OUTPUT); // Pines del decodificador como salidas
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT); 
  
  Serial.begin(9600);
  Serial.flush();
  
  // Se inicia con el led apagado
  mail = LOW;
  digitalWrite(9, HIGH);
}

void loop() {
  // Lectura de serial
  val = Serial.read();
  Serial.write(val);
  if (Serial.available()) {
    Serial.println(val);
    while(true){
      multiplex();
    }
  }
}

void display_values() {
  int aux = 0;
  while (aux <= serReadInt()){
    x++;
    if (x == 10){
      x = 0;
      y++;
    }
    if (y == 10){
      y=0;
      z++;
    }
    aux++;
  }
}

void dec_bin(int value){
  if (value == 0){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 1){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 2){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 3){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 4){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 5){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 6){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 7){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 8){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
    else if (value == 9){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
}

void multiplex(){
  display_values();
  dec_bin(x);
  digitalWrite(3, HIGH);
  delay(5);
  dec_bin(y);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  delay(5);
  dec_bin(z);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  delay(5);
  digitalWrite(5, LOW);
}

int serReadInt()
{
 int i, serAva;                           // Contador i, serAva espera a que haya información disponible en serial
 char inputBytes [7];                     // Arreglo de bytes que se reciben
 char * inputBytesPtr = &inputBytes[0];   // puntero al primer elemento
     
  if (Serial.available()>0)            // Hay informacion en serial?
 {
   delay(.0000001);                              //Delay para la transmición
                                              
   serAva = Serial.available();  // Se lee el número de bytes de entrada
   for (i=0; i "mayor que" serAva; i++)       // Se cargan los bytes recibidos al arreglo
     inputBytes[i] = Serial.read();
   inputBytes[i] =  '\0';             // Se pone el caracter nulo al final
   return atoi(inputBytesPtr);    
 }
 else
   return -1;                           // Se regresa -1 si no hay información de entrada
}

[DISPOSITIVOS MÓVILES] DroidDraw - Diseño de interfaces gráficas Android online

Uno de los temas más importantes en el desarrollo de aplicaciones móviles es la interfaz gráfica. En pequeños dispositivos es muy importante este aspecto, las aplicaciones debe ser fáciles de usar y así mismo llamativas para el usuario.

Existen herramientas para la creación de una interfaz para android que consta de un archivo xml que define la posición de cada elemento, y al estar separada del código hace más fácil su diseño.

DroidDraw es una herramienta programada en Java que permite crear interfaces de forma sencilla; arrastrando módulos y soltándolos. Aunque herramientas como eclipse o netbeans cuentan con editores gráficos, DroidDraw esta disponible para utilizarse en línea, opcionalmente se puede descargar el mismo archivo del programa.

Se muestra siempre la preview de la interfaz de como va quedando a manera de que vallamos editándola, en la pestaña Windgets se muestran los módulos que generalmente encontramos en todo programa: botones, check boxes, etc.
La pestaña Layouts muestra precisamente los distintos tipos de layouts que sirven para distribuir los elementos de una interfaz en la pantalla de una forma ordenada.

La pestaña Properties muestra las propiedades que tiene cada elemento en la interfaz y la forma en que se comportan, se definen parametros como el tamaño del elemento, color, etc.

La pestaña Support muestra la informacion de los desarrolladores asi como ligas a paypal.

Para generar una interfaz facil, solo hay que arrastrar los módulos y de ahí mismo se pueden estirar o encoger para definir el tamaño y la posición, damos click sobre "Generate" y en "Output" aparecerá el xml listo para exportar a nuestra aplicación. De igual modo podemos copiar nuestro xml y pegarlo en "Output" y dar clic sobre "Load" para que se cargue la interfaz anteriormente editada.

La página donde se ejecuta la aplicación tambien tiene Ligas a tutoriales de edición y contiene los archivoa para descargar el programa.

jueves, 17 de mayo de 2012

[CÓMPUTO INTEGRADO] Osciladores (PIC16F84A)

Para mi proyecto había comprado un pic16f84a debido a que fue el que me recomendó el que me atendía. Según el era de los que más se vendía y de los más eficientes. Lo compré por que me convenció, sin embargo había un detalle que se le olvidó comentar; el pic16f84a es un microcontrolador que no tiene un oscilador interno como la mayoría de los pics que han presentado.

Al principio pensé que no representaba un gran problema, sin embargo, el oscilador es la parte que hace funcionar el pic.

Oscilador para el 16f84A

Todo microprocesador o microcontrolador requiere de un circuito que le indique a que velocidad debe trabajar. Este circuito es conocido por todos como un oscilador de frecuencia. Este oscilador es como el motor del microcontrolador por lo tanto, este pequeño circuito no debe faltar. En el caso del microcontrolador PIC16F84 el pin 15 y el pin 16 son utilizados para introducir la frecuencia de reloj.

El microcontrolador PIC16F84 requiere de un circuito externo de oscilación o generador de pulsos de reloj. La frecuencia de reloj máxima es de 20 Mhz.


El PIC16F84 puede utilizar cuatro tipo diferentes de reloj oscilador externos. El tipo de oscilador dependerá de la precisión, velocidad y potencia que requiramos; por otro lado, el coste también es una aspecto a tener en cuenta a la hora de elegir un oscilador u otro.

En el momento de programar el microcontrolador se deberá especificar en los parámetros el tipo de oscilador que utilizamos en nuestro proyecto electrónico. Por ejemplo si su frecuencia de trabajo es de 10 MHz entonces la configuración del microcontrolador deberá estar en "HS"; pero si su frecuencia de trabajo es de 4 Mhz entonces la configuración del microcontrolador deberá estar en "XT".

Tipos de oscilador

Podemos hacer uso de 4 tipos diferentes de osciladores:
  • Oscilador tipo "XT" (XTal) para frecuencias no mayores de 4 Mhz.
  • Oscilador tipo "LP" (Low Power) para frecuencias entre 32 y 200 Khz.
  • Oscilador tipo "HS" (High Speed) para frecuencias comprendidas entre 4 y 20 MHz.
  • Oscilador tipo "RC" (Resistor/Capacitor) para frecuencias no mayores de 5.5 Mhz. 
Oscilador de tipo XT



La condición básica importante para que este oscilador funcione es que los condensadores C1 y C2 deberán ser iguales.

A continuación se detallan algunos valores:


Oscilador de tipo LS (Low Power) para frecuencias entre 32 y 200 Khz

Este oscilador es igual que el anterior, con la diferencia de que el PIC trabaja de una manera distinta. Este modo está destinado para trabajar con un cristal de menor frecuencia, que, como consecuencia, hará que el PIC consuma menos corriente.

Oscilador de tipo HS (High Speed) para frecuencias comprendidas entre 4 y 20 MHz

Habremos de usar esta configuración cuando usemos cristales mayores de 4 MHz. La conexión es la misma que la de un cristal normal.

Oscilador de tipo RC

Si no se requiere mucha precisión en el oscilador, se puede utilizar una resistencia y un condensador.


Oscilador TTL

Este tipo de oscilador está basado en un Cristal que contiene toda la circuitería para generar una onda cuadrada. Este ha de ser conectado como si de un generador de señal externa se tratase. Al incluir toda la circuitería esto lo convierte en la opción más costosa; pero representa la forma más práctica por la cantidad de conexiones y por la precisión en la señal de reloj emitida. En la imagen de la siguiente figura se muestra como debe conectarse al microcontrolador y las características del cristal.

Estos tipos de cristales están diseñados especialmente para tecnologías TTL. La frecuencias disponibles para esta versión de cristal son muy amplias y las mas usuales son 1 - 1.8432 - 2 - 4 - 8 - 10 - 11.059 - 12 - 14.31818 - 16 - 20 - 25 - 32 - 33 - 40 - 50 - 80 y 100 Mhz. 




[DISTRIBUIDOS Y PARALELOS] Redes de Petri


Una red de Petri representa un sistema cuando se asigna un significado o una interpretación a las plazas, transiciones y testigos.

La descripción de un sistema mediante una red de Petri se basa en dos conceptos:
  • Evento.
  • Condición.

Un evento es una acción que ejecuta el sistema. Se modela mediante una transición.

La realización de un evento depende del estado del sistema, que se describe mediante un conjunto de condiciones, que se modelan mediante las plazas.

Los arcos que conectan las transiciones y las plazas representan la dependencia entre los eventos y las condiciones. 

La verificación de una condición se representa situando un testigo dentro de la plaza que lo modela.

Una RdP marcada representa la coordinación entre eventos.

Las redes de Petri pueden describir fácilmente sistemas en los que se producen relaciones de paralelismo, exclusión mutua y sincronización entre procesos que ocurren en ellos.

Cuando varios procesos que se ejecutan en paralelo comparten información, es necesario garantizar que los accesos a la información común no se lleve a cabo simultáneamente para evitar problemas de interferencia que conduzcan a resultados erróneos.

Una solución a este problema es hacer mutuamente excluyentes las secciones críticas de los diferentes procesos encargadas de acceder a la información. En la figura, se muestra una RdP que resuelve este problema.


Ejemplo de Productor/Consumidor

Los procesos productor/consumidor involucran elementos de datos compartidos por ambos procesos y, en consecuencia, es necesario plantear tareas de sincronización entre ambas.

En las figuras, se muestran dos procesos de este tipo. El primero supone la existencia de un buffer infinito capaz de absorber la diferencia de velocidad entre el productor y el consumidor. El segundo limita la capacidad de este buffer a n unidades del producto.


Problema de la cena de los filosofos


Este es un problema de sincronización para la utilización compartida de recursos.

Supónganse un conjunto de cinco filósofos que se reúnen para cenar y filosofar. La comida es china y se presenta la dificultad de que a cada comensal sólo le han colocado un palillo.

Con el fin de cenar, llegan a la solución de que cada comensal puede utilizar el palillo del comensal que tiene a su izquierda, siempre que él tenga el suyo (no se lo haya cogido el de su izquierda) y el comensal de la derecha no estécomiendo.

En la figura, se muestra una red de Petri que representa la dinámica que sigue esta comida.


Proceso de lectura y escritura sobre un recurso común


Se supone que existen procesos de dos tipos: procesos de lectura y de escritura. Todos los procesos
comparten un recurso común sobre el que escriben y leen. Los procesos de lectura no modifican la
información y, en consecuencia, todos ellos son compatibles entre sí. Por el contrario, el proceso de
escritura modifica la información y, por tanto, es excluyente con cualquier otro proceso de lectura y de
escritura. Se pretende establecer el proceso de control que permita el acceso a todos y que no conduzca al
sistema a ningún bloqueo.

En  la figura (a), se muestra una solución para el caso de que el número de lectores que simultáneamente pueden acceder al recurso sea finito e igual a n.

En  la figura (b), se muestra una solución para el caso en que se considera que el número de lectores es indefinido y que todos ellos pueden acceder simultáneamente al recurso. En este caso, el problema de
control no tienen solución desde las redes de Petri ordinarias y es necesario acudir a redes de Petri con
arcos inhibidores.




[CÓMPUTO INTEGRADO] Proyecto PIC

Para mi proyecto, hice un contador de números de 0 a 999 que ademas dice si el número mostrado es par o si es primo. Por problemas con el algoritmo mostrare el funcionamiento en el simulador y en el pic aparte, ya que por alguna razón no funciona la parte donde decide que el número es o no primo.

El material que utilizé:

  • 2 leds
  • 2 resistencias de 330 ohms
  • 3 displays 7 segmentos anodo común
  • 1 decodificador 7447
  • 1 pic16f628a
  • muchos cables
  • 1 protoboard

El circuito esta de la siguiente manera:


El código utilizado para el pic:

program reloj
  symbol display1 = PORTB.4
  symbol display2 = PORTB.5
  symbol display3 = PORTB.6
  symbol led_par = PORTA.1
  symbol led_prim = PORTA.0

  const numeros as byte[10] = (%00000000, %00000001, %00000010,
  %00000011, %00000100, %00000101, %00000110, %00000111, %00001000,
  %00001001)
  dim centenas as byte
  dim decenas as byte
  dim unidad as byte
  dim i as integer
  dim j as integer
  dim auxi as integer
  dim prim2 as integer
  dim prim3 as integer
  dim prim5 as integer
  dim prim7 as integer
  dim par as integer

 sub procedure parprim
     if auxi = 0 then
        goto final
     end if
     if auxi = 1 then
        goto final
     end if
     if auxi = 2 then
        led_prim = 1
        goto salto
     end if
     if auxi = 3 then
        led_prim = 1
        goto salto
     end if
     if auxi = 5 then
        led_prim = 1
        goto salto
     end if
     if auxi = 7 then
        led_prim = 1
        goto salto
     end if
     led_prim = 0
     led_par = 0
     prim2 = auxi mod 2
     prim3 = auxi mod 3
     prim5 = auxi mod 5
     prim7 = auxi mod 7
     if prim2 <> 0 then
        if prim3 <> 0 then
           if prim5 <> 0 then
              if prim7 <> 0 then
                 led_prim = 1
              end if
           end if
        end if
     end if
     'auxi2 = auxi-1
     'while auxi2 > 1
     '    prim = auxi mod auxi2
     '    if prim <> 0 then
     '       auxi2 = auxi2-1
     '    end if
     '    if prim = 0 then
     '       goto salto
     '    end if
     '    led_prim = 1
     'wend
     salto:
     par = auxi mod 2
     if par = 0 then
        led_par = 1
     end if
     final:
 end sub

 sub procedure multiplexar
     PORTB = numeros[centenas]
     display1 = 1
     delay_ms(2)
     PORTB = numeros[decenas]
     display1 = 0
     display2 = 1
     delay_ms(2)
     PORTB = numeros[unidad]
     display2 = 0
     display3 = 1
     delay_ms(2)
     INC(i)
     parprim
  end sub

main:
  'entrada
  CMCON = 0x07
  TRISB = %00000000
  TRISA = %00000000
  centenas = 0
  decenas = 0
  unidad = 0
  display1 = 0
  display2 = 0
  display3 = 0
  i = 0
  while True
        multiplexar
        if i = 200 then
        i=0
          unidad = unidad + 1
          auxi = auxi + 1
          if unidad > 9 then
             unidad = 0
             decenas = decenas + 1
             if decenas > 9 then
                   decenas = 0
                   centenas = centenas + 1
                   if centenas > 9 then
                      auxi = 0
                      unidad = 0
                      decenas = 0
                      centenas = 0
                   end if
             end if
          end if
        end if

  wend

end.

[DISTRIBUIDOS Y PARALELOS] Más sobre grids - Globus Toolkit

La semana pasada hable un poco sobre lo que son los grids, sus características y aplicaciones; se había dicho que un grid es una red de meta-computacion, osea, capacidades computaionales superiores a las conocidas actuales. Junto con clustering, grid es otro paradigma de la computación distribuida, solo que el primero esta orientado a los servicios de computación local con una función concreta.

Middleware

“Middleware” es el software que organiza e integra los recursos en una grid.

El middleware está hecho con muchos programas (softwares) y contiene cientos de miles de líneas de código computacional. Una vez unido, este código automatiza todas las interacciones “máquina a máquina” (M2M) que crean una única grid computacional.

El middleware negocia de manera automática “acuerdos” mediante los cuales se intercambian los recursos; vale decir, acuerdos referidos al paso desde el proveedor de recursos de grid hacia el usuario de la grid. En estos “acuerdos”, algunos programas del middleware actúan como “agentes” y otros como “corredores de bolsa” (brokers).

Los programas agentes presentan “metadatos” (datos acerca de los datos) que describen a los usuarios, datos y recursos. Los programas brokers se encargan de las negociaciones M2M (Machine to Machine - Máquina a Máquina), requeridas para la autenticación y la autorización, y luego aclaran los “acuerdos” para acceder y pagar por los datos y recursos específicos.

Cuando se establece un acuerdo, el broker agenda las actividades computacionales y supervisa las transferencias de datos requeridas. Al mismo tiempo, agentes especializados en el “cuidado de la casa” optimizan los enrutamientos de la red y monitorean la calidad de servicio.

Y todo esto ocurre de manera automática, en apenas una fracción del tiempo que le llevaría a los humanos hacerlo de modo manual en sus computadoras.

Hay muchas otras capas dentro de la capa del middleware. Por ejemplo, el middleware incluye una capa de protocolos de recursos y conectividad, y una capa superior de servicios colectivos.

Los protocolos de recursos y conectividad manejan todas las transacciones de red “específicas para grid” que se desarrollan entre los computadores y los recursos de grid. Por ejemplo, los computadores contribuyendo en una grid específica deben reconocer los mensajes de grid relevantes e ignorar el resto. Esto se hace mediante protocolos de comunicación que permiten a los recursos comunicarse unos con otros, permitiendo el intercambio de datos, y protocolos de autenticación, que proveen mecanismos seguros para verificar la identidad de los usuarios y los recursos.

Los servicios colectivos también se basan en protocolos: protocolos de información que obtienen información acerca de la estructura y el estado de los recursos en la grid, y protocolos de manejo, que negocian el acceso a los recursos de un modo uniforme. Los servicios colectivos incluyen:

  • directorios de actualización de recursos disponibles,
  • recursos negociables (para aquellos que disfrutan de las negociaciones en la bolsa, se trata de las negociaciones entre aquellos que quieren “comprar” recursos y aquellos que quieren “vender”)
  • monitoreo y diagnóstico de problemas
  • réplica de datos para que múltiples copias puedan estar disponibles en diferentes locaciones para facilitar su uso
  • provisión de servicios de membresía/política para saber a quién se le ha permitido hacer qué y cuándo.

Globus Toolkit

Existen varias herramientas que permiten la creación y gestión de grids. Un ejemplo popular es Globus Toolkit. Éste es un conjunto de herramientas de software requeridas para la construcción de una grid, cubriendo mediciones de seguridad, localización de recursos, manejo de recursos, comunicaciones y más.

La herramienta Globus ha emergido como el estándar de facto para la capa intermedia (middleware) de la grid. Globus tiene recursos para manejar:
  • La gestión de recursos(Protocolo de Gestión de Recursos en Grid o Grid Resource Management Protocol)
  • Servicios de Información (Servicio de Descubrimiento y Monitorización o Monitoring and Discovery Service)
  • Gestión y Movimiento de Datos (Acceso Global al Almacenamiento Secundario, Global Access to secondary Storage y FTP en grid, GridFTP)
La mayoría de grids que se expanden sobre las comunidades académicas y de investigación de Globus Toolkit como núcleo de la capa intermedia.

Muchos de los grandes proyectos grid emplean Globus Toolkit, software desarrollado por Globus Alliance, un equipo inicialmente compuesto por el grupo de Ian Foster, en el Laboratorio Nacional Argonne, y por el de Carl Kesselman, en la Universidad de California del Sur en Los Ángeles (Estados Unidos).

Muchos de los protocolos y funciones definidas por Globus Toolkit son similares a aquellas que hoy operan para las redes y los almacenajes, pero han sido optimizadas para desarrollos específicos de grid.

Globus incluye programas como:
  • GRAM (Globus Resource Allocation Manager – Recurso Globus de Manejo de Asignación): se encarga de convertir las solicitudes de recursos en comandos que lo computadores locales puedan comprender.
  • GSI (Grid Security Infrastructure – Infraestructura de Seguridad Grid): autentifica a los usuarios y determina sus derechos de acceso.
  • MDS (Monitoring and Discovery Service - Servicio de Monitoreo y Descubrimiento): reúne información acerca de recursos tales como capacidad de procesamiento, capacidad de ancho de banda, tipo de almacenamiento y más.
  • GRIS (Grid Resource Information Centre – Centro de Recursos de Información Grid): recursos de consultas para sus actuales configuraciones, capacidades y status.
  • GIIS (Grid Index Information Service – Servicio de Índice de Información Grid): coordina arbitrariamente los servicios GRIS.
  • GridFTP (Grid File Transfer Protocol - Protocolo de Transferencia de Archivos Grid): provee un mecanismo de transferencia de datos de alto rendimiento, seguro y robusto.
  • Replica Catalog (Catálogo de Réplicas): provee la ubicación en la grid de las distintas réplicas de un grupo de datos determinado.
  • Replica Management system (Sistema de Manejo de Réplicas): maneja el Catálogo de Réplicas y el GridFTP, permitiendo a las aplicaciones crear y manejar réplicas de grandes grupos de datos.
Hay dos razones para el fortalecimiento y la popularidad de Globus Toolkit:
  1. Las grid necesitan soportar una amplia variedad de aplicaciones creadas de acuerdo a diferentes paradigmas de programación. En vez de proveer un modelo uniforme de programación para las aplicaciones grid, Globus Toolkit tiene un “acercamiento orientado al objeto”, proveyendo una bolsa de servicios para que los desarrolladores puedan escoger el servicio que mejor se adecua a sus necesidades. Además, las herramientas pueden introducirse de a una a la vez. Por ejemplo, una aplicación puede usar GRAM o GRIS sin tener que usar necesariamente Globus Security o los sistemas de manejo de réplicas.
  2. Globus Toolkit está disponible bajo acuerdo de licencia de “fuente abierta”, lo que significa que cualquiera el libre de utilizar o mejorar el software. Esto es similar a la World Wide Web y a los sistemas de operación Linux.

domingo, 13 de mayo de 2012

[DISPOSITIVOS MÓVILES] Baterías de los móviles

La batería es la parte más importante de tu teléfono móvil, sin ella tu teléfono solo se convertirá en un trasto más, que podrás llevar en el bolso o colgado en la cintura, aunque sin ninguna utilidad.

Al convertirse en un producto de consumo, pocos compradores son informados de como optimizar el rendimiento de las baterías, encontrándose al poco tiempo que la autonomía del móvil cae en picado y que apenas podemos realizar o recibir una llamada.

¿Que batería usa nuestro móvil?

Aunque las baterías tengan distinto tamaño, adaptados al diseño de nuestro móvil, las podemos encontrar de tres tipos: Níquel -Cadmio (NiCd), Níquel metal híbrido (NiMH) y Litio, además de las alcalinas que aceptan algunos modelos. Cada una de ellas precisa un mantenimiento distinto, por lo que, en primer lugar debemos conocer cual es la que usamos en nuestro móvil.

NiCd

Las baterías de Níquel y Cadmio (NiCd) son unas de las baterías para teléfonos móviles más comunes en el mercado. Fueron las primeras en comercializarse y aún se siguen fabricando para los modelos más populares. Incluso, a veces, es posible encontrar en establecimientos especializados increíbles ofertas, debido a que su material es más económico.
Se calcula que su duración máxima, con un buen mantenimiento, es de tres años, aunque la mayoría no alcanzan ni un año y eso que la NASA ha conseguido el desarrollo de unas baterías de este tipo capaces de trabajar durante 17 años y 70.000 ciclos de carga.

Sin embargo el usuario de estas baterías padece como ninguno los principales inconvenientes que tiene: el efecto memoria y la pérdida de carga cuando no se usa durante un tiempo.

El llamado efecto memoria se produce cuando cargamos la batería y esta aún no esta vaciando del todo.

Típicamente, si la batería es recargada aún conteniendo 30% de carga, pasará a conseguir usar apenas los restantes 70% de capacidad. Si es recargada con 60%, la capacidad queda reducida a 40%.

¿Por qué? En una batería de NiCd, los elementos activos, Níquel y Cadmio, existen en forma de cristales. Cuando las baterías son recargadas antes de descargadas totalmente, ocurre el efecto de memoria y los cristales crecen y se acumulan en formaciones, haciendo que la batería pierda gradualmente su capacidad. Rigurosamente no es el efecto de memoria (que vuelve los cristales mayores), pero sí el efecto de cristalización (que produce acumulaciones de cristales) el verdadero problema de las baterías. En estado de degradación adelantados, las formaciones de cristales pueden hasta romper el separador aislante provocando niveles altos de auto-descarga o un corto-circuito.

En realidad, el problema no es tan preocupante. No es necesario una disciplina férrea y solo recargar la batería cuando está totalmente descargada. Normalmente, basta que la primera carga sea larga (alrededor de 15 horas) y que la batería sea entonces completamente descargada. Después debe recargarse la batería totalmente por lo menos una vez por semana. Esta operación deberá bastar para mantener los cristales en actividad y no permitirles crear formaciones.

NiMH

Las baterías de Níquel metal híbrido (NiMH), que usan Hidrógeno en su proceso de producción de energía, han nacido en los años 70 de las manos del químico Standford Ovshinsky, pero solo recientemente fueron redescubiertas para los teléfonos móviles.

La inusual tecnología de las NiMH permite el almacenamiento de mucho más energía. Típicamente, consigue almacenar alrededor de 30% más energía que una NiCd de idéntico tamaño, aunque algunos digan que este número está subestimado.

No usan metales tóxicos, por lo que se consideran amigas del ambiente. Muchas de estas baterías son hechas con metales como el Titanio, el Zirconio, el Vanadio, el Níquel y el Cromo, y algunas empresas japonesas han experimentado, incluso, otros metales como el raro Lantano.

Este detalle hace que estas baterías sean mucho más caras que las NiCd. Una batería NiMH normal tiene una vida de entre 400 a 700 ciclos de carga y el proceso de recarga suele ser más largo que las de NiCd.

Las baterías de NiMH no sufren con el efecto de memoria, tan presente en las de NiCd. Sí en cambio padecen auto descarga, siendo su tasa mucho mayor que las de NiCd debido a los átomos de Hidrógeno en fuga.

La carga en exceso puede también ser prejudicial. Las baterías deben ser cargadas apenas lo necesario, especialmente las baterías de NiMH. Una carga de una noche cuando apenas algunas horas bastarían, puede reducir considerablemente la vida de una batería.

Litio

Las baterías basándose en iones de Litio son las baterías más recientes en el mercado de los teléfonos móviles. Consiguen un almacenamiento muy superior de energía, aumentando considerablemente el tiempo de acción del teléfono móvil. Son también muy leves, pesando cerca de la mitad de una NiCd equivalente. 
A pesar del precio elevado las ventajas de las baterías de Litio las han popularizado y han hecho que se incluyan ya de serie en muchos teléfonos móviles.

Aunque no padece el efecto memoria, es aconsejable no iniciar un proceso de carga antes de que haya perdido un 50% su capacidad. De vez en cuando, es aconsejable que se descargue completamente antes de ponerlo a re-cargar. El proceso completo, como en las de NiMH, dura más tiempo que las de NiCd.

En cuanto a la vida de estas, es muy inferior a las antes mencionadas y se sitúan entre los 150 y 300 ciclos de carga.

El futuro

Baterías de Polímeros de Litio

De hecho, las baterías de polímeros de Litio ya son una realidad. Utilizadas inicialmente por Ericsson y ahora difundidas por los demás fabricantes, son muy semejantes a las baterías de Litio ya conocidas, siendo la flexibilidad su principal ventaja, prometiendo revolucionar no apenas el mercado de las baterías sino también el diseño futuro de los teléfonos móviles, ya que estas nuevas “perlas” moldeables podrán ser producidas en laminas con el espesor de un milímetro, lo que se traducirá posiblemente en teléfonos móviles con un diseño más vanguardista. Poseen además un ciclo de carga / descarga superior a su congénere rígida, o sea menos espacio, menos peso y más autonomía.


Baterías solares

La empresa californiana Sunpower Systems ha unido una batería de teléfono móvil de litio con un conjunto de células solares que se adaptan a la batería. En un día de mucho sol, una carga de 15 minutos podría soportar cerca de un minuto de conversación. En cinco horas puede cargar completamente una batería, según palabras del presidente de Sunpower, Henry Adams: “Puedes cargar tu batería en el coche, en el campo o en la playa para que siempre esté preparado si necesitas hacer una llamada de emergencia”. 


Baterías de alcohol

Los investigadores de Motorola Labs han adelantado más una etapa en el desarrollo de una nueva tecnología de baterías. Han construido y presentado en la Power 2000 Conference en San Diego un prototipo de una micro batería apta a producir energía a partir del metanol, también designado de alcohol. El funcionamiento consiste en la mezcla de oxigeno y metanol dentro de un envoltorio cerámico, que genera energía a la temperatura ambiente.

El objetivo es crear una batería pequeña y barata, con una autonomía muy superior a la de las baterías de Litio, y que en el futuro pueda por ejemplo alimentar un móvil durante un mes. Fue testada durante varias semanas sin que presentase señales de degradación relevantes. Pero esta tecnología no se quedará por los teléfonos móviles, todo que sea portátil podrá un día ser aún más pequeño y fácilmente transportable.


Hidrógeno

Apple podría estar trabajando ya en la próxima generación de baterías de larga duración, basadas en tecnología de hidrógeno. Este sistema lleva años siendo investigado por los especialistas, aunque por el momento no se ha conseguido desarrollar un estándar que pueda resultar viable para su uso generalizado. La compañía de Cupertino, sin embargo, habría enfilado el buen camino, algo que habría quedado registrado en una patente presentada en los últimos días en Estados Unidos.

Los principales puntos fuertes de este revolucionario sistema estarían, cómo no, en su duración -capaz de prolongar su autonomía a lo largo de varias semanas sin necesidad de recarga- y su vocación sostenible -ya que estaría basado, fundamentalmente, en hidrógeno y oxígeno, es decir, agua-. Además, esta tecnología podría ser asumible por varios dispositivos, no sólo móviles, ampliándose su traslación a tabletas e, incluso, portátiles. Y por si fuese poco, este tipo de baterías serían mucho más ligeras.