Pages: [1]   Go Down
Author Topic: LCD shield con PCF8574  (Read 395 times)
0 Members and 1 Guest are viewing this topic.
Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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!


* lcd shield.jpg (369.3 KB, 729x678 - viewed 41 times.)

* IMG_1445.jpg (1187.41 KB, 2048x1536 - viewed 29 times.)

* IMG_1449.jpg (1704.83 KB, 2048x1536 - viewed 43 times.)
« Last Edit: November 08, 2013, 05:37:36 am by marcowip » Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
lcd2.begin(16, 2);
nel loop?
« Last Edit: November 08, 2013, 06:08:29 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Selvazzano Dentro - Padova
Online Online
Edison Member
*
Karma: 37
Posts: 1278
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Perché non posti lo schema?
Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
/*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);
}


* lcd shield.jpg (398.96 KB, 729x678 - viewed 26 times.)

* LCD.jpg (1155.44 KB, 4260x2946 - viewed 52 times.)
Logged

Pages: [1]   Go Up
Jump to: