martes, 8 de mayo de 2012

Arduinos Shields

Algunas veces necesitamos algunas características funcionales extra para poder realizar nuestro proyecto, es por eso que al Arduino le podemos conectar encima de la placa, shields, estos tienen la capacidad de poder agregar otras funciones, son fáciles de montar y son baratas de producir.

Por ejmplo, los Shields permiten convertir un Arduino en, reproductor musical, robots móvil, entre otras cosas, es por eso que en esta entrada hablaré de algunos shields que pueden ser utiles para algún proyecto y desarrollarlo de manera más completa.


Cellular Shield con SM5100B

Este shield incluye todas las piezas necesarias para poder realizar un módulo celular, permitiendo agregar fácilmente la capacidad de enviar SMS, tener conexión celular GSM o GPRS, al igual que permite TCP IP para la placa del Arduino.

Para poderlo utilizar, simplemente le agregas una tarjeta SIM de prepago de una compañia telefónica y con la antena incluida se pueden enviar mensajes de texto, crear un servidor web o inclusive realizar llamadas telefónicas.
Página oficial


Adafruit Data logging shield



Con este shield podemos guardar datos de cualquier formato en tarjetas SD, entonces puedes crear programas en donde tengas que interactuar con memoria externa, al igual que incluye librerias y código ejemplo para poderlo desarrollar más facilmente.
Página oficial


Arduino Ethernet Shield

Este Shield nos sirve para poder conectarnos al internet mediante el Arduino, se basa en un chip Wiznet W5100 Ethernet, proporcionando una red IP, es compatible hasta con cuatro conexiones de socket simultáneas. Utilizando la biblioteca de Ethernet podemos hacer sketches que se conectan al Internet, ahora estos incluyen conexiones de tarjeta SD y es compatible con la mayoria de los Arduinos.
Página oficial


Liquidware Shield Touchscreen


Es una pantalla táctil de 320 x 240 OLED, resistiva y con este shield puedes conectarlo al Arduino y dibujar formas, pixeles, colores, gráficos, botones, entre otras cosas ya que contiene una API de gráficos para sistemas integrados.
Página oficial


Wayne y Layne Video Game Shield

Es un Shield para realizar videojuegos con Arduino, incluyendo gráficos, texto, efectos de sonido y música, usando el Arduino, incluye todo lo necesario para conectarlo mediante los cables de colores a tu TV, al igual que permite que puedan jugar dos personas al mismo tiempo.
Página oficial


Adafruit Wave Shield


Es un Shield que permite agregar audo de alta calidad a un proyecto de electrónica, en donde podemos reproducir sonido de hasta 22KHz, los archivos se pueden leer desde un SD y capacidad de conectar audifonos y bocinas.
Página oficial


WiShield Arduino

Es un Shield que añade la posibilidad de compatibilidad de WiFi con Arduino, con velocidades de 1 Mbps y 2 Mbps de Wi-Fi 802.11b, soporta la infraestructura BSS y ad hoc IBSS, al igual que  WEP de 64 bits y 128 bits, WPA/WPA2.
Página oficial


Interrupciones en sistemas integrados

¿Qué son las interrupciones?

Los microcontroladores deben de proporcionar en tiempo real una respuesta a los acontecimientos en el sistema integrado que estamos controlando, por lo que algunas veces suceden eventos que el sistema debe de interrumpir por ejemplo el suspender el procesamiento de una instrucción que se está haciendo y empezar otra instrucción de interrupción que realice algo antes de volver a la instrucción original.

Por lo que, podemos decir que las interrupciones son las cosas que van a suceder cuando el microcontrolador no esta listo para hacer alguna otra función, o cuando este sistema integrado estaba ocupado, y no puede comprobar que es lo que se esta haciendo, entonces las interrupciones causan que se detenga lo que se esta haciendo para manejar una tarea de alta prioridad, para luego remontar a lo que se estaba haciendo antes.


Tipos de Interrupciones.
  • Hardware
  • Software
Existen dos tipos de interrupciones en los sitemas integrados, los son basados en hardware y los que son basados en software, las interrupciones de software son llamados desde un código, mediante comandos especializados, en cambio de los de hardware que son provocados por dispositivos periféricos que son externos al microcontrolador, entonces por ejemplo, tenemos un sistema en donde tengamos un temporizador que envia pulsos contando cada segundo y cuando de alguna forma el microcontrolador recive alguna pulsación activaria una señal de interrupción.


Rutinas de interrupción [ISR]

Las rutinas de servicio de interrupción o en inglés Interrupt Service Routines (ISR) son partes de código en un programa en el cual se tienen solicitudes de interrupción, por lo que cuando una de estas interrupciones se activa, ya sea basadas en hardware o basadas en software, el microprocesador se aparta o se separa de la tarea que esta actualmente realizando y mueve el puntero de la pila de instrucciones a la parte del código de la ISR, y entonces empieza estas lineas de instrucciones para luego, al momento de terminar y completar esto, vuelva a la ejecución en la cual la dejamos inconclusa.

Muchos de los sistemas integrados son llamados sistemas impulsados por una interrupción, ya que la mayor parte del procesamiento se produce en el ISR, y el sistema integrado pasa la mayor parte del tiempo utilizando bajos consumos.

Algunas veces, el ISR puede se puede dividir en dos partes, la mitad superior, llamado tambien como el fast interrupt handler o el primer nivel de interrupciones, y la parte inferior de la mitad, llamado tambien el slow interrupt handler o segundo nivel de interrupciones, por lo que la mitad superior es más rápida del ISR que rapidamente se debe almacenar la información mínima en la interrupción y el segundo nivel, para un momento posterior.


Tabla de vectores de interrupción

Las tablas de vectores de interrupción son listas en donde se guardan todas las rutinas de servicio de interrupción o ISR, y se encuentra muchas veces en una ubicación fija en la memoria del programa, en donde algunos microcontroladores esperan la tabla de vectores de interrupción y hacer como una seride de llamadas a las instrucciones y algunos otros solamente seleccionan una instruccion de esa tabla, depende de como lo programemos y de que se trata nuestro proyecto.


Interrupciones en Arduino

Para utilizar interrupciones en Arduino se utiliza la función attachInterrupt(interrupcion, funcion, modo) en donde especificamos la función ISR que necesitamos invocar remplazando cualquier función previa.


Es importante saber que las placas de Arduino (incluyendo Arduino BT) tienen dos interrupciones externas:
Las número 0 (en el pin digital 2)
Las número 1 (en el pin digital 3)



Y en el Arduino Mega se tienen 4 interrupciones externas:
Las número 2 (pin 21)
Las número 3 (pin 20)
Las número 4 (pin 19)
Las número 5 (pin 18)

Espero que esta entrada nos pueda ayudar a entender las interrupciones, como funcionan y en que nos pueden ayudar para nuestro proyecto de Arduino.

Referencias.
AttachInterrupt Función
Embedded Systems - Interrupts.

Memoria de Arduino

Cuando utilizamos un sistema integrado, en este caso para nuestro proyecto final de Arduino, es necesario saber sobre las fuentes que tenemos disponibles de memoria, es por esto que en esta entrada voy a hablar acerca de las diferentes memorias que contiene el Arduino y para qué sirven.



Una placa de Arduino tiene 3 diferentes fuentes de memoria, estas son:
  • La memoria flash.
  • La SRAM o la Static Random Access Memory.
  • La EEPROM  o la Electrically Erasable Programmable Read-Only

Vamos a hablar de cada una de ellas y cuales son sus funciones en la placa de Arduino.


Memoria flash.



La memoria flash es una memoria no volátil, esto quiere decir que el contenido de los datos que vamos a almacenar, no se van a perder, inclusive si no tiene energia, es el contrario de la volátil, entonces se pueden borrar y reprogramar eléctricamente, esta permite que podamos leer y escribir en múltiples posiciones de la memoria y por medio de estos impulsos electricos, tenemos velocidades rápidas, la memoria flash tiene una función específica en el Arduino, la cual es almacenar el sketch que vamos a realizar en la IDE, por lo que ahí ponemos lo que codificamos y que va a correr en nuestra placa.


SRAM
 
Es la memoria estática de aceso aleatorio la cual es un tipo de memoria utilizando semiconductores, la cual tiene distintas operaciones como el reposo o standby en donde el ponemos la memoria en este modo, el modo lectura o reading y el modo de lectua, actualizando los datos de la memoria, en la placa de Arduino sirve para que los sketches puedan manimular y almacenar las variables que nosotros necesitamos programar, al momento de ejecutar el programa.


EEPROM

La memoria EEPROM es la ROM programable y eléctricamente borrable, en donde podemos decir que es una memoria de solo lectura la cual podemos programarla, borrarla y reprogramarla eléctricamente, siendo tambien no volátiles, contienen transistores, puede ser leída ilimitadamente, peor borrada y programada entre cien mil y un millon de veces, la función de la placa de Arduino es que puede ser utilizada por nostros para almacenar información que ocupelos de largo plazo.


Como podemos ver, la memoria flash y la memoria EEPROM son memorias no volátiles, esto quiere decir que la memoria tiene información guardada aunque no tenga una alimentación de energia externa, a diferencia de la memoria SRAM ya que esta es volatil y esta se pierde cuando reiniciemos nuestra placa.


 Por ejemplo, en un chip de una placa de Ardunio, el ATmega168 tiene esta memoria.


  • Flash  16  kbytes, en donde 2 son los que se utilizan para el bootloader
  • SRAM 1024 bytes
  • EEPROM 512 bytes

Para nuestro proyecto final de Arduino, estamos utilizando el Arduino Bluetooth, en donde tenemos esta memoria


  • Flash 32 KB, en donde otra vez, 2 son usados para el bootloader
  • SRAM 2 KB
  • EEPROM 1 KB


¿Por qué es importante?

Esto es importante tenerlo en cuenta a la hora de programar nuestro Arduino ya que como podemos ver, no tenemos mucha memoria SRAM disponible, y si por ejemplo reservamos cadenas con mucho texto para mostrarlo en alguna pantalla, si ya no tenemos SRAM disponible, nuestro programa definitivamente no va a funcionar, esto quiere decir que nosotros vamos a compilarlo normal y pasarlo mediante USB en la IDE de Arduino, pero no va a funcionar en el Arduino o va a funcionar de una manera que no queremos.


Espero que esta entrada nos ayude a entender como funciona la placa de Arduino y saber que debemos de administrar correctamente la memoria para tener un programa eficiente.


Referencias.
Arduino - Memory
Memoria volatil
Memoria flash
Memoria SRAM
Memoria EEPROM

Sistemas Operativos en Tiempo Real [RTOS]

¿Qué es un RTOS?

Un sistema operativo de tiempo real es un ambiente de computación en el cual el hardware reacciona a las entradas en un tiempo especifico, se dice que es en tiempo real por que muchas veces estas reacciones son tan pequeñas que da la sensación de que funcionan instantaneamente.


Entender las diferencias entre sistemas operativos de tiempo real y los sistemas operativos a los cuales estamos acostumbrados a ver, es múy sencillo, por ejemplo, imaginemos que estamos jugando a un videojuego, cada que realizamos acciones, es como un programa que se ejecuta en ese entorno, entonces el juego cuenta con un sistema operativo de tiempo real para sentir como si nosotros manejaramos el cuerpo de un personaje, contando con un cierto tiepo de retraso entre la solictud de acción y la ejecución de esta, en contraste en un sistema operativo, se puede sentirun tiempo de retraso algunas veces, ya que en un sistema operativo de tiempo real se le da prioridad a la actualización antes que a nada.


Métodos

Un sistema operativo se considera en tiempo real si este siempre permite que sus programas realizar tareas dentro de cierto limite de tiempo que son especificados y que generalmente es lo esperado por el usuario, para cumplir con este propósito existen algunos métodos que se pueden utilizar.

En listo algunos métodos, en donde los RTOS deben:
  • Realizar pocas tareas, garantizando que las tareas se ejecutaran siempre antes del tiempo limite.
  • Disminuir o reducir ciertas funciones, cuando no se puede ejecutar dentro de estas limitaciones
  • Monitorizar constantemente la entrada de manera oportuna.
  • Controlar los recursos y poder interrumpir los procesos de fondo según sea necesario.
  • Anticipar posibles solicitudes y liberar lo suficiente del sistema para permitir una reacción oportuna.
  • Realizar seguimiento en la cantidad de cada recurso, por ejemplo, checar el tiempo del CPU, la memoria RAM, el ancho de banda.

Kernel de tiempo real.

Un kernel, como lo hemos visto en otras materias, es como el nucleo central de un sistema operativo y se encarga de todos los puestos de trabajo del sistema operativo.
  1. Arranque
  2. Programación de tareas
  3. libreria de funciones estándar.
Es importante recalcar que en un sistema integrado, la memoria rara vez es suficiente como para mantener una libreria de funciones, por lo que si van a ser incluidos, deben ser las más importantes y pequeñas.



En un sistema integrado, con frecuencia el núcleo arranca el sistema, inicia los puertos y los elementos de datos, luego se iniciará el planificador, para crear instancias de los temporizadores de harware, despues de este proceso, el núcleo, básicamente, se ponen como que fuera de la memoria, a exepción de las funciones de libreria, si es que tienen y el programador comenzará a ejecutarse en tareas secundarias, por lo que vemos que simplemente tendrá prioridad las de "tiempo real".


Algunos RTOS

Existen muchos más, aqui puedes encontrar una lista.


Referencias
Real-Time Operating System - Wikibooks
Common RTOS
Programming RTOS