martes, 8 de mayo de 2012

Arduino Bluetooth

Nuestro proyecto de cubo de leds, va a ser controlado por medio de un Arduino Bluetooth, por lo que en esta entrada, hablaré acerca de ese Arduino, el cual tiene, como su nombre lo indica, capacidad de transferencia de datos por medio de Bluetooth, es importante saber las características importantes de este Arduino y como debemos de utilizarlo.

¿Que es el Arduino BT?

La placa de Arduino Bluetooth es una placa con un módulo incluido de bluetooth ya incorporado en esta y permite transferencia de datos inalámbricamente por medio de esa tecnología.


Características principales.

Las características de este bluetooth diferencia en cierta manera, con los demás, es similar a un Arduino Diecimila, pero tiene algunas diferencias significativas entre ellas:
  • El Arduino BT es más sencillo de romper que una Arduino normal, es más frágil.
  • La placa funciona con un mínimo de 1.2 volts, por lo que lo puedes alimentar por medio de una pila, al igual que es importante no darle más de 5.5 volts ni invertir la polaridad porque pudes dañar el ATmega168 incluido en la placa.
  • Contiene una versión más pequeña  del ATmega168, comparado con los otros Arduinos, es importante no quitarlo de la placa ya que es difícil.
  • El Arduino BT tiene dos entradas analógicas más, unas 8 en total, en donde dos de ellas, no están conectadas a los pines de la placa de fabrica, pero las puedes soldar.
  • El pin 7 está conectado al pin de resetear, no se debe de utilizar solamente para restablecer el módulo.

Especifiaciones técnicas
  • Microcontrolador : ATmega168
  • Operación de voltaje : 5V
  • Voltaje de entrada : 1.2-5.5V
  • Pines digitales de I/O : 14 (6 de los cuales proporcionan salida PWM)
  • Pines de entrada analógica : 6
  • Corriente DC por I/O Pin : 40 mA
  • DC corriente de 3, 3V Pin : 50 mA
  • Memoria flash : 32 KB (de los que 2 KB son utilizados por el cargador de arranque)
  • SRAM : 2 KB
  • EEPROM : 1 KB
  • Reloj velocidad : 16 MHz

Hardware

El módulo contenido para la transferencia inalámbrica es el Bluegiga WT11.

 El módulo BT envia comandos a través del pueto de serie del ATmega168.

El nombre cuando utilizas el Arduino Bluetooth es ARDUINOBT y el password es 12345.
Es importante saber que si queremos conmuncar la placa entre el módulo bluetooth y el sketch que escribamos, tenemos que poner en la función setup() la intrucción Serial.begin(115200) y la velocidad entre el módulo y la computadora puede ser cualquiera.
Aquí podemos ver el diagrama de la placa, incluyendo todos su módulos.

domingo, 6 de mayo de 2012

Técnicas de optimización en sistemas integrados.

Un sistema integrado a menudo se ejecuta en los procesadores con capacidad de procesamiento limitada, por lo tanto es necesario que utilicemos algunas técnicas de optimización ya que como he hablado de otras entradas, tiene recursos limitados, y en esta, hablaré de algunos puntos que debemos considerar para hacer mejor un código para computo integrado.


Minimizar las variables locales.

Si tenemos muchas variables locales en una función que no tiene mucha importancia, el compilador será capas de acoplarlos con los registros, por lo que, podemos evitar que se haga ese puntero en la pila, entonces tendríamos de ganancia que el compilador no tendrá sobrecarga en tener que crear y restaurar los punteros de la pila que se crea, entonces, podemos decir que nos favorece.


Declarar variables locales entre más "interno" mejor.

No declarar todas las variables al principio de una función o en una función externa, nostros podremos tener un mejor rendimiento si las variables se declaran cuando las vamos a utilizar, por ejemplo esto quiere decir que si tenemos una función y dentro de esa función tenemos un if, y en esa condición, necesitamos una variable, declararla ahí dentro y no cuando iniciamos la función.


Saber utilizar las variables

Por ejemplo, muchas veces se utilizan erroneamente un char para realizar operaciones, esto en un sistema integrado desperdicia recursos, si decimos que vamos a sumar dos variables tipo char, necesitamos convertir estos a int y volverlos a convertir a char, por lo que debemos de tomar en cuenta el impacto que va a perjudicar al momento de alinear los bytes y como los va a ordenar, esto ahorra espacio, ya que muchos de los microoprocesadores alinean solamente 16 bytes como límite.

char suma_mala (char a, char b) {
         char c;
         c = a + b;
         return c;
}


int suma_buena(int a, int b) {
        return (a + b);
}



Ajustar el tamaño de cualquier estructura en potencia de 2.

Cuando estamos utilizando arreglos, el compilador realiza una multiplicación por el tamaño de la estructura para realizar una indexación de arreglos, por lo que si el tamaño es una potencia de 2, una operación de multiplicación que le cueste en recursos a un sistema, se sustituye por una operación barata, por lo tanto, mantener los tamaños de estructuras en una potencia de dos mejorará el rendimiento de indexación de una matriz.


Reducir el número de parámetros.

Cada que llamamos a una función con un gran número de parámetros puede ser muy costoso debido a que tenemos que "empujar" todos esos parámetros de la pila a la llamada. Es por eso que debemos evitar pasar por ejemplo, estructuras completas como parámetros, podemos pasar en vez de eso, punteros o referencias.


No definir un return si no se utiliza.

Cundo nosotros llamamos a una función, este no se sabe si el valor que va a regresar se va a utilizar, entonces siempre va a regresar ese valor, por lo que puede ser que pongamos valor alguno y omitirlo si no estamos utilizandolo posteriormente.


Inicialización de variables.

Les pongo un ejemplo.

void desastre() {
           int c;
           c = 5;
}


void mejoro() {
         int c = 5;
}

En donde podemos ver que se inicializa directamente en la versión mejorada, en lugar de declarar y luego asignar.

Espero que esto nos ayude en mejorar sus códigos y que muchas veces por eso tenemos errores al momento de pasarlos a nuestro pic o arduino, por ejemplo en mi proyecto de pic, después me dí cuenta que no funcionaba porque realizaba muchisimos errores de este tipo, debemos de recordar que es diferente la manera de trabajar con computo integrado, aquí les dejo una liga de esta página, en donde vienen algunas otras técnicas.

Manejo de memoria en sistemas integrados

Las herramientas de desarrollo que hemos utilizado para programar el pic, como MickroBasic, o las herramienta de programación como la de Arduino que utilizan lenguajes como C++ u otros que utilizan lenguajes de programación que muchas veces no son enfocados precisamente para sistemas integrados, nosotros las utilizamos para desarrollo de aplicaciones de alto nivel, pero no son una opción viable para un sistema embebido.


Por ejemplo, muchas de las bibliotecas proporcionadas por Arduino se escriben como clases de C++, en donde este lenguaje permite el control de bajo nivel de una manera similar a C, y que nos permite enviar estructuras como a la "antigua",  pero es necesario saber como tomar la ventaja en utilizar este lenguaje en sistemas embebidos y no utilizarlo en nuestra contra.


Cuando estamos escribiendo aplicaciones que vamos a utilizar en nuestro escritorio, muchas veces no tenemos que preocuparnos en la memoria y los almacenamientos de estas ya que a pocos kilobytes de residuos no es nada en este contexto y si tenemos fugas de memoria, no nos fijamos en que nuestro programa esté bien reservado la memoria y son algunas veces tomado como si tuvieramos memoria infinita o parecido.


En el computo integrado, la memoria y el almacenamiento es muy limitado, por ejemplo un Arduino Mega viene con un ATMEGA1280, que tiene al rededor de 8 KB de memoria RAM,  o algunos como el AT90 tienen 16 MB de almacenamiento flash externo, por lo que si desarrollamos el aplicaciones de la misma manera que desarrollamos aplicaciones de escritorio, vamos a tener muchisismos problemas.


El mayor riesgo en el manejo de memoria en sistemas integrados es la asignación de memoria dinámica, tanto C como C++ ofrecen asignación memoria dinámica, pero como C++ soporta programación orientada a objetos y todos los patrones de programación orientada a objetos están diseñados para la asignación dinámica de computadoras con mucha memoria, debemos de tener un cuidado especial el utilizar C++.


¿Usamos asignación dinámica de memoria?


Estas son algunas de las dificultades de la asignación de memoria dinámica, la cual se debe de evitar en los sistemas integrados.


  • Motículos de asignación o llamados en inglés "Heap", son difícil de predecir cuanta memoria se va a ocupar.
  • El uso de pilas permite pérdidas de memoria, lo cual es muy peligroso en los sistemas con poca memoria.
  • Los sistemas integrados no tienen memoria virtual para recurrir si se acaba el espacio.
  • El sistema de manejo de memoria implica una sobrecarga de procesamiento y memoria para cada asignación de cualquier elemento (Por el contrario, la asignación estática es "liviana" de alguna forma).
  • No existe un control operativo para informar si hay un segmentation fault, por ejemplo, entonces tendremos más probablemente, errores de referencia a punteros cuando exista memoria liberada dinámicamente. 
  • Puede que existan como colisiones inesperadas entre la pila y los motículos, sobretodo si la pila se fragmenta.


Otra cuestión es que, si es muy necesario hacer una asignación dinámica en un sistema integrado, no debe ser realizado dentro de bucles, solo se debe hacer al inicio del código, para que de este modo se pueda utilizar el puntero de la pila y detectar las colisiones.


¿Como evitamos la asignación dinámica?


Una de las claves para evitar la asignación dinámica es hacer un buen diseño antes de programar un sistema integrado, esto es muy recomendable, el analizar lo que va a hacer nuestro programa, obviamente no vamos a predecir si vamos a tener un fallo o no, pero vamos a tomar conciencia de lo que debemos de hacer al hacer el computo de este tipo y esto lo podemos hacer tambien leyendo las especificaciones técnicas del integrado que estemos utilizando, por ejemplo el sistema operativo de tiempo real RTOS, permite unicamente hacer 8 tareas simultáneas y para cada tarea un límite de 256 bytes de espacio de pila.


Otra cosa que podemos hacer es utilizar técnicas oreintadas a objetos, sin asignación de memoria dinámica, por ejemplo en las bibliotecas de Arduino, definir los objetos de forma estática en el espacio de las variables globales, esto es muy bueno ya que los objetos están disponibles a nivel global y se puede acceder a ellos desde cualquier parte sin tener que utilizar punteros, por ejemplo. Aunque como hemos visto en algunas otras materias, el uso de variables globales muchas veces es malo, pero en cierta parte nos benefician en sistemas integrados.


¿Es buena idea utilizar la recursividad?



Nosotros utilizamos, muchas veces, formas recursivas en nuestros programas cuando necesitamos hacer algo, pero hay un problema en computo integrado, la recursividad, al igual que la asignación de memoria dinámica, no son faciles de predecir en tiempo de compilación por lo que aumenta considerablemente el riesgo de rebasar la pila. podemos utilizar funciones recursivas solo cuando la función es pequeña, por ejemplo que la tengamos funciones de O(log n).



Bueno espero que esto nos ayude a realizar códigos de manera más eficientes y pensar en como diseñar mejor nuestros programar, ya que por ejemplo, cuando yo realicé mi proyecto de PIC, tenia muchos problemas con este tipo de cosas y después de investigar, me he dado cuenta que yo queria programar como si estuviera en una computadora, cuando no estaba tomando las consideraciones adecuadas para hacer un programa de computo integrado, el cual es diferente.

jueves, 3 de mayo de 2012

Tendencias futuras en móviles

Predecir el futuro de los dispositivos móviles es algo dificil, siempre estamos avanzando en el area de la tecnología y con esto, surgen necesidades al igual que nuevas tendencias, pero podemos decir que actualmente tenemos algunas caracteristicas en los celulares móviles con los cuales podriamos decir que estas serian las tendencias del futuro en esta area, por lo que en esta entrada hablaré de algunas de las innovaciones que considero importante, por lo que hablaré de 3 tendencias, las que considero más importante.

Pantallas con "superesolución".

Actualmente la pantalla táctil es una de las favoritas para la creación de nuevos celulares inteligentes,  pienso que el desarrollo de nuevas pantallas sera un objeto clave para tener una mejor capacidad visual y tambien en la respuesta táctil de estas, actualmente existen terminos que se utilizan como "QHD" que pretende tener muchos pixeles en pantallas pequeñas, al igual que las "Retina" de Apple, las cuales tienen inclusive más pixeles que una pantalla de 1080p, por lo que considero que este será una tendencia en el futuro.

Debemos de pensar que, este seria una tecnología clave ya que cambiaria la forma en generar software con interfaces adaptadas para este tipo de pantallas y que ocupan más memoria que las pantallas que actualmente la mayoria de los celulares tiene.

Cargadores inalambricos.

Una de las caracteristicas de las cuales existe mayor problema es la carga de la bateria, si bien en una entrada anterior hablé sobre esto, considero que una de las innvoaciones que pudieran salir en el futuro es que nuestros componentes electrónicos se puedan cargar de manera completamente inalámbrica.

Carga inalambricamente, pero necesitamos adaptadores gruesos :(

Actualmente en el mercado, he visto algunos tapetes en donde por medio de un adaptador que le pones a tu celular y lo acuestas en ese tapete, por medio de carga inductiva podemos cargar la bateria del celular de manera "inalambrica", aunque yo pienso que en un futuro, así como tenemos internet inalámbrico y podemos pasar datos sin cables, vamos a poder cargar nuestro celular de esta manera, cabe mencionar que investigando en la web, encontré que existen personas que trabajan en realizar un estandar para la carga inalámbrica, es llamada Qi, pueden encontrar más información aqui.

Celulares sin ningún puerto.


Podriamos decir que, la tendencia es que todo un celular o cualquier aparato móvil, sea completamente independiente de cualquier otro aparato, entonces que todo pudieramos realizarlo sin ningún puerto, por ejemplo escuchar musica con audifonos inalámbricos, hacer reproducción de videos en nuestra tele de manera inalámbrica, sincronizar nuestra computadora con nuestro celular sin cables, por lo que muchos de los celulares que existen ya tienen algunas de estas características, pero todavia dependemos de los cables, por lo que considero que esperemos que esta sea una de las cosas que tengamos en celulares en un futuro, como hablé en mi entrada de NFC, podriamos inclusive poder pagar por medio de nuestro celular sin utilizar un cable, por lo que esta es una tendencia futura.

Ahora, adjuntaré algunos videos con algunas tendencias futuras y que pudieramos tener en varios años en el área de la ingenieria móvil, estas son algunas visiones de personas, de lo que creen que habrá en algún futuro, tal vez no muy lejano y me parecieron interesantes.




Si se fijan, en este video pueden ver que los dispositivos móviles no tienen ningún puerto o cable conectado, una de las características de las cuales hablé.



Como serian los pagos utilizando el celular sin ninguna conexión alambrica, simplemente aproximando el celular.

Referencias
NFC Mobile Phones and the future privacy
Wireless Power Consortium
Retina Display