La USBLab es una tarjeta reprogramable para interfaz de datos entre el ordenador y dispositivos físicos desarrollada por mi departamento en la Universidad. Y es un típico ejemplo de evolución/diseño convergente.
Después de un tiempo colaborando con la Universidad, y después de haber construido ya varios robots regidos por un microcontrolador, conocí de la existencia del micro 18F4550 de Microchip y sus hermanos pequeños.
Me interesó especialmente porque tenía puerto USB -esclavo-, el encapsulado era apto para humanos -DIP28 o DIP40- y era de Microchip -luego no necesitaba gastar un duro, ya tenia el programador y enviaban muestras gratuitas-. Hasta entonces los micros que conocía con USB era de gama alta y de otros fabricantes, de modo que necesitaría aprenderme una nueva arquitectura y comprar un nuevo programador.
Una ventaja de ese puerto USB es que los mismos chicos de Microchip tenían -tienen- un bootloader disponible, lo que implica que una vez cargas el bootloader con el programador normal, luego ya no es necesario el programador. Basta enchufarlo al USB del ordenador para reprogramarlo (con un programita que ellos te dan)... que es mucho menos engorroso que tener que sacar el micro de su zócalo y montarlo en el programador cada vez que que necesitas reprogramarlo. Además mi programador funcionaba por el puerto serie, y ya había muchos ordenadores que no tenían, por ejemplo mi portátil.
Por aquel entonces cada robot que construía llevaba un micro distinto, o como poco con diseño distinto, según necesitase unas cosas u otras. Pero estaba dándome cuenta de que de esa forma perdía mucho tiempo repitiendo la misma tarea con ligeras variaciones. Necesitaba fijar un micro y usar siempre el mismo, así ahorraría mucho tiempo en no tener que inventar una y otra vez la rueda.
Cuando me llegaron los 18F2550 -el hermano pequeño del 18F4550- que había pedido a Microchip, empleé uno para hacer el control de un pequeño brazo robot comercial -siete grados de libertad, creo- que estaba rondando por el laboratorio. El brazo tenía un controlador propio, pero era cerrado y sólo funcionaba desde su software, cuando lo que a nosotros nos interesaba era manejarlo desde Matlab o algún otro entorno normal.
Así que le cargué el bootloader, instalé el compilador de C de microchip -me pareció más redondo que los compiladores de C que había usado en los 16F- y empecé a adaptar mis rutinas para el control de servos y el puerto serie, que por aquel entonces era la única forma que tenía de hablar entre el PC y el microcontrolador.
La cosa es que me pareció muy cómodo, era rápido y me sentía a gusto con cómo funcionaba el compilador en C. Teniendo ya controlado el brazo, le puse una pantalla lcd de 2x16 caracteres, botones, etc, estaba a gusto. Y claro, empece a explorar el puerto USB, no sólo como forma de programarlo sino como forma de enviar datos entre el PC y el microcontrolador. Las ventajas eran evidentes: un cable menos, alimentación directa desde el PC y usar USB -porque ya no todos los PC tenian serie-.
Junto con el Bootloader y la documentacion disponible del micro, Microchip tenía también unas librerías para usar el USB como puerto de datos, había -al principio- dos formas : usar el puerto USB 'a pelo' como un dispositivo más o usar el USB emulando a un puerto serie.
Empecé con la emulación del puerto serie, con lo que Windows reconocía de inmediato el dispositivo y lo montaba con un puerto serie.
Para controlar el brazo, yo ya estaba usando un puerto serie desde Matlab, por tanto ahí no tenía que modificar nada.
En el lado del microcontrolador simplemente usé las librerías disponibles en Microchip y seguí su guía de cómo convertir un sistema usando el puerto serie real en otro usando el puerto serie vía USB.
Ya tenía comunicación vía USB y sus múltiples ventajas. Pero seguía teniendo un problema. Por algún motivo, el soporte de comunicación vía serie en Matlab no es muy bueno, no consigue abrir siempre los puertos, pierde la conexión y hay que reiniciar Matlab para poder volver a abrir el puerto, ... total, un engorro.
Aunque en parte debo agradecérselo, porque cansado de reiniciar matlab, me puse a estudiar la comunicacion USB 'a pelo'.
Esa parte fue más dura, la librería de Microchip se podía usar con una cierta facilidad, pero como quería entender cómo funcionaba -para saber que estaba pasando en mi micro- empecé a hurgar en los archivos de configuración de la librería, en los estandares del protocolo USB, y demás ... no lo recomiendo, el USB es un puerto muy cómodo a nivel usuario, pero a bajo nivel es un sin fin de estructuras, estados y configuraciones.
Y por supuesto necesitaba también averiguar como hablar con el micro desde el PC.
Al cabo de un tiempo -un par de meses, tenia otras cosas que hacer!- empecé a dominar el intercambio de datos entre el 18F2550 y el PC por USB 'a pelo'. Y una vez ordene las librerías de Microchip de una forma que me resultaba cómoda para trabajar el lado del micro, quedó resuelto -casi hasta hoy, que sigo usando prácticamente lo mismo que entonces monté-.
En el PC disponía de una librería base de Microchip en C, así que mis primeras comunicaciones con el micro eran vía un programa en C. Como lo realmente cómodo para desarrollar y prototipar es Matlab, no tardé en averiguar cómo hacer una librería que pudiese invocar desde Matlab. Así que Matlab habla con mi librería en C, ésta habla vía USB con mi micro y la respuesta sigue el mismo camino.
De esa forma era estable, asquerosamente estable. Matlab no se quedaba pillado, si se desconectaba el micro -por lo que fuese- no era necesario reiniciar Matlab y podía reconectar al vuelo... ni punto de comparación -Hoy es la librería que se usa en el departamento con la USBLab, sustituyendo a todas las implementaciones anteriores que usaban la emulación de puerto serie-.
Pero en aquel momento yo ignoraba que existiese la USBLab, de hecho creo que aun no existía.
Como el 18F2550 me había gustado muy mucho, pedí unos 18F4550 a Microchip -la principal diferencia es que tenían más patitas, por tanto podía conectar más cosas al mismo micro- y los puse en marcha.
Creo recordar que fue en las vacaciones de Semana Santa o un puente largo en primavera que decidí adoptar el 18F4550 como micro base, y el 18F2550 como alternativa de menor tamaño -el código es 100% compatible-.
Tomada la decisión, diseñe una placa, no muy grande, que contuviese lo mínimo para operar el micro: un conector USB, un botón de programación y otro de reset, toma de alimentación externa y un conector gordo donde sacar todas la señales de las patas del micro -usé un IDE40 porque se encuentra en cualquier tienda-. Monté un prototipo y quedé satisfecho.
La idea era llevar el prototipo a la facultad y convencer a mi director de tesis o a alguno de los profesores con los que colaboraba en todo aquel cacharreo, de que sería útil tener una placa estandarizada y ver si se podía encargar la fabricación de una tanda de ellas -y dejar de usar constantemente placas hechas a mano-
Convencerlos no fue difícil, de hecho no hizo falta, resulta que una compañera del departamento también había cacharreado con el mismo micro, llegado a la misma conclusión y diseñado una placa muy, muy parecida a la que yo tenía. La principal diferencia es que yo incluí alimentación externa mientras que ella incluía un conversor digital-analógico, coincidimos hasta en el conector IDE40 para los pines.
Se me habían adelantado, ya habían hecho el primer pedido a fábrica y acababan de llegar -o les faltaba muy poco-. Como no era cuestión de duplicar el esfuerzo, adopté la USBLab -como bautizaron a la otra placa- como mi placa de trabajo estándar.
Pero no todo ese trabajo fue en vano, de hecho la mayoría fue útil porque la compañera se había quedado en la parte de comunicación por USB emulando el puerto serie, con lo que tenían los mismos problemas de estabilidad que tuve yo. Así que yo usé su placa, pero ellos pasaron a usar mis librerías de comunicaciones.
Al final todos felices, objetivo cumplido: placa de desarrollo estandarizada para todos los que quisiéramos cacharrear - así se podía reutilizar y compartir el código directamente- y comunicaciones sencillas y estables entre el micro y Matlab.
La USBLab se sigue usando en el departamento para todo tipo de fines -debe haber un par de cientas- , se han hecho todo tipo de placas de expansión, se usa en varios laboratorios de alumnos, se han hecho ya un buen número de proyectos de fin de carrera con ella y son las placas que van a bordo de los robots de mi Tesis.
![]() |
La USBLab |
![]() |
Placa de extensión de la USBLab para la radio MRF24J40MA |
![]() |
Placa de extensión de la USBLab para control de motores Paso a Paso |
No hay comentarios:
Publicar un comentario