SainSmart 1602 LCDKeyPad Shield kein Text

Hallo Zusammen,

habe mir vor kurzem ein SainSmart 1602 KeyPad Shield berstellt. Heute ist es nun gekommen. Und jetzt nach über 3 Stunden habe ich es noch nicht geschafft einen Text anzeigen zu lassen.

Das einzige was mir angezeigt wird sind Pixelfelder. Am Poti habe ich auch schon jeweils in beide Richtungen bis an Anschlag gedreht. Kein Bild. Das Keypad funktioniert. Habe die Kontakte des Displays mit dem Pins unterhalb durchgemessen. Alles iO.

Woran könnte es noch liegen?

Habe mehrere Beispiel Sketche und auch schon 2 Versionen der LiquidCrystal Lib versucht.

#include <LiquidCrystal.h>
#include "Wire.h"

/*******************************************************

This program will test the LCD panel and the buttons of
the DFRobot LCD Keypad Shield for Arduino
Product code : RB-Dfr-07
http://www.robotshop.com/dfrobot-lcd-keypad-shield-arduino-1.html

Note cct error identified by Arduino forum discussion at:
http://arduino.cc/forum/index.php/topic,96747.0.html
which advises insertion of a Germanium 1n34a or a Schotky 1N5819
diode between pin 10 and the base of Q1 (K to pin 10).

sample code originally by Mark Bramwell, July 2010
modifications by Dion Weston, March 2012



********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int backLight   = 10;    // LCD Panel Backlight LED connected to digital pin 10
int lightLevel  = 255;   // Initialise light full on
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my [Mark Bramwell's] buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
 return btnNONE;  // when all others fail, return this...
}

void setup()
{
 lcd.begin(16, 2);              // start the LCD library
 lcd.setCursor(0,0);            // move cursor to beginning of line "0"
 lcd.print("Backlight adjust"); // print a simple message
 
}
 
void loop()
{
 analogWrite(backLight, lightLevel);
 lcd.setCursor(13,1);            // move to position 13 on the second line
 lcd.print(lightLevel);

 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     lcd.print("LED On          ");
     lightLevel = 255;
     break;
     }
   case btnLEFT:
     {
     lcd.print("LED Off         ");
     lightLevel = 1;
     break;
     }
   case btnUP:
     {
     lcd.print("LED Fade Up     ");
     if (lightLevel < 255) lightLevel += 1;
     break;
     }
   case btnDOWN:
     {
     lcd.print("LED Fade Down   ");
     if (lightLevel > 1) lightLevel -= 1;
     break;
     }
   case btnSELECT:
     {
     lcd.print("Select          ");
     break;
     }
     case btnNONE:
     {
     lcd.print("                ");
     break;
     }
 }
 
}
/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 25 July 2009
 by David A. Mellis
 
 
 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include "Wire.h"
#include "LiquidCrystal.h"
#include <DFR_Key.h>
DFR_Key keypad;


const int RS = 8;
const int ENABLE = 9;
const int D4 = 4;
const int D5 = 5;
const int D6 = 6;
const int D7 = 7;

int DimLevel = 255;
int localKey = 0;
String keyString = "";


/*
Analog 0 	Button (select, up, right, down and left)
Digital 4 	DB4
Digital 5 	DB5
Digital 6 	DB6
Digital 7 	DB7
Digital 8 	RS (Data or Signal Display Selection)
Digital 9 	Enable
Digital 10 	Backlit Control
*/

// initialize the library with the numbers of the interface pins
  LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
  analogWrite(10, DimLevel);
  keypad.setRate(10);
}

void loop() {
  localKey = keypad.getKey();
  switch (localKey) {
    case 2: DimLevel = 0; RenewDimLevel(); break;
     case 3: DimLevel++; RenewDimLevel(); break;
     case 4: DimLevel--; RenewDimLevel(); break;
     case 5: DimLevel = 255; RenewDimLevel(); break;
  }
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
  lcd.setCursor(1, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

void RenewDimLevel()
{
  if (DimLevel > 255) { DimLevel = 0; }
  if (DimLevel < 0) { DimLevel = 255; }
   analogWrite(10, DimLevel); 
}

Dachte auch schon das bei meinen Arduino Mega vielleicht ein Port defekt sein könnte. Habe es auf einem anderen Arduino Uno Probiert. Gleiches Symptom.

Harrdy: Dachte auch schon das bei meinen Arduino Mega vielleicht ein Port defekt sein könnte.

Was nicht ist, kann ja noch werden. :grin:

Mit dem LCD Keypad Shield darfst Du schon mal nicht versuchen, die Hintergrundbeleuchtung per PWM-Steuerung in der Helligkeit zu regulieren.

Gerade nochmal die Schaltung geprüft: Darfst Du wohl doch.

Hast Du mal alle Beinchen überprüft, ob alle Beinchen vom Shield auch sauber in der dazugehörenden Buchse auf dem Arduino stecken? Nicht zufällig eins daneben?

Verschiedene LiquidCrystal-Libraries braucht man nicht zu probieren, das LCD Keypad Shield funktioniert mit der bei der Arduino-Software mitgelieferten LiquidCrystal-Library, man muß nur die Initialisierung setzen auf: LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Wenn das Display mit der vom Hersteller bereitgestellten Demosketch nicht funktioniert dann reklamiere es und laß es Dir umtauschen. Die Gegenprobe mit einem anderen Arduino hast Du ja schon gemacht. Du hast das LCD Shield ohne zusätzliche Shields oder elektronik am Arduino angeschlossen?

Die weißen Balken auf dem Display (angehängtes Foto) bedeuten daß der Kontrast richtig eingestellt ist und der LCD Controller das LCD ansteuert. Es funktioniert die Datenübertragung aber nicht und darum wird das Display nicht inizialisiert.

Grüße Uwe

uwefed: Wenn das Display mit der vom Hersteller bereitgestellten Demosketch nicht funktioniert dann reklamiere es und laß es Dir umtauschen. Die Gegenprobe mit einem anderen Arduino hast Du ja schon gemacht. Du hast das LCD Shield ohne zusätzliche Shields oder elektronik am Arduino angeschlossen?

Das ist es ja gerade: Er testet das Shield NICHT mit dem vom Hersteller bereitgestellten Demosketch und er testet es auch NICHT mit dem Hello-World Beispielsketch der Liquidcrystal-Library (bei dem die Initialisierung zu ändern wäre), sondern er testet den Sketch mit einem Spezial-Sketch zur Helligkeitsregelung der Hintergrundbeleuchtung.

Wenn mich nicht alles täuscht, sind die meisten Keypad-Shields und auch das von Sainsmart NICHT für eine PWM-Helligkeitsregelung der Hintergrundbeleuchtung vorgesehen und dafür auch nicht "safe".

Ich bin nicht so der Schaltungs-Freak, aber vielleicht war mein erster Gedanke (den ich oben wieder gestrichen habe) wohl doch der richtige: http://sainsmart.com/zen/documents/20-011-901/schematic.pdf

Schau Dir mal den Transistor an, und wie der Transistor mit GND, VCC und D10 verschaltet ist.

Wenn D10 auf "OUTPUT" und "HIGH" geschaltet ist oder per PWM angesteuert wird, gibt es einen recht veritablen Kurzschluss zwischen D10 und GND über den Transistor, oder?

Damit könnte man dann natürlich das D10-Beinchen am Arduino wegen gefährlicher Überlastung killen. Gerne auch gleich an mehreren Arduinos nacheinander weg. Eine Verschrottung nach der nächsten.

So wie ich die Schaltung lese und wie ich es von meinem eigenen Keypad-Shield kenne, sind bei diesem Shield nur "ON" und "OFF" für die Hintergrundbeleuchtung erlaubt, so wie es auch die LiquidCrystal-Library anbietet.

"ON" ==> D10 ist INPUT und LOW "OFF" ==> D10 ist OUTPUT und LOW

Es ist bei dieser Schaltung verboten, D10 auf OUTPUT und HIGH oder mit analogWrite auf PWM zu schalten. Das führt zu einer erheblichen Überlastung des D10 Pins am Controller, mit der Gefahr, dass er durchbrennt.

uwefed: reklamiere es und laß es Dir umtauschen.

Ja, das lieben alle Hersteller: Der Kunde reklamiert einwandfreie Ware, nur weil er nicht in der Lage ist, das technische Gerät korrekt zu bedienen.

Das ist es ja gerade: Er testet das Shield NICHT mit dem vom Hersteller bereitgestellten Demosketch und er testet es auch NICHT mit dem Hello-World Beispielsketch der Liquidcrystal-Library

Da habe ich ja einiges übersehen.

Ich bin nicht so der Schaltungs-Freak, aber vielleicht war mein erster Gedanke (den ich oben wieder gestrichen habe) wohl doch der richtige: http://sainsmart.com/zen/documents/20-011-901/schematic.pdf

Da fehlt im Schaltplan der Basiswiderstand oder man darf nur LOW oder hochohmig (Pin als Eingang) aber kein HIGH auf das Pin D10 geben . Der Widerstand zwischen Basis und +5V schaltet die Hintergrundbeleuchtung ohne Ansteuerung ein. Mit einem LOW kann man die Hintergrundbeleuchtung abschalten. Mit einem HIGH macht man einen Kurzschluß zwischen 5V und 0,7V (Basis-Emittor Strecke Transistor). Darum muß ich sagen die Hintergrundbeleuchtung DARF NICHT mittels PWM ( digitalWrite(D10,x); ) geregelt werden. Du kannst Deine eigene PWM- Ansteuerung programmieren, aber bei der MUß als Ausgangspegel LOW und Hochohmig (Eingang) ausgegeben werden.

Lieber Harrdy Tu uns bitte den Gefallen und teste den Sketch sainsmart.com/zen/documents/20-011-901/keypad_lcd.zip Dann reden wir weiter.

Grüße Uwe

uwefed: Da fehlt im Schaltplan der Basiswiderstand oder man darf nur LOW oder hochohmig (Pin als Eingang) aber kein HIGH auf das Pin D10 geben .

Hier habe ich auch ein geändertes Schaltbild gefunden. Shields, die nach diesem Schaltbild von DFRobot gefertigt sind, können per PWM in der Helligkeit geregelt werden: http://www.dfrobot.com/image/data/DFR0009/LCDKeypad%20Shield%20V1.0%20SCH.pdf

Man beachte hier den zusätzlichen Widerstand zwischen D10 und Transistor.

Ich glaube, die von Hardy geposteten Sketche basieren weitgehend auf dem Democode, den DFRobot zu seinen DFRobot-Shields als Democode veröffentlicht. Allerdings ist der Code mit PWM-Regelung des Backlight nur zu den neueren Shields von DFRobot kompatibel und nicht zu denen von Sainsmart, die noch auf dem alten Keypad-Shield-Schaltbild beruhen.

Mit 10kOhm Basiswiderstand braucht es schon einiges um den Transistor in Sättigung zu bringen. Was für ein Transistor ist das? Q1 und 9013 sagt mir nicht viel.

Grüße Uwe

Google spuckt das aus: http://phys.thu.edu.tw/~mengwen/exp-electronics/datasheet/SS9013.pdf http://www.adrirobot.it/datasheet/transistor/pdf/9013%20Transistor%20NPN.pdf

Ziemlich normaler NPN

uwefed: Mit 10kOhm Basiswiderstand braucht es schon einiges um den Transistor in Sättigung zu bringen. Was für ein Transistor ist das? Q1 und 9013 sagt mir nicht viel.

Grüße Uwe

-Qx ist lediglich die Betriebsmittelkennzeichnung ;)

Also das Shield sitzt der auf dem Arduino ohne irgendetwas daziwschen. Und zum Demoskretch. Auch wenn man Pin10 nicht mit PWM Dimmen darf was ich nicht wusste. Den Sketch mit dem Dimmen habe ich erst viel viel später nach 2 Stunden probiert um überhaupt eine Reaktion vom Shield zu sehen.

Den ersten Sketch den ich probiert hatte war der HelloWorld Sketch. Nachdem ich dort aber keine Anzeige erhalten habe. Habe ich weitere Sketche probiert (under anderem auch den von dir geposteten sainsmart.com/zen/documents/20-011-901/keypad_lcd.zip & sämtliche die bei der IDE bereits dabei waren natürlich mit Anpassung der Pins, Uwe). Leider ohne Erfolg. Die zwei welche ich gepostet hatte, waren eigentlich nur ein Beispiel was ich schon alles versucht hatte.

Gerade nochmal den Schaltplan und die Artikelbeschreibung angesehen. Ich bin davon ausgegangen das adjustable backlighting bedeutet das es Dimmbar ist und nicht nur An/Aus.

Aber ich werde heute nachmittag sainsmart.com/zen/documents/20-011-901/keypad_lcd.zip probieren. Da ich das Zip aus der ebay beschreibung hatte wo ich dieses Shield gekauft habe. Vielleicht war da auch ein Hund drin.

Gruß Sven

sschultewolter:
-Qx ist lediglich die Betriebsmittelkennzeichnung :wink:

Diesen Verdacht hate ich irgendwie :wink: :wink: :wink:
Grüße Uwe

Harrdy:
Also das Shield sitzt der auf dem Arduino ohne irgendetwas daziwschen. Und zum Demoskretch. Auch wenn man Pin10 nicht mit PWM Dimmen darf was ich nicht wusste. Den Sketch mit dem Dimmen habe ich erst viel viel später nach 2 Stunden probiert um überhaupt eine Reaktion vom Shield zu sehen.

Den ersten Sketch den ich probiert hatte war der HelloWorld Sketch. Nachdem ich dort aber keine Anzeige erhalten habe.

Am HelloWorld-Sketch muss nur die Initialisierung der Pins passend zum LCD Keypad Shield geändert werden. Das ist ist geänderte Version:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // Sainsmart LCD keypad shield

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}
  1. Teste diese Sketch! Läuft? Problem gelöst.

  2. Hast Du “andere LiquidCrystal-Libraries” installiert? Falls Du andere Libraries installiert hast, mache die Änderungen rückgängig. Deinstalliere die nicht funktionierenden zusätzlichen Libraries und installiere ggf. wieder die originale LiquidCrystal Library. Oder teste mit einer frischen Installation der Arduino-Software. Läuft? Dann war nur die Softwareinstallation beschädigt. Problem gelöst.

  3. Das Testen mit dem HelloWorld Sketch mit falscher Pinbelegung ist normalerweise harmlos. Das Testen mit PWM an Pin-10 bei aufgestecktem Shield kann das Arduino-Board beschädigen und den Pin-10 oder andere Pins im selben Port des Controllers himmeln. Falls Du noch ein Arduino-Board hast, auf dem noch niemals die falsche PWM-Ansteuerung bei aufgestecktem Keypad-Shield probiert hast, teste mit dem richtigen Sketch und diesem “frischen” Board. Läuft? Dann ist dieses Board und das Shield in Ordnung, aber die Boards, auf denen es nicht läuft, sind defekt.

Wenn 1. und 2. nichts bringen oder 2. nicht durchführbar ist, weil Du auf allen Deinen Boards durch versuchte PWM-Ansteuerung bei aufgestecktem Shield das Board potentiell beschädigt hast, müßtest Du mal mit anderer Hardware und Sketchen testen, ob überhaupt noch alle Pins auf dem Controller-Board völlig in Ordnung sind und funktionieren.

Hallo Zusammen,

also habe die Arduino IDE komplett frisch installiert. Und dann deinen Code getestet jurs. Geht leider nicht. Nun bin ich gerade dabei die einzelnen Ports des Arduino zu Testen. Zunächst mit einer simplen HIGH/LOW Schaltung um eine LED zum Blinken zu bewegen. Sieht ganz gut aus. Alle Ports lassen sich an/ausschalten und die LED blinkt. Wobei Ein Port dabei ist der sich anderst verhält.

(Anode an Arduino Ports, Kathode über 1kohm an GND)

Port Nr. 9. Dort schaltet sich die LED nicht ab. Man sieht zwar einen unterschied zwischen HIGH/LOW. Einmal glimmt sie nur etwas und einmal ist sie so Hell wie auf allen anderen Ports. Nun meine Frage, ist das Normal? Habe mir am Donnerstag nochmals einen neuen Arduino bestellt der hoffentlich am Montag kommen dürfte. Damit werde ich das LCD Shield dann probieren. Dort kann ich 100% ausschließen das bereits irgendwann mal etwas falsch angesteckt war.

Gruß Sven

Port Nr. 9. Dort schaltet sich die LED nicht ab. Man sieht zwar einen unterschied zwischen HIGH/LOW. Einmal glimmt sie nur etwas und einmal ist sie so Hell wie auf allen anderen Ports. Nun meine Frage, ist das Normal?

Nein, ist nicht normal. Der Pin ist kaputt.

Grundsätzliches: Bei älteren Arduinos (vor UNO) verhält sich Pin 13 anders, weil dort eine LED mit 500 Ohm Widerstand auf Masse geschaltet ist. Beim UNO, Mega 2560, Leonardo, Micro ist ein Operationsverstärker verbaut, der die LED ansteuert und das Pin 13 nicht belastet. Darum verhält sich das Pin 13 gleich wie die anderen.

Grüße Uwe

Harrdy: Nun meine Frage, ist das Normal?

Nein, es sieht aus als wenn Du Digitalpin 9 gekillt hast. Das ist ein Bit im selben Portregister Port-B, in dem auch D10 enthalten ist, den Du so stark überlastet hast. D9 ist offenbar gegrillt. Dass bei Überlastung nicht direkt der überlastete Eingang kaputtgeht, sondern ein Bit daneben, kann passieren.

Wenn Du genügend Experimentier-Verbindungskabel mit Male/Female Enden hättest, könntest Du das Shield versuchsweise durch Kabel mit dem Board verbinden, und dabei statt D9 einen anderen Pin verbinden, z.B. D11. Also verkabeln z.B.: Board - Shield D11 - D9 D10 - D10 D8 - D8 D7 - D7 D6 - D6 D5 - D5 D4 - D4 A0 - A0 GND - GND 5V - 5V

Und dann als Initialisierung statt "LiquidCrystal lcd(8, 9, 4, 5, 6, 7); " den Ersatzpin D11 statt des defekten D9 im Sketch einsetzen, z.B.

LiquidCrystal lcd(8, 11, 4, 5, 6, 7);

Also anstelle des dekten Digitaleingangs einen (hoffentlich) einwandfreien verwenden.