Thursday, November 25, 2010

Arduino Output : LCD Modules, Part 1 - Hardware


20x4 LCD module

For myself, one of the first useful projects I ever did with an Arduino besides blinking the LED is to wire up a LCD module. A LCD module is a character based liquid crystal display (LCD) that is used commonly to display status in control panels or a simple way to interface with human in a parking payment machine. These display are considered ancient in today offering of colour based and large screen touch sensitive display found everywhere from ATM to control panels for home automation.

LCD Control Panel


As a curious person, I always wanted to know about how LCD works and of course, how to program and use them. Here are some information I found out.

Most of the common ones are based on Hitachi HD44780 (or compatible) with common sizes like  16 columns with 2 rows (16x2) or a much larger version of 20 columns with 4 rows (20x4). There are smaller or bigger combinations but these two are the most commonly found in stores or online.

The common colours are  black on green/yellow or white on blue with a backlight. For Arduino, there are a few ways to add a LCD to your circuit. First method is to buy a LCD shield, the second method is to buy a LCD module, solder the header pins and hook it up to a breadboard.

LCD Shield with buttons

My favorite is the third method,  as most of my projects are "Arduino on a breadboard"  with enough space for a LCD module and some breadboard area for other electronic components with easy access to the power rails.

Arduino breadboard with LCD


These LCD modules comes with 16 connectors/holes for you to either solder 16 header pins or  solder a flat cable directly to the module for permanent use. The pins are either one single row on the top or bottom of the module or 2 rows of 8 connectors located at the side of the module.

I will go over the LCD pinout and will be focus more on how to connect them up to an Arduino using the common 4bit mode. You will only use up 6 digital pins from the Arduino.

The LCD module should come with a datasheets that have the following pinout. I will translate the datasheets information into english as most datasheets are very hard to read or understand for beginners!!!

Pin 1 - Vss ( Ground )
Pin 2 - Vdd ( Supply voltage for logic )
Pin 3 - Vo ( Operating voltage for the display/contrast, voltage controlled by a potentiometer )
Pin 4 - RS ( Register Select, HIGH: data LOW:instructions )
Pin 5 - R/W ( HIGH:read LOW:write, we use only LOW to write data to display )
Pin 6 - E ( Enable signal )
Pin 7 -   DB0 ( Data bit 0 )
Pin 8 -   DB1 ( Data bit 1 )
Pin 9 -   DB2 ( Data bit 2 )
Pin 10 - DB3 ( Data bit 3 )
Pin 11 - DB4 ( Data bit 4 )
Pin 12 - DB5 ( Data bit 5 )
Pin 13 - DB6 ( Data bit 6 )
Pin 14 - DB7 ( Data bit 7 )
Pin 15 - A ( Backlight, Anode, LED+ )
Pin 16 - K ( Backlight, Cathode, LED- ) 

Male-male jumper cables


For a beginner, wiring up a LCD can be a daunting task without the proper components and cables. Firstly, you will need the LCD module, header pins, lots of male-male jumper cables and a 5K or 10K mini variable resistors called preset/rimpot like the picture below.

16x2 LCD, 16 pin male header & trimpot


Let start with the power first, wire up pin 1 to Gnd, pin 2 to +5V and pin 3 to the trimpot/preset middle connector (voltage divider), with +5V and Gnd to the other two pins on the pot. For the backlight, hook up +5V to pin 15 and Gnd to pin 16. Put a correct resistors between either pin 15 or 16 to limit the current. You will need to refer to your LCD datasheet for the backlight forward voltage (Vf) and forward current (If).  The formula for the resistor to use is : R = (Vcc - Vf ) / If.

The LCD should lit up, with a full single line bar. If the bar is not visible, adjust the trimpot/preset/ for the contrast level until it is visible. If you do not have a trimpot/preset, just wire pin 3 to the common Gnd but you cannot control the LCD contrast level.

Remember to hook up the +5V and Ground from the Arduino to the power rails on the breadboard. For my cables, red is +5V, while is ground.

Arduino 16x2 LCD power connections


Next hook up the bus wiring from the Arduino to the LCD. To save pins, we will hook up using the 4bit method so that other pins are available for other sensors/application. The pin setting I am using are as follows. You can choose other pin configuration but you will need to change your codes to match your wiring setup.

Arduino 16x2 LCD Data connections



Arduino digital pins (Atmega chip) - LCD pins :-

Arduino Digital pin 5 (11) - LCD pin 11 (DB4)
Arduino Digital pin 6 (12) - LCD pin 12 (DB5)
Arduino Digital pin 7 (13) - LCD pin 13 (DB6)
Arduino Digital pin 8 (14) - LCD pin 14(DB7)

The reason I hook up this way is because on the breadboard, Atmega 328 chip, the 4 closest pins to the LCD are pin 11 to 14 and somehow it also correspond to the LCD pin number. If you are using an Arduino board, the digital pins are 5 to 8.

Arduino 16x2 LCD all connections


For pins  RS (pin 4), R/W (pin 5)  and Enable (pin 6) , the hookup is as follows :-

Arduino Digital pin 11 (17) - LCD pin 6 (Enable)
Arduino Digital pin 12 (18) - LCD pin 4 (Register Select)
Ground   - LCD pin 5 (LOW, write only)

I use the Arduino digital pin 11and 12 is so that pin 9 and 10 are available for other sensors nearer to the empty breadboard area and I always reverse pin 13 for the LED. The LCD pin 5 is pull low to the ground as we always just write data to the LCD instead of reading data from the LCD module.

20x4 LCD with large fonts

The above is a photo of Arduino on breadboard with 20x4 LCD module displaying custom large fonts.

LCD on Protoshield
This is an idea of hooking up a 16x2 LCD Module on to the Protoshield mini breadboard.

Protoshield LCD connections
This is the picture of the LCD module connections without the LCD Module attached.



Part 2 will explain about the LCD library and setting up the display.

Monday, November 15, 2010

Arduino Protoshield + mini breadboard

For Arduino beginners, if you are ordering an Arduino and other accessories to save on shipment but do not know what else to order, I would like to suggest to you this shield, Prototype shield or just Protoshield.

Arduino Prototype Shield
With this shield plug on top of your Arduino, you have access to all the Arduino pins plus a row of five +5V and GND pins each for easy access. This protoshield comes with a mini breadboard with double sided tape that you can stick on top of the blank holes for permanent prototyping.

Let me go into a bit of details about this Arduino Protoshield. This protoshield comes with 2 push buttons, one push button for the reset function and another extra push button connected to the ground. This push button connected to the ground can be used as a pull-up resistors. There is a small hole besides the push button to connect to your circuit.

Protoshield with pull-up resistors
The above picture shows a pull-up resistor on a protoshield with the green cable connected from Pin 13 to the LED and the orange cable connected to the push button. The 10K ohm resistor is on the same circuit as the orange cable is connected to +5V and 100 ohm resistor is connected to pin 3. When the push button is not pressed, the state of Pin 3 is HIGH and the LED is OFF. When the push button is pressed, due to the lower resistance, the circuit is grounded and the state of Pin 3 is LOW and the LED will be turned ON. (Beginner Note :- a 10K ohm resistor is commonly used to denote a pull-up or pull-down resistor)

Besides the push buttons, there are two extra surface mounted LED (red and green for mine) with a 1K resistor on each rows of Arduino pins. You can connect it directly to your circuit without any resistors. Look for the small hole near the surface mounted LED. As the protoshield have blocked the LED on the Arduino board, you can connect the LED up to either pin 13 or the Receive or Transmit pins to see the activities.

The mini breadboard, similar to normal breadboard, have a large groove in the middle for putting Dual Inline Package (DIP) integrated circuit (IC) or chips.

Using this Arduino Protoshield, the circuit is very neat with short jumper cables and have good access to both side of the Arduino pins instead of using long jumper cables connection to a breadboard. Power access is at the top of the board with 5 pins each for +5V and Ground.

This is one of my most useful Arduino accessories to have in your arsenal. My Protoboard is permanent plug into the Arduino.

Below is an image of Protoboard shield with a 16x2 LCD module with all the wires connected to the mini breadboard.

Protoshield with LCD module


Tuesday, November 2, 2010

So Many Types of Arduino : Which one should I buy ???

One of the most confusing thing about Arduino for beginners is that there are just too many different choices with different sizes, colours and form factors.

Arduino Mega2560, Arduino UNO, Arduino Mini, Arduino Nano and Lilypad Arduino.
From official Arduino itself have the latest Arduino Uno and older version Arduino Duemilanove, Arduino Mega2560 (Uno version of Mega with lots of Input and Output pins), Arduino Mini (smallest version, need another board (FTDI) to connect to USB), Arduino Nano (breadboard version), LilyPad Arduino (wearable version, for fashion designers), FIo and Arduino Bluetooth (No USB or Serial port).

These different form factor caters to different needs like size and height requirements, number of input/output pins, cost and shields compatibility. Please refer to the Arduino hardware page for the detail technical specifications. The software programming codes (called sketches) should be the same for most of the Arduino boards.

If you want to buy the first Arduino, please get either the Arduino UNO or Arduino Duemilanove (Duemilanove means year 2009 in Italy) available locally in your area. Trust me, since these are so low price, you will get a couple more Arduino, Arduino on a breadboard or Arduino clones for your future DIY projects needs. The Arduino brand can ONLY be used for official Arduino products and buying an official Arduino product is to show our support to the original creators for sharing with us such a powerful and easy to use microcontroller platform.

The Arduino UNO (or Duemilanove) have pins compatible with all the available shields (add-on modules on top of the UNO). The others like Mini, Nano, Mega and Lilypad board uses a different form factor and cannot be used with the Arduino shields. Some Arduino does not have USB chip on board and need either a USB-FTDI cable or FTDI breakout board for USB connection to the computer.

Since Arduino published all the schematics and diagrams, other companies also produces similar and differentiated duino products BUT they cannot use the Arduino name so they come up with similar names like Boarduino (Arduino on a breadboard), Freeduino, RBBB (Really Bare Bones Board), DFRuino, Seeeduino, Roboduino (for robotics) and Gator (rugged and fully protected). Some duino even have different colour PCB to suite your taste.


Some of these offering have fully assembled products or sold as a kit (unassembled) or just the printed circuit board (PCB) so that you can purchase common electronic components locally at a cheaper price or you enjoy soldering them yourself and save some money.


Due to popular demand, I am offering an Arduino UNO Starter Kit for beginners.







Sensors part 2 - Environmental Sensors

Temperature Sensors
These are most common found in air-conditioning unit to lower the room temperature to the temperature set by the remote controller.  They are widely used in a lot of electrical appliance and PC motherboard to measure the temperature. There are analog and digital version of the sensors. The common ones are the LM35 (analog) and DS18B20 (digital) and thermistor.

I've compared three temperature sensors ( LM35, DS18B20 and DHT11 ) and my findings are as follows :-

DS18B20



DS18B20 1-wire parasite power


DS18B20 - These are the best, most expensive and harder to find locally. The DS18B20 uses a 1-Wire bus for data transfer (another wire for ground) and can be daisy chained together to draw power directly from the 1-wire bus "parasite power" with a 4K7 ohm pull-up (5V) resistor. They only use 1 digital pin on the Arduino and can support a lot of these sensors on a single pin as all the DS18B20 have unique address in them. Just need to load the libraries and call the function to retrieve the temperature from each of the sensors. Since the data is digital, these sensors are not dependent on voltage level and can go a further distance.

LM35

LM35 - These sensors are very common and easily found locally. They are analog sensor and need to be connected to Arduino analog pin to get the voltage level. If the power supply are not regulated at 5V and fluctuating between 4.8-5.5V,  these analog sensors could give a wrong readings as they are dependent on the voltage level. Even when I use analogReference(INTERNAL) using the internal 1.1V for the temperature calculations, with different power source, regulated 5V and USB 5V power, the temperature reading are off by 1C between them. In terms of accuracy, they are 0.5- 1.0C higher than the DS18B20 so you might need to do minor adjustment in the temp calculations. If you think the temp reading are off, always use a multimeter to check the power supply voltage.

Thermistor

A cheaper way to measure temperature is to use a thermistors together with a 10K resistors.

Gas Sensors

Smoke and gas sensors

These different sensors that can detect different gasses like CO, CO2, alcohol, LPG, smoke and air quality. A smoke detector usually works in conjunction with an alarm detect smoke using optical or ionization methods.

Relative Humidity Sensors
Humidity sensors also known as hygrometer, measure the relative humidity in the air. It measures both the air temperature and moisture. It is express as a percent, is the ratio of actual moisture in the air to the highest amount of moisture air at that temperature can hold. The warmer the air is, the more moisture it can hold, so relative humidity changes with fluctuations in temperature. 

DHT11 sensors

These sensors are always combined with a temperature sensors and give digital readings. The common ones are DHT that sense both relative humidity and temperature with digital output.

I've tested this sensor, DHT11, they are relatively cheaper than the SHT-11. The sensor are from Aosong AM2303 with range of 0 - 100% Relative Humidity and Temperature range of -40 to 125 Celsius. The accuracy are +/- 2% RH. The output from the sensor are digital but they are connected to an Analog pin from the Arduino. After initialising the sensor, you call a function to get four values from the sensor, relative humidity in percentage, temperature and the checksum. I find the temperature value is 1C higher than DS18B20.