Problema I2C e LCD

Salve, stò per diventare pazzo a causa di un display Lcd collegato ad un LCD backpanel acquistato su Hobbytronics un LCD Backpanel che funziona un giorno si e l'altro no!!

il Display è quello dell'arduino starter kit:

e questo è il Backpanel:
http://www.hobbytronics.co.uk/lcd/i2clcd-backpack-v2

Il Codice che ho usato e che ieri funzionava l'ho preso dal pdf consigliato sempre su Hobbytronics:

/*
I2CLCD
Example Arduino sketch to communicate with HobbyTronics I2CLCD backpack
The I2CLCD backpack turns a standard HD44780 LCD display into an I2C addressable
Device which will free up many pins for use elsewhere.
Requires the Hobbytronics HTI2CLCD library
Copyright (c) 2011 www.hobbytronics.co.uk
This example code is in the public domain.
*/
#include <Wire.h>
#include <HTI2CLCD.h> // Include the Library
HTI2CLCD lcd; // Create an instance of the HTI2CLCD
const int lcd_address=58; // I2C Address of LCD backpack
unsigned long counter=0;
int bl=0; // Backlight power value
unsigned long currentTime;
unsigned long bloopTime;
unsigned long cloopTime;
byte updown=0;
// We can create up to 8 of our own characters to display
// Here we define 2 characters to be uploaded
byte ht_logo[8] = {
B10100,
B10100,
B11111,
B10110,
B10110,
B00010,
B00010,
};
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
void setup()
{
delay(800); // Give LCD time to configure itself
Wire.begin(); // join i2c bus
lcd.setType(lcd_address,4,20); // Define rows and columns for LCD
lcd.createChar(lcd_address,0, ht_logo); // Upload ht_logo as character 0
lcd.createChar(lcd_address,1, smiley); // Upload smiley as character 1
lcd.clear(lcd_address); // Clear LCD
lcd.backLight(lcd_address,10); // Set backlight to dim
// Display String
lcd.write(lcd_address,0); // Display our ht_logo character
lcd.print(lcd_address," HobbyTronics ");
lcd.write(lcd_address,1); // Display our smiley character
currentTime = millis();
cloopTime = currentTime;
bloopTime = currentTime;
}
void loop()
{
currentTime = millis();
if(currentTime >= (cloopTime + 1000)){
// Create String with Text and Number
lcd.setCursor(lcd_address,2,1);
char ascii[32];
sprintf(ascii,"Counter: %0.7d",counter);
lcd.print(lcd_address,ascii);
counter++;
cloopTime = currentTime; // Updates cloopTime
}
if(currentTime >= (bloopTime + 30)){
// Lets increase the brightness until we hit 150, then we reduce back to 0 again
if(updown==0) bl++;
else bl--;
if(bl==150) updown=1;
if(bl==0) updown=0;
lcd.backLight(lcd_address,bl);
bloopTime = currentTime; // Updates bloopTime
}
}

Il problema è che non si accende più il Display, non credo sia un problema di collegamento è talmente stupido che ci arrivo pure io, in pratica:

  • Arduino pin 5v --> 5v pin backpack
  • Arduino pin GND --> GND pin backpack
  • Arduino pin A4 --> SDA pin backpack
  • Arduino pin A5 --> SCL pin backpack
    come potete vedere dalla foto sotto:

l'unica cosa che mi da da pensare è che poco dopo aver visto che il display funzionava ho provato a collegare un MCP23017, non vorrei che si sia verificato un conflitto di "IC2 adress"

ho fatto una prova con questo IC2 Scanner
http://playground.arduino.cc/Main/I2cScanner
ma non trova nessun collegamento IC2. =(

Non sò più dove sbattere la testa, consigli?

Prima prova:
smonta tutto e prova a pilotare il display con la LiquidCrystal, collegandolo direttamente all'Arduino. In questo modo verifichi se il display funziona oppure no.

Grazie del consiglio, ma è stata una delle prime prove che ho fatto e ho usato lo sketch "Hello World"

il display funziona

L'unica cosa che mi viene in mente è che quando ho caricato lo sketch "I2CLCD" e il display non si è acceso, ho provato ha scollegare il cavo dal pin 5v di arduino e ogni volta che lo ricollego windows emette un suono come ad indicare che si verifichi un cortocircuito, non vorrei che sia andato il PIC del Backpanel.

Come posso verificare che il Backpanel sia ancora funzionante?

Saluti

Problema risolto era la scheda che era fallata oppure l'ho rovinata io non sò, fatto stà che cablando la seconda scheda che mi ero preso per scorta è tutto ok.

Ora usando questo codice:

#include <Wire.h>
#include <HTI2CLCD.h> // Include the Library
HTI2CLCD lcd; // Create an instance of the HTI2CLCD
const int lcd_address=58; // I2C Address of LCD backpack


void setup()
{
Wire.begin(); // join i2c bus
lcd.clear(lcd_address); // Clear LCD
}
void loop()
{
lcd.setCursor(lcd_address,0,1);
lcd.backLight(lcd_address,10);
lcd.print(lcd_address," HobbyTronics ");
delay(2000);
lcd.clear(lcd_address); // Clear LCD
lcd.setCursor(lcd_address,0,1);
lcd.backLight(lcd_address,100);
lcd.print(lcd_address," Ciao ");
delay(2000);
lcd.clear(lcd_address); // Clear LCD
}

riscontro i seguenti problemi:

  • ogni 2 secondi la scritta cambia ma rimane sempre il cursore lampeggiante alla fine delle frasi.
  • ogni tanto si incanta e mi scrive entrambe le frasi.

Inoltre come potete notare nell'immagine sotto:

sui pin SDA eSCL cè il posto per 2 resistenze secondo voi in quale caso bisogna metterle?

Biagetti:
riscontro i seguenti problemi:

  • ogni 2 secondi la scritta cambia ma rimane sempre il cursore lampeggiante alla fine delle frasi.

La libreria per pilotare il display LCD via I2C che uso io ha un comando per far sparire il cursore. Controlla se quella che usi tu ce l'ha.

  • ogni tanto si incanta e mi scrive entrambe le frasi.

Che vuol dire che si "incanta"? Io per "incantare" intendo "bloccare".

sui pin SDA eSCL cè il posto per 2 resistenze secondo voi in quale caso bisogna metterle?

La libreria Wire dell'Arduino attiva le pull-up interne ai pin A4 e A5.
Sono però pull-up da 20K minimo, sono altine per dare la corrente che serve al bus I2C ma dovrebbero essere più che sufficienti se non hai altri dispositivi I2C oltre a quella schedina.
Potresti provare saldando sulla schedina delle R da 2K2 in aggiunta a quelle interne. Se non te la senti a saldare componenti SMD, basta anche un paio di classiche R collegate alle piste del bus I2C.

Questa è la libreria che ho scaricato da Hobbytronics allegata alla pagina del prodotto del backpanel I2C:

/*
  HTI2CLCD.h - Library for I2C-LCD backpack
  Copyright (c) 2011 www.hobbytronics.co.uk  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
*/

#ifndef HTI2CLCD_h
#define HTI2CLCD_h
#if ARDUINO >= 100
	#include "Arduino.h"
#else
	#include "WProgram.h"
#endif

#define LCD_SETCGRAMADDR 0x40

class HTI2CLCD
{
  public:
    HTI2CLCD(void);
	 void clear(unsigned char lcd_address);
	 void createChar(unsigned char lcd_address, uint8_t location, uint8_t charmap[]);
	 void write(unsigned char lcd_address, uint8_t value);
	 void clearLine(unsigned char lcd_address, unsigned char line);
	 void backLight(unsigned char lcd_address, unsigned char brightness);
	 void setType(unsigned char lcd_address, unsigned char line, unsigned char col);
	 void setCursor(unsigned char lcd_address, unsigned char line, unsigned char col);
	 void print(unsigned char lcd_address, char *pstring);
	 void print(unsigned char lcd_address, const String &s);
	 void command(unsigned char lcd_address, unsigned char command);	 
  private:

};

#endif

non mi sembra che ci sia il comando per far sparire il cursore.
Ho dato una rapida occhiata alla Libreria "Lyquid Cristal" di Arduino e se non erro i comandi che mi servono per far sparire e smettere di lampeggiare il cursore sono:
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00

Ieri ho visto che esiste la libreria "LyquidCristal i2c" che ha gli stessi comandi descritti sopra, questa sera proverò con questa.

Che vuol dire che si "incanta"? Io per "incantare" intendo "bloccare".

Si, intendevo Bloccare, nel senso che esegue il loop come programmato poi dopo un pò si blocca e mi scrive entrambe le frasi e poi riparte.

Ho scaricato la libreria "LiquidCrystal I2C" e installata nella cartella di Arduino.
Verifico con "I2C Scanner" il I2C adress in formato HEX che in questo caso è 0x04.
Apro Arduino e carico l'esempio "Hello World" che trovo nel menu "LiquidCrystal I2C" vi cito il codice:

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

LiquidCrystal_I2C lcd(0x04,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}

void loop()
{
}

Non riesco a capire perchè non funziona.

Ho fatto la prova del nove caricando il codice semplificato con inclusa la libreria allegata alla Backpanel di Hobbytronics tutto funziona:

#include <Wire.h>
#include <HTI2CLCD.h> // Include the Library
HTI2CLCD lcd; // Create an instance of the HTI2CLCD
const int lcd_address=4; // I2C Address of LCD backpack (0x04 = 4)


void setup()
{
Wire.begin(); // join i2c bus
lcd.clear(lcd_address); // Clear LCD
}
void loop()
{
lcd.setCursor(lcd_address,0,1);
lcd.backLight(lcd_address,10);
lcd.print(lcd_address," HobbyTronics ");
delay(2000);
lcd.clear(lcd_address); // Clear LCD
lcd.setCursor(lcd_address,0,1);
lcd.backLight(lcd_address,100);
lcd.print(lcd_address," Ciao ");
delay(2000);
lcd.clear(lcd_address); // Clear LCD
}

però non ha tutti i comandi che ha la "LiquidCrystal I2C", si possono usare entrambe le librerie, una accende e configura il display e con l'altra formatti il testo?

inoltre ho visto che in alcuni scketch viene definita all'inizio il pin BACKLIGHT_Pin ma tramite I2C come riesco a capire quale il numero del pin?

scusate le domande da principiante, ma sono alle prime armi.

La LiquidCrystal_I2C serve per i display LCD collegati ad un PCF8574.
Il tuo ha un PIC programmato allo scopo e lo devi pilotare con la libreria fornita dal produttore.

quindi mi consigli di realizzarmi una scheda con il PCF8574?
tipo questo:
http://garagelab.com/profiles/blogs/tutorial-lcd-using-only-2-arduino-pins-with-pcf8574-and-i2c

Il display LCD mi serve per visualizzare i Preset di una Pedaliera MIDI.

No, ti sto dicendo che la LiquidCrystal_I2C lavora solo con il PCF8574 mentre la schedina che hai tu è basata su un microcontrollore pilotato con una propria libreria.

Se vuoi usare il PCF8574, allora preleva la libreria e tutta la documentazione da questa pagina:
http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/
Lo ZIP contiene anche lo schema di collegamento tra il display ed il PCF.

Siccome non ho a disposizione il PCF8574, sarebbe possibile usare la libreria LiquidCristal i2c con il port expander MCP23017?

Saluti

Io ho trovato questo:
http://spikenzielabs.com/SpikenzieLabs/I2C-SPI_LCD.html

Sembra faccia al caso tuo.

Intanto per sicurezza mi sono preso anche il PCF8574.

Oggi mi sono accorto che per realizzare il "Backpack I2C" gestibile con la Libreria Liquid Cristal I2C come descritto dal Jpeg allegato che vi allego sotto:

oltre che del PCF8574 ho bisogno anche del transistor BC557

http://www.robosapiensindia.com/resources/BC556_557[1].pdf

ma io purtroppo non ho a disposizione, ma ho qualcosa di simile che era all'interno dello starter Kit di Arduino ovvero il BC547

Secondo voi è possibile usarlo lo stesso?

Non è lo stesso, il BC557 è un PNP mentre il BC547 è un NPN. Cambia la logica di funzionamento. In pratica dando il comando per accendere la retroilluminazione spengi il display e viceversa

Ho trovato anche questo in una vecchia scheda C9013 mi sà che è sempre NPN ma non n sono sicuro

http://pdf1.alldatasheet.com/datasheet-pdf/view/81558/ETC/C9013.html

Sì è un NPN.
Non hai un 2N2222 o un BC327 nel kit?

Ho trovato un C9012 dovrebbe essere un PNP

Può andare.

premetto che non ho mai avuto a che fare con i transistor, solo con Valvole.

posso lasciare la resistenza da 1k sulla base del C9012?

per calcolare la resistenza da mettere sul collettore che calcolo devo fare? :slight_smile:

provo ad arrivarci con il ragionamento :

datasheet C9012: C9012 Datasheet
datasheet LCD Arduino Starter Kit: http://arduino.cc/documents/datasheets/LCD-WH1602B-TMI.pdf
datasheet del PCF8574: http://www.nxp.com/documents/data_sheet/PCF8574.pdf

se non erro a pagina 20 del pdf del display cè riportata la corrente denominata Supply Current che deve arrivare al pin 15 del LCD
ovvero:
max 20ma
min 14.4ma

quindi dovrei sapere quanta corrente eroga il pin 12 del PCF8574 ed a pagina 14 del suo datasheet dovrebbe essere descritta la corrente di uscita ovvero 25ma.

poi dovrei sapere quanta corrente eroga il pin +5v di arduino, dove è collegato l'emettitore del C9012 e se non erro 40ma

Ora dovrei capire come funziona un transistor ma per questa sera stacco.

Ovviamente si accettano consigli :slight_smile:

a presto!