Go Down

Topic: PROBLEMA I2C LCD 20x4 (Read 20217 times) previous topic - next topic

Rebel_88

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?

Gabriel-99

bel acquisto solo $9.55 e pochissimo  :)

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 :

Quote
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

Code: [Select]
#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



leo72

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

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.


leo72

@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?

Rebel_88

Si infatti l'ho preso per il costo è bassissimo :D
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 :
http://www.ti.com/lit/ml/scyb031/scyb031.pdf
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?

Rebel_88

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?

leo72

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.

Rebel_88

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

leo72

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).

Gabriel-99

Quote
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) )

Rebel_88

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 ?

Rebel_88

@ leo 72
Il cavo l'ho inserito perche' sul mio modello non è presente il jumper che puoi vedere in quest'altra foto :
http://www.ebay.com/itm/IIC-I2C-TWI-SP-I-Serial-Interface-Board-Module-Port-For-Arduino-1602LCD-Display/310565362720?rt=nc&_trksid=p2047675.m1851&_trkparms=aid%3D222002%26algo%3DSIC.FIT%26ao%3D1%26asc%3D18058%26meid%3D2882176677533162240%26pid%3D100005%26prg%3D8304%26rk%3D2%26rkt%3D5%26sd%3D130748113121%26

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

gpb01


...
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 ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Rebel_88

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 :
Code: [Select]
#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.

Go Up