Cuando empezamos a descubrir el mundo de los sistemas integrados, es común preguntarnos cual es la diferencia entre un microprocesador y un microcontrolador, en esta enrada explicaré las diferencias y similitudes básicas entre estos componentes integrados, generando funcionamiento de sistemas inteligenes que van desde herramientas, móviles, computadoras pequeñas, etc., a pesar de que cada uno proporciona una gestión automatizada, difieren en su estructura interna, las caracteristicas y sus aplicaciones.
Microprocesador
Podemos empezar por definir que es un microprocesador, en donde podemos decir que es un chip integrado creado para procesar información binaria y alimentarla, de acurdo con las instrucciones de programación guardados en la memoria, es realmente un circuito de reloj impulsado por lo que puede ser programado para lograr varias tareas, mayor es la cantidad de transistores, mayor es su capacidad, para que un microprocesador pueda funcionar es necesario que sea conectado afuera del espacio de meoira y de los puestos de salida y entrada, se trata de productos versátiles que pueden ser programados para realizar una amplia variedad de funciones.
Un procesador de una computadora es sin duda un ejemplo de un microprocesador de gama alta con miles de millones de transistores grabados en el chip, para hacer frente a todas las resposabilidades de una computadora electrónica, basado en cómo se reserva el espacio de memoria y cómo se va a acceder a esa información, según las arquitecturas ya sea Von Neumann o Harvard como he hablado en entradas anteriores.
Los microprocesadores se clasifican de acuerdo a la cantidad de bits que son capaces de procesar a la vez, se amplia de 8 a 64 bits, las cuales son utilizadas en las computadoras, ellos poseen la capacidad de ejecución de un conjunto de instrucciones.
Microcontrolador
Un microcontrolador por el contrario, es un circuito integrado, como un microprocesador, con su espacio de la memoria y la entrada de los puertos de salida, creado para ser integrado en los aparatos electrodomésticos y aparatos inteligentes, se han precompilado código de equipos guardados en su módulo de espacio de memoria que tiene incorporada, que puede ser ejecutado de acuerdo a determinados insumos alimentados en ellos, la información y las aplicaciones se guardan normalmente en ellos haciendo uso de la EEPROM, ROM, EPROM o memoria flash, ya que estos procesadores no usan una memoria externa, poseen un conjunto de instrucciones muy restringido y también limita su aplicabilidad, tiene pines de entrada y salida que se utilizan para obtener datos y ofrecer una respuesta adecuada en tiempo real.
El microcontroladr se creó para ofrecer un verdadero rendimiento automatizando en los aparatos, desde teléfonos móviles, impresoras, lavadoras, etc., principalmente debido a su espacio de memoria incorporada y puertos de entrada y salida, un microcontrolador es realmente un equipo compacto que puede ser utilizada sin requisitos para una gran cantidad de circuitos, entonces podemos decir que están preparados para ser pre-programados utilizandos en sistemas embebidos.
Comparación
Un microcontrolador es un sistema integrado que nosotros podemos modificarlo a nuestro gusto con procedador y espacio de memoria, preparado para conectar periféricos, creado por ejemplo para controlar aparatos automáticos digitales, a pesar de que un microprocesador es realmente un chip con mayor densidad de transistores, es creado para albergar una variedad de características complicadas que tienen la instrucción mucho más aplia a configurar, utilizado para generar computadoras completas a gran escala.
Mientras que los microcontroladores están orientados en la dirección de su utilización en sistemas integrados, los microprocedadors están oriendados en dispositivos informáticos que se ejecutan aplicaciones compuestas con mayor grado de lenguajes, un microprocedador exige espacio en memoria externa y las conexiones con los puertos de salida de entrada, a pesar de que los microcontroladores tienen todos estos periféricosm puede hacer que su funcionamiento sea considerablemente más rápido en comparación con los microprocesadores, aunque un microcontrolador podría alcanzar una tasa de aumento en funcionamiento, su rendimiento se ve limitado por sus pocas instrucciones.
Espero que esta entrada les sea de ayuda a todos aquellos que no entienden las diferencias entre microprocesador y microcontrolador, es muy sencillo, lo más importante que podemos concluir de esto es que, los microprocedadores son de mayor complejidad, como por ejemplo los miembros de la familia x86 que son los que se utilizan en algunas computadoras, son programables y permiten ejecutar una amplia gama de funciones, en comparación con los microcontroladores como un PIC, el cual se crean para ejecutar tareas muy específicas y restringidas, pueden encontrar más información aquí
Mostrando entradas con la etiqueta Laboratorio de computo integrado. Mostrar todas las entradas
Mostrando entradas con la etiqueta Laboratorio de computo integrado. Mostrar todas las entradas
miércoles, 23 de mayo de 2012
martes, 22 de mayo de 2012
Usando Fritzing
Hacer diseños de nuestros propios circuitos puede ser muy complicado cuando no utilizamos herramientas adecuadas o cuando tenemos que hacer circuitos grandes, por lo que tenemos que diseñar un esquema, probarlo en el protoboard, etc...
Existe un programa de código abierto llamado Fritzing el cual funciona en Windows, Max y Linux, a diferencia de otros programas que he probado, considero que fritzing fué el más sencillo ya que tiene una interfaz simple y hace que el diseño de circuitos sea intuitivo, ahora, les mostraré paso a paso como realizamos nuestro circuito en frizing para controlar el cubo de Leds de 10x10x10 con 2 arduinos entre otras cosas.
En el caso de mac, como en los demás sistemas operativos, vas a la página de fritzing aquí, seleccionas la versión que deseas descaegar, y vas a seguir las intrucciones de la página para instalarlo en tu compu, al momento de instalar fritzing, incluirá con todo tipo de bibliotecas de piezas grandes, compontentes básicos, cables, botones, resistencias, también componentes especiales como placas de Arduino.+
Al abrir por primera vez un proyecto Fritzing, se iniciará una pantalla con un protoboard como se muestra a continuación.
Como ven, a la derecha de la pantalla, tenemos una barra de menú con todos los componentes y opciones, si un componente es personalizable, la mitad inferior de la barra de herramientas se muestra las opciones de personalización disponibles para ese parte específica.
Si quisieramos por ejemplo, poner un 74hc595 en el protoboard, vamos a seleccionar y arrastrar el LED en el área de trabajo, como muestro en la captura, cuando lo ponemos en este protoboard, el modo de cable está conectado a una columna vertical en el tablero, por lo que si un componente realiza una conexión a una columna, la fila entra se vuelve de color verde claro, indicando una conexión eléctrica entre los espacios del protoboard.
Podemos tambien realizar de manera esquemática nuestro diagrama y para PCB de manera automática y muy sencillo, solamente en el menú seleccionamos el que queramos.
Así podemos ir arrastrando y seleccionando los elementos que necesitamos para la creación de nuestro proyecto, por ejemplo aquí les dejo nuestro circuito de nuestro proyecto.
Utilizando:
Te recomiendo veas este video, para mirar como utilizar el programa y que otras funcionalidades puedes hacer con el.
Espero que esta entrada ayude a entender como utilizar fritzing para poder diseñar bien nuestro proyecto de arduino y de una manera más clara explicando como funciona nuestro proyecto, ya sea para nosotros mismos o para exponerlo.
Existe un programa de código abierto llamado Fritzing el cual funciona en Windows, Max y Linux, a diferencia de otros programas que he probado, considero que fritzing fué el más sencillo ya que tiene una interfaz simple y hace que el diseño de circuitos sea intuitivo, ahora, les mostraré paso a paso como realizamos nuestro circuito en frizing para controlar el cubo de Leds de 10x10x10 con 2 arduinos entre otras cosas.
En el caso de mac, como en los demás sistemas operativos, vas a la página de fritzing aquí, seleccionas la versión que deseas descaegar, y vas a seguir las intrucciones de la página para instalarlo en tu compu, al momento de instalar fritzing, incluirá con todo tipo de bibliotecas de piezas grandes, compontentes básicos, cables, botones, resistencias, también componentes especiales como placas de Arduino.+
Al abrir por primera vez un proyecto Fritzing, se iniciará una pantalla con un protoboard como se muestra a continuación.
Como ven, a la derecha de la pantalla, tenemos una barra de menú con todos los componentes y opciones, si un componente es personalizable, la mitad inferior de la barra de herramientas se muestra las opciones de personalización disponibles para ese parte específica.
Si quisieramos por ejemplo, poner un 74hc595 en el protoboard, vamos a seleccionar y arrastrar el LED en el área de trabajo, como muestro en la captura, cuando lo ponemos en este protoboard, el modo de cable está conectado a una columna vertical en el tablero, por lo que si un componente realiza una conexión a una columna, la fila entra se vuelve de color verde claro, indicando una conexión eléctrica entre los espacios del protoboard.
Podemos tambien realizar de manera esquemática nuestro diagrama y para PCB de manera automática y muy sencillo, solamente en el menú seleccionamos el que queramos.
Así podemos ir arrastrando y seleccionando los elementos que necesitamos para la creación de nuestro proyecto, por ejemplo aquí les dejo nuestro circuito de nuestro proyecto.
Utilizando:
- 20 74HC595
- 110 Resistencias
- 10 Transistores
- 2 Arduinos (BT y Duemilanove)
- Fuente de poder
|
| Clic para zoom |
Te recomiendo veas este video, para mirar como utilizar el programa y que otras funcionalidades puedes hacer con el.
Espero que esta entrada ayude a entender como utilizar fritzing para poder diseñar bien nuestro proyecto de arduino y de una manera más clara explicando como funciona nuestro proyecto, ya sea para nosotros mismos o para exponerlo.
Etiquetas:
Laboratorio de computo integrado
Arquitectura de PIC
La programación de PIC es más sencilla si nosotros hacemos antes de realizar un proyecto, una comprensión de la arquitectura que se maneja internamente en el microcontrolador, por lo que estos varían de los sistemas de computación a los cuales ya estamos acostumbrados a programar, en esta entrada voy a hablar de las arquitecturas más importantes, al igual que los ventajas y desventajas en sistemas integrados.
Existen dos arquitecturas principales, la Von Newmann y la arquitectura Harvard.
Arquitectura Von Neumann
Esta arquitectura es la manera mas común para crear un sistema, en donde los buses de dirección y los datos son comunes para todos los accesos de memoria, el programa o código y los datos existen en un intervalo de memoria, junto con los periféricos asignados en memoria, podemos decir algunos ventajas y desventajas de esta arquitectura.
Es importante recalcar que la unidad de aritmética y lógica (ALU) y la unidad de control se denominan colectivamente en la CPU, por lo que un microprocesador es solo una CPU en un solo chip, un microcontrolador es básicamente, un ordenador en un chip, por lo que la CPU, memoria, etc, estan todos ellos en un chip.
Ventajas
Desventajas
Arquitectura de Harvard
Esta es una arquitectura en donde se espera no tener cuello de botella en la memoria por la división de la memoria en instrucciones de código y en áreas de datos, entonces estas se acceden a través de datos por separado y buses de direcciones.
Esta es la arquitectura que se utiliza en el microprocesador Armel AVR.
Ventajas
La arquitectura Harvard tiene una memoria del programa y la memoria de datos como memorias separadas y se accede desde buses separados, esto mejora el anchi de banda más tradicional de la von neumann, en la que el programa y los datos se obtienen de la misma memoria usando un mismo bus, para ejecutar una instrucción, una maquina de von Neumann debe acceder una o más veces a través del bus de 8 bits para recuperar la instrucción, mientras que en la arquitectura de harvard, la instrucción se recupera en un solo ciclo de instrucción los 14 bits, mientras que la memoria del programa se puede accedar, de manera independiente, como la memoria de datos donde se puede leer y escribir, permitiendo una instrucción para ejecutar la siguiente.
En esta imagen podemos ver una arquitectura básica del PIC16C74A, en donde vemos que se compone de la memoria del programa, los registros de archivos y la memoria RAM, ALU y registros de la CPU, es importante señalar que el contador de programa es de 13 bits y la memoria de programa está organizado como 14 bits, teniendo una capacidad de 8K x 14 bits, por lo que cada instrucción de el PIC 16C74A es de 14 bits de largo.
Espero que esta entrada ayude a las personas a comprender como está compuesto un PIC y así programar con una mayor eficiencia cualquier proyecto PIC que tengamos en algún futuro profesional.
Puedes encontrar la tarjeta de referencia de este PIC aqui
Más información sobre las arquitecturas aquí
Existen dos arquitecturas principales, la Von Newmann y la arquitectura Harvard.
Arquitectura Von Neumann
Esta arquitectura es la manera mas común para crear un sistema, en donde los buses de dirección y los datos son comunes para todos los accesos de memoria, el programa o código y los datos existen en un intervalo de memoria, junto con los periféricos asignados en memoria, podemos decir algunos ventajas y desventajas de esta arquitectura.
Es importante recalcar que la unidad de aritmética y lógica (ALU) y la unidad de control se denominan colectivamente en la CPU, por lo que un microprocesador es solo una CPU en un solo chip, un microcontrolador es básicamente, un ordenador en un chip, por lo que la CPU, memoria, etc, estan todos ellos en un chip.
Ventajas
- Se simplifica el hardware, tanto de circuitos de diseño como de elaboración
- Es más facil de generar código, lo que hace que la multitarea sea más facil.
Desventajas
- Las instrucciones deben ser múltiplos de la anchura del bus de datos, pudiendo ser ineficiente
- Existe un número variable de ciclos necesarios para poder obtener instrucciones, por ejemplo, una instrucción en donde se requiere datos de la memoria, debe esperar al menos otro ciclo antes de que pueda completarse, mientras que algunas instrucciones se ejecutan mucho más rápido, pudiendo ser un problema para aplicaciones en donde necesitamos las cosas rápido.
Arquitectura de Harvard
Esta es una arquitectura en donde se espera no tener cuello de botella en la memoria por la división de la memoria en instrucciones de código y en áreas de datos, entonces estas se acceden a través de datos por separado y buses de direcciones.
Esta es la arquitectura que se utiliza en el microprocesador Armel AVR.
Ventajas
- Los datos y buses de dirección pueden tener diferentes anchuras, por lo que la memoria del programa puede ser lo suficientemente amplia como para poder incorporar una instrucción y datos fijos en una sola instrucción.
- La mayoria de las instrucciones se ejecutan en un solo ciclo de reloj
- Es más confuso
- El hardware es más complicado.
La arquitectura Harvard tiene una memoria del programa y la memoria de datos como memorias separadas y se accede desde buses separados, esto mejora el anchi de banda más tradicional de la von neumann, en la que el programa y los datos se obtienen de la misma memoria usando un mismo bus, para ejecutar una instrucción, una maquina de von Neumann debe acceder una o más veces a través del bus de 8 bits para recuperar la instrucción, mientras que en la arquitectura de harvard, la instrucción se recupera en un solo ciclo de instrucción los 14 bits, mientras que la memoria del programa se puede accedar, de manera independiente, como la memoria de datos donde se puede leer y escribir, permitiendo una instrucción para ejecutar la siguiente.
En esta imagen podemos ver una arquitectura básica del PIC16C74A, en donde vemos que se compone de la memoria del programa, los registros de archivos y la memoria RAM, ALU y registros de la CPU, es importante señalar que el contador de programa es de 13 bits y la memoria de programa está organizado como 14 bits, teniendo una capacidad de 8K x 14 bits, por lo que cada instrucción de el PIC 16C74A es de 14 bits de largo.
Espero que esta entrada ayude a las personas a comprender como está compuesto un PIC y así programar con una mayor eficiencia cualquier proyecto PIC que tengamos en algún futuro profesional.
Puedes encontrar la tarjeta de referencia de este PIC aqui
Más información sobre las arquitecturas aquí
Etiquetas:
Laboratorio de computo integrado
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
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
Etiquetas:
Laboratorio de computo integrado
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.
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.
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
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.
Etiquetas:
Laboratorio de computo integrado
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:
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.
Para nuestro proyecto final de Arduino, estamos utilizando el Arduino Bluetooth, en donde tenemos esta memoria
¿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
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
Etiquetas:
Laboratorio de computo integrado
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:
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.
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
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.
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.
- Arranque
- Programación de tareas
- libreria de funciones estándar.
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
- Palm OS
- Windows CE
- MS-DOS or DOS Clones
- Linux, incluyendo RTLinux, MontaVista Linux y Unison OS
Existen muchos más, aqui puedes encontrar una lista.
Referencias
Real-Time Operating System - Wikibooks
Common RTOS
Programming RTOS
Etiquetas:
Laboratorio de computo integrado
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:
Especifiaciones técnicas
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.
¿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.
Etiquetas:
Laboratorio de computo integrado
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.
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);
}
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.
Etiquetas:
Laboratorio de computo integrado
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.
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.
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.
Etiquetas:
Laboratorio de computo integrado
lunes, 30 de abril de 2012
Registros de desplazamiento utilizando Arduino
Para nuestro proyecto de Arduino, es necesario aprender a utilizar y como poder manejar muy pocas entradas del Arduino para controlar más salidas, por lo que para esta entrada hablaré del registro de desplazamiento que vamos a utilizar en el cubo de leds, en donde mostraré un ejemplo en donde tenemos con solamente 4 salidas del arduino, controlar 16 Leds.
Un registro de desplazamiento se puede utilizar para controlar 8 salidas simultaneas usando unos pocos pines del microcontrolador, incluso es posible conectar dos demultiplexores y sacar 16 salidas, que es lo que hicimos para esta entrada.
El integrado 74HC595, lo compramos en AG electronica y este integrado es un registro de desplazamiento de 8 bits con entrada serie, salida serie o paralelo con latch (o sea, bloqueos), de 3 estados.
¿Cómo funciona?
Este integrado funciona de la siguiente manera, utiliza comunicación serie sincrona, en donde tu puedes transmitir un byte enviando pulsos altos y bajos por un pin y otro pin, viene siendo el clock o reloj en donde va enviando pulsos constantes para ir diferenciando los bits enviados por el pin que envia los pulsos diferentes, por lo que este es muy diferente a una comunicación serial asicrona ya que utilizando la función Serial.begin() el emisor y el receptor fijan la forma de una velocidad de tranferencia, por lo que a diferencia, este una vez que le enviamos el byte completo al registro, los valores ya sean los altos o los bajos, se lo asignan a cada pin de salida, provocando una salida en paralelo.
La salida en serie de este integrado es el agregr un pin extra que retransmite la información que le estamos mandando del arduino sin cambios, por lo que podemos como comunicar dos de estos integrados y tener la capacidad de transmitir 16 bits donde los primeros 8 bits atraviesen al primero y después se almacenen en el segundo, esto es lo que hicimos como ejemplo.
Bueno este es la información de los pines del integrado que utilizamos, tomado de aquí
Para checar como funciona, es preferible hacer un programa que nos ayude a probar los integrados y de las conexiones, por lo que utilizamos este diagrama de circuito, con 16 LEDs, 16 resistencias de 220 Ohm, dos integrados demultiplexores 595 y un condensador 0.1 uf o 100 nF.
Este es el diagrama.
Y este es el código que realizamos para verificar su funcionamiento.
En donde podemos ver que tenemos un arreglo con los leds que queremos prender y este los va leyendo y pasando la información a los integrados para que realicen su función.
En esta liga aquí vienen algunos ejemplos, pero nos dimos cuenta que algunos no funcionaban, por lo que nos dimos la tarea de realizar un programa por nosotro mismos, en base a los ejemplos.
Estos fueron los resultados.
Un registro de desplazamiento se puede utilizar para controlar 8 salidas simultaneas usando unos pocos pines del microcontrolador, incluso es posible conectar dos demultiplexores y sacar 16 salidas, que es lo que hicimos para esta entrada.
El integrado 74HC595, lo compramos en AG electronica y este integrado es un registro de desplazamiento de 8 bits con entrada serie, salida serie o paralelo con latch (o sea, bloqueos), de 3 estados.
¿Cómo funciona?
Este integrado funciona de la siguiente manera, utiliza comunicación serie sincrona, en donde tu puedes transmitir un byte enviando pulsos altos y bajos por un pin y otro pin, viene siendo el clock o reloj en donde va enviando pulsos constantes para ir diferenciando los bits enviados por el pin que envia los pulsos diferentes, por lo que este es muy diferente a una comunicación serial asicrona ya que utilizando la función Serial.begin() el emisor y el receptor fijan la forma de una velocidad de tranferencia, por lo que a diferencia, este una vez que le enviamos el byte completo al registro, los valores ya sean los altos o los bajos, se lo asignan a cada pin de salida, provocando una salida en paralelo.
La salida en serie de este integrado es el agregr un pin extra que retransmite la información que le estamos mandando del arduino sin cambios, por lo que podemos como comunicar dos de estos integrados y tener la capacidad de transmitir 16 bits donde los primeros 8 bits atraviesen al primero y después se almacenen en el segundo, esto es lo que hicimos como ejemplo.
Bueno este es la información de los pines del integrado que utilizamos, tomado de aquí
| PINS 1-7, 15 | Q0 " Q7 | Pins de salida | |
| PIN 8 | GND | Ground, Vss | |
| PIN 9 | Q7" | Salida Serie | |
| PIN 10 | MR | Master Reset, activo = low | |
| PIN 11 | SH_CP | Pin Clock | |
| PIN 12 | ST_CP | Pin Latch | |
| PIN 13 | OE | Salida disponible, activo = low | |
| PIN 14 | DS | Entrada Serie | |
| PIN 16 | Vcc | Voltaje |
Para checar como funciona, es preferible hacer un programa que nos ayude a probar los integrados y de las conexiones, por lo que utilizamos este diagrama de circuito, con 16 LEDs, 16 resistencias de 220 Ohm, dos integrados demultiplexores 595 y un condensador 0.1 uf o 100 nF.
Este es el diagrama.
Para verlo mejor o más grafico, estas son las conexiones utilizando 3 protoboards.
En donde podemos ver que tenemos un arreglo con los leds que queremos prender y este los va leyendo y pasando la información a los integrados para que realicen su función.
En esta liga aquí vienen algunos ejemplos, pero nos dimos cuenta que algunos no funcionaban, por lo que nos dimos la tarea de realizar un programa por nosotro mismos, en base a los ejemplos.
Estos fueron los resultados.
Etiquetas:
Laboratorio de computo integrado
Usabilidad en sistemas integrados
La usabilidad en sistemas integrados es muy diferente a la usabilidad de sistemas computacionales en los cuales el objetivo principal, es el aspecto gráfico del sistema, para que un sistema integrado tenga una buena usabilidad interfieren cosas como la colocación de los botones, como son los botones y los interruptores, entre algunas otras cuestiones.
En esta entrada hablaré acerca de los dos enfoques fundamentales para que los sistemas integrados tenga una facilidad de uso y que por lo tanto tengan usabilidad para los clientes finales, estos enfoques son la facilidad de uso mediante la evalucación y la otra es la facilidad de uso mediante los principios.
La facilidad de uso por la evaluación consiste en encontrar puntos fuertes y débiles para hacer mejoras al ambiente no grafico, esto involucra el utilizarlo de manera constante para poder saber si este tiene una facilidad de uso, hasta que alguien se de cuenta de que el producto es difícil de usar, por lo que nadie se dará cuenta de que es difícil de usar hasta que el producto se ha construido, la parte fácil de la usabilidad es ver el diseño actual y analizarlo, la parte difícil es decidir lo que se necesita mejorar ya que en algunos casos lo pueden empeorar, por lo que es imporante utilizarlo y valoralo de manera física.
La facilidad de uso por los principios es la que trata de decir por medio de consideraciones anteriores, que características de usabilidad son deseables para que la interfaz que estas utilizando sea usable y que tipo de gente va a utilizar la interfaz que estas realizando, por lo que al utilizar estos principios, permite que cuando tengas tu prototipo fisico puedas criticarlo y ser discutido con más fuerza ya que puedes tener documentado el por qué se considera usable el producto para luego analizarlo de manera más profunda.
Ahora les hablaré de algunos de los principios más importantes de debemos de considerar al momento de realizar un análisis de un sistema integrado con usabilidad de interfaces de usuario los cuales no son gráficos, si no, físicos.
Robustez.
Muchas veces este concepto se piensa que se utiliza para saber si el sistema que estamos utilizando va a estar fuertemente ligado a una propiedad mecánica, esto es como nuestro producto puede ser utilizado en caso rudo o cuando tengamos algún descuido, pero esto no es necesariamente lo que tiene que ver con este principio, es más bien que la interfaz sea tolerante a las entradas incorrectas, o que estas sean imposibles de hacer, por lo que una interfaz robusta, no solo protege al dispositivo de daños que pudieran ser accidentales, si no que también lo protege de una entrada incorrecta y que protege al usuario de como el dispositivo pudiera actuar.
Un ejemplo es por ejemplo en el manual de la computadora Sinclair ZX Spectrum, en 1982, especificaban muy claramente que Nada de lo que se escriba en el teclado puede dañar el equipo entonces esto demostraba una percepción de los diseñadores que a las personas que compraban sus equipos, pudieron reducir la ansiedad de los usuarios dandoles seguridad de que su computadora no se iba a destruir si ellos realizaban algo equivocadamente, no importa cuantos errores cometieran.
Podemos hablar de robustez cuando por ejemplo, se nos solicita la confirmación de realizar una acción, es la manera básica de añadir robustez al sistema integrado, del mismo modo, los mensajes de error o un sonido para indicar que la acción que esta realizando está mal, puede ser una respuesta muy buena para que el usuario final pueda saber que lo está haciendo de una manera no adecuada.
Algo muy importante y que personalmente yo lo he visto en ciertos sistemas, no nada más integrados, si no también gráficos, es el que muchas veces las personas que diseñan los sistemas formulan bien los mensajes de error o advertencias que se muestran, esto es por ejemplo si en el microondas tu picas a un boton que no esté disponible y te diga en una pantalla led "Acción ilegal" nosotros vamos a pensar que somos unos criminales como lo dice Niall Murphy en su artículo [aquí], nosotros pudieramos hacer que proporcione mensajes mas apropiados como "No disponible" o similar, haciendo más robusto el sistema.
A veces, es necesario proporcionar conjuntos de acciones que permitan que cualquier acción pueda ser regresada a un punto anterior, por lo que si nosotros hacemos un sistema que mueve un brazo robotizado a la izquierda, pueda hacer con la misma facilidad, moverse hacia la derecha y que pueda regresar al modo izquierda de manera como movió a la derecha, solamente como ejemplo.
Algunas veces, un sistema integrado, no puede revertir algunos comandos ya que es simplemente imposible, sobretodo cuando es una acción física que recibió el dispositivo y no se pude deshacer, por lo que en estos casos es importante que requiera alguna confirmación haciendo un equilibro entre la facilidad de uso y la intención de deshacer la acción.
Consistencia
Este principio lo que nos dice es que al utilizar una consistencia global del diseño para que pueda ser más fácil aprender las reglas y que el usuario pueda utilizar toda la interfaz sin ningún problema, por lo que la consistencia en la interfaz será reflejado en los programas y por lo tanto, nosotros como programadores debemos de realizar un código que pueda detectar este tipo de inconsistencias, por lo que le permite al usuario desarrollar normas que otros productos han utilizado como normas generales acerca de cómo funciona una interfaz, entonces es importante que cuando reciba el producto sea rapido de usar y no que tenga que aprender desde cero para saber a que significa cada uso, esto lo pudieramos dejar para sistemas más avanzados en donde si es importante saber este tipo de uso.
Affordance
De este principio no encontré una traducción directa aunque lo veo un poco como facilitante de hacer las cosas, por lo que esta es una propiedad que nos dice que al ver un producto es obvia su función, desde el momento de su aparición, esto es por ejemplo si te dan unas tijeras, te vas a dar cuenta que cada uno de los extremos tiene unas cosas redondas que se ajustan a tus manos y que del otro lado están afilados, por lo que tu razonablemente sabrás para que van a servir y como usarlo.
Podemos decir que esto es algunas veces facil porque el usuario puede ver por ejemplo, todos los controles en una tableta o el teclado numérico en un celular, pero debemos de acondicionar los productos a que los botones sean visibles y muestren información relevante, también es importante el etiquetado de cada boton proporcione una buena figura para saber que es lo que hace el boton por ejemplo, muchas veces un boton de stop, tiene un cuadro pero ese mismo botón sirve para dar play a algo, por lo que es importante poner las dos simbologias y el usuario pueda entender porque están los dos.
Un fallo que algunas veces se tiene en los sistemas físicos es colocar los botones en un patrón regular para que la apariencia del dispositivo sea simétrica, esto tiene sentido si por ejemplo cada uno de los botones tienen funciones similares, pero si se tienen funciones separadas, es preferible agruparlos según lo que se va a realizar, también es importante tener botones más grandes para las funciones más utilizadas y las funciones que raramente se van a utilizar no tan grandes, también por ejemplo si se tiene un teclado con números, es preferible acomodarlos de un orden de izquierda a derecha, ya que esta la forma de leer y la forma en que se pueden representar en un display.
Compatibilidad
Consideremos que existen 3 tipos de compatibilidad en una interfaz no gráfica.
La compatibilidad entre los productos no es tan facil como parece, los productos a través de la historia en el mercado, han hecho que las personas tengan ciertas prácticas, por lo que algunas veces, no todas, es importante seguir ese camino, es por eso que existen organismos de normalización que han ido haciendo intentos para estandarizar, por ejemplo los sonidos y las luces de alarma de un hospital, el ISO 9995 ha establecido un estándar para la disposición de las letras en los botones de un teléfono o un teclado numérico distinto, pero a pesar de esto los teléfonos en todo el mundo van variando la colocación de su teclado.
También los botones principales junto con los símbolos de una videograbadora, han sido normalizados, aunque existen inclusive aparatos de la misma empresa o compañía que no utilizan o separan estos botones.
Existen otras normas, los cuales hacen que el trabajo de una persona en el diseño y realización de aparatos sea más difícil, por ejemplo el estándar ISO 86901 es un estándar para los formatos de la fecha y hora, con un formato de año - mes - dia, sin embargo en Europa, se utiliza el formato dia - mes - año, como aquí en nuestro país y en paises como Estados Unidos utilizan el formato mes - dia - año. Por lo que la norma ISO es un formato más lógico ya que comienza con la unidad más importante y luego se traslada a las unidades cada vez más pequeñas, a medida que los vamos leyendo de izquierda a derecha.
Otra de las consideraciones de compatibilidad es que debe de ser compatible con el medio ambiente en donde va a trabajar un dispositivo, por ejemplo en un entorno ruidoso, suena una alarma que no se escucha o se escucha muy poco, pues no será apropiado, pero por otro lado una calculadora si la queremos utilizar en una biblioteca, no quiere decir que tenemos que tener una calcu que suene cada que tengamos que picar a un botón, pero es algunas veces difícil predecir este tipo de situaciones adivinar.
Por lo tanto podemos concluir que estos principios son importantes para la realización de sistemas que tengan usabilidad apropiada para el usuario final y que esto no es una cuestión que debemos de tomar a la ligera ya que, si en algún momento este producto deseamos venderlo, la cuestión de la usabilidad viene siendo algunas veces la clave del éxito de un producto y por lo tanto tendremos más venta y satisfacción al usuario, por lo que es relevante tomarlo en cuenta.
Bibliografía.
Usability for Embedded Sytems de Panelsoft
Usability for Non-Graphical user Interfaces por Niall Murphy
En esta entrada hablaré acerca de los dos enfoques fundamentales para que los sistemas integrados tenga una facilidad de uso y que por lo tanto tengan usabilidad para los clientes finales, estos enfoques son la facilidad de uso mediante la evalucación y la otra es la facilidad de uso mediante los principios.
La facilidad de uso por la evaluación consiste en encontrar puntos fuertes y débiles para hacer mejoras al ambiente no grafico, esto involucra el utilizarlo de manera constante para poder saber si este tiene una facilidad de uso, hasta que alguien se de cuenta de que el producto es difícil de usar, por lo que nadie se dará cuenta de que es difícil de usar hasta que el producto se ha construido, la parte fácil de la usabilidad es ver el diseño actual y analizarlo, la parte difícil es decidir lo que se necesita mejorar ya que en algunos casos lo pueden empeorar, por lo que es imporante utilizarlo y valoralo de manera física.
La facilidad de uso por los principios es la que trata de decir por medio de consideraciones anteriores, que características de usabilidad son deseables para que la interfaz que estas utilizando sea usable y que tipo de gente va a utilizar la interfaz que estas realizando, por lo que al utilizar estos principios, permite que cuando tengas tu prototipo fisico puedas criticarlo y ser discutido con más fuerza ya que puedes tener documentado el por qué se considera usable el producto para luego analizarlo de manera más profunda.
Ahora les hablaré de algunos de los principios más importantes de debemos de considerar al momento de realizar un análisis de un sistema integrado con usabilidad de interfaces de usuario los cuales no son gráficos, si no, físicos.
Robustez.
Muchas veces este concepto se piensa que se utiliza para saber si el sistema que estamos utilizando va a estar fuertemente ligado a una propiedad mecánica, esto es como nuestro producto puede ser utilizado en caso rudo o cuando tengamos algún descuido, pero esto no es necesariamente lo que tiene que ver con este principio, es más bien que la interfaz sea tolerante a las entradas incorrectas, o que estas sean imposibles de hacer, por lo que una interfaz robusta, no solo protege al dispositivo de daños que pudieran ser accidentales, si no que también lo protege de una entrada incorrecta y que protege al usuario de como el dispositivo pudiera actuar.
Un ejemplo es por ejemplo en el manual de la computadora Sinclair ZX Spectrum, en 1982, especificaban muy claramente que Nada de lo que se escriba en el teclado puede dañar el equipo entonces esto demostraba una percepción de los diseñadores que a las personas que compraban sus equipos, pudieron reducir la ansiedad de los usuarios dandoles seguridad de que su computadora no se iba a destruir si ellos realizaban algo equivocadamente, no importa cuantos errores cometieran.
Podemos hablar de robustez cuando por ejemplo, se nos solicita la confirmación de realizar una acción, es la manera básica de añadir robustez al sistema integrado, del mismo modo, los mensajes de error o un sonido para indicar que la acción que esta realizando está mal, puede ser una respuesta muy buena para que el usuario final pueda saber que lo está haciendo de una manera no adecuada.
Algo muy importante y que personalmente yo lo he visto en ciertos sistemas, no nada más integrados, si no también gráficos, es el que muchas veces las personas que diseñan los sistemas formulan bien los mensajes de error o advertencias que se muestran, esto es por ejemplo si en el microondas tu picas a un boton que no esté disponible y te diga en una pantalla led "Acción ilegal" nosotros vamos a pensar que somos unos criminales como lo dice Niall Murphy en su artículo [aquí], nosotros pudieramos hacer que proporcione mensajes mas apropiados como "No disponible" o similar, haciendo más robusto el sistema.
A veces, es necesario proporcionar conjuntos de acciones que permitan que cualquier acción pueda ser regresada a un punto anterior, por lo que si nosotros hacemos un sistema que mueve un brazo robotizado a la izquierda, pueda hacer con la misma facilidad, moverse hacia la derecha y que pueda regresar al modo izquierda de manera como movió a la derecha, solamente como ejemplo.
Algunas veces, un sistema integrado, no puede revertir algunos comandos ya que es simplemente imposible, sobretodo cuando es una acción física que recibió el dispositivo y no se pude deshacer, por lo que en estos casos es importante que requiera alguna confirmación haciendo un equilibro entre la facilidad de uso y la intención de deshacer la acción.
Consistencia
Este principio lo que nos dice es que al utilizar una consistencia global del diseño para que pueda ser más fácil aprender las reglas y que el usuario pueda utilizar toda la interfaz sin ningún problema, por lo que la consistencia en la interfaz será reflejado en los programas y por lo tanto, nosotros como programadores debemos de realizar un código que pueda detectar este tipo de inconsistencias, por lo que le permite al usuario desarrollar normas que otros productos han utilizado como normas generales acerca de cómo funciona una interfaz, entonces es importante que cuando reciba el producto sea rapido de usar y no que tenga que aprender desde cero para saber a que significa cada uso, esto lo pudieramos dejar para sistemas más avanzados en donde si es importante saber este tipo de uso.
Affordance
De este principio no encontré una traducción directa aunque lo veo un poco como facilitante de hacer las cosas, por lo que esta es una propiedad que nos dice que al ver un producto es obvia su función, desde el momento de su aparición, esto es por ejemplo si te dan unas tijeras, te vas a dar cuenta que cada uno de los extremos tiene unas cosas redondas que se ajustan a tus manos y que del otro lado están afilados, por lo que tu razonablemente sabrás para que van a servir y como usarlo.
Podemos decir que esto es algunas veces facil porque el usuario puede ver por ejemplo, todos los controles en una tableta o el teclado numérico en un celular, pero debemos de acondicionar los productos a que los botones sean visibles y muestren información relevante, también es importante el etiquetado de cada boton proporcione una buena figura para saber que es lo que hace el boton por ejemplo, muchas veces un boton de stop, tiene un cuadro pero ese mismo botón sirve para dar play a algo, por lo que es importante poner las dos simbologias y el usuario pueda entender porque están los dos.
Un fallo que algunas veces se tiene en los sistemas físicos es colocar los botones en un patrón regular para que la apariencia del dispositivo sea simétrica, esto tiene sentido si por ejemplo cada uno de los botones tienen funciones similares, pero si se tienen funciones separadas, es preferible agruparlos según lo que se va a realizar, también es importante tener botones más grandes para las funciones más utilizadas y las funciones que raramente se van a utilizar no tan grandes, también por ejemplo si se tiene un teclado con números, es preferible acomodarlos de un orden de izquierda a derecha, ya que esta la forma de leer y la forma en que se pueden representar en un display.
Compatibilidad
Consideremos que existen 3 tipos de compatibilidad en una interfaz no gráfica.
- Compatibilidad de lo que el usuario espera y lo que obtiene
- Compatibilidad entre los diferentes productos del mismo tipo
- Compatibilidad entre el dispositivos y con los que tiene que "cooperar".
La compatibilidad entre los productos no es tan facil como parece, los productos a través de la historia en el mercado, han hecho que las personas tengan ciertas prácticas, por lo que algunas veces, no todas, es importante seguir ese camino, es por eso que existen organismos de normalización que han ido haciendo intentos para estandarizar, por ejemplo los sonidos y las luces de alarma de un hospital, el ISO 9995 ha establecido un estándar para la disposición de las letras en los botones de un teléfono o un teclado numérico distinto, pero a pesar de esto los teléfonos en todo el mundo van variando la colocación de su teclado.
También los botones principales junto con los símbolos de una videograbadora, han sido normalizados, aunque existen inclusive aparatos de la misma empresa o compañía que no utilizan o separan estos botones.
Existen otras normas, los cuales hacen que el trabajo de una persona en el diseño y realización de aparatos sea más difícil, por ejemplo el estándar ISO 86901 es un estándar para los formatos de la fecha y hora, con un formato de año - mes - dia, sin embargo en Europa, se utiliza el formato dia - mes - año, como aquí en nuestro país y en paises como Estados Unidos utilizan el formato mes - dia - año. Por lo que la norma ISO es un formato más lógico ya que comienza con la unidad más importante y luego se traslada a las unidades cada vez más pequeñas, a medida que los vamos leyendo de izquierda a derecha.
Por lo tanto podemos concluir que estos principios son importantes para la realización de sistemas que tengan usabilidad apropiada para el usuario final y que esto no es una cuestión que debemos de tomar a la ligera ya que, si en algún momento este producto deseamos venderlo, la cuestión de la usabilidad viene siendo algunas veces la clave del éxito de un producto y por lo tanto tendremos más venta y satisfacción al usuario, por lo que es relevante tomarlo en cuenta.
Bibliografía.
Usability for Embedded Sytems de Panelsoft
Usability for Non-Graphical user Interfaces por Niall Murphy
Etiquetas:
Laboratorio de computo integrado
Suscribirse a:
Entradas (Atom)
















