Librería gameduino 2 modificada para pantallas FT81X

Sketch ajustado para la librería GD3 normal.

//#include <EEPROM.h>
#include <SPI.h>
#include <GD3.h>

char GrupoJPG01[16][15]={"c100.jpg", "cope.jpg", "catin.jpg","europa.jpg","los40.jpg","m80.jpg","maxfm.jpg","melofm.jpg","ondac.jpg","rac1.jpg","radio5.jpg","rmarca.jpg","rne1.jpg","rockfm.jpg","rt.jpg","ser.jpg"};  //64x64
int IDJPG0, IDJPG1;

long previousMillis0=0, interval0=0;
unsigned long start, Test;

void setup()
{
  GD.begin();
  CargaGrupoJPG01(IDJPG0, IDJPG1);
  MP();
}
void loop(){}

float Conteo;

void MP()
{
  while(1){
  GD.Clear();
  //GD.wr(REG_PWM_DUTY, 15); 
  GD.Begin(BITMAPS);

  GD.Vertex2ii(0, 0, 0); //image 1
  GD.Vertex2ii(100, 100, 1); //image 2

 unsigned long currentMillis0 = millis();        
  if(currentMillis0 - previousMillis0 >= interval0)
  {
    previousMillis0 = currentMillis0;
       CargaGrupoJPG01(IDJPG0,IDJPG1);
       IDJPG1++;
       if(IDJPG1>=16){IDJPG1=0;}
  }
  
  GD.cmd_number(100, 250, 28, OPT_SIGNED|OPT_CENTER, Conteo);
  Conteo++;  
  GD.swap(); 
  }
}

void CargaGrupoJPG01(int ID0, int ID1)
{
  start = millis(); 

  // load image 1
  GD.BitmapHandle(0);
  GD.cmd_loadimage(0, 0);
  GD.load("Fn1.jpg");

  // load image 2
  GD.BitmapHandle(1);
  GD.cmd_loadimage(-1, 0);
  GD.load(GrupoJPG01[ID1]);

  Test = millis() - start;
}

Ajustes:

  • Incluir las instrucciones de inicio para las pantallas de HotMCU.
  • La imagen FN1.jpg es de 800x480 px, sustituye la adecuada para la resolución de 480x272

Estuve revisando el código generado por el editor EVE para el manejo de slots de memoria en FT8XX. Para cargar dos imágenes jpg de 64x64 px, ésta es la secuencia:

#include <SPI.h>
#include <GD3.h>

#define RAM_L00 0

static const PROGMEM prog_uchar L00[] = {
 #include "L00.h"
};

#define RAM_L01 8192

static const PROGMEM prog_uchar L01[] = {
 #include "L01.h"
};

void setup()
{
 GD.begin();
 GD.cmd_inflate(RAM_L00);
 GD.copy(L00, sizeof(L00));
 GD.cmd_inflate(RAM_L01);
 GD.copy(L01, sizeof(L01));
 GD.BitmapHandle(0);
 GD.BitmapSource(0);
 GD.BitmapLayout(ARGB1555, 128, 64);
 GD.BitmapSize(NEAREST, BORDER, BORDER, 64, 64);
 GD.BitmapHandle(1);
 GD.BitmapSource(8192);
 GD.BitmapLayout(ARGB1555, 128, 64);
 GD.BitmapSize(NEAREST, BORDER, BORDER, 64, 64);
}

void loop()
{
 GD.Clear(1, 1, 1);
 GD.Begin(BITMAPS);
 GD.Vertex2ii(79, 70, 0, 0);
 GD.End();
 GD.Begin(BITMAPS);
 GD.Vertex2ii(250, 146, 1, 0);
 GD.End();
 
 GD.swap();
}

/* end of file */

El editor EVE exporta las imágenes para que se puedan cargar sin usar un lector externo, tomando como base la librería base del gameduino 2 (GD2, FT80X); cabe destacar que podemos usar el código resultante en las librerías para FT81X: GD3 o GD3_SDIO.

Para que el sketch previo funcione hay que incluir en su carpeta los archivos exportados L00.h y L01.h.

El código equivalente para cargar las imágenes desde el lector SD es:

#include <SPI.h>
#include <GD3.h>

void setup() {
  GD.begin();

  //imagen 1
  GD.BitmapHandle(0);
  GD.cmd_loadimage(0, 0);
  GD.load("L00.jpg");

  //imagen 2
  GD.BitmapHandle(1);
  GD.cmd_loadimage(-1, 0);
  GD.load("L01.jpg");  
}

void loop() {
  GD.Clear();
  GD.Begin(BITMAPS);
    GD.Vertex2ii(0, 0, 0);      //imagen 1
    GD.Vertex2ii(100, 100, 1);  //imagen 2
  GD.swap();
}

L00.h (13.8 KB)

L01.h (18.9 KB)

Dado que en el @equipo_FT81X, hemos versado mucho en el tema del manejo del lector SDIO incluido en el Teensy 3.X, opté por ampliar provisionalmente una linea paralela de ejemplos enfocados a Teensy 3.X.

Gracias RndMnkIII por todo el soporte que nos has brindado con el tema del Teensy.

Debo confesar que me faltan horas de estudio para el manejo de las prestaciones de SDIO del teensy 3.6; que se han incorporado a GD3; es por ello que incluí en la familia a GD3_SDIO, con la idea de agregar poco a poco ejemplos particulares para estas excelentes placas.

Mas adelante ya que tengamos una buena compilación de ejemplos, creo que será factible unificar ambas lineas de experimentación.

Versión mas reciente

9 de Febrero 2017: adición de la libreria GD3_SDIO enfocada al uso del lector SDIO del Teensy 3.X

  • Adición de un logo de alerta en la pantalla de error (sin que se tenga instalado un lector SD)

Se incluyen nuevamente las librerías gameduino 2 y GD2, ajustadas para el shield-Arduino de RIverdi.

PD: es posible que existan errores en los ejemplos incluidos, he estado muy ocupado con el trabajo, en cuanto disponga de un tiempo libre razonable, daré una revisión a los ejemplos: paciencia.

Gracias por la información TFTLCDCyg

Tube problemas a la hora de compilar tu ejemplo dos imagenes JPG en array y encontré la solución
El problema es al exportar el script del editor FTDI EVE en la librería GD2, el IDE de Arduino 1.0.5 o superior no usa el termino;

static const PROGMEM prog_uchar

Sino este;

const unsigned char

Por lo tanto el código resultante es este adaptado a mi pantalla de HotMCU;

/*
 *  MODIFICADO POR lightcalamar
 *  Dia 09-02-2017
 *  
 *  
*/  

#include <EEPROM.h>
#include <SPI.h>
#include <GD2.h>

#define PDNPin 8

#define RAM_L00 0
const unsigned char  L00[] PROGMEM  = {
#include "L00.h"
};

#define RAM_L01 8192

const unsigned char  L01[] PROGMEM = {
#include "L01.h" 
};

void setup()
{
    pinMode(PDNPin, OUTPUT);       // CONTROL P.O.R. Power On Reset
    digitalWrite(PDNPin, HIGH);    // Pantalla FT800 comparada
    delay(20);                     // en http://HotMCU.com
    digitalWrite(PDNPin, LOW);     //           |
    delay(20);                     //           |
    digitalWrite(PDNPin, HIGH);    //           |
    delay(20); 
    //           |
 GD.begin();
 GD.cmd_inflate(RAM_L00);
 GD.copy(L00, sizeof(L00));
 GD.cmd_inflate(RAM_L01);
 GD.copy(L01, sizeof(L01));
 GD.BitmapHandle(0);
 GD.BitmapSource(0);
 GD.BitmapLayout(ARGB1555, 128, 64);
 GD.BitmapSize(NEAREST, BORDER, BORDER, 64, 64);
 GD.BitmapHandle(1);
 GD.BitmapSource(8192);
 GD.BitmapLayout(ARGB1555, 128, 64);
 GD.BitmapSize(NEAREST, BORDER, BORDER, 64, 64);
}

void loop()
{
 GD.Clear(1, 1, 1);
 GD.Begin(BITMAPS);
 GD.Vertex2ii(79, 70, 0, 0);
 GD.End();
 GD.Begin(BITMAPS);
 GD.Vertex2ii(250, 146, 1, 0);
 GD.End();
 
 GD.swap();
}

A todo esto, adjunto el código completo y por cierto en este mismo foro, le posó tambien a un usuario este enlace :slight_smile:

Me interesa muchisimo esta forma de representar varias imagenes sin usar el lector microSD para mi proyecto MDC v1.0
Voy a tratar de modificar el script ditado para cuando exporte no de problemas. Luego lo adjuntaré por si alguno le hace falta.

GD_2_JPGS.zip (13.7 KB)

Solucionado el script de Python modificado por mi donde ya se exporta correctamente el array de las imagenes.

En la carpeta donde se instaló el FTDI EVE Editor, se tiene que borrar el fichero llamado; Export GameDuino2 Project.pyc y sobreescribir el fichero que adjunto.

EDITO

Este "parche" es solo para la version del Editor FTDI EVE Screen Editor v 1.17 . Si TFTLCDCyc lo desea compartir, porque el fue quien me paso el mismo. No se si esta en la pagina ofical, de lo contrario que mi amigo determine el mismo si lo comparte.

Export GameDuino2 Project.zip (3.25 KB)

Gracias amigo. He estado liado todo el día por el trabajo.

Aquí la liga de descarga del editor EVE V1.17

Vendrá bien esa corrección para quien tenga ese detalle con la definición. Pensé que había guardado el proyecto EVE con dos logos, pero al parecer no lo hice, solo extraje los archivos h y copié el código directamente en el IDE de arduino y allí guardé el ejemplo. Sin embargo te dejo un proyecto con tres imágenes, semejante al del ejemplo, sin usar el lector SD.

Proyecto tres logos sin lector SD

PD: ¿por cierto esa falla se presenta en el ejemplo del pantallazo de error con logo de la última versión de GD3?

TFTLCDCyg:
PD: ¿por cierto esa falla se presenta en el ejemplo del pantallazo de error con logo de la última versión de GD3?

No. Porque el error da al compilar el código y no lo sube a la placa.

Con el editor EVE me he dado cuenta y se confirma despues de algunas pruebas realizadas, al menos por mi e inclusive en un mensaje anterior mio de este hilo puse que se podría poner muchas imagenes. Es una realidad. Me explico.

Si tenemos una imagen en una posición GD.Vertex2ii(416, 206); siempre que usemosla misma posición podremos poner cientos de ellas, nunca se veran juntas si no cuando lo deseemos, Ahora de esta forma incluso se podrá hacer una pequeña animación...

Es mas sencillo usar la carga de una imagen directamente desde la microSD, sin embargo es tambien muy interesante dependiendo de nuestro proyecto y codigo usar la flash de la MCU para almacenar iconos pequeños en esta ultima. Si usamos el modelo Arduino MEGA opviamente en adelante. No recomiendo para nada modelo UNO el cual ya lo he descartado totalmente para estas pantallas.

13 febrero 207: Actualización GDX_V5.1

Estas semanas han sido alucinantes con el tema del teensy 3.6 y su lector SDIO.

Además, la herramienta FTDI EVE screen editor (en su versión 1.17) ha resultado de gran ayuda para generar imágenes que podemos usar dentro de la librería sin hacer uso de un lector SD.

Este aspecto abre muchas posibilidades para quienes no se deseen aventurar con la instalación de un lector externo en sus arreglos, reduciendo cableado y "fallas inoportunas" causadas por un hilo defectuoso, un shield difícil de encontrar o bien una memoria SD dañada.

Claramente estamos limitados a placas que se pueden programar con el IDE de arduino que cuenten con el suficiente espacio de memoria de programación. Como ha señalado ligthcalamar, las placas como el UNO, NANO, MINI se van a quedar cortas de espacio de programación.

Definitivamente para diseños con espacios muy reducidos, sugiero usar MCU como la teensy 3.5 o la 3.6, ya que estamos en posibilidad de extraer todo el potencial de las pantallas FT8XX y disponemos de un extra: el lector SDIO que tienen estas placas.

Las adiciones en la versión consisten en:

  • La inserción de imágenes en las pantallas de error y de calibración de la pantalla táctil, sin hacer uso de un lector SD. Estas mejoras se han incorporado a las librerías base gameduino2 y GD2, así como en GD3 y la versión especializada para placas teensy 3.5/3.6: GD3_SDIO.

Aviso de error en la librería Gameduino2:

Aviso de calibración en GD2:

  • Reorganización de ejemplos e inserción de nuevos (trabajo en proceso...).

  • La librería gameduino2 llama a las cabeceras como GMD2, en lugar de GD2, con esto podemos usar ambas librerías sin que interfieran entre sí en el IDE de arduino.

  • En las librerías GD3 y GD3_SDIO, los avisos de error y de calibración se ajustan a la rotación base de trabajo seleccionada en el archivo .ccp correspondiente.

Aviso de calibración en GD3/GD3_SDIO (rotación 0):

Aviso de error en GD3/GD3_SDIO (rotación 2):

  • Inclusión de una instrucción que permite ajustar manualmente en GD3_SDIO.ccp, la frecuencia de trabajo SPI, dependiendo de la longitud del cable plano usado como interface para la pantalla (LFFC):
#if (LFFC==15)
SPISettings settingsT36(26000000, MSBFIRST, SPI_MODE0); 
#endif

#if (LFFC==5)
SPISettings settingsT36(30000000, MSBFIRST, SPI_MODE0); 
#endif

En los experimentos realizados por RndMnkIII él optó por usar un cable plano de 5 cm de largo, armando un sistema que puede funcionar al tope de velocidad (FT813 de 7" con un teensy 3.6). El cable que acompaña al shield de Riverdi o a las pantallas FT8XX de Riverdi, es de 15 cms, alcanzando un 86.6% de la tasa de transferencia SPI.

Como hemos visto, la longitud del cableado afecta la señales SPI, a menor longitud, mayores frecuencias podrán emplearse para comunicar al MCU con la pantalla. Hay que vigilar este aspecto siempre para descartar fallas aleatorias.

Encontre un nuevo bug en el script de EVE Editor v1.17 cuando se realiza una sentencia BITMAP_LAYOUT
El resultado es este código incorrecto:

void WriteMemfromflash(uint32_t Addr, const prog_uchar *Src,uint32_t NBytes)
{
	GD.cmd_memwrite(Addr,NBytes);
	GD.copy(Src, NBytes);
}

Donde tendría que poner ;

void WriteMemfromflash(uint32_t Addr, const unsigned char *Src,uint32_t NBytes)
{
	GD.cmd_memwrite(Addr,NBytes);
	GD.copy(Src, NBytes);
}

El usar el GD.BITMAP_LAYOUT no es otra que se puede desde una imagen, inclusive en array tomar "celdas" de diferentes imagenes dentro de una misma.
Aqui adjuntado el nuevo Script para Python del EVE Editor.
Saludos.

Export GameDuino2 Project.py.zip (3.3 KB)

Carga de 20 iconos de 64x64 px

Tenemos una límitante con el número de imágenes que podemos manejar de forma simultánea en la memoria de los chips FT8XX, podemos usar varias técnicas para superar esta condición, pero en ocasiones tendremos mas de 16 imágenes con las que desearíamos contar, sin tener que cargar nuevos grupos en cada ocasión.

Adicionalmente lo podemos conseguir sin usar el lector SD.

Partiendo de la respuesta que nos compartió James en el foro del gameduino 2, en la que indica como cargar los assets luego de procesarlos con la herramienta gd2asset.exe

#include <EEPROM.h>
#include <SPI.h>
#include <GD2.h>

#include "logo.h"

void setup()
{
  GD.begin();
  LOAD_ASSETS();
  GD.BitmapLayout(ARGB4, 2 * 64, 64); // override the bitmap layout
}

void loop()
{
  GD.cmd_gradient(0, 0, 0x103010, 480, 480, 0x101030);
  GD.Begin(BITMAPS);
  GD.Vertex2ii(100, 100, 0, 0);
  GD.Vertex2ii(200, 100, 0, 1);
  GD.swap();
}

La usé como punto de partida para extender su aplicación de 2 a 20 iconos de 64x64. Los pasos a seguir son:

1 Crear un archivo base con las imágenes en arreglo vertical. Los iconos que vamos a anexar son de 64x64 px, por lo que el ancho de la imagen base debe ser de 64 px. La altura es un múltiplo de 64, dependiendo del numero de iconos a insertar en la fila.

En el experimento logré insertar 20 iconos, dando una altura de 20 x 64 = 1280 px. El archivo lo llamé I20.jpg

2 Crear el archivo con extensión .h con ayuda de la herramienta gd2asset.exe, desde la linea de comandos (CMD.exe), en el ejemplo lo llamé icx.h

La linea de creación es esta:

gd2asset -o icx.h I20.jpg,format=ARGB4

3 Copiar el archivo .h en la carpeta del sketch.

4 Este es el ejemplo terminado:

#include <SPI.h>
#include <GD3_SDIO.h>

#include "icx.h"

void setup()
{
  GD.begin();
  LOAD_ASSETS();
  GD.BitmapLayout(ARGB4, 2 * 64, 64); // override the bitmap layout
}

void loop()
{
  GD.cmd_gradient(0, 0, 0x103010, 480, 480, 0x101030);
  GD.Begin(BITMAPS);

  GD.Vertex2ii(25, 25, 0, 0);
  GD.Vertex2ii(125, 25, 0, 1);
  GD.Vertex2ii(225, 25, 0, 2);
  GD.Vertex2ii(325, 25, 0, 3);
  GD.Vertex2ii(25, 125, 0, 4);
  GD.Vertex2ii(125, 125, 0, 5);
  GD.Vertex2ii(225, 125, 0, 6);
  GD.Vertex2ii(325, 125, 0, 7);
  GD.Vertex2ii(25, 225, 0, 8);
  GD.Vertex2ii(125, 225, 0, 9);
  GD.Vertex2ii(225, 225, 0, 10);
  GD.Vertex2ii(325, 225, 0, 11);
  GD.Vertex2ii(25, 325, 0, 12);
  GD.Vertex2ii(125, 325, 0, 13);
  GD.Vertex2ii(225, 325, 0, 14);
  GD.Vertex2ii(325, 325, 0, 15);
  GD.Vertex2ii(25, 410, 0, 16);
  GD.Vertex2ii(125, 410, 0, 17);
  GD.Vertex2ii(225, 410, 0, 18);
  GD.Vertex2ii(325, 410, 0, 19);
  
  GD.swap();
}

En total el asset dispone de 20 celdas dentro de la primer posición de manejo de imagenes (0), queda experimentar la posibilidad de almacenar en los slots de memoria restantes, imagenes normales.

He intentado cargar un segundo grupo de sprites en el slot 1, pero parece que afecta slot 0 y al usar GD.Vertex2ii(325, 410, 0, 19); GD.Vertex2ii(325, 410, 1, 19); el resultado en pantalla no es el correcto.

Ésta técnica de manejo de múltiples imágenes en un solo archivo, se le llama "manejo de sprites"

icx.h (186 KB)

Buenas noches.

Pues se de tu esfuerzo TFTLCDCyg, pero cuando veas mi nuevo mensaje en el foro de James ya te puedes morir ...
esto es lo que buscaba yo y creo que hasta tu...

Es decir, ya lo tenemos TODO.

Lllevo con este tema muy atascado, otra cosa es pasar el fichero a gd2 en microSD que será lo mas importante y esto lo mas encillo

La solución pasa en estas lineas;

void setup()
{
             
    GD.begin();
    LOAD_ASSETS();

    GD.BitmapHandle(LOGO_HANDLE);
    GD.BitmapLayout(ARGB4, 2 * 64, 64);
    GD.BitmapHandle(LOGO2_HANDLE);
    GD.BitmapLayout(ARGB4, 2 * 64, 64);
}

Es decir definir los Handles de las imagenes convertidas ...
Comprobado y funciona.

Es decir en el fichero cabecera .h nos pone los diferentes "XXX_HANDLE" ...
Otra cosa es experiementar desde 16 Handles por 16 imagenes que son 256 ....
Saludos Tomas.

/* EDITO */

Por ejemplo no se si crear dentro del fichero .h otro de iconos de 32x32, seria otra imagen dentro y luego hacer esto por ejemplo;

void setup()
{            
   GD.begin();
    LOAD_ASSETS();

    GD.BitmapHandle(LOGO_HANDLE);
    GD.BitmapLayout(ARGB4, 2 * 64, 64);
    GD.BitmapHandle(LOGO2_HANDLE);
    GD.BitmapLayout(ARGB4, 2 * 64, 64);
    GD.BitmapHandle(ICONOS_HANDLE);
    GD.BitmapLayout(ARGB4, 2 * 32, 32);
}

Vaya así de simple!. Te digo: mas secretos..., eso no aparece en la librería GD2 y vaya que la he leído infinidad de veces.

Gracias por abrir el post en el foro de James. Me da gusto que por fin hayas solucionado ese "detallito", lo digo así, puesto que la solución estaba allí, y es muy simple... estaba en las mismas instrucciones que tantas vueltas les hemos dado.

Parece entonces que la herramienta para windows en efecto si tiene ese potencial. Experimentaré con mas arreglos de imágenes.

La duda que me queda es si es posible usar una imagen de fondo en conjunto con los sprites, tal como está el ejemplo "nightstrike" que viene en la librería.

Creo que con el tema de pasar al lector SDIO (felicidades por tu Teensy 3.5, pero... ya debes dormir menos que antes jejejeje), RndMnkIII nos podría dar una orientación ya que el domina el tema.

Trataré de crear un ejemplo con la respuesta que nos ha brindado James, estará incluido en la siguiente revisión de las librerías.

Gracias.

TFTLCDCyg:
Vaya así de simple!. Te digo: mas secretos..., eso no aparece en la librería GD2 y vaya que la he leído infinidad de veces.

jejejeje ,pues aunque no lo creas despues de leerme bastantes veces el book de James he realizado un curso intensivo de Ingles, ahora me voy enterando mas. :slight_smile:

Bueno he realizado las pruebas, y escribo que es totalmente funcional. He usado iconos del tamaño 32x32, 64x64, 70x50 el problema no son las dimensiones sino de como se tiene que lograr realizar el "split" (dividir) las celdas de los mismo. En esta ocasión he usado 27 iconos. Con gd2asset:

gd2asset -f logos.gd2 player.jpg,format=ARGB4 tempo.jpg,format=ARGB4 icradio.jpg,format=ARGB4

Esto da el reporte:

Assets report
-------------
Header file:    default_assets.h
GD2 RAM used:   114016
Output file:    logos.gd2
File size:      28521

Osea que sobra y estoy a menos del 50% de la RAM para FT800 !!!! Genial entonces...
Las pruebas las he realizado con mi FT811 averiada del tactil por esto.

He de comentar que lo he realizado para un fichero .gd2 ( opción -f y no -o ) para no engordar la skets de trabajo y dejar el codigo mas limpio. En fin se puede hacerde ambas formas y no influiria el resultado, salvo que entonces inflamos la flash de la MCU. A libre elección.

Tambien en mensajes anterior escribí que con una condicional if en una zona de la pantalla (yo le llamo zona de batalla) se pueden subir con GD.cmd_loadimage() las que se desee porque estas siempre modificaran la misma zona. Para una imagen de 64x64 son unos 8k de RAM (bien!!!) hay espacio mas que suficiente.

El codigo usado es;

#include <EEPROM.h>
#include <SPI.h>
#include <GD3.h>

#include "logos.h"
#define PDNPin 8       // Señal P.O.R. TFT FT800

void setup()
{
    pinMode(PDNPin, OUTPUT);       // CONTROL P.O.R. Power On Reset
    digitalWrite(PDNPin, HIGH);    // Pantalla FT800 comparada
    delay(20);                     // en http://HotMCU.com
    digitalWrite(PDNPin, LOW);     //           |
    delay(20);                     //           |
    digitalWrite(PDNPin, HIGH);    //           |
    delay(20);                     //           |
  
    GD.begin();
    LOAD_ASSETS();
 
    GD.BitmapHandle(PLAYER_HANDLE);            // ICONOS REPRODUCTOR MP3
    GD.BitmapLayout(ARGB4, 2 * 32, 32);
    
    GD.BitmapHandle(TEMPO_HANDLE);             // ICONOS DEL TIEMPO
    GD.BitmapLayout(ARGB4, 2 * 70, 50);
    
    GD.BitmapHandle(ICRADIO_HANDLE);           // ICONOS LOGOS RADIO
    GD.BitmapLayout(ARGB4, 2 * 64, 64);
        
    GD.BitmapHandle(ALTA_HANDLE);               // VARIOS ICONOS LED Y ALTAVOCES
    GD.BitmapLayout(ARGB4, 2 * 32, 32);
}

void loop()
{
GD.ClearColorRGB(0, 0, 0);
 // GD.Clear(1, 1, 1);
  GD.Clear();
  /*
  GD.cmd_button(0, 0, 479, 45, 30, 0, "Estacion Meteo");

  GD.Begin(LINES);
  GD.Vertex2ii(0, 50, 20, 0);
  GD.Vertex2ii(480, 50, 20, 0);
  GD.Vertex2ii(0, 54, 20, 0);
  GD.Vertex2ii(480, 54, 20, 0);
  GD.End();

  */

 // GD.cmd_gradient(0, 0, 0x103010, 480, 480, 0x101030);
  GD.Begin(BITMAPS);
  GD.Vertex2ii(30, 50, 0, 0);
  GD.Vertex2ii(70, 50, 0, 1);
  GD.Vertex2ii(110, 50, 0, 2);
  GD.Vertex2ii(150, 50, 0, 3);
  GD.Vertex2ii(190, 50, 0, 4);
  GD.Vertex2ii(240, 50, 0, 5);
  GD.Vertex2ii(280, 50, 0, 6);
  GD.Vertex2ii(320, 50, 0, 7);
  GD.Vertex2ii(360, 50, 0, 8);
  GD.Vertex2ii(400, 50, 0, 9);
  GD.End();

  GD.Begin(BITMAPS);
  GD.Vertex2ii(50, 115, 1, 0);
  GD.Vertex2ii(120, 115, 1, 1);
  GD.Vertex2ii(190, 115, 1, 2);
  GD.Vertex2ii(270, 115, 1, 3);
  GD.End();

  GD.Begin(BITMAPS);
  GD.Vertex2ii(20, 200, 2, 0);
  GD.Vertex2ii(95, 200, 2, 1);
  GD.Vertex2ii(170, 200, 2, 2);
  GD.Vertex2ii(245, 200, 2, 3);
  
  GD.Vertex2ii(20, 300, 2, 4);
  GD.Vertex2ii(95, 300, 2, 5);
  GD.Vertex2ii(170, 300, 2, 6);
  GD.Vertex2ii(245, 300, 2, 7);

  GD.Vertex2ii(20, 400, 3, 0);
  GD.Vertex2ii(95, 400, 3, 1);
  GD.Vertex2ii(170, 400, 3, 2);
  GD.Vertex2ii(245, 400, 3, 3);
  GD.Vertex2ii(295, 400, 3, 4);
  GD.End();

  GD.swap();
  }

El fichero logos.h es;

#define LOAD_ASSETS()  GD.safeload("logos.gd2");
#define PLAYER_HANDLE 0
#define PLAYER_WIDTH 32
#define PLAYER_HEIGHT 320
#define PLAYER_CELLS 1
#define TEMPO_HANDLE 1
#define TEMPO_WIDTH 70
#define TEMPO_HEIGHT 200
#define TEMPO_CELLS 1
#define ICRADIO_HANDLE 2
#define ICRADIO_WIDTH 64
#define ICRADIO_HEIGHT 512
#define ICRADIO_CELLS 1
#define ALTA_HANDLE 3
#define ALTA_WIDTH 32
#define ALTA_HEIGHT 160
#define ALTA_CELLS 1
#define ASSETS_END 124256UL
static const shape_t PLAYER_SHAPE = {0, 32, 320, 0};
static const shape_t TEMPO_SHAPE = {1, 70, 200, 0};
static const shape_t ICRADIO_SHAPE = {2, 64, 512, 0};
static const shape_t ALTA_SHAPE = {3, 32, 160, 0};

Este es el resultado;

Resumiendo y lo mas importante: usando esta tecnica de sprites las FT(xx cobran una vida tridimensional con imagenes ..
Adjunto las imagenes del mismo.
Saludos!

prueba_set.zip (64.5 KB)

Nuevas funciones para la futuras librerías en vista de esta grande GDx.

Leyendo el CodeBook vi este ejemplo de como poner un "outline" al texto de 1 pixel y la verdad queda muy llamativo:

static void blocktext(int x, int y, byte font, const char *s)
{
GD.SaveContext();
GD.ColorRGB(BLACK);
GD.cmd_text(x-2, y-2, font, 0, s);
GD.cmd_text(x+2, y-2, font, 0, s);
GD.cmd_text(x-2, y+2, font, 0, s);
GD.cmd_text(x+2, y+2, font, 0, s);
GD.RestoreContext();
GD.cmd_text(x, y, font, 0, s);
}

Sin embargo, despues de pruebas lo he realizado a la funcion GD.cmd_number para el mismo efecto.
Donde le llamo blockNum2() por tener dos pixels alrededor del numero, se puede hacer otra por ejemplo llamada blockNum1(), para solo un pixel ...
Vean el código para dos pixels ( blockNum2() );

static void blockNum2(int x, int y, byte font, int a)
{
GD.SaveContext();
GD.ColorRGB(BLACK);
GD.cmd_number(x-2, y-2, font, 0, a);
GD.cmd_number(x+2, y-2, font, 0, a);
GD.cmd_number(x-2, y+2, font, 0, a);
GD.cmd_number(x+2, y+2, font, 0, a);
GD.RestoreContext();
GD.cmd_number(x, y, font, 0, a);
}

Una aportación mas...

Muy buena para resaltar encabezados.

Me permití hacer algunos ajustes para que la tengamos en modo "todo en uno":

static void blocktext(int x, int y, byte font, const char *s, int espesor, int CR, int CG, int CB)
{
  GD.SaveContext();
  GD.ColorRGB(CR, CG, CB);
  GD.cmd_text(x-espesor, y-espesor, font, 0, s);
  GD.cmd_text(x+espesor, y-espesor, font, 0, s);
  GD.cmd_text(x-espesor, y+espesor, font, 0, s);
  GD.cmd_text(x+espesor, y+espesor, font, 0, s);
  GD.RestoreContext();
}

También se puede usar con las fuentes extra de FT81X:

#include <SPI.h>
#include <GD3.h>

void setup()
{
  GD.begin();
  GD.cmd_setrotate(0);
}

void loop()
{
  GD.ClearColorRGB(0x000020);
  GD.Clear();
    GD.cmd_romfont(1,34);   //Usa las fuentes adicionales del FT81X: 32, 33, 34
    blocktext(220, 180, 1, "_]StarX[_", 2, 0,255,0);
    GD.cmd_text(220, 180, 1, 0, "_]StarX[_");
  GD.swap();
}

static void blocktext(int x, int y, byte font, const char *s, int espesor, int CR, int CG, int CB)
{
  GD.SaveContext();
  GD.ColorRGB(CR, CG, CB);
  GD.cmd_text(x-espesor, y-espesor, font, 0, s);
  GD.cmd_text(x+espesor, y-espesor, font, 0, s);
  GD.cmd_text(x-espesor, y+espesor, font, 0, s);
  GD.cmd_text(x+espesor, y+espesor, font, 0, s);
  GD.RestoreContext();
}

PD: éstos días si que han estado movidos con el trabajo, espero ya pronto disponer de algún tiempo libre para corregir fallos en los ejemplos y adicionar más.

Hola:

Un apregunta tonta.
¿No es más fácil y barato usar una tablet con Android y comunicarlo por USB con Arduino UNO?

Aquí les veo que usan hasta controladores de hardware y todo, lo veo más caro.

Eso si, los poryectos que están haciendo por ahora que estoy viendo de ustedes son impresionantes.

Un cordial saludo.

Metaconta:
¿No es más fácil y barato usar una tablet con Android y comunicarlo por USB con Arduino UNO?

Wow no, es totalmente diferente.

Usamos un MCU nativo con su pantalla y librería, donde se puede programar cualquier dispositivo dentro de los rangos sea Arduino MEGA o Teensy, etc ... Con Android tienes un sistema operativo Linux, aunque pueda controlar a traves de Arduino, luego vendría la aplicación del mismo. Sería otro mundo

El usar este tipo de pantallas, a mi modo de ver es porque son las mejores al día de este mensaje mio de programar en esta plataforma. No hay otras que las superen. No solo por su enorme potencial, ademas siempre te sorprende su voracidaz de hacer muchas cosas. Sin embargo son algo problematicas en un primer contacto. Lo mas importante es tener mas funciones en librería para que realice infinidad de comandos visuales.

Y es cierto, un hobby y proyectos caros con estas pantallas FT8xx, pero a veces, el precio no es en sí, es mas sin duda un factor secundario cuando las tienes en tus manos realizando sofisticadas recreaciciones, y esto no tiene precio alguno.

Buenas:

Ya veo que es otro mundo. Recuerdo que hice cosas con Android, encender y apagar un Led, creado su aplicación, no es tan completo.

Si te digo la verdad, me recuerda manejar Raspberry Pi con su Linux y Arduino, esta puede conectar a un TV por HDMI.

¿Esto no se le han opcurrido?

Seguro que si, pero no es tan interesando como lo que están haciendo.

También se pueden usar pantalla de los coches.

Ya sabes, RAspberry como servidor y Arduino como actuador. Están haciendo mucho solo con Arduino, es un reto grande.

Ánimos y adelante.

Al recurrir a una R-Pi dentro de la ecuación, estaríamos introduciendo una segunda PC para programar lo que ya podemos programar con la primer PC.

Pronto nos quedaríamos limitados al soporte que podría darnos la R-Pi con el tema de hardware y software, sin olvidar las librerías tan escasas y el poco soporte que han dado los fabricantes a estas increíbles pantallas.

Hemos batallado mucho para compartir una librería 100% funcional partiendo de GD2 (la librería para el gameduino 2), por lo visto a medida que hemos caminado con ella, no alcanzamos a conocerla por completo.

Los chips FT81X son bastante quisquillosos con el tema de SPI y su programación es bastante caprichosa.

Estas pantallas son lo mas eficiente que he visto para trabajar en el IDE de arduino y por lo que hemos visto con plataformas mas veloces como el Teensy 3.2, Teensy 3.5 o Teensy 3.6, disponemos de prestaciones inigualables.

Conseguí un segundo Teensy 3.6, habilité la librería GD3_SDIO para experimentar con el lector SDIO con la pantalla FT801, de acuerdo a las pruebas que he podido hacer, la velocidad de carga de imágenes está limitada por el propio chip FT801.

Por cierto este chip en particular no puede manejar imágenes png, quizás por algún tema de construcción de la propia pantalla. La pantalla gameduino 2 si que puede manejar este tipo de imágenes. Trataré de averiguar mas al respecto, quizás estoy pasando por alto alguna configuración de hardware dentro de librería GD3_SDIO.

31 marzo 2017: Actualización GDX_V5.2

IDE empleado en las pruebas: 1.8.0

Importante: eliminar las librerías GDX previas, con el fin de evitar errores de compilación por duplicidad de librerías.

Es un proyecto en proceso y como tal, aún pueden estar colados algunos errores, si los detectan en sus pruebas, por favor repórtenlos en el presente hilo con el fin de corregirlos y mejorar la calidad de la librería.

Modificaciones relevantes

  • Ajustes en los archivos núcleo de la librería: wiring.h, GDX.h y en GDX.ccp para que la asignación de pines de control, modelo de chip FT8XX, orientación de la pantalla sea lo mas simple posible y se controle desde la propia librería.

  • Ya no es necesario usar una instrucción en el setup del sketch para establecer la orientación de la pantalla, aunque para efectos de diseño se puede incluir. En el archivo GDX.h de cada variante de librería, dentro del encabezado, está definida la variable que controla la orientación de la pantalla

Para FT80X, con GD2 y GD2_SDIO:

#define ORIENTACION       0   //0,  1

Para FT81X, con GD3 y GD3_SDIO:

#define ORIENTACION       0   //0,  1, 3, 4
  • Reorganización de los ejemplos de manejo de cada variante con el fin de que sea mas sencillo aprender a usar la librería en sus diferentes versiones.

  • Esta versión GDX incluye dos variantes (GD2_SDIO y GD3_SDIO) que permiten el uso del lector SDIO de las placas teensy 3.5 y 3.6, con la idea de aprovechar las prestaciones de ese lector microSD.

  • Las versiones para arduino, que dicho sea de paso funcionan sin problemas en las placas teensy 3.X, son GD2 y GD3, funcionan con un lector externo de 3.3V. Se reestructuraron en su apartado de ejemplos con el fin de eliminar errores de compilación y facilitar adiciones futuras de demos y extras.

Adjunto las librerías SD y SDFat para teensy 3.X que soportan al lector SDIO. Incluí las versiones actuales que trabajan en placas arduino.

PD: lightcalamar, saludos amigo, he estado bastante liado con el trabajo; en la siguiente versión trataré de incluir los ajustes que se necesitan para activar las pantallas de HotMCU, con el fin de que ese ajuste se pueda conseguir desde la librería considerando los modelos específicos de ese fabricante.