Presentazione e prima richiesta di aiuto

Salve a tutti.. ho comprato un arduino nano pochi giorni fa e ho passato l'ultima settimana a spulciare il forum alla ricerca di consigli ed ho trovato molte risposte ai miei dubbi.... Grazie alla comuntiason riuscito a pilotare un display che ho riciclato da un vecchio nokia per visualizzare dei dati che mi interessava monitorare.... ma si sa l'appetito vien mangiando per cui mi son procurato un display grafico 128X64 della futaba (GP9002A01) col quale volevo portare a termine un progettino abbastanza ambizioso... ma qui mi sono imbattuto in una difficolta per me insormontabile per cui chiedo aiuto qui...... per questo display sembrerebbe non esistere alcun tipo di libreria.. ne specifica per arduino ne generica che potrei provare a riaggiustare.. sono ormai 2 giorni che cerco in ogni meandro della rete e non ne tiro fuori nulla.... o meglio ho solo trovato un pdf del datasheet nel quale son spiegate alcune cose.... ma davvero troppo poco per partire a scrivere una libreria da zero con le mie capacita`. possibile mai? che nessuno sembri aver usato questo o qualche altro display simile????

grazie in anticipo Luca.

spero che sia io a commettere qualche errore

come comunica con arduino? (spi, i2c...) posta il pdf :)

innanzitutto grazie per la risposta .. non mi aspettavo tanta rapidita.... il diplei comunica in parallelo e in syncronus serial ( modalita per la quale l'avevo scelto) non ho trovato al volo come inserire il pdf per cui metto un link

http://docs-europe.origin.electrocomponents.com/webdocs/0d12/0900766b80d12c93.pdf

ancora mille grazie

Ho dato uno sguardo al datasheet e come prima cosa ho notato l'assenza del pinout del display, senza il quale risulta piuttosto difficile il collegamento (se non si vuole rischiare di bruciare il tutto con dei tentativi).

Per quel che riguarda il controllo software direi invece che ci sono tutti i dati per scrivere le funzioni necessarie.

Escludendo il collegamento in parallelo (che sarebbe preferibile se ci fosse a disposizione un bus esterno per Arduino ;) ) la connessione seriale non è certo un problema perchè a differenza di altri simili (e ponendo a Vss il segnale CS) qui c'è solo in più da pilotare il segnale C/D per inviare Comandi o Dati.

Per il resto tutte le funzioni sono da scrivere ed è un lavoro che il "primo" ad usarlo purtoppo deve sempre fare ::)

Così, visto che hai acquistato un prodotto così recente, mi sa che toccherà a te (io lo farei se avessi a disposizione il display, ma senza sarebbe un lavoraccio...)

P.S. piuttosto: l'hai pagato caro? (e dove l'hai comprato?)

--- aggiunta:

hai scritto di aver utilizzato il display da un vecchio nokia, ti dispiace dare maggiori info al riguardo (modello del nokia, tipo di display, collegamenti, protocollo, ecc)

...grazie.... dunque... il pinout del display epresente sul datasheet in una doppia tabella dove dice come collegarlo sia nel caso del collegamento parallelo che di quello seriale.. mi debbo rassegnare a tentare di scriverla e io spero di riuscirci........... ci provero... e ovviamente nel caso ci riuscissi la condividero con tutti voi..... per quanto riguarda il diplay del nokia era quello classico del 3310 e tutte le info sulla libreria le ho prese direttamente qui sul sito.

grazie ancora.

Per il pinout hai ragione, mi era sfuggito tra le tante tabelle... :)

Per la scrittura della libreria, come ti ho già scritto, non è possibile operare senza il display... Ma non mi hai risposto su: l'hai pagato caro? e dove l'hai comprato?

ops.. me ne ero dimenticato..... preso su rscomponents pagato una trentina di euro....

Comunque se hai bisogno per la scrittura delle librerie non farti problemi a chiedere, ok?

oggi ho tentato di implementare i primi comandi base per questo display.... onestamente i risultati non sono stati incoragianti.... solo ad un certo punto ho ottenuto l'accensione ma senza nesssun tipo di visualizzazione...

avrei davvero bisogno di aiuto ma nello stesso tempo mi vergogno un po a chiedere che qualcuno facesse tutto il lavoro che mi occorre al posto mio .... anche perche credo che riuscire a fare funzionare le cose sia ugualmente molto gatificante.

Mi hai dato una tua eventuale disponibilità a fornirmi aiuto te ne sono sinceramente grato e non vorrei approfittarne troppo quindi almeno se potessi darmi una mano ad implementare le funzioni elementari come per inviare un comando oppure la procedura corretta per fare l'iizializzazione potrei cercare poi di proseguire con le mie forze..... ovviamente ti chiedo questo senza alcuna pretesa ne sui tempi ne su altro.....

ti ringrazio quindi in anticipo Luca

Ho dato la mia disponibilità perchè credo sia un lavoro abbastanza complesso per chi ha poca esperienza, e la confermo in pieno ;)

Inizia con il postare qui il codice che hai già scritto (una funzione alla volta) e se non è ben commentato, commentalo nel post.

Vedrai che così arriviamo presto alla soluzione (e probabilmente anche altri potranno fare la loro parte).

Grazie ti sono davvero grato…
Dunque io ti posto cosa ho fatto fino ad adesso ma tu mi prometti di non ridere???
tieni conto che sono una decina di giorni che ho l’arduino ed e`la prima volta che affronto la programmazione.

/*
            Lybrary Syncronous Serial  LCD VFD FUTABA
*/
// Collegamento hardware pin arduino
int LCD_CS_N      =  9;  //Chip Select
int LCD_CD_N      = 10;  //Command Data     
int LCD_SCLK      = 11;  //Synchronous Clock Signal
int LCD_SI        = 12;  //Serial Data IN

#define LCD_CMD   0
#define LCD_DATA  1

void LcdInit       ( void );

void LcdChr       ( int size, byte ch );

void LcdStr       ( int size, char *dataPtr );

void LcdSendCmd  ( byte data, int cd );


void LcdSendCmd ( byte data, int cd )
{
  byte i = 8;
  byte mask;
  //
  
  if ( cd == LCD_DATA )
  {
    digitalWrite(LCD_CD_N,LOW);
  }
  else
  {
    digitalWrite(LCD_CD_N,HIGH);
  }
  delayMicroseconds(1); // eppo' di ci penza
  
  digitalWrite(LCD_CS_N,LOW);
  delayMicroseconds(1); // eppo' di ci penza

  //digitalWrite(LCD_WR_N,LOW);
  delayMicroseconds(1); // eppo' di ci penza
  

  while(0 < i) {
    mask = 0x01 << --i; // get bitmask and move to least significant bit

    
    digitalWrite(LCD_SCLK,LOW); // tick
    delayMicroseconds(1); // eppo' di ci penza

    
    if(data & mask){ 
      digitalWrite(LCD_SI,HIGH); 
    }
    else{
      digitalWrite(LCD_SI,LOW); 
    }

   
     digitalWrite(LCD_SCLK,HIGH); 
     delayMicroseconds(1); 

  }

     
  
    digitalWrite(LCD_CS_N,HIGH);
    delayMicroseconds(1); // eppo' di ci penza
}



void LcdInit(void)
{
  pinMode(CONTROL_LED,OUTPUT);
  pinMode(LCD_CS_N,OUTPUT);
  pinMode(LCD_CD_N,OUTPUT);
  pinMode(LCD_SCLK,OUTPUT);
  pinMode(LCD_SI,OUTPUT);
    
  LcdSendCmd( 0x14, LCD_CMD );  // Display Mode command.
  LcdSendCmd( 0x10, LCD_CMD );  // The display mode (no gray scale mode)
  LcdSendCmd( 0x06, LCD_CMD );  // Clear Screen
  LcdSendCmd( 0x01, LCD_CMD );  // 1st Screen is Displayed on (01H)
  LcdSendCmd( 0x0E, LCD_CMD );  // Setting lower address of Write
  LcdSendCmd( 0x48, LCD_CMD );  // Setting lower address 48H
  LcdSendCmd( 0x0F, LCD_CMD );  // Setting upper address of Write
  LcdSendCmd( 0x00, LCD_CMD );  // Setting upper 3bits 000B
  LcdSendCmd( 0x08, LCD_CMD );  // Display data write-in(08H)
  
  
}


void LcdChr(int size, byte ch )
{


}



void LcdStr ( int size, char *dataPtr )
{
  while ( *dataPtr )
  {
    LcdChr( size, *dataPtr++ );
  }
}
 


void setup()
{
 
 LcdInit();
  
}
    
    void loop()
{
  

  
}

Per favore sii clemente…

Ho dato uno sguardo veloce al pinout e alla tabella dei tempi, e la prima cosa che mi è saltata all'occhio è che non ho visto la definizione del pin su Arduino che va a SO. In sostanza hai solo battezzato LCD_SI che serve per il DATA In e per il DATA Out? Come fai ad inviare i tuoi comandi altrimenti?

Poi, per vedere se hai capito bene come deve essere preparato il protocollo, mi dovresti spiegare come hai stabilito i vari delayMicroseconds(1);

dimenticavo: il CS lo dovrai usare solo se prevedi di utilizzare altri dispositivi con la stessa comunicazione seriale (cosa che non credo tu faccia), così puoi benissimo impostare tale segnale sempre basso, e liberare così un uscita di Arduino ;)

Wowo che rapidita..... dunque... ho definito con LCD_SI il piedino serial data out di arduino (collegato appunto al serial in del display) e non ho definito il data out poiche immaginavo che la comunicazione dovesse solo avvenire tra arduino e display e non vice versa ovvero credevo che non fosse necessario il collegamento dei dati di ritorno dal display all'arduino. dalla tua osservazione mi pare di capire invece che e necessaria..... provvedo subito ad effettuare il collegamento... ( a cosa puo` servire il dato di ritorno verso arduino??)

per quanto riguarda la tempistica ho usato un generico ritardo "delayMicroseconds(1) minimo usato in tutti i casi dove dal datasheet era richiesto in ritardo di decie o centinaia di nanosecondi (valore minimo consigliato) queindi essendo in fase di prova volevo essere sicuro di rientrare entro questi tempi ( il tutto si evince nel grafico inserito nella sezione 5-2 del pdf che ti ho linkato. spero di non aver sbagliato anche questo....

Grazie ancora e spero di ricevere altre preziose info al piu presto.....

a cosa puo` servire il dato di ritorno verso arduino??

se non fosse altro che per implementare una libreria completa ::) direi che di fatto hai poi a disposizione tutta la ram utilizzata dal display (che in questo caso è addirittura doppia!). Immagina la possibilità in grafica di poter tracciare figure vettoriali sopra immagini preesistenti (tipo grafici, tabelle, ecc), o mescolare immagini bitmap con immagini preesistenti... Per farlo dovresti avere una copia dello schermo anche dentro alla ram di arduino, e questo comporterebbe un grosso spreco di risorse. Così invece sfrutti la stessa ram che ti mette a disposizione il display potendola leggere e scrivere a piacere, non trovi?

In merito poi ai ritardi, visto che si parla di nano secondi, credo non ci sia necessità di applicare ulteriori ritardi a quelli che già Arduino stesso impone, in quanto ad ogni azione che tu gli fai fare corrisponde sempre e comunque un tempo minimo dettato dal codice compilato che non è certo uguale a quello scritto direttamente in asm.

Comunque ad aggiungere ritardi sei sempre in tempo, ma se ne devi togliere allora si che diventa un problema (in C).

Per il resto forse potresti usare un pochino più di funzioni di logica eliminando del codice superfluo che fa perdere un sacco di tempo e occupa inutile spazio programma (rom), tipo:

if(data & mask){
      digitalWrite(LCD_SI,HIGH);
    }
    else{
      digitalWrite(LCD_SI,LOW);
    }
}

con

digitalWrite(LCD_SI,(char)(data & mask));

ho provato la modifica che mi hai suggerito senza peroalcun esito.. purtroppo il display non sembra rispondere quindi continuo ad essere ad un punto fermo.... sto analizzando perche npon sembra voler accettare alcun comando... ho controllato sia inserendo delle stampe a video che con l'oscilloscopio che gli stati logici sembrano essere tutti rispettati.... mi resta il dubbio sulla tempistica e sulla maschera che ho utilizzato per inviare i dati perche inviando un dato o un comando 08H e 00H esso risponde accendendo l'illuminazione o spegnendola sia col CD alto che basso.. in realta questa e l'unica cosa che fa.. poi per il resto qualunque cosa faccia sembra nopn sortire alcun effetto....

la settimana prossima saroin trasferta lavorativa fuori citta per cui non potro effettuare nessun test.. vuol dire che impieghero le ore libere a reperire info in rete....

grazie comunque di tutto l'aiuto....

Stamattina ero fuori come un balcone e nel cercare di capire dove potesse essere l’errore ti stavo inviando delle indicazioni completamente sbagliate, poi è arrivato il caffè (e spero di aver capito qualcosa…) :wink:

Allora, secondo me l’errore è proprio nella generazione della maschera, in quanto viene spedito il byte ad iniziare dal bit più significativo, mentre a noi serve che il primo sia il più basso, giusto?

Per verificare se funziona dovresti sostituire << con >> ma non sono del tutto convinto del tuo metodo, e se vuoi ho riscritto la funzione (commentata a dovere!) e che puoi provare:

void InviaByte(char datocomando, char cd){    //dove se cd = 0 è un comando altrimenti è un dato
  digitalWrite(LCD_CS_N, 0);                  //attiva il CS
  digitalWrite (LCD_CD_N, cd == 0 ? 0 : 1);   //imposta linea CD
  for (char i=0; i <= 7; i++) {               //ciclo per gli 8 bit
    digitalWrite(LCD_SCLK, 0 );               //abbassa il clock
    digitalWrite(LCD_SI, datocomando & 1 );   //scrive il bit meno significativo
    datocomando = datocomando >> 1;           //scorre a destra i bit di una posizione (e funziona anche da ritardo ;)
    digitalWrite(LCD_SCLK, 1 );               //alza il clock (dato valido su fronte di salita)
  }
  delayMicroseconds(1);                       //ritardino di fine ciclo
  digitalWrite(LCD_CS_N, 1);                  //disattiva il CS
}

P.S. non devi farti prendere dallo sconforto, spesso è proprio la causa degli errori più piccoli e comuni , perchè ti distrae quel tanto dal non vederli :wink: (si cerca chissà quale strano meccanismo, e invece…)

eccomi qua... rientrato da una missione di lavoro fuori dalla mia citta`.... ho letto attentamente tutto quanto da te propostomi e effettuato la correzzione sulla maschera per quanto riguardava l'invio del byte piu significativo.... ebbene sia la maschera da me modificata e sia quella da te ideata sortiscono lo stesso effetto sul display ( stesso identico comportamento...).. per cui mi ritrovo al punto di partenza..... da domani mi ci rimetto su e vedo se riesco a capire quale errore commetto....( posso usare il termine commettiamo??)

Permettimi ancora una riga di ringraziamenti nei tuoi confronti in particolare ed in generale per tutto il forum senza di voi non sarei andato oltre il blink del led sul pin 13. GRAZIE