PROBLEMA I2C LCD 20x4

Salve a tutti,
oggi mi è arrivato un LCD comprato da ebay, più precisamente questo :
http://www.ebay.com/itm/Blue-Display-IIC-I2C-TWI-SP-I-Serial-Interface2004-20X4-Character-LCD-Module-/161095107719?ssPageName=ADME:X:RTQ:US:1123

E' dotato di una interfaccia che mi consente di utilizzare l' I2C per comunicare. Come consigliato dal sito ho scaricato la libreria LiquidCrystal_I2C ed ho collegato i cavetti ad arduino come da diagramma allegato alla libreria ed ho collegato sul retro della scheda i due pin denominati LED perchè manca il jumper.
Ma quando vado a caricare uno sketch di esempio (sempre contenuto nella libreria) al LCD non accade niente e se stacco i due pin SDA e SLC il risultato è lo stesso ho lo schermo con due righe piene di pixel colorati e altre 2 senza nulla come nella foto che allego.

Non riesco a capire il problema. Qualcuno saprebbe aiutarmi?

bel acquisto solo $9.55 e pochissimo :slight_smile:

vedendo dai collegamenti e tutto giusto
quindi a livello di collegamenti e tutto OK
il problema e il software
prima di tutto devi sapere cose i2c :

I²C, acronimo di Inter Integrated Circuit (pronuncia i-quadro-ci o i-due-ci), un sistema di comunicazione seriale bifilare utilizzato tra circuiti integrati. Il classico bus I²C è composto da almeno un master ed uno slave (letteralmente "capo, padrone" e "sottoposto, schiavo"). La situazione più frequente vede un singolo master e più slave; possono tuttavia essere usate architetture multimaster e multislave in sistemi più complessi.
Il protocollo hardware dell'I2C richiede due linee seriali di comunicazione:

SDA (Serial DAta line) per i dati
SCL (Serial Clock Line) per il clock (per la presenza di questo segnale l'I2C è un bus sincrono)
Va aggiunta una connessione di riferimento detta, talvolta impropriamente, GND (non visualizzata in figura) e una linea di alimentazione Vdd a cui sono connessi i resistori di pull-up che può anche non essere condivisa da tutti i dispositivi (le tensioni tipiche usate sono +5 V o +3,3 V anche se sono ammesse tensioni più basse o più alte). Esistono esempi di architetture più complete.

in breve:
devi sapere anche che i2c comunica ad indirizzi (seriale)
ed ogni slave a un indirizzo
l'indirizzo serve per chiamare un slave (quindi al tuo Arduino potresti aggiungerne pure una ventina di LCD)
QUINDI IL PROBLEMA E CHE NON CONOSCI L'INDIRIZZO DEL LCD

Quando te includi la libreria dopo di averla messa, devi diciarare l'indirizzo

#include <Wire.h>  // la libreria wire serve per la comunicazione i2c
#include <LiquidCrystal_I2C.h>   //includi la libreria
 
LiquidCrystal_I2C lcd(0x38,4,20);  // qua metti l'indirizzo 0x38 in questo caso e 0x38 ma può essere anche un altro quindi                             
                                                             //devi chiederlo a chi te la venduto.       4,20  sta a quante righe e composto il tuo lcd
                                                             // nel tuo caso e 4,20 (4 sta alle righe giù)(20 alle righe a destra)
 
void setup()
{
  lcd.init();                      
  
  // qui esegui il programma che scrivera
  lcd.backlight();
  lcd.print("Ciao come va XD");
}
 
void loop()
{
}

echo questo e il codice.

per l'indirizzo del tuo LCD io non lo so devi chiedere al tuo venditore che indirizzo i2c usa il tuo LCD

link per LCD con i2c
_**Linuxmx migliori ragazze, notizie per adulti e video di sesso gratuiti

un po di info sul I2C

_**http://www.logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/**_

@Gabriel-99:
forse non hai letto il mio avviso:

leo72:
Gabriel-99, o inizi a scrivere in maniera decente, rispettando la Netiquette, o ti cancello i thread/post.

Non puoi usare il bold, il maiuscolo, ed i colori messi a casaccio. I tuoi post sembrano arlecchinate.
Costringi la gente a fare fatica a leggere i tuoi post.

@Rebel:
non ho capito cos'è che hai fato ai pin del LED. Dalla foto hai attorcigliato un pezzo di cavetto fra di loro. Perché?
Dallo schema mi pare di capire che lì dovresti mettere una R di limitazione, ma che cos'è che alimenta esattamente quella coppia di pin? La retroilluminazione?

Inoltre l'indirizzo I2C di quel display non lo capisco:
nella scheda del prodotto viene detto che è 0x20 mentre nello sketch di esempio viene detto che è 0x27.
Non hai il datasheet del display? Il venditore non lo fornisce?

Si infatti l'ho preso per il costo è bassissimo :smiley:
Le basi dell' I2C le conosco per via di alcuni studi ma praticamente l'ho utilizzato solo una volta con un sensore capacitivo della sparkfun.
Sul datasheet è scritto che per il mio modello PCF8574 l indirizzo CON a0-a1-a2 A MASSA (come credo che sia sul mio dispositivo di default) è 0x20. Infatti quando provo gli schetch impongo che L'indirizzo sia 0x20 e che il tipo di lcd è 40x4.
Questo è il datasheet :

Ma il risultato è quello che si puo vedere dalle immagini.
In più ho scaricato una "nuova libreria" New LiquidCrystal da https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads ma il risultato è sempre lo stesso.
Qualche consiglio?

In tutti gli altri modelli di quel dispositivo viene posto un jumper tra i due pin per cortocircuitarli, quello serve per la retroilluminazione se non li metto lo schermo rimane spento. Visto che non ho a portata di mano un jumper decente ho dovuto usare un pezzo di cavo. Secondo voi potrebbe essere un problema?

Se il modulino è pilotato dal PCF8574, controlla sul chip la sigla esatta
PCF8574
PCF8574A
Cambia infatti la parte fissa dell'address I2C.

Il PCF8574 ha un address che può andare da 0x20 a 0x27 mentre il modello "A" va da 0x38 a 0x3F.
A questa parte va sommata quella impostata dai pin A0..A2 del chip.

Il modulino ha un chip TLPCF8574T, è il modello con l'address da 0x20 a 0x27.
Adesso pero' mi sorge un dubbio. Guardando l'immagine che allego secondo voi i pin A1,A2 e A3 sono a massa veramente? perchè le piazzole non sono collegate ne da una saldatura ne da uno di quei circuiti che si puo tagliare. Ora controllo con il tester e vi faccio sapere

Non mi hai risposto circa quel nodo fatto col cavetto su quei 2 pin. Io lo leverei, se non hai un resistore da montarci (sempre che sia dove mettere la R di limitazione per la retroilluminazione).

Visto che non ho a portata di mano un jumper decente ho dovuto usare un pezzo di cavo. Secondo voi potrebbe essere un problema?

Non penso che sia un problema basta che faccia contatto.

Ps.: leo scusa non lo letto non pensavo che rientrava nel regolamento (pero fa più stile 8) )

Ho preso un tester e ho notato che i pin A0-A1-A2 non sono collegati a massa. Infatti puntando con il tester per vedere la continuità questa non è presente.Guardando la scheda le piazzole più vicine alle scritte A0 A1 A2 sono collegate a massa mentre le 3 superiori sono collegate con i pin del chip.
A questo punto mi chiedo : essendo quei tre piedini floating il loro valore nell'indirizzamento è 0 ?

@ leo 72
Il cavo l'ho inserito perche' sul mio modello non è presente il jumper che puoi vedere in quest'altra foto :

Cmq se lo levo non cambia molto, scompare solo la retroilluminazione dello schermo e il mio problema di fondo rimane.

Rebel_88:
...
A questo punto mi chiedo : essendo quei tre piedini floating il loro valore nell'indirizzamento è 0 ?

Scusa, ma fai girare un I2C Scanner e scopri a che indirizzo risponde :wink:

Guglielmo

Questo metodo non lo conoscevo! Grazie mille per la risposta.
Ho trovato cosi che l'indirizzo è 0x27.
Allora l'ho inserito in uno sketch ottenendo :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {	0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
  
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  lcd.home();
  
  lcd.print("Hello world...");
  lcd.setCursor(0, 1);
  lcd.print(" i ");
  lcd.write(3);
  lcd.print(" arduinos!");
  delay(5000);
  displayKeyCodes();
  
}

// display all keycodes
void displayKeyCodes(void) {
  uint8_t i = 0;
  while (1) {
    lcd.clear();
    lcd.print("Codes 0x"); lcd.print(i, HEX);
    lcd.print("-0x"); lcd.print(i+16, HEX);
    lcd.setCursor(0, 1);
    for (int j=0; j<16; j++) {
      lcd.write(i+j);
    }
    i+=16;
    
    delay(4000);
  }
}

void loop()
{

}

Quando lo faccio girare lo schermo dell' LCD (se il mio jumper fatto in casa è inserito ) comincia a lampeggiare in maniera quasi random non facendo visualizzre nulla.
Se invece il jumper non lo metto allora lo schermo rimane scuro con quei rettangoli di pixel come nella figura del primo post...
non so cosa fare.

Normalmente la fila di rettangolini scuri sulla 1a e 3a fila indicano chiaramente un problema di comunicazione, quei rettangoli sono il segnale che il chip è alimentato ma non riceve dati. Quindi qualcosa non funziona, o lo shield o i collegamenti fatti da te.

Sinceramente spero che siano i collegamenti fatti da me...cmq devo connettere solo 4 fili non penso di crare problemi.
Ho collegato GND -5V(dall' arduino) SDA al pin Analog4 e SCL all'analog5 tramite dei fili per breadboard...in più il test fatto per vedere l'indirizzo della periferica I2C da esito positivo a 0x27 quindi credo che il collegamento sia fatto bene.
Il fatto che ottengo un indirizzo dal test puo significare che anche la periferica funziona correttamente?

Se la periferica ha risposto su 0x27 il collegamento I2C dovrebbe funzionare.

E tutti gli altri sintomi cosa indicano allora?
Perchè lo schermetto comincia a lampeggiare se inserisco l'indirizzo 0x27 come indirizzo di collegamento per l'I2C?
Nonostante le numerose prove che ho fatto le righe alternate sull' LCD persistono.
Spero di venirne a capo con il vostro aiuto

Non so se può esserti utile, ma io ho dovuto dichiarare i vari pin usati dall' IC2 per la connessione all'LCD, prova con questa :

// settaggio indiriz, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

ciao Dimi

p.s: Hai provato a regolare la luminosità dello schermo dal trimmer ? ]:smiley: