You are on page 1of 6

Arduino I2C (MCP 23017) LCD Interface

This article outlines the construction of an I2C serial interface to a Hitachi HD 44780 LCD. This is implemented with the use of
Microchips
MCP 23017, 16-Bit I/O Expander with Serial Interface. You could go out and buy an all-in-one commercial serial LCD but I like to build
things from
scratch, thus hopefully gaining a more comprehensive understanding along the way. I decided to build this project because I have
been promising
myself for months that I would replace the veroboard prototype of this interface, that I have been using as the display for my hot
water system
Powermeter/logger. Once again I didnt want to use SMD, my eyesight isnt the best and I have pretty big hands! Also I like to be able
to socket
ICs, as this makes repair and troubleshooting much easier. Obviously the down-side of this approach comes at the cost of valuable
board real estate.
Hey, I guess the bottom-line is, I like to make my own boards and I dont have sophisticated board fabrication technology at my
disposal. I must
stress that to attempt this project you will need good soldering skills, yes I know thats pretty relative, read the article and you be
the judge but
at least you have been warned.
A single-sided PCB, using several wire links was fabricated using the Toner Transfer method and a GBC/Creative A4 laminator. The
etchant used
was 12% v/v Hydrogen Peroxide, 28% v/v Hydrochloric Acid mixed in the ratio of 1:2. Please note this etchant is a powerful oxidising
agent and needs
to be treated as such. A bit of basic chemistry, the ARROW rule applies here big time, always add the acid to the Hydrogen Peroxide!
The I2C approach was chosen because if a 4 or 8 bit parallel interface were used its too greedy with the existing Arduino IO lines.
This interface
ties up just four Arduino wires, SDA, SCL, GND and 5 volts. The board has been designed to provide quite a degree of flexibility.
The board in
its standard setup enables the MCP 23017 to control the HD 44780 with GPA0-7 data bits and GPB6-7 data bits. This leaves six free
IO lines,
GPB5-0 free, to interface to anything you like. This is reduced to five if you decide to use GPB5 to control pin 5(R/W) of the HD
44780, which can
be used to access programmable characters in the HD 44780 RAM. Provision has also been made to be able to control the HD 44780
backlight by
using GPB4 to control a switching transistor. This reduces the available IO to four lines, GPB3-0, which is still pretty handy if you want
to add a few
buttons/switches or the like. This flexibility is easily configured using the four jumpers, JP1 to JP4.
As far as software is concerned for this project you will need to use the wire.h library. There are many examples of using this library
to get the
I2C up and running ... just a google away! Eons ago I came across an article by Lewis Loflin, Connecting the ATMEGA168/Arduino to
MCP 23016
and LCD Display. This excellent article grabs you by the hand and walks, maybe there is a bit of dragging too, you through getting
the HD 44780
display up and running with the MCP 23016 chip. The MCP 23017 is essentially just an upgrade with less passives and faster speed
options!
The schematic of the project is depicted in( fig i). As you can see it is pretty simple and is built around a Hitachi HD 44780 and a
Microchip
MCP 23017. Ive seen HD 44780 16x2 backlight LCDs for around AUD $7.90 and 16x4 backlight LCDs for around AUD $12.90. The
MCP 23017
can be bought for around AUD $1.20, cheap as chips!

Page 1 of 6

(fig i)
If you follow the schematic you can see pretty clearly how to set the jumpers, JP1 - JP4, for what ever configuration you decide to
use. The following
diagrams and pictures are designed to be a helpful construction aid... hopefully! Fig (ii) shows the foil pattern for the pcb, which was
produced using the
Toner Transfer method.

(fig ii)
Fig (iii) shows the board
routing (blue) on the
wire links on the top side
board (red).

layout with the pads (green) and


bottom side of the board and the
of the

(fig iii)

Page 2 of 6

Fig (iv) shows the board layout with the wire links (red) on the top of the board and the relevant connection pads (green) on the
bottom side of
the board.

(fig iv)

Fig (v) shows the component layout on the top of the board and the relevant pads (green).

( fig v)
Fig (vi) shows the etched pcb. Please note that this photo is of the original pcb foil pattern. I discovered a mistake in the routing
after etching
the board. x marks the spot, this shorted the base of Q1 (BC327) to +5V. If you have a look at fig(ii) and fig(iii), you will find the
corrected foil
pattern... sorry about that!.

Page 3 of 6

(fig vi)
Fig (vii) shows the assembled pcb with all components and LCD attached.

(fig vii)

Fig (viii) shows the assembled pcb and the SCL (white), SDA (blue), GND (black) and +5V (red) wires connecting the interface board
to the Arduino.

(fig viii)

Page 4 of 6

Fig (ix) shows the completed interface board displaying the time , courtesy of a Dallas DS1307 RTC. Also shown is the ambient
temperature in Celsius
courtesy of a Dallas 1621 Thermometer/Thermostat chip. Lastly shown is the Barometric Pressure and the ambient temperature
courtesy of a Bosch
BMP 085 chip. The BMP 085 chip readings are erroneous due to it being fed +5 volts instead of 3.3 volts. These three chips are all I2C
devices.

(fig ix)
I should mention a couple of rather esoteric things that you should find useful when constructing this board. I used two 8 pin
female stacking headers
to implement the LCD1 connector. If you know of anyone who can supply a single 16 pin female stackable header, please let me
know? You will need to
cautiously file the two joining ends of the 8 pin stackable headers to get them to fit together properly. Take the filing procedure slowly
and adopt
a heuristic approach and you should be able to achieve a good fit. If I can do it, you shouldnt have any problem! Also when it comes
to soldering the
8 pin female headers to the pcb I used a 16 pin male header to align the two 8 pin female headers and then soldered them carefully
to the board. When
soldering the LCD1 header I had it slightly elevated from the boardss surface, allowing just enough room to get a soldering iron tip
onto the header
pin and solder it. The reason for the elevation is that I wanted to keep the pcb and LCD as low profile as possible. Once the header is
soldered into place
the excess header wire length can be cut off with side cutters. You will need to be careful with the soldering iron when soldering the
header to the pcb
otherwise you will have a melted header ... not a good look! Once again, I did it so you ......I also screwed two spacers into position
on the other side of
the pcb to fix the LCD and interface board together. See the brass bolts and Teflon spacers in (fig ix).
Good luck with this project, if you attempt it. Any problems .... get in touch with me by email at matthodge@iinet.net.au and I will
try to help you
out!
Fig (x) is a photo of the veroboard version of this interface, without the bells and whistles of the pcb version. As mentioned
previously this little
number has served faithfully as a LCD for my hot water powermeter/logger for many months now. The reason for the much bigger
board is because
its a veroboard construction and I used a 16x4 LCD panel instead of a 16x2 used in this project. Got to love that Teflon spacer
arrangement!!!

Page 5 of 6

(fig x)

Page 6 of 6

You might also like