Hola a todos,
después de unos 3 meses de trabajo os traigo mi ultimo proyecto, aun sin terminar. Una pequeña PDA basada en un Cortex-M4 a 170Mhz... Realmente aun no tiene ninguna utilizad final, puede ser una agenda, un reloj de muñeca, un calendario, un osciloscopio, una consola de juegos...no se, ya se verá.
De momento me he preocupado en aprender varias cosas que no había hecho nunca, como mandar a fabricar el PCB, diseñar una carcasa a medida en 3D con Google Sketchup o programar los drivers a bajo nivel en C++.
El esquema electrónico no tiene ningún misterio, con lo mínimo para hacer funcionar el micro y poco más.
-Circuito de carga de batería. Nunca antes había utilizado un circuito de este tipo y la verdad es que estan muy bien. Solo necesita una resistencia para ajustar la corriente de carga, la batería carga en 15 o 20 min y tiene una autonomía mínima de 1 hora...
-Conector USB. Aun no he escrito los drivers de USB, de moento solo sirve para cargar la bateria.
-Conector microSD. Aun no he escrito los drivers para manejar la SD, pero ya lo hice en el pasado con las librerias FatFs y tampoco tiene mucho misterio...
-Controlador de touch screen. Un pequeño circuito se encarga de leer el touch screen resistivo y entregarnos el valor via SPI.
-Conector JTAG reducido de 8 pins. He eliminado los que no se utilizaban.
El diseño del PCB tampoco tiene nada de particular. Es un PCB a doble cara, con pistas de 0.15mm, con los componentes en la Top, pistas "locales" trazadas en la Top y pistas "globales" trazadas en la Bottom. Creo que me costaron 10 placas 34€ con gastos de envío incluidos, y los componentes los soldé a mano... Con ese precio nunca mas volveré a realizar una PCB en mi casa.
La carcasa esta bien, me quedo un poco corta, pero esta lo bastante bien. Esta diseñada con el Google Sketchup y el punto de partida es el propio PCB en 3D exportado desde eagle con un plugin. Además utilizé otro plugin en el sketchup para redondear todas las aristas.
Gracias a este plugin del eagle, y a que disponia de todo el tiempo del mundo para medir y re-medir, las ranuras de la carcasa encajan perfectamente en los conectores USB, JTAG y SD.
En la imagen anterior se muestra el PCB creado con el plugin del eagle, pero la carcasa no es la final.
Todo el software esta desarrollado en C++, con el objetivo de estudiar que ventajas e inconvenientes tiene este lenguaje en los sistemas embebidos. He creado unas pocas clases que representan el hw de la placa, para poder manejarlo de manera sencilla desde las capas mas altas del Sw. El C++ te permite modelar los drivers de una manera mas intuitiva y te da muchos más funcionalidades, siempre a costa de mas recursos de CPU...
-Al final se divide todo en unas 7 clases, organizadas verticalmente, donde las clases superiores son mas genericas y contienen objetos de las clases inferiores que estan mas proximas al Hw.
Por ejemplo, para configurar el touch screen es algo como lo siguiente. Primero inicializamos los objetos de las capas inferiores y se los vamos pasando en la inicializacion de los objectos de las capas superiores.
Pin busy = Pin( PIN_MODE_INPUT, PIN_PORT_A, PIN_BIT_2 );
Pin nPenIrq = Pin( PIN_MODE_INPUT, PIN_PORT_A, PIN_BIT_3 );
nPenIrq.setPuPd( PIN_PULL_UP );
Spi spi = Spi( SPI_NUMBER_1, SPI_MODE_MASTER, 100 );
Ads7846 ads7846( spi, busy, nPenIrq );
TouchScreen tsc = TouchScreen( ads7846 );
while(1){
if( tsc.read( x, y ) ){
//...
}
}
La idea es poner una librería de interfaz de usuario sobre la capa de drivers descrita antes, y este ha sido el mejor punto del proyecto....
El micro es muy rápido, cuenta con bastante memoria, tiene FPU, puede manejar un TFT con mucha velocidad, compilador Gcc, según los resultados de CoreMark es el doble de potente que un Pentium 100... pero sin un linux y todas sus librerías asociadas no puedo aprovechar apenas ninguna librería gráfica y me veía obligado a desarrollar una desde cero...
Después de mucho tiempo buscando por internet e intentar portar librerias como Qt, Gtk, Microwindows, MiniGui, Fltk, Woopsi, Glui... por fin encontré Gwen, una librería con muchos widgets, que no depende del SO, que es ansi C++ y que viene preparada para ser facilmente adaptada a cualquier plataforma.
Solo he probado algunos widgets, pero los tiene todos como: label, button, checkbox, tree, listbox, textbox, canvas, windows, tabs, menus... y otra cosa que me gusta es que muchos son "drag and drop", con lo que puedes reorganizarlos como quieras en tiempo de ejecucion.
bueno, espero que os haya gustado. Publicaré las novedades en breve...