Warning to users of some vendors LCD keypad shields

Hey guys,
I just got this 1602 keypad shield http://imall.iteadstudio.com/im120417018.html and found this thread.
I've read through here and did the test - checked out bad, but I'm still very confused as to whether or not this is a shield that has the mentioned problem.
As a noob I see the D10 input mod from post #3 as the best "fix", but I'm unsure as to how to use this.
Could someone please upload a sample code with the D10 correction so me and others can test it out and use it in our future sketches?

Cheers!

Fyod:
Hey guys,
I just got this 1602 keypad shield http://imall.iteadstudio.com/im120417018.html and found this thread.
I've read through here and did the test - checked out bad, but I'm still very confused as to whether or not this is a shield that has the mentioned problem.
If you run the test sketch and it reports the shield has the issue. The shield has the issue.

As a noob I see the D10 input mod from post #3 as the best "fix", but I'm unsure as to how to use this.
Could someone please upload a sample code with the D10 correction so me and others can test it out and use it in our future sketches?

"sample code with the D10 correction" ????
I'm not sure what you are asking for.

I as well as a few others have posted h/w fixes for the issue.
I also posted a text document in a zip file that includes a description
of the issue, along with 2 possible s/w only work arounds, along with instructions
on how to use them in your sketches.

Fyod:
Hey guys,
I just got this 1602 keypad shield http://imall.iteadstudio.com/im120417018.html and found this thread.
I've read through here and did the test - checked out bad, but I'm still very confused as to whether or not this is a shield that has the mentioned problem.
As a noob I see the D10 input mod from post #3 as the best "fix", but I'm unsure as to how to use this.
Could someone please upload a sample code with the D10 correction so me and others can test it out and use it in our future sketches?

Cheers!

Take a close look at your circuit board around D10. Look for a thin trace coming off of that pin and going to a small IC, that should be the transistor (It might be under the LCD screen, verify with the schematic if you can). I wasn't able to find a germanium diode so I grabbed the closest one to me, a 1N5819. It is not the best diode for the job but it gets the job done. Essentially you are going to "splice" that diode in with the marking band towards D10. All you have to do is cut that trace coming off of D10 with an xacto blade, bend the diode into a U shape (be careful, they do crack open), scratch the black "paint" off of the trace, then solder the diode in place.

Part I used: Schottky Diode - COM-10926 - SparkFun Electronics

Hope this helps!

OP I just tested your sketch and it's fried my brand new Leonardo board :astonished:

Looks like I've got the same LCD keypad shield as you. I brought it ages ago here Recommendations For You - DealeXtreme Mine doesn't say DR Robot but looks like the same shield in every other respect.

I was having problems getting it to display anything but a few solid blocks as you were initially (although my blocks were only half height for some reason). I still haven't managed to get it displaying anything (despite the pins being correct as far as I can tell). Anyway I thought I'd test if it also had the backlight issue you discovered. On running your sketch the backlight faded in and out so I concluded it didn't have the issue. I carried on trying to diagnose why the LCD wasn't displaying anything, then it stopped working completely after a few minutes. Noticed the arduino chip was super hot. Now VIN/5v and GND are dead short on arduino board (nothing else plugged into arduino)

When I tested the sketch on my older seeduino board the backlight flashed on and off indicating the shield did have the bad wiring. For whatever reason the voltage didn't droop on my Leonardo making the sketch think it was fine (and going on to fry it).

It may have been a design flaw of my Leonardo in particular as it is a cheap clone Recommendations For You - DealeXtreme

Still I just thought I'd warn anyone else of the potential danger of running the sketch.

scott-nightingale:
OP I just tested your sketch and it's fried my brand new Leonardo board :astonished:

So sorry to hear that. This h/w issue is stressing the AVR WAY beyond it's maximum ratings.
When doing so there is always a risk of damaging the AVR.
The code tries to minimize the time it put the AVR at risk but unfortunately there is still
a risk of damage.

I don't think that this is due to a design flaw in the Leonardo board you have.
This is a h/w issue on the LCD backpack.

The only safe way to verify the shield for the issue is to not use the Arduino board.
I'll update the initial post to be more clear about the potential risks
of using the sketch.

--- bill

I think you were very clear on the risks of testing this flaw. Just interesting the sketch didn't seem to pick up the issue when I ran it on the Leonardo and ran the BL as if the wiring was good. I have no doubt this is where the damage occurred and not in the microseconds you sketch took to test the fault.

scott-nightingale:
I think you were very clear on the risks of testing this flaw. Just interesting the sketch didn't seem to pick up the issue when I ran it on the Leonardo and ran the BL as if the wiring was good. I have no doubt this is where the damage occurred and not in the microseconds you sketch took to test the fault.

If I had to guess, I'd guess that the "short" created in this case for this shield has enough resistance
that the output signal doesn't droop low enough to be read as a low.
So even though the pin is being overloaded, the sketch can't detect the issue.
And then by continuing to using it, it eventually burns out the pin.
I updated the initial post with an additional warning and a link to response #3 which now
describes a manual way to detect this issue using a meter.

--- bill

would like to know where is the "test sketch and it reports the shield has the issue. The shield has the issue."
the module turns on back lite bright blue with 16 spots on the upper line...
???
:roll_eyes:

phoenixcomm:
would like to know where is the "test sketch and it reports the shield has the issue. The shield has the issue."
the module turns on back lite bright blue with 16 spots on the upper line...
???
:roll_eyes:

I'm not really understanding your question, but the very first post has all the information.

--- bill

I noticed that there might be a problem with my newly bought KeyPadLCD shield, when the LCD was moderately bright when my Arduino was powered only by USB cable, and much brighter when powered with 12V to the power connector.

Googling the Internet revealed that others have noticed similar problems, including this lengthy Arduino forum thread, warning that some versions of the LCDKeyPad shield can burn up the Arduinos they are used on.

After reading and studying this thread, I was still confused as to what the specific cause of the problem was, and how to correct it. It may be that the thread is so long, because many others are similarly confused. Thus I have summarized my studies and understanding below, in the hopes that I (and others) might better understand this issue.

The problem:

As seen in the schematics linked below, 5V is connected to LCD pin 15 , LCD pin 16 connected to collector pin of a transistor, with the transistor emitter connected to ground.

The LCD backlight was designed to be controlled (off to full brightness) by applying a 0 to 5V potential to the transistor base, in this case from Arduino pin D10. Note: The following schematic would have been easier to understand, if instead of simply D10 written next to the line between the 4.7k resistor to the transistor base, it had clearly shown a line from a pin labeled D10, also connected to that line.

See:
http://forum.arduino.cc/index.php?PHPSESSID=hhbirj8dd46l2m524u5mei5bd2&action=dlattach;topic=96747.0;attach=15152;image

On power up, Arduino pin D10 is by default in INPUT mode ( no defined voltage ). This means that the backlight will be off or nearly off by default, and lead a new user to think that the LCD is not working and defective.

Thus, many shield manufacturers have placed a 4.7k resistor between 5V and the transistor base, so the backlight will be on by default, due to the resistor passing approximately 5V/4k7 ohms or 1mA of current to the transistor base.

Now, if you want to control the LCD backlight intensity using Arduino pin D10, you need to set pin D10 to OUTPUT mode, which by default will be initially LOW. The Arduino absorbs the above 1mA current and a close to 0V on the transistor base turns LCD backlight off or nearly so.

The problem happens when you set pin D10 to OUTPUT and HIGH to turn backlight on again, ie the Arduino provides 5V to pin D10 and thereby directly to the transistor base. A typical transistor base to emitter resistance is low, for this discussion lets say around 500 ohms, so 5V/500ohms=100mA of currentl, way over the Arduino pin tolerance of 40 mA or less. This effectively results in a short circuit between pin D10 to ground and eventual Arduino burnout!

The Theoretical Solutions:

Looking at the schematic referred to above, one can either disconnect the 4.7k resistor that turns the LCD backlight on by default and then connect it or similar to the Arduino pin D10 as a curentl limiting resistor. The backlight will now be OFF by default, but pin D10 will now have full and protected control of backlight intensity.

Or a suitable diode can be placed in series between pin D10 and where the 4.7k resistor attaches to the line to the transistor base. If the diode's orientation is correct, it will prevent short circuit of pin D10, when it is set to OUTPUT and HIGH. In this case however, you will only be able to turn the backlight ON with pin D10 in INPUT mode, backlight OFF with pinD10 in OUTPUT mode (either HIGH or LOW). You will have no intensity control.
Refer to the following corrected schematic – note that the free end of the diode should have been labeled as connected to Arduino pin D10, rather than labeled with a cryptic BT.

http://forum.arduino.cc/index.php?PHPSESSID=7r8mtgghd6t50agg9c37nbavk7&action=dlattach;topic=96747.0;attach=23847;image

A third option mentioned in the thread (untested? not feasible? not recommended?) is simply disconnecting LCD 15 and 16 and Arduino D10 pins and reconnecting D10 directly to LCD 15, LCD 16 directly to ground. (Then why was the transistor there in the first place?)

The Practical solution:

Since I haven't read of anyone actually doing and describing how they did the first (my preferred) solution or third solution, I did the second by soldering a diode onto my LCDKeyPad shield, as described in the above Arduino forum thread. Links to photos of other similarly repaired shields are:

http://forum.arduino.cc/index.php?PHPSESSID=mhha79v8o3sepvkd1ortgj7eg0&action=dlattach;topic=96747.0;attach=66886;image

http://forum.arduino.cc/index.php?PHPSESSID=32gn5knof1d20p1kulljths0i0&action=dlattach;topic=96747.0;attach=82288;image

Final Comment:
Given my understanding as described above, I found that rereading the thread referred to above, was much less confusing that it was the first time.

twallace51,
All of this information is already in this thread.
In fact nearly all of it is in the original post, including a description of
the issue and an attached schematic image.

As was discussed in the thread, the issue with a few of the solutions you are
considering is that they are very difficult to do, particularly your #1 solution.
While better than using a diode, it requires unsoldering and resoldering the LCD
to be able to get to the area where the transistor and resistor are located.
In post #1, I mentioned using the diode solution, not because it was ideal,
but because doing much else required lots of desoldering.

The reason you don't see any discussion of directly wiring d10 to the backlight
is that it is not guaranteed to work. LCD Backlights are typically driven with a transistor
because backlight current needs can vary between LCDs and some can consume more power than than an i/o pin
on a microcontroller can supply supply.
While some backlights can be driven by an AVR pin directly, some can't.
That is why you typically see the backlight begin driven by a transistor.

This part of your post is incorrect.

Or a suitable diode can be placed in series between pin D10 and where the 4.7k resistor attaches to the line to the transistor base. If the diode's orientation is correct, it will prevent short circuit of pin D10, when it is set to OUTPUT and HIGH. In this case however, you will only be able to turn the backlight ON with pin D10 in INPUT mode, backlight OFF with pinD10 in OUTPUT mode (either HIGH or LOW). You will have no intensity control.
Refer to the following corrected schematic – note that the free end of the diode should have been labeled as connected to Arduino pin D10, rather than labeled with a cryptic BT.

Note: this is the same diode solution I used in the orginal post; however,
the entire point of the diode is to allow controlling the transistor and hence the backlight,
while D10 is always in OUTPUT mode.
With the diode, when D10 is HIGH, the diode blocks it but the pullup on the shield turns on the backlight, when D10 is LOW
it goes through the diode and overrides the pullup and turns off the backlight.
When D10 is used in PWM mode using andlogWrite() you
get dimming/intensity control.
The point of the diode is prevent the short between the D10 being HIGH and ground through the transistor
so that the D10 can be left in OUTPUT mode and driven HIGH or LOW with no issues.

The ideal solution would be to replace the transistor with an FET. Problem solved.
Not only do you get the backlight on by default by the pullup turning on the FET, but
D10 can overfide the pullup to control the gate with no issues of a short,
since there is no current flow into the gate.

But that requires being able to get to the transistor which is usually quite difficult because
it is under the soldered LCD.

There is a s/w only solution that is also mentioned in the original post.
In that solution, there is no modification needed to the board,
you must have D10 in INPUT mode to allow the pullup to turn on the backlight
and then set D10 to OUTPUT and LOW to turn off the backlight.
This work around precludes the use of PWM since that leaves the pin OUTPUT
mode all the time and during the HIGH portions of the PWM signal, there will
be the short through the transistor.

The original post mentions this and reply #1 has the code for the s/w work around.

--- bill

Just thought I'd drop in and thank bperrybap for bringing this matter up. I've also got one of the nuisance keypad jobbies. I rigged up the +5v and GND to the shield, testing on the 200ma range, from pin 10 to +5v gives me OVER RANGE (so that's over 200ma! ) From pin 10 to GND gives me just 4.6ma (and the backlight goes out).

I attempted a diode but every one I tried (even a schotsky) prevents the backlight from being extinguished. By trial and error with resistors of various values I found a 150 ohm seems to be the sweet spot. It still draws 26ma (when the backlight is on) but increasing the value to just 220 ohms prevents the backlight from going out.

I've managed to make the break in the track but it's fiddly on this beast as the small piece of track that's available to me runs pretty tightly between two others. Also, after the laborious job of carefully scratching away the paint, and cutting the break in the track, the small 1/4 Watt resistor I was going to use now looks enormous.

I'm leaving it as it is for now until I have a surface mount resistor available. I think a 1206 would slot in there nicely. Until then, I'll just be stuck with a permanently illuminated backlight (that's at least won't draw any current through pin 10.)

Hey, I've bought a DFRobot lcd shield (v1.0?) do I have this problem? The schematics are supposed to be this:

http://www.dfrobot.com/image/data/DFR0009/LCDKeypad%20Shield%20V1.0%20SCH.pdf

I see that it is a bit different from the one you posted, this one has a 10K resistor (R8) connect to base...

Thanks,
Tiago

EDIT: ok now i know that there is a version before v1.0, and since mine does not have printed 1.0, I am in doubt....

EDIT2: Later i will post a pic of the shield, that i have

tvcsantos:
EDIT: ok now i know that there is a version before v1.0, and since mine does not have printed 1.0, I am in doubt....

I have one marked v2.0. Inspecting the components under a magnifier, it looks like it has the problem (includes a "resistor" of zero ohms) yet testing proves that it's fine. Perhaps the (unmarked) transistor on this one is a mosfet.

Did not have time to read the entire thread, but it seems that the schematic can work without changing the hardware. Did anyone already try to not set pin D10 to high (as this would be an issue), but has anyone tried to program the pin as an INPUT with the internal pullup activated? That might draw enough current to close the transistor without blowing up the Arduino pin.

--EasY--:
Did not have time to read the entire thread, but it seems that the schematic can work without changing the hardware. Did anyone already try to not set pin D10 to high (as this would be an issue), but has anyone tried to program the pin as an INPUT with the internal pullup activated? That might draw enough current to close the transistor without blowing up the Arduino pin.

Did you take the time to read the first post in the thread?
The first post notes using the pin as in input as a
s/w work around and has a link to the second post
which has a zip file containing additional information and some code macros
to provide a safe backlight control function using this s/w work around.

While enabling the pullup won't hurt, the pullup is not needed when
the D10 pin is in input mode since there already
is a pullup on the lcd shield - which is what allows the back to be on by default
since by default, AVR pin 10 is an input after power up.

Note: I updated the first post to correct the tags for the link to the 2nd post
since it wasn't clickable. It is now clickable. Also added direct link to
zip image that contains s/w work around.

--- bill

Hello, i've just received this one i don't know why.
How can i use it completly with Arduino Uno ?
Pictures and programs requested !
Thanks a lot my international friendship from Marseille France.
Regards Morel Philippe.
www.pilote13008@facebook.com

PilotPhil:
Hello, i've just received this one i don't know why.
How can i use it completly with Arduino Uno ?
Pictures and programs requested !
Thanks a lot my international friendship from Marseille France.
Regards Morel Philippe.
www.pilote13008@facebook.com

Just never put pin 10 into OUTPUT mode and you'll be fine.

KenF:
Just never put pin 10 into OUTPUT mode and you'll be fine.

And you'll never be able to turn off the backlight, either. But that is the safest way to handle it.

If you do want control over the backlight, and don't want to modify the board as mentioned elsewhere in this thread, then:

  • To turn backlight off: set pin 10 to OUTPUT and LOW
  • To turn backlight on: set pin 10 to INPUT
  • Just be sure to never set pin 10 to OUTPUT and HIGH!

Hi all. I bought an LCD keypad from DFRobot ( )

The schematics can be found here : http://www.dfrobot.com/image/data/DFR0009/LCDKeypad%20Shield%20V1.1%20SCH.pdf

The link to schematics from DFRobot page still redirects to v1.0 so I give the right one above.

I use this for a while, using dimming by using D10 as an output with a value of about 150, so with PWM.

Can someone say to me if I'm concerned with the issue ?