Go Down

Topic: Librería gameduino 2 modificada para pantallas FT81X  (Read 49963 times) previous topic - next topic

lightcalamar

Es un problema de las fuentes usadas por Python con el modulo PIL en Windows. En Linux no da este problema.
Este es el código usado.
Code: [Select]

def load_ttf(self, name, ttfname, size, format):
        font = ImageFont.truetype(ttfname, size)
        sizes = [font.getsize(chr(c)) for c in range(32, 128)]
        fw = max([w for (w, _) in sizes])
        fh = max([h for (_, h) in sizes])
        # print fw, fh
        alle = {}

He encontrado esta posible solución modificando el modulo PIL, http://stackoverflow.com/questions/24085996/how-i-can-load-a-font-file-with-pil-imagefont-truetype-without-specifying-the-ab

y el repositorio: https://github.com/python-pillow/Pillow/pull/682
Le echaré un vistazo a ver que se puede hacer.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

#181
May 18, 2017, 11:55 am Last Edit: May 18, 2017, 12:26 pm by TFTLCDCyg
Jejeje tenías razón... he estado algo ocupado con GD3ASSET y tratando de arreglar la PC, que en días pasados se fastidió la fuente y se llevó consigo el disco del sistema operativo y otro más de respaldo... estoy tratando de recuperar lo mas posible.

FT81X: MSGEQ7 Rolling Graph

Dejo un ejemplo para dibujar gráficas lineales, el cual he podido rescatar de entre los escombros de la anterior PC...

Traza en forma de linea continua, 7 bases de datos; en el ejemplo almacenan 145 datos cada una.
En este arreglo especifico, el máximo posible es de 185 datos, mas allá de este valor el FT813 colapsa debido a que supera el limite de instrucciones que puede presentar en pantalla.

Al reducir el número de bases de datos, la capacidad de almacenamiento se va incrementando, alcanzando hasta 780 datos en el caso de presentar una base.

Este ejercicio, permite ver la capacidad de procesamiento gráfico que tiene el chip FT81X. Hay algo de complicidad con el MCU, por lo que el orden de velocidad quedaría (mayor a menor) T36-Due-MEGA; el UNO que da fuera por el tema de la memoria.



Software:
IDE 181, teensy loader 1.35 beta 2, librería GD23L

Hardware:
Pantalla: Riverdi FT813 5"
MCU: Teensy 3.6@240 MHz  
Otros: Riverdi breakout 20, Quad MSGEQ7
Fuente de audio: placa de audio de la PC



Link del sketch

PD: alguna vez alguien me dijo que este tipo de gráficas solo eran viables en STM32...  estas pantallas aun tienen sorpresas bajo la chistera... solo falta que salten conejos!

lightcalamar

#182
May 20, 2017, 07:48 pm Last Edit: May 20, 2017, 07:55 pm by lightcalamar
Wow!! que bien esto me da ideas ...

Ahora soy yo el que está atascado. He usado tu ejemplo del GD3_MSGEQ7_Spectrum_analyzer y va bien, pero un problema.

Asi es como me queda una vez modificado;



Para ello he usado los 15 handles de las 15 imagenes y lo que quiero es ponerlas todas en un fichero concretamente lo adjunto ya preparado, sin embargo en la parte del código donde se representa es;
Code: [Select]

 
  GD.Vertex2ii(XbaseD+Xdelta*0, 215, map(left[0],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*2, 215, map(left[1],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*4, 215, map(left[2],0,1024,0,15));   
  GD.Vertex2ii(XbaseD+Xdelta*6, 215, map(left[3],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*8, 215, map(left[4],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*10, 215, map(left[5],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*12, 215, map(left[6],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*14, 215, map(R[0],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*16, 215, map(R[1],0,1024,0,15)); 
 
 
  GD.SaveContext();
   GD.VertexTranslateX(16*260);
   GD.Vertex2ii(440-165, 215, map(R[2],0,1024,0,15));     
   GD.Vertex2ii(440-110, 215, map(R[3],0,1024,0,15));   
   GD.Vertex2ii(440-55, 215, map(R[4],0,1024,0,15));
   GD.Vertex2ii(500-60, 215, map(R[5],0,1024,0,15));   
   GD.Vertex2ii(500, 215, map(R[6],0,1024,0,15));   
  GD.RestoreContext();


en donde pone  GD.Vertex2ii(440-165, 215, map(R[2],0,1024,0,15 en negrilla significa las imágenes, sin embargo yo las tengo por celdas.

Realice la conversión con;
Code: [Select]

gd2asset -f barras2.gd2 -o barras2.h sp0.png,format=ARGB4 sp1.png,format=ARGB4 sp2.png,format=ARGB4 sp3.png,format=ARGB4 sp4.png,format=ARGB4 sp5.png,format=ARGB4 sp6.png,format=ARGB4 sp7.png,format=ARGB4 sp8.png,format=ARGB4 sp9.png,format=ARGB4 sp10.png,format=ARGB4 sp11.png,format=ARGB4 sp12.png,format=ARGB4 sp13.png,format=ARGB4 sp14.png,format=ARGB4
para las 15, de este modo no puedo poner mas assets. He realizado un nuevo fichero donde es un asset solo con las 15 imágenes en un solo fichero que adjunto, su peso en RAM es de 230kb y claro quiero todos esos 750kb que me sobran.

Adjunto el código que estoy usando y las imágenes en una sola.

Crees TFTLCDCyg se podria hacer como digo?
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

#183
May 21, 2017, 05:54 am Last Edit: May 21, 2017, 05:55 am by TFTLCDCyg
Suena interesante, pero tenemos una frontera en el formato base del dibujo: hay un límite vertical y horizontal en pixeles que no podemos superar con la herramienta gdxasset.exe.

En este mensaje James lo explica, tal parece que la herramienta para phyton lo puede hacer. No solo dividir de forma vertical, sino que también se puede de forma horizontal.

No debemos dejar de lado aquellas 2048 instrucciones por pantalla del motor EVE/EVE2.

El ejemplo de 2000 sprites de la librería de James, muestra como deben "empaquetarse" las imágenes para el caso de que deseemos presentarlas todas de una vez, pero en esos extremos la velocidad del MCU se torna relevante y las dimensiones de las imágenes también.

Debe existir una forma de "mapear" una imagen de 800x480 (o de 480x272) de tal forma que la carguemos en pantalla una vez, y podamos solo usar fragmentos de la misma. Este aspecto lo he tocado varias veces pero, por falta de tiempo lo he explorado a fondo. No prometo nada, pero puede ser una buena solución gráfica.

Se me ocurre que podamos simplificar todas esas barras en tan solo "6 minibarras": "tres apagadas" y "tres iluminadas", pero no sé si todos los MCU logren soportar la carga de proceso.

Veamos lo que dice el cook-book del FT813 (FT81X_Series_Programmer_Guide)

Code: [Select]
"...The graphics engine has no frame buffer: it uses dynamic compositing to build up each display line during scan out. Because of this, there is a finite amount of time available to draw each line. This time depends on the scan out parameters (decided by REG_PCLK and REG_HCYCLE) but is never less than 2048 internal clock cycles. FT81X's internal clock runs at 60MHz.
Some performance limits:
 The display list length must be less than 2048 instructions, because the graphics engine fetches display list commands one per clock.
 The usual performance of rending pixels is 16 pixels per clock
 For some bitmap formats, the drawing rate is 8 pixels per clock. These are TEXT8X8, TEXTVGA and PALETTED4444/565.
 For bilinear filtered pixels, the drawing rate is reduced to ¼ pixel per clock..."

TFTLCDCyg

#184
May 21, 2017, 08:51 am Last Edit: May 21, 2017, 08:53 am by TFTLCDCyg
La librería gameduino 2 prioriza placas como la UNO.

Basados en este principio, opté por darle un enfoque diferente a las celdas, ¿por qué llevar a límite al FTXX?, es mejor mantenerlo relajado. Sabemos que gd3asset puede con eso y por lo visto bastante más.

No sé como se comporte el siguiente código en placas AVR, pero en el Teensy 3.6 va muy fluido. Espero te ayude con el proyecto, está diseñado para FT81X. La celda se reduce a 6 dots de 32x18 pixeles. El archivo de imagen no es necesario cargarlo en la SD, pesa apenas 2.55 Kb.

GD23L Analizador MSGEQ7

lightcalamar

#185
May 24, 2017, 10:03 am Last Edit: May 25, 2017, 12:01 am by lightcalamar
Ayer por fin, casi he terminado de realizar a toda pantalla FT811 con Arduino MEGA, la representación del Spectrum Audio con 225 led´s ...  (código adaptado del ejemplo de TFTLCDCyg, obviamente) y la verdad toda una elegancia.

Nunca me imagine tanta belleza con este ejemplo a estas pantallas.

Aquí el video

También se muestra una gráfica tipo "osciloscopio" donde el pobre Arduino MEGA, por su baja velocidad no alcanza mas, ahora toca probar en Teensy!

Nota muy importante. Cuando realice mi proyecto RadioFM, use 4 MGSEQ7, en este caso solamente 1, sin embargo con otro MSGEQ7 se pueden usar las 14 bandas de audio para diferentes frecuencias, por defecto en la datasheet del integrado se usa un condensador de 33pF, si el segundo MGSEQ7, doblamos esta capacidad es decir 66pF el espectro de frecuencias varía intermediamente donde tendremos desde los 40Hz a 16KHz con 14 filtros. Lo pondré en practica en otros video.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

#186
May 25, 2017, 12:20 am Last Edit: May 25, 2017, 07:15 am by TFTLCDCyg
Aplicando algo de trigonometría para dibujar alguno que otro arco...

Velocímetro

Video: Gauge para FT813



lightcalamar

Este es el código de las 14 bandas con 2 chip MGSEQ7

Code: [Select]

  GD.Vertex2ii(XbaseD+Xdelta*0, 215,  map(left[0],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*2, 215,     map(R[0],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*4, 215,  map(left[1],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*6, 215,     map(R[1],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*8, 215,  map(left[2],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*10, 215,    map(R[2],0,1024,0,15));   
  GD.Vertex2ii(XbaseD+Xdelta*12, 215,  map(left[3],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*14, 215,    map(R[3],0,1024,0,15));
  GD.Vertex2ii(XbaseD+Xdelta*16, 215,  map(left[4],0,1024,0,15));

GD.SaveContext();
   GD.VertexTranslateX(16*260);
   GD.Vertex2ii(440-165, 215,        map(R[4],0,1024,0,15));   
   GD.Vertex2ii(440-110, 215, map(left[5],0,1024,0,15));
   GD.Vertex2ii(440-55, 215,         map(R[5],0,1024,0,15));
   GD.Vertex2ii(500-60, 215, map(left[6],0,1024,0,15));
   GD.Vertex2ii(500, 215,            map(R[6],0,1024,0,15));
GD.RestoreContext();


El espectro de frecuencias van desde 40Hz a los 16KHz, centradas en la pantalla.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

lightcalamar

#189
May 29, 2017, 10:13 am Last Edit: May 29, 2017, 12:06 pm by lightcalamar
Estube estudiando este fin de semana las interupciones del chip FT81xQ que usan las pantallas y no es algo nuevo pero si muy llamativo.

Parte INTERUPCIONES

Entonrtré que existen tres modos;

1.- Stand-By
2.- Sleep
3.- PowerDown

La opción 3, es realizando un POR (Power On Reset) y luego se trataría de averiguar como posicionar la 1 y 2 para realizar un Stand-by y Sleep del mismo.

Desde EVE, hay un bloque tiene un generador de Interupciones, donde las señales que controlan son; PD_N, CS_N y INT_N. esta ultima es de salida hacia el MCU. Concretamente en la pagina 20 del manual del enlace (abajo del todo), existen unos registros que no ví por ningún lado en la libraría GDx, donde se podría realizar alguna que otra función.

Este pin llamado INT_N, es muy interesante.

Ya puestos inclusive lei que se puede variar la resolución del chip a voluntad propia y creo esto si puede ser muy interesante. Por ejemplo pasar de 800x480 a 480x272 ... jugando con los registros HSYNC y VSYNC donde se realizaria un POR sin que el MCU "sufriera" alteraciones alguno.

Parte AUDIO

A todo esto existen dos registros sobre el audio del chip; REG_VOL_PB y REG_VOL_SOUND, estos tienen en la librería su registros pero, no tienen una función determinada, caso del primer registro sería tener el control del mismo de la salida PWM_AUDIO de la pantalla.


Parte BACKLIGHT

Esta ya la conocemos y su uso es muy extendido realizando un REG_PWM_DUTY, desde 0-128 el minimo y maximo de señal para la retroiluminación de los led´s de la pantalla. Sin embargo existe un registro llamado; REG_PWM_HZ, donde el rango de frecuencia que le podamos enviar estan comprendidos entre 250-10000Hz y puede llegar el caso de ser factible para ahorrar dolores de cabeza si algún dispositivo del MCU tiene problemas con la frecuencia emitidas (he tenido reciente un caso con un receptor RF433, donde su frecuencia intermodulaba a la del REG_PWM_DUTY), y consiguientemente realizaba lecturas erroneas.

He aquí otra información mas. Creo llegaré a realizar alguna función extra e imcorporarla a la librería GDx

Este es el enlace de la documentación
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

Interesante recopilación.

La que tiene mejores prestaciones es la que permite controlar la intensidad de la retroiluminación; incluso permite "apagar" los leds para ahorrar algo de energía.

Menu-slider

El aspecto mas relevante de los controladores FT8XX, es la simplicidad con la que se vincula la pantalla táctil al uso del TFT con tan solo una librería, ya sea la original de FTDI o GDX.

La posibilidad de desplazar objetos en toda la pantalla, podría conseguirse manipulando la coordenada de origen o aquella que deseemos usar como centro de desplazamiento (X,Y) del objeto.

La aproximación mas simple puede conseguirse manipulando dos instrucciones: GD.cmd_slider y GD.cmd_track. Se usan en combinación. El resultado es un botón deslizante que puede ser monitoreado usando una sola entrada táctil.

Por default, el arreglo produce un slider horizontal; el slider vertical, puede obtenerse manipulando las componentes: espesor y longitud.

PP: lo dejo aquí, resuelvo algunos asuntos del trabajo. Sigue ejemplo de uso

lightcalamar

Hace unos meses observé este video no tiene despecdicio alguno ...

Me llamo muy mucho el menu de iconos con mutiples paginas !
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

#192
Jun 21, 2017, 09:06 am Last Edit: Jun 21, 2017, 09:10 am by TFTLCDCyg
GDX para STM32F103X

A pesar de estar liado con el trabajo y aun con detalles de la mudanza, he podido encontrar un rato para seguir con los experimentos con la plaquita STM32F103ZET6 de HotMCU.

Este es el avance de la modificación de la librería GDX, aun está en proceso de optimización, pero ya compila con ayuda de las herramientas de stm32duino

GDX para STM32F103X

Las pruebas las estoy haciendo en el IDE 1.8.1. Diseñé algunos ejemplos con los que creo se puede partir para proyectos mas complejos.

La parte táctil tiene algunas fallas aleatorias en la calibración, pero con paciencia y usando el reset de la placa, es posible conseguir calibrar correctamente.

Las lineas SPI (MOSI, MISO, SCK) las soldé directamente al cabezal SPI que tiene la placa. El pin CS corresponde al pin PC5, el pin PC4 lo usaré para el chip select del lector SD.

Para la carga de imagenes estoy usando el Editor EVE versión 1.17, por el momento no he instalado un lector externo SD. Mas adelante me daré a la tarea de instalar uno, para seguir con las pruebas.

La corriente que demanda la pantalla debe suplirse usando el conector usb y el propio ST-Link V2, por lo que necesitamos 2 puertos usb libres.

lightcalamar

#193
Jun 23, 2017, 09:27 am Last Edit: Jun 23, 2017, 09:34 am by lightcalamar
Buenas.

Con la librería del mensaje anterior y con 2 tardes de trabajo he podido hacer funcionar mi pantalla de HotMCU con esta plaquita diminuta de ST, concretamente la : STM32F103C8T6



De momento las pruebas realizadas han sido para la FT800.

Buscando en Google no encontraran nada, tan solo unos códigos para la placa Discovery de ST con IDE Keil, y los que llevamos algún tiempo con Arduino nos hecha atras (personalmente yo mismo)

Sinceramente y poniendome serio, me estoy preguntando, donde estará el fin de las modificaciones de esta grandisima libreria? creo no hallar respuesta.

Esta placa de ST, tiene un procesador ARM de 72 MHz de reloj, con 20Kb de RAM y 64Kb de flash para nuestros códigos. A todo esto, he de comentar que posee dos BUS SPI, el primero trabaja con logica de 3,3 voltios, y el SPI_2, tolerante con 5 Voltios, pues bien las pantallas de HotMCU, su salida es tolerante a 5 voltios, es decir que se pueden usar en MCU, tal como Arduino UNO, Nano o MEGA, pero lo que aprendí ayer, estas pantallas trabajan con lógica de 3,3.

Ampliaré esta documentación en el hilo que cree especificamente dedicado a estas.

Volviendo atras, todavía queda por realizar de poner el lector microSD a estas placas.

Sea como sea, por 2$ de esta MCU + 28$ de una pantalla FT800, se tiene todo un arsenal de hardware donde el juego esta asegurado, quien puede dar mas?

Pondré unas capturas y video en breve, donde podran ver en acción esta novedad, y sin olvidarme del enorme trabajo realizado por @TFTLCDCyg
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

lightcalamar

#194
Jun 23, 2017, 11:00 pm Last Edit: Jun 23, 2017, 11:01 pm by lightcalamar
Aquí 2 nuevos videos de esta pequeña placa con pantallas FT8xx.

FT800 (480x272px)

FT810 (800x480px)
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

Go Up