I mentioned a backlight control issue with a few lcd shields in this thread:
http://arduino.cc/forum/index.php/topic,95618.0.htmlThis is a follow up to the LCD backlight control issue.
It is definitely an issue for these LCD keypad shields:
DFRrobot:
http://www.robotshop.com/dfrobot-lcd-keypad-shield-arduino-1.htmlEmartee:
http://emartee.com/product/42054/Keypad%20LCD%20Shield%20V2.0%20%20Arduino%20Compatiblehttp://emartee.com/product/41909/Keypad%20LCD%20Shield%20%20Arduino%20CompatibleSainsmart:
http://www.sainsmart.com/evaluation-board/atmel-avr-board/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.htmlSee the reference schematic (look closely at the transistor that controls the backlight)
[attached below]
The idea was that the backlight would be on by default and then pin D10 could control it.
The 4.7k pullup turns on the transistor if D10 is an input and the transistor turns off when
D10 is low. It was supposed to also turn the backlight on when D10 is HIGH.
In those backlight circuit designs, the problem is that the Arduino pin is shorting to ground through the
transistor when the pin is high. Yes the backlight is on and it "appears" to be working but it is massively
overloading the Arduino pin which may eventually cause problems and perhaps
even burn out the pin.
I'm amazed that it even works at all.
The real solution is a different backlight circuit design.
It is also possible to alter the circuit on the shield; however,
the issue I had on my emartee shield is that the pullup and the transistor
are under the LCD which is soldered to the shield/board, which really limited what could
be done without de-soldering the LCD.
The answer is to add a diode between D10 and the base so that D10 can
pull the base low but not short out when D10 is HIGH.
It turns out that this can actually be done on the emartee board without desoldering
the LCD. The trace to D10 goes around the header than drops through the board.
The trace can be cut and a diode dead bugged to the board.
Another issue is that you can't use a typical silicon signal diode like a 1n4148 as the voltage
drop is too high and the backlight will not go all the way off.
I used a germanium diode 1n34a - which worked perfectly and the AVR no longer gets warm
under heavy LCD activity with the backlight on.
As an alternative a 1/8th watt ~510 ohm resistor could be used.
Not as power efficient as the diode when d10 is high (wastes about 8ma) but works ok.
(backlight will also not be 100% off but so dim that you won't see it)
There is also a software alternative which is to set the pin to input mode to turn the backlight
on and to output and low to turn the LED off. This will work fine for on/off control.
If this method is used, avoid using PWM.
I attached photos of the emartee board and my diode mod.
--- bill
Note: updated to include SainSmart lcd keypad.