Problemi di comprensione su come utilizzare LCD03 - I2C/Serial LCD

Ciao a tutti, è il mio primo post e vi chiedo scusa, l'argomento è ampiamente trattato ma non riesco proprio a capire come utilizzare questo display.
E' un mesetto che ho iniziato a prototipare con arduino, ho un pò di successi (piccoli) alle spalle, interruttori, led, led rgb, comunicazione seriale, tastierino a matrice ecc...
Ora volevo iniziare a vedere qualcosa su un display, ed ho comprato questo:
http://www.robot-electronics.co.uk/htm/Lcd03tech.htm

Allora vorrei connetterlo ad Arduino 2009, ma non capisco se lo devo utilizzare in I2C o seriale.
Per quel poco che capisco, mi sembra che utilizzarlo in modalità seriale non vada bene?
Per farlo dovrei attaccarci un connettore DB9 o USB?
Oppure posso collegarlo alle porte TX ed RX di arduino (0 e 1)?

Ho trovato qui (Arduino Examples) un esempio di connessione ma non so cosa è il (SRF02, SRF08, SRF10 and SRF235).
Potete darmi una mano a capire?

Grazie!

E' pilotabile sia in seriale che in I2C. di fabbrica e' settato per la seriale, c'e' un jumper sulla schedina piccola.

quindi lo colleghi soltanto a 0 e 1 di arduino

Ok, un grande passo per me, un piccolissimo passo per l'umanità, ho trovato su questo link (Arduino Playground - SerialLCD) alcune delle informazioni che mi interessavano, utilizzando le indicazioni per la connessione seriale, sono riuscito a collegare e far funzionare il display.

Tuttavia ci sono 2 errori nel codice, o quantomeno 2 cose che non facevano funzionare correttamente il display.

  1. beginSerial(19200); Dovrebbe essere Serial.begin...
  2. Il boud dovrebbe essere 9600

Chiunque possa darmi qualche informazioni e spiegazione sarà comunque oggetto del mio massimo rispetto :).
Ora voglio cercare di capire 1° come accendere la retro illuminazione, 2° ed un pò più complicato forse, come funziona.

Grazie a tutti
Dio come mi piace Arduino..

EDIT: Grazie Testato, il fatto del jumper e le due modalità l'avevo capito, solo non ero sicuro della connessione seriale, il TX ed RX a quanto pare è una logica TTL e non seriale? Per avere una logica seriale pura non serve un adattatore TTl->seriale?

beginSerial effettivamente è sbagliato. La velocità invece no perché se leggi il testo ti dice appunto che devi regolarla in base al tuo display:

although you may have to change the serial speed

Dipaniamo il casino

TX-RX sono i nomi dei segnali, trasmettitore ricevitore
TTL: e' il livello del segnale, vuol dire che un 1 e' 5V
Seriale: e' la metodologia usata, appunto seriale, un bit alla volta, differentemente da parallelo.

quando leggi di adattatore seriali ttl e' un adattamento a livello di tensioni in gioco. ad esempio una seriale standard di un pc, rs232, ragiona su segnali di +-15V che distruggerebbero l'ingresso 0 e 1 di arduino

in questo caso a te non serve nessun adattatore perche' sia arduino che il display da te preso funzionano su livelli TTL

P.S. nel caso di display non serve nemmeno collegare l'rx di arduino

Grazie ora mi è molto più chiara la differenza tra seriale e TTL.
Inoltre il termine stesso seriale mi crea confusione.

Grazie di nuovo
(Ho acceso il display... :))

Rieccomi di nuovo.
Va tutto alla grande... ho anche stampato dei caratteri personalizzato e mi sono fatto un foglio excel che mi crea direttamente il codice da mettere sul sketch.

Tuttavia non riesco a capire questa dicitura del manuale: "Next you have to specify the position in ram of one of the 8 available chars you intend to build, the 8 chars are mapped at positions 128-135.".

Sembra che io possa creare 8 caratteri personalizzati, tuttavia io sono riuscito a creare e stamparne solo uno.
Il fatto che si possano fare solo 8 caratteri probabilmente deriva dalla quantità di memoria 64 byte, ma non sono riuscito ad indirizzarli correttamente.

Il primo carattere lo indirizzo partendo dalla posizione 128, inserendo 8 byte che descrivono ogni riga del carattere, dovrei occupare le celle di memoria che vanno dalla 128 alla 135.
Nel testo riportato in inglese dice che i caratteri sono mappati nelle posizioni 128-135.
Io per non spendo come fare ho provato a settare un'altro carattere alla cella 129, ma la stampa è fallita, dopo di che ho provato a memorizzarlo alla cella 136.. e niente ugualmente...

Voi sapete aiutarmi? Perché si inizia il set dalla cella 128?
Grazie per l'aiuto

Inizia dalla 128 per scelta del costruttore.
Cmq io leggo:

Custom characters can be generated by sending an 8 byte map. The first thing that must be done is to send a command of 27 to indicate that you intend to make a custom char. Next you have to specify the position in ram of one of the 8 available chars you intend to build, the 8 chars are mapped at positions 128-135. Then the pattern should be sent as below.

Quindi apri la comunicazione, mandi il comando 27, mandi la posizione della cella da usare, mandi i dati.
Se così non va, c'è qualcosa che non... va. Potresti postare il codice che hai usato per creare il carattere?

non saprei, effettivamente i cratteri personalizzabili sono 8 nelle celle da te menzionate.
Se riesci a fare il primo su 128 vuol dire che segui la procedura giusta, il secondo su 129 dovrebbe funzionare ugualmente.

Una cosa importante da ricordare e' che se si toglie alimentazione si perdono i caratteri

Per questo chiedevo il codice.

abbiamo scritto contemporaneamente, la mia replica non era diretta a te logicamente :slight_smile:

p.s.+o.t.: leo mi si e' accesa una lampadina, visto che non ho giocato ancora con la eeprom interna del micro, e visto che togliendo alimentazione si perdono i caratteri, appena mi arriva il dispay ordinato dal polacco memorizzo nella eeprom i caratteri personali, in modo da non doverli dichiarare nei vari sketch.
ti piace come idea ?

No.
I caratteri li hai già memorizzati all'interno del micro, esattamente sulla flash. Casomai potresti usare PROGMEM per leggere i dati direttamente da essa.

Cmq stiamo parlando di 64 byte max. Se la tua applicazione non è complessa e non consuma tutti i 2048 byte della SRAM, perché appesantire il codice con librerie mangia-memoria solo per memorizzare quei byte da un'altra parte?

hai ragione, perche' se e' vero che si perdono allo spegnimento e' pur vero che ripartendo lui li ricrea dallo sketch memorizzato in flash. ma e' solo per fare un po' di pratica con la eeprom, non per un utilizzo reale.

bello progmem, testero' anche questo
grazie

Ciao ragazzi, per quanto riguarda il singolo carattere non ho problemi, va alla grande, e devo dire che funziona alla perfeziona anche l'excel che mi sono fatto per generare in automatico il codice.
Di seguito riporto 3 caratteri personalizzati che ho usati per fare i test, il codice è questo:

  Serial.print(27, BYTE);
  Serial.print(128,BYTE);
  Serial.print(159,BYTE);
  Serial.print(128,BYTE);
  Serial.print(159,BYTE);
  Serial.print(128,BYTE);
  Serial.print(128,BYTE);
  Serial.print(159,BYTE);
  Serial.print(128,BYTE);
  Serial.print(159,BYTE);

  Serial.print(27, BYTE);
  Serial.print(136,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);
  Serial.print(146,BYTE);

  Serial.print(27, BYTE);
  Serial.print(144,BYTE);
  Serial.print(165,BYTE);
  Serial.print(154,BYTE);
  Serial.print(165,BYTE);
  Serial.print(154,BYTE);
  Serial.print(165,BYTE);
  Serial.print(154,BYTE);
  Serial.print(165,BYTE);
  Serial.print(154,BYTE);

Come potete notare ho provato ad inserire il primo in posizione 128, il secondo in 136 ed il terzo in 144. Ho provato in altri test a memorizzarli in 128, 129, 130, ma con lo stesso risultato.. ossia non si capisce niente...

La cosa strana è che a volte del secondo carattere viene mostrata magari solo la prima colonna, traslata sul lato destro dello "spazio carattere".
La mia è solo una curiosità, questa sera non posso fare delle prove che non ho qui l'hardware..
Grazie ciao

PS: in allegato riporto la schermata del foglio excel utilizzato

Uhm. Stranamente da 128 a 136 ci sono 8 posti, tanti quanti da 136 a 144.
Non vorrei che il problema fosse in Serial.print(xx, BYTE). Se metti Serial.print(xx, BIN) che ti fa?

leo72:
Uhm. Stranamente da 128 a 136 ci sono 8 posti, tanti quanti da 136 a 144.
Non vorrei che il problema fosse in Serial.print(xx, BYTE). Se metti Serial.print(xx, BIN) che ti fa?

Leo non è strano, sono io che ho impostato come cella di archiviazione prima il 128 poi il 136 ecc..
Lo ho fatto perchè provando con 128,129,130 mi andava in errore (lo schermo faceva cose molto strane...:)), quindi ho pensato, forse io indico la prima cella di memoria dove memorizzare il carattere, dopo di che trattandosi di 8Byte (un carattere = 8 byte), allora ho pensato di saltare alla prima cella libera successiva... ma come dicevo senza successo.
Domani mattina faccio la prova e vi faccio sapere.
Ciao

Attenzione a non fare confusione fra il codice del carattere e la memoria dove effettivamente risiedono i dati del carattere. 128 non è l'indirizzo della memoria ma il codice del carattere.

Tu devi informare l'LCD che vuoi personalizzare il carattere con codice 128 poi gli mandi i dati relativi: sta a lui memorizzarli nella RAM interna e da lì richiarli per ricostruire sull'LCD il carattere 128 quando tu glielo chiedi.

M, capito, se quello è il codice carattere allora sicuramente il codice è sbagliato, dal manuale si evince che possono essere memorizzati massimo 8 caratteri di conseguenza dal 128 al 135, ed effettivamente io all'inizio avevo provato cosi... ma non andava.
Domani provo con più attenzione... voglio vedere...

Intanto visto che ho ripreso il manuale, ti riporto degli estratti e delle considerazioni, magari mi puoi correggere.

"Custom char generator
Custom characters can be generated by sending an 8 byte map. The first thing that must be done is to send a command of 27 to indicate that you intend to make a custom char. Next you have to specify the position in ram of one of the 8 available chars you intend to build, the 8 chars are mapped at positions 128-135. Then the pattern should be sent as below.

How to calculate an 8 byte character pattern:"

Quando parla di "to specify the position in ram..." Sembra che tu debba definire l'indirizzamento..., poi, "of one of the 8 available chars..." sono i famosi 8 caratteri al massimo. Poi prosegue con "The 8 chars are mapped at positions "128-135", che effettivamente confermerebbero quello che mi hai scritto... non resta che fare altre prove...

Per il calcolo tutti i codici inviati sono calcolati in "offset" con l'indirizzo dichiarato all'inizio dopo il comando 27.
Ad esempio volendo mettere il carattere nella posizione 128, vanno sommati i valori dei bit di riga a 128. Nel mio excel ho creato le funzioni per fare questo, prima creo graficamente il carattere scrivendo 1 nella cella che voglio annerire (la cella diventa nera quando ha valore uno e bianca con valore 0), poi calcolo il corrispettivo decimale usando il metodo classico BIT*(2^POSIZIONE) dove BIT = 1 o 0, e posizione indica la posizione del bit meno significativo partendo da 0.

Vedremo..
Ciao

La "posizione in ram" è una frase un po' sibillina. In realtà intende appunto il codice nella mappa caratteri. Anche i display con HD44780 permettono di creare 8 caratteri, che occupano nella mappa caratteri i codici 0-7. Ma anche in questo caso devi considerare che i caratteri vanno poi nella RAM del controller.

PS:
il disegno dei caratteri è corretto (a parte l'indirizzo, che esce dalla RAM consentita).