## Sunday, April 3, 2011

### Controlling fan or motor speed with PWM

On the first part, I talk about switching any 12V DC or higher electronic components ON or OFF. This can be easily done using an optoisolator and a 12V reed relay. In this article, I will be using a different component to control the speed of the 12V fan or motors using Pulse Width Modulation (PWM).

The TIP-122 are Darlington transistors that can support voltage up to 100V. It consist of two transistors with resistors and diode all inside a TO-220 package. You can use TIP-120 that support up to 60V. Please refer to the TIP-120/TIP-122 datasheets for details specifications here.

 TIP-122
I've wired u my circuit like the schematic diagram below :-

 TIP-122 fan speed control

The input of the circuit is using analogRead(0) to read the light level from the light dependent resistors (LDR). Depending on the light level, the value is converted by the ADC to 0 to 1023. Since the PWM can only take value of 0-254, I will divide the ADC value by 4  to match the PWM value.

The 12V DC supply is separate from the Arduino 5V supply but shared a common ground.

The LCD is to display the LDR value for debugging purpose. Cover the LDR or shine a light to it to see the fan speed change.

Arduino Pin 9 (PWM) connect to the TIP-122 Base (B) pin.
The 12V fan connect to the TIP-122 Collector (C) pin and the Emitter (E) pin connect to the Ground.

Sketch to control the 12V fan speed using PWM is as below :-

int ldr = 0;

// if light level is room light, turn the fan speed higher

if ( ldr < 125 && ldr > 40 ) {
ldr = ldr + 50;
}

// if value is less than 40, do not switch the fan ON

if ( ldr < 40 ) {
ldr = 0;
}

// else run the fan speed according to light level up to 255

// send PWM value to TIP-122 base pin
analogWrite(9,ldr);
delay(500);

## Friday, March 4, 2011

### Controlling a 12V DC motor/fan with an Arduino

Most of the Arduino runs on 5V and driving low power actuators like LED is fine with a  resistor but how do I control relays / motors / pump / fans that runs more than 5V ?

I get a lot of beginner questions like below :-

1. How do I switch ON & OFF  a 12V DC fan from an Arduino ?
I was told I need a relay, what type of relay should I get ?

2. How do I control the speed of a 12V DC motor or fan from Arduino ?

Let's look at these scenarios one by one so that I can explain them in more details. Firstly, even if a motor or pump or fan (anything with coils inside) is 3V or 5V, do NOT power it directly from the Arduino pins as the Arduino pins can only supply a maximum of 40mA. As per my previous article on Arduino pins, they are not designed to drive a DC motor or coils.

Always use a separate power source to drive these high load components and have a relay to switch them.

Question 1:-

How do I switch ON & OFF a 12V DC fan from an Arduino ?
I was told I need a relay, what type of relay should I get ?

A 12V DC fan or motor have coils inside it. You would need a relay to control it. A relay is an electrically operated switch to turn on or off a device. Most relay use an electromagnet to operate a switching mechanism mechanically. You could hear a "click" when the relay switches on when it magnetize the coil and turn on the switch. Below is an image of a 12V Single Pole Double Throw (SPDT) relay housed in a transparent casing. You can see the copper wires winding or coil clearly.

 12V SPDT relay

The advantage of a relay is that they can allow high flow of current and voltage across them but the disadvantage of a relays is that it is a mechanical device with springs, so the switching speed is much slower than semiconductors ( called switching speed in the specs ) and have wear and tear of the mechanical parts. They are also more expensive to manufacture compared to semiconductors switches.

Below is my sample circuit using an Arduino to drive a 12V DC Fan with a 12V relay.

- Arduino
- optoisolator 4N35
- 12V SPDT Relay
- 12V PC fan

 4N35 optoisolator

An optoisolator is a chip that combined two circuits ( a LED & NPN phototransistor ) into an integrated circuit to isolate two different voltage. The Arduino is on 5V and the relay & DC fan is on 12V. According to the 4N35 datasheets, it can support up to 70V from pin 4 to 5.

See the circuit diagram below :-

 Arduino 4N35 12V Relay

When pin 12 is turn ON or HIGH, it will triggered the LED between pin 1 & 2 inside the 4N35 optoisolator (6 pins white chip) to turn on the phototransistor ( pin 4 & 5) and  complete the circuit and send 12V power into the relay (black colour). When the coil is energize, you will hear a click and switch on the motor. The red wires are connected to 12V power supply.

Using this method, it can only switch on or off a circuit but could not control the variable speed of the motor. A second method will use a semiconductor, NPN Power Transistor model TIP122 to control the speed of the DC motor using PWM from pin 9.

On Part 2 of the article, I will explain on how to control the speed of a 12V DC fan using PWM.

## Friday, February 11, 2011

### Why the Arduino won and Why its here to stay

For a beginner, if you are still considering to use Arduino vesus other microcontrollers, Phillip Torrone, Creative Director of Adafruit on Make: Online wrote an interesting article on "Why the Arduino won and Why its here to stay" that might just be able to help tip you over.

The author also commented that it only takes 10 minutes, assuming your Internet download is fast, to get Arduino up and running and that itself show the simplicity of Arduino.

From reading the article, it remind me of some of the things I told my readers when choosing between different types of Arduino. I usually advise beginner that "Unlike the PC CPU where faster and more Ghz is better, in microcontroller, less is good, uses less power and more power efficient, you can even run it off batteries".

To keep the Arduino cost low with a lower entry barrier, everything else is modular or called a breakout board or "shields" in Arduino term like LCD module, network or TCP/IP module, realtime clock module, GPS module and many other modules. Again, less is good and keep it simple concept.

I find most challenging part for beginners is actually understanding the datasheets, Sparkfun wrote a good article on how to Read a Datasheet, well, we can read english but understand engineer's terminology is another challenge for beginners as most datasheets are written by engineers for engineers.

Finding the correct components is the next most asked questions, like "How do I control a 12V or 220V from an Arduino ?" What parts do I need to accomplished this task ? I will address this in my next blog entry.

One of the recent events I think "Arduino won" is the worldwide shortage of the Atmega328 DIP version of the chip from Atmel. DIP (stands for Dual In-line Package) is a through-hole packaging of the chip that can be plugged into a breadboard or IC (Integrated Circuit, technical name for chips) sockets and can easily be removed and replaced if you burned your chip. The original version of Arduino have all the components in through-hole and the latest version, Arduino UNO moved most of the components into surface mounted except for the main Atmega328 chip. With the recent shortage, to fulfill the hugh demand, Arduino made a surface mounted version of Arduino UNO. The DIP version of the chip is important because hobbyist like myself, like to make parmanent version of Arduino for different type of projects.

All these food related names like DIP, chips, bytes and nibble just makes me hungry.

## Monday, February 7, 2011

### Arduino Pins - Analog style output - Pulse Width Modulation (PWM)

The last part of the Arduino Pins - Analog Output using Pulse Width Modulation.

We have mentioned about digital input, digital output and analog input. How do we do analog output ?

There are no analog output pins on the Arduino and how can I control the intensity or brightness of the LED or variable speed of the DC motor or fan. Yes, you can do analog output style,  it is called Pulse Width Modulation (PWM) and Arduino have a function called analogWrite() to accomplished this with digital pins. This is done by turning on and off the digital pins very quickly at a rate of 500 times per seconds ( frequency of 500Hz).

If you look at the Arduino UNO board, there are ~ beside the following pins - 3, 5, 6, 9, 10 and 11.  These are the PWM pins you can use. To use the analogWrite(), the syntax are :-

analogWrite( pin, dutyCycle );

The pins are 3,5,6,9,10 and 11 and the dutyCycle is a value from 0 to 255.

 PWM duty cycle

If you want the LED to be 100% brightness or the PC fan running at full speed, set the dutyCycle to 255. If you want 50%, set the dutyCycle to 128. If you look at the Aduino Fade example, it uses pin 9 instead of the pin 13 for Blink example.  This is because pin 13 is not a PWM pin.

Please note that the function analogWrite() have nothing to do with the Analog Pins!!!

 CPU Cooler with PWM

An application of PWM is most commonly found in CPU air cooler with 4 wires to control the speed (RPM) of the fan based on the temperature sensor of the CPU. This is to reduce the noise level by controlling the speed (RPM) of the fan.

You can refer to this article on controlling DC motor / fan speed using PWM.

## Sunday, January 16, 2011

### Arduino Pins - Analog Pins and Analog Reference Voltage

Arduino have 6 analog pins labeled as Analog 0 to 5. Analog pins are mostly used to read analog sensors and sent to the 6 channels Analog Digital Converter (ADC). The ADC will convert the voltage (0V to 5V) to integers from 0 to 1023 (10 bit resolution). This can be accomplished using the analogRead() function. If the analog sensors have a narrow voltage range, you can use the analogReference() to change the input range and resolution.

The analogReference() can be change from the default analog reference of 5V ( or 3.3V for some boards ) to either an INTERNAL analog reference or EXTERNAL analog reference.

Internal analog reference will use the internal 1.1V when converting from voltage of integer of 0 - 1023. If the AREF (Analog Reference)  pins is connected, it will USE the external reference voltage even if you issue the command analogReference(INTERNAL);

External analog reference will use the external AREF pin and take the reference voltage of whatever voltage that pins is connected to. You can use this method with a voltage divider to get 2.5V for the analog reference voltage. An example is to connect two resistors of same value (example 100 ohm each) to the 5V pin and tap in the middle to get the 2.5V into the AREF pin.  As normal resistor have a 5% tolerance value, it is not very accurate unless you use metal-film resistors with 1% tolerance value for better accuracy.

All the 6 analog pin can be used as General Purpose Input/Output (GPIO) pins like digital pin using label of A0 to A5. Use the command, pinMode(A0, OUTPUT) to set the analog pin to OUTPUT mode. After the mode is set to OUTPUT, you can use the digitalWrite() functions for these pins.

*** analogRead will not work correctly when set to OUTPUT due to the internal pull-up resistor. You need to use the pinMode to set it back to INPUT before using the analogRead() function.

## Wednesday, January 12, 2011

### Arduino Documentary is finally done.

I do not usually post current events or news articles but this is an important event for Arduino, the Arduino Documentary. The documentary talks about how it all started, open source hardware, some cool projects and how easy it is to work with a microcontroller without any knowledge in electronics and focus on what you trying to get done.