Nuelectronics 2.8" TFT/Touch/SD Shield

Buongiorno a tutti!
torno su questo forum dopo tempo immemore... Finalmente riesco a riprendere qualche mio progetto lasciato in sospeso ormai qualche anno fa.

In particolare sto tentando di sfruttare uno shield acquistato da Nuelectronics (che nel frattempo sembra sparita?) che prevede:

  • Display TFT con controller ILI9325
  • Touchscreen basato su AD7843
  • Slot SD card su interfaccia SPI
    La shield occupa tutto lo strip laterale di Arduino Mega, cioè gli I/O digitali dal 22 al 53, e da ciò che ho capito opera in modalità parallela a 16bit.

Ho trovato le librerie originali, che per fortuna avevo tenuto, ma ho parecchi problemi nel farle funzionare, problemi che da quanto ho capito sono dovuti a restrizioni dei nuovi compilatori.
Ora, ho provato a correggere qualche problema ma non ho ancora risolto del tutto... Prima di sbatterci altro tempo però vorrei capire se esistono librerie aggiornate adatte per questa shield, o se sono costretto a lavorare sulle vecchie librerie.

Qualche esperto in materia mi può dare qualche dritta?
Grazie!

Nel frattempo ho fatto qualche prova... Non sono esperto in materia ma sto cercando di risolvere gli errori uno ad uno.
Allego innanzitutto la libreria e riporto i primi errori che ottengo alla compilazione dello sketch di esempio "tft_menu.pde" contenuto nelle librerie:

In file included from calibrate.cpp:1:0:
/Users/Michele/Documents/Arduino/libraries/TFT_lib/f12x12.h:56:49: error: variable 'f12x12' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 static uint8_t __attribute__ ((progmem)) f12x12[] = {
                                                 ^
In file included from /Users/Michele/Documents/Arduino/libraries/TFT_lib/f12x12.h:48:0,
                 from calibrate.cpp:1:
calibrate.cpp: In function 'void tp_calibrate()':
calibrate.cpp:78: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
  text_box_P(80, 100, 240, 120, 5, PSTR("TP Calibration")); 
                                   ^
calibrate.cpp:15: error: initializing argument 6 of 'void text_box_P(uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, char*)' [-fpermissive]
 void text_box_P(uint16_t x1,uint16_t y1, uint16_t x2, uint16_t y2, uint16_t radius, char* str_P);
      ^
In file included from /Users/Michele/Documents/Arduino/libraries/TFT_lib/f12x12.h:48:0,
                 from calibrate.cpp:1:
calibrate.cpp:116: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
  text_box_P(80, 100, 240, 120, 5, PSTR("TP Calibrated"));
                                   ^
calibrate.cpp:15: error: initializing argument 6 of 'void text_box_P(uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, char*)' [-fpermissive]
 void text_box_P(uint16_t x1,uint16_t y1, uint16_t x2, uint16_t y2, uint16_t radius, char* str_P);
      ^
invalid conversion from 'const char*' to 'char*' [-fpermissive]

Ho iniziato dichiarando come "const" questa f12x12[] ma restituisce errore di conversione da "const char*" a char*"

In file included from /Users/Michele/Documents/Arduino/libraries/TFT_lib/f12x12.h:48:0,
                 from calibrate.cpp:1:
calibrate.cpp: In function 'void tp_calibrate()':
calibrate.cpp:78: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
  text_box_P(80, 100, 240, 120, 5, PSTR("TP Calibration")); 
                                   ^
calibrate.cpp:15: error: initializing argument 6 of 'void text_box_P(uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, char*)' [-fpermissive]
 void text_box_P(uint16_t x1,uint16_t y1, uint16_t x2, uint16_t y2, uint16_t radius, char* str_P);
      ^
In file included from /Users/Michele/Documents/Arduino/libraries/TFT_lib/f12x12.h:48:0,
                 from calibrate.cpp:1:
calibrate.cpp:116: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
  text_box_P(80, 100, 240, 120, 5, PSTR("TP Calibrated"));
                                   ^
calibrate.cpp:15: error: initializing argument 6 of 'void text_box_P(uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, char*)' [-fpermissive]
 void text_box_P(uint16_t x1,uint16_t y1, uint16_t x2, uint16_t y2, uint16_t radius, char* str_P);
      ^
invalid conversion from 'const char*' to 'char*' [-fpermissive]

In realtà poi ho provato a risolvere eliminando l'attributo "progmem" e le PSTR in giro per il programma... era non capisco e non riesco a risolvere:

In file included from TFT_ILI9325.cpp:10:0:
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/avr/include/util/delay.h: In static member function 'static void LCD::init(uint8_t)':
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/avr/include/util/delay.h:163:40: error: __builtin_avr_delay_cycles expects a compile time integer constant
  __builtin_avr_delay_cycles(__ticks_dc);
                                        ^
Errore durante la compilazione

Da profano direi che gli manca un intero che indica il delay, ma non capisco dove!

TFT_lib.zip (44.3 KB)

Immaginavo che non avrei ottenuto molte risposte, avevo già intuito che non è una shield molto diffusa...
Nel frattempo però ho fatto altre ricerche e sono riuscito a capire che il display funziona correttamente con le librerie UTFT e UTOUCH (UTFT - Rinky-Dink Electronics) impostando i pin corretti nel programma... Quindi ho prontamente abbandonato le librerie originali che erano un po' problematiche.

Sto ancora facendo un po' di test perché il touchscreen risulta "specchiato" sull'asse verticale rispetto all'immagine visualizzata, quindi ad esempio toccando un tasto sulla destra dello schermo viene attivato il tasto situato sul lato opposto del display... Devo solo capire come invertire l'asse del touchscreen (accetto consigli a riguardo)

Non appena riesco ad ottenere qualcosa di perfettamente funzionante magari riporto il tutto per i posteri :slight_smile:

gamby:
Non appena riesco ad ottenere qualcosa di perfettamente funzionante magari riporto il tutto per i posteri :slight_smile:

Grazie, condividere è buona cosa.