Use Arduino With TIP120 Transistor to Control Motors and High Power Devices





Introduction: Use Arduino With TIP120 Transistor to Control Motors and High Power Devices

About: Did I unplug the solder iron?
Hello again.

So you have a DC motor or lamp but no matter how you connect them to your Arduino they just won't work? Guess what, the Arduino is a brain that comes with small muscles. It can control LEDs and other low power nicknacks but not those power motors or lights you need for your next project. The Arduino is good at thinking but not for heavy lifting. Lazy lad.

There are a few add-ons out there that you can buy such as power and motor shields for your Arduino. They have all the muscles in one nice package. Slap those shields on your Arduino and you are ready to control motors and other high power stuff (some soldering may be required.)

Or you can do it yourself for a fraction of the cost and double the pleasure. Enter the TIP120 and its sidekicks.

The TIP120 is an NPN Power Darlington Transistor. It can be used with an Arduino to drive motors, turn lights on, and drive other high power gadgets.

The TIP120 acts as a power broker or gatekeeper between the Arduino realm and the high power realm composed of the PC fan and its battery pack. The Arduino can tell the TIP120 how much power to pass from the external battery pack to the PC fan but the Arduino does not share any of its power or share pins with the PC fan or its batteries. The TIP120 is the go in between.

The TIP120 has three pins. One is called Base, which we will connect to any of the Arduino PWM pins. Through the Base pin, the Arduino can tell the TIP120 how much power to supply to the motor from the external battery pack. That's it. The TIP120 does the heavy lifting while Arduino sits back and gives orders through one of its PWM pins to the TIP120 Base pin telling it how much power to pass to the motor. The poor TIP120 has to then pass the requested power from the external power to the motor based on Arduino's request.

In this tutorial, I will build a basic circuit in which I use an Arduino to control the speed of PC fan via the TIP120. You can take this basic circuit and replace the fan with other devices.

If you want to know more about Darlington transistors you can spend some time at Wikipedia It's an interesting read but you don't really need to understand it to use the TIP120. Heck I don't know what most of this stuff means.

The TIP120 is a very robust item. It can handle lots of power (see specs) but the Arduino can't. So we must protect the Arduino from potential party crashers. For starters, we use a 1K Ohm resistor between the Arduino pins and the TIP120 Base pin. This is insurance against electric shorts. The TIP120 can handle 60V and 5A but I assure you the Arduino won't.

Then we have those DC motors. The internal brushes on toy/hobby DC motors generate lots of potentially harmful sparks and stray electricity that needs to be blocked. Instead of guessing which motor is safe and which is not, we simply add a $0.20 diode and $0.10 1uF ceramic capacitor to our circuit. Some electromechanical devices such as solenoids may require different capacitors.

Placing the ceramic capacitor on the + & - poles of the motor will act as suppressor of sparks and surges generated by motor brushes, which can be harmful to your circuit.

A small ceramic capacitor in the range of .01 to 0.1 uF is probably sufficient to offer protection from hobby DC motors. But If you are using brushless motors, such as the PC fan I am using in this tutorial, don't use a capacitor.

As for the 1N4004 diode, it allows current to pass in one direction from positive to negative but will block any stray current that tries to go in the opposite direction, which might have undesirable effects on your circuit.

Unlike resistors which allow current to flow in both directions, diodes were designed to let current pass from positive into negative, not the other way around. When you look closely at those small diodes we use in our projects, you will see a ring on one end of the diode cylinder. This tough guy can block high voltage (400V) with high current (1A). Again, no need to understand all this stuff so long as you connect the circuit properly.

I am a picture person so I have lots of pictures to help me explain my point.

- TIP120 transistor (datasheet: ) $0.70
- Diode 1N4004 (datasheet: ) $0.20
- 1K Resistor (Brown, Black, Red, Gold) $0.10
- 1uF ceramic capacitor to be used with hobby DC motors $0.10
- Arduino UNO with IDE
- Breadboard
- PC fan or hobby DC motor
- 9V Alkaline or 7.2V NiMh batteries (6 X AA)
- Wires.

NOTE: I don't get commission or any perks from linking to I just like their service and prices so far.

// Define which pin to be used to communicate with Base pin of TIP120 transistor
int TIP120pin = 11; //for this project, I pick Arduino's PMW pin 11
void setup()
pinMode(TIP120pin, OUTPUT); // Set pin for output to control TIP120 Base pin
analogWrite(TIP120pin, 255); // By changing values from 0 to 255 you can control motor speed

void loop()

I must thank for his super blog.


5 People Made This Project!


  • Water Contest

    Water Contest
  • Oil Contest

    Oil Contest
  • Creative Misuse Contest

    Creative Misuse Contest

127 Discussions

Hello sir,
i am not a electronics student but having a huge hobby to it.

i want make a arduino uno base led music reactive programe. i am using normal led strip (12v) atleast 10meter. can you guide me for the project?? if i use the same diagram can it possible to power a 12v led strip?

how to change AC voltage using transistor??

Thanks, this is really thorough and well explained. I'm still fairly uncomfortable with transistors, but your explanation has made me comfortable with not only using the TIP120 but in modifying the circuit for my specific needs. Cheers.

Is there any way of achieving the same thing without using any batteries, just arduino connect to the wall?

1 reply

Of course. If your AC-to-DC adapter supplies 12V and at least 1A, it's enough to power your UNO board and drive your small hobby 12V DC motor.

My circuit drives the the motor, but does not vary the speed. I wonder if its a coding problem? Heres what I wrote;

// Define which pin to be used to communicate with Base pin of TIP120 transistor
int TIP121pin = 11; //for this project, I pick Arduino's PMW pin 11
void setup()
pinMode(TIP121pin, OUTPUT); // Set pin for output to control TIP120 Base pin
analogWrite(TIP121pin, 255); // By changing values from 0 to 255 you can control motor speed

void loop()
digitalWrite(TIP121pin, HIGH);
analogWrite(TIP121pin, 5);
digitalWrite(TIP121pin, HIGH);
analogWrite(TIP121pin, 100);
digitalWrite(TIP121pin, HIGH);
analogWrite(TIP121pin, 255);
digitalWrite(TIP121pin, HIGH);
analogWrite(TIP121pin, 0);


Any ideas most welcome

3 replies

Please note I'm using a TIP121, I'm also using a switching mode power supply (set at 9v) and not batteries, my motor is DC 6-15v

Your sketch is always setting the speed to maximum speed.

If you remove the digitalWrite(TIP121pin, HIGH) instructions it'll work!

Hey SarahD25,

So I tried your code with a different transistor but the same type and it gives me the usual behavior of a variable current flow. I would recommend removing those digitalWrite(TIP121pin, HIGH) commands because the analogWrite is all you probably need. However, the problem at hand is that your motor isn't varying its RPM so if I were to guess, the transistor might be damaged and it is acting like a short circuit.

If you have a multimeter there are tests you can do on the leads to see if it is damaged; Google can help there.

Otherwise your code is fine minus the digitalWrite(), unless they are purposefully put in there but I don't really see why. The digitalWrite() is just outputting a fraction of time of a digital high signal so ~5V (Arduino Uno) then your analogWrite() is sending periodic digital high signals (aka PWM). So long story short I don't think you need those digitalWrite() commands in this instance.

I'm new here, sorry if that was long winded.

Hope that helps!

You may want to move to a MOSFET instead of a TIP-120. Runs alot cooler. Check out:

You shoud use an "H Bridge" and 2 pins of the arduino, that way you can choose the polarity. And you should turn CAPS LOCK off, keeping it on is bad Internet etiquette..

hi, many thanks; got my simple little LED output from transistor under Arduino control now. wee!

I created the circuit and uploaded the sketch to my Arduino without issue, or so it seemed. My varying the analogwrite value between 0 and 250 I can change the output voltage, but I can only vary it between 5V and the 10V of my power supply. At a value of 0 it is still outputting 5V. Is that a limitation of the transistor used in this demo? If so, what do I need to look for in a transistor? I do not necessarily need it to go to zero but it would need to 'turn off' at some point.

can we control two directions? and can v use pwm for speed control?

2 replies

If you want to control two directions, check out for a transistor H bridge. It is basically a circuit made of 4 transistors that allows you to choose a direction for the motor. And yes, you can use PWM for speed control. Anyway, I recommend using MOSFET transistors instead of TIP120, because the TIP ones are too old, and they usually dissipate a lot of your power, and might even overheat and stop working.

ok , thank you so much (y)
May i know how to control the speed of the moors using mosfets as a h bridge?

i have tried making the circuit, but instead of 9v battery, I used 12v dc from unregulated power supply. but when i measured the voltage supplied to the motor. it barely reaches 8v. i dont seem to understand it. does anyone know why does it happen?

1 reply

TIP120 is an old and outdated transistor. For higher power applications, like yours, you would rather use a MOSFET. TIP120 will overheat and dissipate lots of your power, and might even stop working if it gets too hot.