Go Down

Topic: LCD shield con PCF8574 (Read 522 times) previous topic - next topic

marcowip

Nov 08, 2013, 11:28 am Last Edit: Nov 08, 2013, 11:37 am by marcowip Reason: 1
Ciao a tutti,
ho bisogno di una mano per risolvere un problema. Giorni fa ho deciso che avrei costruito una shield che mi permettesse di collegare velocemente il display all'arduino.
Ho voluto fare in modo da poter scegliere se:
• collegare il display con il classico collegamento che sfrutta 6 cavi ("che ho chiamato modalità normale"),
• possibilità di collegare il display sfruttando il collegamento I2C mediante l'uso dell'integrato PCF8574 (che ho chiamato "modalità I2C").
Ho quindi saldato su una proto shield l'integrato in questione e due file di pin femmina seguendo lo schema allegato (scusatemi se l'ho fatto con fritzing ma mi serviva per scegliere il percorso dei cavi). Ho completato il tutto con gli opportuni resistori e con un potenziometro da 10k per il contrasto.
Lo sketch che ho scritto per provare il tutto è questo:
Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>

LiquidCrystal_I2C lcd1(0x38,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal lcd2(12, 11, 5, 4, 3, 2);

void setup()
{
 lcd1.init();                      // initialize the lcd

 // Print a message to the LCD.
 lcd1.backlight();
 lcd1.print("Test Display I2C");
 lcd1.setCursor(0,1);
 lcd1.print("(mod. I2C)");
 lcd2.begin(16, 2);
 lcd2.clear();
 lcd2.setCursor(0, 0);
 lcd2.print("Test Display I2C");
 lcd2.setCursor(0, 1);
 lcd2.print("(mod. normale)");
 delay(2000);
}

void loop()
{
 lcd1.print("(mod. I2C)");
 lcd1.setCursor(0,1);
 lcd1.print(analogRead(A0));
 lcd2.begin(16, 2);
 lcd2.clear();
 lcd2.setCursor(0, 0);
 lcd2.print("(mod. normale)");
 lcd2.setCursor(0, 1);
 lcd2.print(analogRead(A0));
 delay(100);
}


ARRIVIAMO AL PROBLEMA.
Il problema è che se collego il display in modalità normale (che è anche la più semplice in quanto a collegamenti) il display dopo un po' di tempo mostra sullo schermo caratteri strani, mentre se lo collego in modalità I2C tutto funziona alla perfezione.
Da cosa può dipendere questo problema? Le due file di pin femmina a cui collegare il display hanno in comune solo l'alimentazione e il trimmerino per il contrasto. Inoltre, il comportamento anomalo c'è anche se levo il PCF8574 dalla shield.
Allego anche qualche foto della shield finita.

Grazie a tutti dell'aiuto!

marcowip

si si compila, ma comunque la prova l'ho fatta anche solo con una delle due librerie alla volta. E il risultato è sempre lo stesso: con la I2C funziona bene e con la normale funziona male.

marcowip

ho provato anche a collegare 2 display contemporaneamente e il risultato è sempre lo stesso.

PaoloP

#3
Nov 08, 2013, 12:06 pm Last Edit: Nov 08, 2013, 12:08 pm by PaoloP Reason: 1
Ops, volevo modificare invece è sparito.  :smiley-roll-blue:

Non so come risolvere il problema se non dirti di ricontrollare le saldature.
Comunque visto che ti servirà per prototipare rapidamente avresti dovuto modificare gli attacchi dei pin in modo da lasciare liberi almeno il pin 2, 4, 10, 11, 12 e 13.
Il 2 per un eventuale interrupt. Il 4 per la SD, dal 10 al 13 per lo SPI.
Ti rimarrebbero il 3, 5, 6, 7, 8, 9 e l'inizializzazione sarebbe
Code: [Select]
LiquidCrystal lcd2(9, 8, 7, 6, 5, 3);

Cosa ne pensi?

p.s. Controlla anche la memoria libera. Anche se con lo sketch minimale non dovrebbe essere questo il caso.

p.s.2
Perché ripeti
Code: [Select]
lcd2.begin(16, 2);
nel loop?

cyberhs

Personalmente ho qualche difficoltà a risalire allo schema dal layout di Fritzing.

Perché non posti lo schema?

marcowip

Per quanto riguarda  i pin, penso che hai perfettamente ragione. Farò questa modifica. La ripetizione di lcd.begin è un errore che correggerò, grazie per la segnalazione (anche se questo stesso errore non c'era in altri sketch che ho provato).  Come si controlla invece la memoria libera?

Appena posso posto lo schema.

PaoloP

Per la RAM --> http://forum.arduino.cc/index.php?topic=115980.0
oppure --> http://www.leonardomiliani.com/2012/come-sapere-loccupazione-di-ram-del-proprio-sketch/

marcowip

ciao a tutti,
ho risolto il problema. Ho dissaldato i collegamenti per utilizzare i pin 3, 5, 6, 7, 8, 9 come diceva PaoloP e adesso funziona. Doveva essere un problema di saldature. La cosa più strana era che il display per 5 minuti funzionava e poi dava letteralmente i numeri. Ho controllato pure la ram usata dallo sketch con uno dei metodi consigliatimi ma veniva fuori un valore veramente esiguo.
Grazie a tutti per l'aiuto!

PaoloP


Grazie a tutti per l'aiuto!

Prego.

Se poi vuoi rilasciare i file con la shield corretta e uno sketch di prova, così qualcuno se vuole può replicare il tuo progetto, la comunità apprezzerà sicuramente.

marcowip

Certamente! Appena posso commento bene lo sketch, faccio uno schema come si deve e posto il tutto. Buona serata

marcowip

Ecco di seguito:
• lo sketch con cui testare la shield
• una immagine con la disposizione dei componenti sulla protoshield
• lo schema dei collegamenti

Code: [Select]
/*Sketch di prova della LCD Shield, utile per verificare il corretto funzionamento della stessa.
Lo sketch è preparato per la verifica sia del display normale che per quello collegato mediante I2C.
Volendo, è anche possibile collegare due display contemporaneamente.
E' necessario collegare un potenziometro al pin A0 per visualizzare sul display il valore letto.

by marcowip

Questo sketch è di pubblico dominio

*/

#include <Wire.h> //libreria necessaria alla comunicazione tramite prot. I2C
#include <LiquidCrystal_I2C.h> //libreria necessaria per utilizzare il display mediante I2C
#include <LiquidCrystal.h> //libreria necessaria per utilizzare il display in modo classico (mediante 6 fili)

LiquidCrystal_I2C lcd1(0x38,16,2);  //Imposto l'indirizzo del display e il suo formato
//per l'indirizzo corretto fare riferimento al datasheet dell'integrato utilizzato
LiquidCrystal lcd2(9, 8, 7, 6, 5, 3); //Imposto i pin utilizzati per la connessione classica del display

void setup()
{
  lcd1.init(); //inizializzo l'LCD collegato mediante I2C
  lcd1.backlight(); //Accendo la retroilluminazione del display
  lcd1.print("Test Display I2C"); //stampo sul display alcune righe per 2 secondi
  lcd1.setCursor(0,1);
  lcd1.print("(mod. I2C)");
  lcd2.begin(16, 2); //inizializzo il display con connessione classica
  lcd2.clear();
  lcd2.setCursor(0, 0); //stampo sul display due righe per 2 secondi
  lcd2.print("Test Display I2C");
  lcd2.setCursor(0, 1);
  lcd2.print("(mod. normale)");
  delay(2000);
}

void loop()
{
  //leggo il valore su A0 e lo stampo sui display
  lcd1.clear();
  lcd1.setCursor(0, 0);
  lcd1.print("(mod. I2C)");
  lcd1.setCursor(0,1);
  lcd1.print(analogRead(A0));
  lcd2.clear();
  lcd2.setCursor(0, 0);
  lcd2.print("(mod. normale)");
  lcd2.setCursor(0, 1);
  lcd2.print(analogRead(A0));
  delay(100);
}

Go Up