miércoles, 25 de enero de 2012

¿Lenguaje ensamblador o lenguaje C? Para microcontroladores y microprocesadores

El motivo de este artículo es para presentar mi opinión acerca de este tema tan delicado. He visto por ahí algunas publicaciones acerca de este tema y me resulta vergonzoso que colegas ingenieros muestren su opinión de una manera tan retrograda que únicamente manifiesta su total inadaptación frente a las nuevas tecnologías.

Pero  ¿Qué es mejor? ¿Programar un MCU ó MPU en lenguaje ensamblador? o bien, programarlo en lenguaje C. Pienso que esto es totalmente relativo. En este tipo de cuestiones no hay absolutos. Para esto, me permito comentarles que mi lenguaje favorito es el lenguaje ensamblador, este lenguaje fue el primero que aprendí, con el que más tiempo tengo de experiencia y es el que más me gusta, y la razón por la me gusta tanto no es porque sea un lenguaje que por el único hecho de escuchar su nombre impone respeto, sino por su simpleza. En mi opinión muy personal, el lenguaje ensamblador es un lenguaje cubierto por infinidad de mitos. Para empezar, el ensamblador no es un lenguaje difícil, al contrario; es el lenguaje más simple que existe, el más fácil. Es el lenguaje que posee las instrucciones menos poderosas que pueden existir, todas destinadas a un mínimo de ciclos de reloj posibles. El problema con el lenguaje ensamblador radica en que para dominarlo, hay que saber electrónica, aquí no hay de otra.

Ahora, en cuanto al lenguaje C, puedo decir que es el lenguaje de programación por excelencia. El lenguaje C marcó una revolución en cuanto a la programación y es el padre de toda la informática que vivimos hoy en día.

Programar firmware en ensamblador tiene sus ventajas, pero la única ventaja que encuentro realmente de peso para programar todo un firmware en ensamblador es porque en todos los ambientes de desarrollo que conozco, es gratuito. Yo en lo personal desde hace muchos años me he dedicado al desarrollo de hardware y por ende, de firmware, y comercializo mis sistemas e incluso tengo patentes. A todo esto, me ha apoyado mucho el lenguaje ensamblador porque para poderlo utilizar, no necesito comprar una licencia y si quiero registrar mi sistema, no necesito demostrar que compré la licencia de un compilador de algún lenguaje de alto nivel como es el C.

Ahora, esto cambia radicalmente en la industria, las empresas dedicadas al desarrollo de hardware, poseen licencias de compiladores en lenguajes de alto nivel. Por lo menos en todas las empresas en las que he trabajado desarrollando firmware, tanto nacionales como extranjeras, el lenguaje oficial para el desarrollo de firmware es el lenguaje C. Y pienso que esto está bien, ya que dentro de las ventajas de programar firmware en un lenguaje de alto nivel como es el C, es que es mucho más rápido en cuanto a desarrollo y la dificultad es la misma, incluso yo siempre he pensado que programar firmware en C es bastante más difícil que programarlo en ensamblador ya que tienes que cuidar mucho los detalles y tener mucha atención en cuanto al consumo de recursos. Pero a final de cuentas, el firmware desarrollado en un lenguaje de alto nivel es dinámico, ágil y rápido (en cuanto a tiempos de desarrollo). Lo cual es lo que le interesa a la industria, por lo menos a empresas de desarrollo grandes y serias. A una empresa no le interesa que su desarrollador lo programe en ensamblador, o en un lenguaje de alto nivel, lo que le interesa a una empresa son los tiempos y los resultados. Los resultados son iguales programando en ensamblador o en un lenguaje de alto nivel, pero los tiempos…. Para nada.

El lenguaje ensamblador fue muy popular en los microcontroladores cuando estos eran los recién llegados dentro de la industria del control digital. En esos tiempos, la arquitectura de los microcontroladores era diferente a las arquitecturas que se manejan hoy en día, las capacidades de los microcontroladores eran muy limitadas y por lo tanto, el lenguaje ensamblador era más que adecuado para este tipo de arquitecturas.

En nuestros días, las arquitecturas de los microcontroladores y microprocesadores son lo suficientemente robustas y poderosas, como para tolerar lenguajes de alto nivel sin ningún problema, es más, no conozco alguna empresa dentro de la industria del diseño de microcontroladores que no recomiende utilizar el lenguaje C para las gamas más poderosas de sus dispositivos. Empresas enormes de fabricación de circuitos integrados muchas veces desarrollan microcontroladores y microprocesadores con arquitecturas diseñadas específicamente para ser programadas en lenguajes de alto nivel como lo es el C. Sinceramente no es concebible que se programe un microcontrolador RENESAS de doble núcleo en ensamblador, eso sería una total pérdida de tiempo y capacidades.

En fin, todo esto es relativo a la magnitud de tu proyecto, si únicamente estas acostumbrado a programar microcontroladores de 8 bits para mover un par de servomotores, controlar unos diodos LED, una pantallita LCD, dos motorreductores y mandar esta información a una computadora; o bien, prender y apagar 5 relevadores, 3 triacs, recibir información por bluetooth y convertir 3 ó 4 señales analógicas a información digital (que también tiene mérito por supuesto); pues… pienso que el lenguaje ensamblador es más que adecuado y entiendo que por eso el lenguaje ensamblador sea lo único para ti.

Pero… qué sucede cuando hay que procesar grandes cantidades de datos y los elementos que conviven con tu microcontrolador o en su caso microprocesador están mucho más allá del dominio del mismo microcontrolador o microprocesador. Cuando tu microcontrolador o microprocesador convive no solo con motores DC o con interruptores o con pantallas o con sensores. Sino cuando tu dispositivo convive con servidores informáticos, con bases de datos alojadas en servidores remotos, con un ambiente web, con protocolos de comunicación tales como http, ftp, tcp o udp. Cuando tu micro realiza almacenamiento masivo de datos en dispositivos flash y se requiere de un FAT32 o incluso, cuando tu microcontrolador funciona como un servidor web, o despacha una página web al resto del mundo a través de su conectividad a internet.

Existen muchos microcontroladores y microprocesadores basados en arquitecturas especializadas para lenguajes de alto nivel, como lo es la arquitectura ARM, todos los microcontroladores y microprocesadores que he utilizado con esta arquitectura se programan en C, o alguna versión de C, llegando incluso a la programación con objetos como lo es C++ y C#. Otro ejemplo de esto son los DSP’s de Texas Instruments líder, en el ramo del Tratamiento Digital de Señales, siendo estos, los más poderosos que visto en cuanto al ramo DSP y se programan en C.

Como conclusión puedo decir que programar un microcontrolador de 8 bits en C no llegaría a ser lo más adecuado desde mi punto de vista. Ya que la arquitectura de un microcontrolador de 8 bits es pequeña aunque poderosa. Pero no veo la necesidad de que sea programado en alto nivel, en cambio un microcontrolador de 32bits ó un DSP ó tal vez un microprocesador de arquitectura ARM requieren una programación más adecuada a su arquitectura, y ésta sería utilizando un lenguaje de alto nivel.

Muchas personas son partidarias de que el único lenguaje válido para el desarrollo de firmware es el lenguaje ensamblador. Sin embargo eso refleja mucho las limitaciones que tiene su conocimiento y su dominio del área. Hoy en día existen muchos dispositivos poderosos que pueden ser utilizados con variadas herramientas de desarrollo muy adecuadas para su calibre. Mencionan mucho el famoso dispositivo ARDUINO, el cual yo considero una herramienta didáctica muy eficiente, tal vez desde mi punto de vista, utilizar un IDE tan grande y un lenguaje de alto nivel para un microcontrolador de 8 bits se me hace algo exagerado para ser aplicado a nivel profesional pero finalmente el objetivo de todo esto es lograr un desarrollo funcional, eficiente y que pueda ser comercializado a un precio accesible. Yo en lo personal no utilizo ARDUINO para aplicaciones de 8bits, porque soy partidario de que utilizar un microcontrolador barato y programarlo en ensamblador te da una ventaja en cuanto a costo, lo cual ayuda a poder comercializar un hardware como comentaba anteriormente, funcional, eficiente y a un precio accesible. Pero, si esto lo logras utilizando un ARDUINO, programándolo en PHP o Pyton o Basic. No le veo ningún problema, incluso tal vez hasta se tendría más mérito porque igualar en costo un hardware desarrollado con un microcontrolador que te cuesta 50 pesos a un hardware desarrollado con un ARDUINO por ejemplo que te cuesta 200 pesos pues, requiere de mucho ingenio y habilidad.

Por último, haciendo referencia a las mismas publicaciones que he visto por ahí en internet, veo que incluso incluyen comentarios que atacan con la idea de que si programas en C es porque es más fácil y que lo único es el ensamblador y que el hecho de programar en C un microcontrolador o un ARDUINO no te hace ser ingeniero. Bueno, entonces ¿qué te hace ser ingeniero? Yo programo en ensamblador desde que estaba en la preparatoria y no únicamente microcontroladores. Y eso no me hacía ingeniero, ¿o sí? Creo que el ser ingeniero se trata precisamente de aplicar el ingenio para resolver problemas de manera funcional. Eso y el título, claro está.

En fin, a todas esas personas que atacan de esa manera las diversas herramientas de desarrollo ajenas al lenguaje ensamblador, sepan que reflejan una formación académica dolorosa debido al gran trabajo que les costó aprender lo que saben a causa de sus inadecuadas capacidades y  únicamente hacen más que evidente su poco dominio en el área, su inadaptación frente a las nuevas tecnologías y su desesperación frente a la amenaza de que sus desarrollos pueden ser fácilmente reemplazados por tecnologías “fáciles”.

Los dejo con un link con otra opinión interesante: 

http://youtu.be/iHFm-kVTXW8

Muchas gracias por su tiempo.
Saludos cordiales a todos.

miércoles, 5 de octubre de 2011

AN AGE OF HARDWARE

Comparto con ustedes un clip; que es una colección algunos de mis desarrollos que tengo documentados en video

Gracias por su tiempo, espero les guste. Saludos a Todos.

martes, 4 de octubre de 2011

NETDUINO













Estando de regreso después de poco más de un año de casi absoluta ausencia debido a un proyecto en el que estuve trabajando muy dedicadamente. Estoy poniendome al tanto con mi Blogg. Gracias a este proyecto en el que estuve trabajando me incursioné muy seriamente en la ingeniería de software, algo que había manejado de manera muy superficial anteriormente. Hoy día me estoy dedicando a la ingeniería de software, principalmente Microsoft .NET con los lenguajes C#, F# y VB. Además eh entrado al territorio de las bases de datos a través de Microsoft SQL Server y tecnologías web como ASP, AJAX y Silverlight.

Hace algunos meses me topé con un dispositivo muy muy interesante, el famoso Netduino. Algo que me llamó la atención de este dispositivo es que posee un microprocesador de arquitectura ARM7 que para los que desconocen de la materia, ARM es la arquitectura en la que se basan actualmente muchos de los microprocesadores utilizados en la industria informatica y de las telecomunicaciones, muchos telefonos celulares de los más novedosos poseen un microprocesador ARM dentro.

Yo ya había estado en contacto con microprocesadores de esta arquitectura, tal como el procesador de 32bits LPC1768 de NXP que es un ARM CORTEX M3 y vaya que es poderoso; este dispositivo se programa en lenduaje C. En sí todos los procesadores de arquitectura ARM que yo conozco he visto que se programan en C o algúna versión de C.

En fin, lo que realmente me llamó la atención de este dispositivo llamado Netduino es que posee un microframework .NET precargado, y mejor aún; se programa en C#.NET. Lo más inmediato que pensé al enterarme de esto es, que de ser cierto, este dispositivo tendría que ser capaz de soportar hilos (Threads) y todas las bondades de la POO (Programación Orientada a Objetos). Que bueno, para un microprocesador ARM la programación con hilos no es novedad, sin embargo, el hecho de que se puedan manejar hilos desde un lenguaje tan potente y amigable como lo es C#.Net, eso es bastante atractivo.

Al obtener mi primer Netduino, comprobé que este dispositivo es de lo mejor que he llegado a utilizar ya que tiene el poder de un microprocesador ARM, posee un microframework .Net, se programa en C# y puedes crear clases y objetos para tu programa; y lo mejor! puedes levantar hilos (rutinas de procesamiento en paralelo). Esto, además de que incluye poderosas librerías para diferentes dispositivos periféricos, tales como Ethernet, Memorias Flash MicroSD entre otros.

A mi Netduino le he incorporado bluetooth y eh experimentado mucho, teniendo toda la potencia y flexibilidad del software pero aplicado a firmware. Sin duda es el comienzo de algo grande, casi no puedo esperar a que los dispositivos con microframework .NET dentro continúen creciendo, abarcando más y más mercado y abaratando sus costos.

Una vez más, Gracias! y un saludo a todos.

lunes, 3 de octubre de 2011

MINI TENGU













Bueno, este proyecto es un "remake" de la primera versión que realicé del Tengu, incluso ocupé el mísmo firmware, pero con un amplificador de audio diferente. La principal diferencia entre esta versión y la primera que diseñé reside en el tamaño, ya que esta mide la mitad de la otra. Los LED's para esta versión son de 3.5mm en vez de los LED's de 5mm que ocupé en la versión anterior; pero la diferencia de tamaño no reside únicamente en el tamño de los LED's, sino que el diseño del circuito en sí es mucho más compacto y optimizado en cuanto a espacio y consumo de energía; además de que ahora posee un puerto mini USB.

Y bueno, los dejo con un video de este nuevo diseño.
Gracias y Saludos a todos.

domingo, 2 de octubre de 2011

MÓDULO VENDVOLUTION

El módulo VendVolution es un módulo de telemetría vía GPRS para máquinas Vending.
Sus tareas básicas son 2:
  • Venta de Tiempo Aire
  • Telemetría
Venta de Tiempo Aire

El módulo está diseñado para ser insertado en los orificios específicos para dispositivos que poseen las máquinas vending, estos "huecos" son utilizados para instalar monederos, billeteros, lectores de tarjetas, entre otros.
La empresa a la que se le desarrolló el sistema, es una empresa dedicada a la venta de tiempo aire, es decir, recibe solicitudes de recarga desde tiendas departamentales, comercios particulares y tiendas de conveniencia. La empresa recibe todas estas solicitudes en sus servidores y se procesan dichas transacciones con software especializado desarrollado dentro de la mísma empresa.
El módulo VendVolution es capaz de realizar conexiones con los servidores de la empresa a través de la infraestructura GPRS, realizando solicitures de recarga y realizando el cobro a través de los dispositivos própios de la máquina vending; estos pueden ser un monedero o un billetero. Esto permite realizar recargas de tiempo aire a telefonos celulares desde cualquier máquina vending que tenga instalado un módulo VendVolution.

Telemetría

Tomando ventaja de la capacidad de conexión GPRS hacía algún servidor específico, se optó por implementar la función de "Telemetría", pero... y ¿Qué es la telemetría?
El concepto más concreto para definir "telemetría" sería; el proceso de monitoreo de variables físicas de manera remota, principalmente inalambrica. Bueno, aplicando este concepto al módulo VendVolution, se optó por monitorear principalmente inventarios y alarmas propias de las máquinas vending. Es decir, se monitorea de manera remota la cantidad de producto que posee la máquina vending, las ventas que ha generado la máquina e incluso algún desperfecto que este afectando la máquina; esto, entre otras variables.

Y bueno, el desarrollo consistió en cuanto al hardware, de un microcontrolador AVR de 8 bits; un módulo GPRS y una interfaz con el usuario que consta de un teclado y una pantalla gráfica monocromática. El firmware fue desarollado en lenguaje C principalmente y algunas rutinas en lenguaje Ensamblador.

En cuanto al Software, que involucra toda la plataforma informatica que reside en los servidores de la empresa y es la encargada de despachar todas las transacciones que generan los cientos de módulos GPRS VendVolution, fue desarrollada con paquetería Microsoft.NET (VB.NET, C#.NET y SQL Server)

Por último quiero mencionar que este proyecto fue lanzado aún bajo una versión BETA en la ciudad de Monterrey para una empresa embotelladora de enorme magnitud. Próximamente compartiré con ustedes el enlace de la página de internet del dispositivo en cuestión.

Muchas Gracias y Saludos a Todos.


martes, 25 de mayo de 2010

COMANDOS DE VOZ PARA ROBOT

Este sistema consta de 2 proyectos aplicados.
  • Procesamiento de voz con C++.NET
  • Modem de Radio por modulación ASK
En un principio experimenté desarrollando sistemas de reconocimiento de voz a través de DSP (Digital Signal Processor) principalmente DSC's. Una vez adentrado en materia, opté por realizar procesamiento de voz a través de la PC aplicando mis recién adquiridos conocimientos en Microsoft Visual C++.NET. Esto data de Marzo 2010

Experimentando un poco, logré desarrollar una aplicación interactiva de procesamiento de voz aplicada a control. La cual me generó muy buenos resultados.

Posteriormente decidí aplicar mi interfaz de voz a algo un poco más llamativo que únicamente un formulario de windows. Para esto, recordé que unos dias atrás había estado trabajando en el desarrollo de un modem de radio a baja potencia con modulación ASK (Amplitude Shift Keying). Retomando el proyecto del modem, decidí adaptarlo a mi aplicación de comandos por voz; incorporando una interfaz USB al modem para que ambas partes, tanto aplicación como modem tengan comunicación entre sí. De esta forma, desde la PC sería posible transmitir instrucciones por radio a través del modem y realizar un sistema de control remoto.

Para hacer aún más llamativo el sistema, decidí colocar un receptor de radio para mi modem en un pequeño robot que tenía ya diseñado y estaba disponible. De esta forma, uniendo todas las partes del sistema (Aplicación Windows, Modem RF y Robot), desarrollé una solución muy adecuada para exhibición; la cual les presento a continuación.

Muchas Gracias y Saludos a Todos.



jueves, 13 de mayo de 2010

CUBO DE ANIMACION 3D (YELLOW LED CUBE)






Cubo de diodos emisores de luz (LED) en arreglo "3D" conformando por una matriz 8x8x8. En total 512 LED's.

El proyecto lo diseñé como proyecto universitario, específicamente para la feria de tecnología de la Universidad, incluso coloqué las siglas de la universidad (UVM) dentro de la rutina de animación que reproduce el cubo luminoso. A su vez, posee otra animación, dicha animación consta de un ecualizador gráfico 3D que comienza a graficar al percibir música o cualquier sonido dentro de la banda que es capaz de procesar.

El diseño del circuito fue muy improvisado por falta de tiempo, ya que me tuve que ajustar a la fecha de la feria, y bueno... me ví orillado a dejar la circuitería ensamblada en un tablero para prototipos. A pesar de que los resultados fueron suficientes para la exhibición, el circuito y el firmware estarán en proceso de perfeccionamiento y estaré publicando aquí los avances, ya que actualmente me encuentro trabajando con un procesador de matriz de pixeles muchísimo más avanzado, potente y por lo tanto eficiente.

Sin más por el momento, los dejo con video de la rutina de exhibición del cubo.
Espero les agrade, muchísimas gracias.
Un saludo a todos.

domingo, 2 de mayo de 2010

NEXUS V2.2





Este robot es un proyecto que realicé a finales del año 2007. Es un robot de exhibición que fue evolucionando a través de sus versiones. Primeramente nació como robot sigue líneas, esto como proyecto universitario para una asignatura. Posteriormente se le implementó un control remoto a través de pulsos de infrarrojo, tal como funcionan los controles remotos para la T.V. El diseño del control remoto y el protocolo del mísmo fue diseñado por su servidor y actualmente está implementado en algunos sistemas comerciales.

Una vez incorporado el control remoto al robot, el proyecto fue presentado en una feria de tecnología de la universidad, teniendo como atractivo el hecho de que podía funcionar siguiendo de manera autónoma una linea blanca que le sirviera de guía, o recibiendo comandos de navegación desde el control remoto.

A continuación les muestro un par de videos de su funcionamiento.

Muchas Gracias por su Atención. Saludos!



Medidor de Distancia por Ultrasonido (SRF05)





Un diseño que implementé a mediados del año 2008. Fue un proyecto sencillo que realicé para la universidad (simple pero funcional). El circuito no es muy elaborado ya que únicamente lo realicé para una materia. Afortunadamente el proyecto resultó ser atractivo y se presentó en una feria de tecnología, propia de la universidad.
El dispositivo es capaz de realizar una medición de hasta 4 metros de distancia. Aclaro que en los créditos del video, cometí un error y escribí 3 metros.
Para los que desconocen de la materia, este dispositivo emite una rafaga de ondas de ultrasonido y mide el tiempo que tarda dicha ráfaga en regresar después de rebotar con algún objeto. Tomando como constante la velocidad del sonido, se puede calcular la distancia a la que está el objeto tomando como variable el tiempo que tardó en rebotar la rafaga de ondas ultrasónicas.
Espero les agrade y les mando un saludo a todos.

My PIC-Tengu





Esta es mi versión del Tengu original de -Crispin Jones-
El circuito es un diseño totalmente propio y lo realicé con un PICmicro programado en lenguaje ensamblador, utilizando su convertidor analógico digital de 8 bits. El amplificador para la salida de audio proveniente del microfono está basado en un par de amplificadores operacionales en cascada.
GRACIAS POR TU VISITA.