TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jgpeiro06 en 22 de Agosto de 2012, 18:32:04

Título: Mini PDA
Publicado por: jgpeiro06 en 22 de Agosto de 2012, 18:32:04
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.
(http://farm9.staticflickr.com/8295/7838537356_1933c0d5a2_b.jpg)


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.
(http://farm9.staticflickr.com/8437/7838537560_751e18e22a_z.jpg)
(http://farm9.staticflickr.com/8308/7838707316_c06c617eda_c.jpg)
(http://farm9.staticflickr.com/8303/7838703628_9dc6fd4371_c.jpg)

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.
(http://farm8.staticflickr.com/7125/7840514722_e4913dcbd8_b.jpg)
En la imagen anterior se muestra el PCB creado con el plugin del eagle, pero la carcasa no es la final.
(http://farm9.staticflickr.com/8286/7840514012_2d6c533ef9_c.jpg)
(http://farm9.staticflickr.com/8422/7840514338_82ac6b1c66_c.jpg)
(http://farm9.staticflickr.com/8299/7838714318_a9d91495e4_c.jpg)

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.
(http://farm8.staticflickr.com/7279/7838537700_92b34482fb_b.jpg)

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.
Código: C++
  1.         Pin busy = Pin( PIN_MODE_INPUT, PIN_PORT_A, PIN_BIT_2 );
  2.         Pin nPenIrq = Pin( PIN_MODE_INPUT, PIN_PORT_A, PIN_BIT_3 );
  3.         nPenIrq.setPuPd( PIN_PULL_UP );
  4.         Spi spi = Spi( SPI_NUMBER_1, SPI_MODE_MASTER, 100 );
  5.         Ads7846 ads7846( spi, busy, nPenIrq );
  6.         TouchScreen tsc = TouchScreen( ads7846 );
  7.         while(1){
  8.                 if( tsc.read( x, y ) ){
  9.                         //...
  10.                 }
  11.         }  
  12.  

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.
(http://farm8.staticflickr.com/7279/7838680716_95fe1f0807_c.jpg)
(http://farm8.staticflickr.com/7118/7838686278_c079dbf803_c.jpg)

bueno, espero que os haya gustado. Publicaré las novedades en breve...


Título: Re: Mini PDA
Publicado por: manutek en 22 de Agosto de 2012, 20:05:36
impresionante ¡¡¡¡   ((:-)) ((:-)) la verdad te pasastes terrible el trabajo que te tomastes ...estare siguiendo el hilo y tratando de entender un poco
saludos 
Título: Re: Mini PDA
Publicado por: peteorito en 22 de Agosto de 2012, 20:15:55
Mola  mucha!! Como te lo has currao!! Por cierto la carcasa de que material es?¿ ¿como la has hecho?
Título: Re: Mini PDA
Publicado por: gera en 22 de Agosto de 2012, 22:42:12
Que pedazo de trabajo te estas mandando!! Te re felicito por los avances!
Estas usando CMSIS para programarlo?
Saludos!!
Título: Re: Mini PDA
Publicado por: jfh900 en 22 de Agosto de 2012, 23:17:55
Fantástico trabajo. Enhorabuena y sigue con el proyecto.

Un saludo
Título: Re: Mini PDA
Publicado por: MLO__ en 22 de Agosto de 2012, 23:34:07
 ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-))

que pedazo de proyecto!!!!   .... excelente ... que nivel jgpeiro ... tan solo observo, porque ni por las curvas alcanzarte jejeje

Saludos
Título: Re: Mini PDA
Publicado por: MGLSOFT en 23 de Agosto de 2012, 08:15:02
Como humilla este muchacho!!! :5] :5] :5]

Buenisimo, Jpeiro !!!   ((:-)) ((:-)) ((:-)) ((:-)) ((:-))

Como cada aporte tuyo !!! :mrgreen: :mrgreen:
Título: Re: Mini PDA
Publicado por: sander en 23 de Agosto de 2012, 09:49:32
Genial el proyecto, gracias por compartirlo

Saludos
Título: Re: Mini PDA
Publicado por: KALLITOS en 23 de Agosto de 2012, 10:20:05
Muy bueno esta esto.
Jpeiro si no es molestia, con que herramientas soft y hard cuentas para programar ese micro, me ha llamado mucho la atención y me interesaria empezar a jugar.

saludos!!
Título: Re: Mini PDA
Publicado por: Suky en 23 de Agosto de 2012, 15:50:02
 :shock: Tremendo trabajo! Felicitaciones  ((:-)) Un vídeo!  :-/
Título: Re: Mini PDA
Publicado por: jgpeiro06 en 23 de Agosto de 2012, 15:52:40
Citar
Por cierto la carcasa de que material es?
La carcasa esta "impresa" en plástico duro. Mandé el diseño a shapeways (http://www.shapeways.com/) y me costo solo 8€ mas gastos de envío. Hay distintos materiales disponibles, yo utilicé este "plástico duro" por ser el mas barato de todos.

Citar
¿Estas usando CMSIS para programarlo?
Bueno, estoy trabajando sobre las librerías que me proporciona ST para manejar los drivers, que a su vez hacen uso de CMSIS.

Citar
...con que herramientas soft y hard cuentas para programar ese micro...
Utilizo el ide Keil uVision y el compilador GCC para ARM.
Para programar/depurar utilizo el ulink2.

Título: Re: Mini PDA
Publicado por: jeremylf en 24 de Agosto de 2012, 02:40:20
Buenisimo, gracias por compartir!!! Estare siguiendo el hilo.
Título: Re: Mini PDA
Publicado por: peteorito en 24 de Agosto de 2012, 05:36:11
Ok gracias!!!
Título: Re: Mini PDA
Publicado por: Nocturno en 24 de Agosto de 2012, 10:56:07
Siempre subiendo el nivel. A tus pies.
Título: Re: Mini PDA
Publicado por: RICHI777 en 24 de Agosto de 2012, 12:53:10
Felicitaciones jgpeiro !!! como siempre con proyectos innovadores y de alto vuelo. Lo que más me intereso es la elección de gwen, me la agendo.  Viniendo de un persona con tus conocimientos no sabes la horas hombres que ahorras en la búsqueda de una GUI para embebidos.

Saludos !
Título: Re: Mini PDA
Publicado por: sanpic en 24 de Agosto de 2012, 13:07:46
 :shock:
Monumental lo que has hecho.
Felicitaciones por semejante esfuerzo y dedicación en el proyecto , y muchas gracias por compartirlo.   ((:-)) ((:-))
Título: Re: Mini PDA
Publicado por: lmtreser en 24 de Agosto de 2012, 14:34:21
Tremendo trabajo. Desde el PCB, la idea y la carcaza. Felicitaciones  ((:-))
Título: Re: Mini PDA
Publicado por: Darukur en 24 de Agosto de 2012, 15:07:46
Excelente trabajo! es realmente un logro combinar todas las diferentes areas de conocimiento para lograr un producto.
Vos lo hiciste! Felicitaciones!
Título: Re: Mini PDA
Publicado por: RICHI777 en 24 de Agosto de 2012, 15:36:58
Hola  jgpeiro te colgué el post en otro foro !. Si tenes tiempo y no te molesta podrías explicar como hiciste la interfaz entre el manejo de display y gwen por lo menos a grandes rasgos.

Saludos !
Título: Re: Mini PDA
Publicado por: jgpeiro06 en 29 de Agosto de 2012, 13:21:57
Citar
Si tenes tiempo y no te molesta podrías explicar como hiciste la interfaz entre el manejo de display y gwen
Yo modifique la clase OpenGL más o menos así:
Código: C++
  1. namespace Gwen
  2. {
  3.         namespace Renderer
  4.         {
  5.                 OpenGL::OpenGL(){}
  6.                 OpenGL::~OpenGL(){}
  7.                 void OpenGL::Begin(){}
  8.                 void OpenGL::End(){}
  9.                 void OpenGL::Flush(){}
  10.  
  11.                 void OpenGL::AddVert( int x, int y, float u, float v ){
  12.                         TDB2012::Color color = TDB2012::Color( m_Color.r, m_Color.g, m_Color.b );
  13.                         lcd.drawLine( x, y, x+u, y+v, color );
  14.                 }
  15.  
  16.                 void OpenGL::DrawFilledRect( Gwen::Rect rect ){
  17.                         Translate( rect );
  18.                         TDB2012::Color color = TDB2012::Color( m_Color.r, m_Color.g, m_Color.b );
  19.                         lcd.drawRect( rect.x, rect.y, rect.w, rect.h, true, color );
  20.                 }
  21.  
  22.                 void OpenGL::SetDrawColor(Gwen::Color color){
  23.                         m_Color = color;
  24.                 }
  25.  
  26.                 void OpenGL::StartClip(){              
  27.                         Gwen::Rect rect = ClipRegion();
  28.                 }
  29.  
  30.                 void OpenGL::EndClip(){}
  31.  
  32.                 void OpenGL::DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect rect, float u1, float v1, float u2, float v2 ){
  33.                         TDB2012::Color color = TDB2012::Color( m_Color.r, m_Color.g, m_Color.b );
  34.                         lcd.drawRect( rect.x, rect.y, rect.w, rect.h, true, color );                   
  35.                 }
  36.  
  37.                 void OpenGL::LoadTexture( Gwen::Texture* pTexture ){}
  38.                 void OpenGL::FreeTexture( Gwen::Texture* pTexture ){}
  39.  
  40.                 Gwen::Color OpenGL::PixelColour( Gwen::Texture* pTexture, unsigned int x, unsigned int y, const Gwen::Color& col_default ){
  41.                         Gwen::Color c;
  42.                         c.r = 0;        c.g = 0;        c.b = 0;        c.a = 0xFF;
  43.                         return c;
  44.                 }
  45.                
  46.                 Gwen::Point OpenGL::MeasureText( Gwen::Font* pFont, const Gwen::UnicodeString& text ){
  47.                         Gwen::Point p;
  48.                         //...
  49.                         return p;
  50.                 }
  51.                
  52.                 void OpenGL::RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::String& text ){
  53.                         //...
  54.                 }
  55.                
  56.         }
  57. }
  58.  

y para generar los eventos eventos del raton desde el touchscreen:
Código: C
  1. while(1){
  2.         pressedBck = pressed;
  3.         pressed = tsc.read( x,y );
  4.  
  5.         if( pressed && !pressedBck ){
  6.                 dx = x - MousePosition.x;
  7.                 dy = y - MousePosition.y;
  8.  
  9.                 MousePosition.x = x;
  10.                 MousePosition.y = y;
  11.                        
  12.                 pCanvas->InputMouseMoved( x, y, dx, dy );
  13.                 pCanvas->InputMouseButton( 0, true );
  14.                 pCanvas->RenderCanvas();
  15.                        
  16.         }else if( !pressed && pressedBck ){
  17.                 dx = x - MousePosition.x;
  18.                 dy = y - MousePosition.y;
  19.  
  20.                 MousePosition.x = x;
  21.                 MousePosition.y = y;
  22.  
  23.                 pCanvas->InputMouseMoved( x, y, dx, dy );
  24.                 pCanvas->InputMouseButton( 0, false );
  25.                 pCanvas->RenderCanvas();
  26.         }
  27.  
  28.         delayMs(10);
  29. }
  30.  

Con esto ya tenemos todo. Menos de 100 lineas que nos permiten aprovechar una librería de más de 100 archivos...
Título: Re: Mini PDA
Publicado por: enzo84 en 02 de Septiembre de 2012, 15:36:55
Está buenísimo! Estas en hackaday
Título: Re: Mini PDA
Publicado por: jgpeiro06 en 02 de Septiembre de 2012, 16:13:20
Citar
Estas en hackaday
si, lo envie y me lo han publicado... que bien!!

Aquí comento el código en C++ para manejar los GPIO. Es una clase que permite majerar cualquier pin del micro. Configura todo lo necesario(reloj, modo, velocidad...) de una manera transparente y solo te tienes que preocupar de decidir si es entrada o salida.
La configuración de los periféricos se simplifica mucho gracias a unas cuantas tablas que contienen los valores que son distintos valores para cada pin y se accede a ellos con la enumeración del propio pin.

Para encender un led, es necesario este codigo:
Código: C++
  1. #include "Pin.hpp"
  2. int main( void ){
  3.         Pin led = Pin( PIN_MODE_OUTPUT, PIN_PORT_A, PIN_BIT_0 );
  4.         Pin button = Pin( PIN_MODE_INPUT, PIN_PORT_A, PIN_BIT_1 );
  5.         while( 1 ){
  6.                 led.write( button.read() );
  7.         }
  8.         return 0;
  9. }
  10.  

Código: C++
  1. class Pin{
  2. private:
  3.         tPinMode _mode;
  4.         tPinPort _port;
  5.         tPinBit _bit;
  6. public:
  7.         Pin();
  8.         Pin( tPinMode mode, tPinPort port, tPinBit bit );
  9.         ~Pin();
  10.         bool read();
  11.         void write(bool value);
  12.         void setPuPd( tPinPull pupd );
  13.         void AFConfig( uint8_t af );
  14. };
  15.  
  16.  
Título: Re: Mini PDA
Publicado por: RICHI777 en 03 de Septiembre de 2012, 18:55:18
Felicitaciones !!! y gracias por publicar la info.

Saludos !
Título: Re: Mini PDA
Publicado por: neodo1 en 04 de Septiembre de 2012, 05:21:49
Creo que me costaron 10 placas 34€ con gastos de envío incluidos

¿En que sitio?

Gracias.
Título: Re: Mini PDA
Publicado por: jgpeiro06 en 04 de Septiembre de 2012, 12:34:44
Citar
¿En que sitio?
Lo encontré por ebay...
http://www.ebay.com/itm/1-2-Layers-PCB-Production-Manufacturing-Prototype-Printed-Circuit-Board-10x10CM-/190712308503?pt=LH_DefaultDomain_0&hash=item2c6756e317 (http://www.ebay.com/itm/1-2-Layers-PCB-Production-Manufacturing-Prototype-Printed-Circuit-Board-10x10CM-/190712308503?pt=LH_DefaultDomain_0&hash=item2c6756e317)
Título: Re: Mini PDA
Publicado por: delmaformacion en 06 de Septiembre de 2012, 07:37:33
Tu proyecto es alucinante...

¿Que resolución gráfica tiene?

¿Se le podria conectar un monitor vga? ¿conoces alguna libreria que lo pueda hacer?

Gracias por tus respuestas y Enhorabuena por tu proyecto

Título: Re: Mini PDA
Publicado por: 100tifico en 06 de Septiembre de 2012, 11:51:10
Hola mi muy estimado jgpeiro06, aprovecho para extenderte mis más amplias felicitaciones por tan creativa aplicación y por tan entuciasta labor, ya que tu reflejas el verdadero espiritu del diseñador multi tecnológico que todos los que seguimos este foro llevamos dentro, ya que este foro no es solo de PIC's ó de otros Micros...Sino de todo lo que con ellos se puede lograr a materializar.

Tambien quiero aprovechar para preguntarte sobre el donde es que podemos, ya sea descargar o conseguir información sobre las librerias FatFas que comentas y sobre todo acerca de la Gwen libreria grafica, ya que busco detalles sobre esta, y lo único que encuentro son fotos y chismes de una rubia cantante con este mismo nombre...de antemano gracias por la creatividad que te motiva para hacer tan completos trabajos..! ((:-))
Título: Re: Mini PDA
Publicado por: jgpeiro06 en 06 de Septiembre de 2012, 16:07:01
Citar
¿Que resolución gráfica tiene?
¿Se le podria conectar un monitor vga? ¿conoces alguna libreria que lo pueda hacer?
La resolución es 320x240. El LCD va conectado mediante un bus llamado "16-bit 8080 interface", que es compatible con el periférico FSMC del uC. No es compatible con un monitor VGA, pero supongo que siempre se puede hacer un convertidor...


Citar
donde es que podemos, ya sea descargar o conseguir información sobre las librerias FatFas que comentas y sobre todo acerca de la Gwen libreria grafica
Las librerías Gwen están "a salvo de cantantes rubias" en google code:
http://code.google.com/p/gwen/ (http://code.google.com/p/gwen/)
Las librerías FatFs se encuentran aquí:
http://elm-chan.org/fsw/ff/00index_e.html (http://elm-chan.org/fsw/ff/00index_e.html)
Título: Re: Mini PDA
Publicado por: CompSystems en 03 de Octubre de 2012, 14:08:58
jgpeiro06, podrías por favor hacer un intento de portar mathomatic a tu miniPDA, es posible?, el código fuente de este CAS esta escrito en lenguaje C http://www.mathomatic.org/math/screenshots.html

(http://www.mathomatic.org/math/png/mathomatic_windows.png)

tal ves algún día se pueda convertir tu proyecto en una calculadora super avanzada

(http://personal.mezasociados.com/calculators/cas/images/uberGraphCalculatorPrototype02.png)

Título: Re: Mini PDA
Publicado por: jgpeiro06 en 23 de Febrero de 2013, 08:44:31
se han "roto" los links. Si alquien quiere ver las imagenes puede visitar mi perfil jgpeiro84 en flickr.