Arduino DC Motor Speed Control Potentiometer


Introduction: Arduino DC Motor Speed Control Potentiometer

This instructable will guide you on how to controll the speed of a Dc motor with a potentiometer and an arduino...

Step 1: Part List

1) Arduino

2) D.C. motor

3) NPN transistor TIP120

4) Rectifier Diode

5) 3* 220 ohms resitors

6) 10K Potentiometer

7) Breadboard

8) Jumper wires

9) Green led

10) Red led

11) Computer with Arduino IDE

Step 2: Connect the Potentiometer

1) Connect the negative pin of the potentiometer to GNDPIN on the arduino.

2) Connect the signal pin of the potentiometer to AnalogPIN0 on the arduino.

3) Connect the positive pin of the potentiometer to 5VPIN on the arduino.

Step 3: Connect the Leds

1) Connect a 220ohm or any ressitor below 1komhs to the anode of the red led and connect the end of the resistor to DIGITALPIN8 on the arduino.

2) Connect the cathode of the red led to GNDPIN.

3) Connect a 220ohms resistor to the anode of the green led and connect the end of the resistor to DIGITALPIN9 on the arduino.

4) Connect the cathode of the green led to GNDPIN.

Step 4: Connect the Transistor,diode,resistor and the D.C.motor

1) Connect the BASE of the transistor to a 220ohms resitor and connect the end of the resistor to DIGITALPIN3 on the arduino.

2) Connect the COLLECTOR of the transistor to a negative of a diode and connect the end of the diode to GND.

3) Connect the EMITTER of the transistor to GND.

4) Connect a pin of the motor to 5v and another to negative of the Diode.

Step 5: TIP 120 NPN Transistor Pinout

Step 6: Breadboard Layout

Step 7: Arduino Code

int analogInPin = A0;

int sensorValue = 0;

int outputValue = 0;

int transistorPin = 3;

void setup()



pinMode(8, OUTPUT);

pinMode(9, OUTPUT);

pinMode(transistorPin, OUTPUT);


void loop()


sensorValue = analogRead(analogInPin)/4;

outputValue = map(sensorValue, 0, 1023, 0, 255);

analogWrite(transistorPin, sensorValue);

if (sensorValue >= 160)



digitalWrite(8, HIGH);

digitalWrite(9, LOW);



{ digitalWrite(9, HIGH);

digitalWrite(8, LOW);


delay(10); }

Step 8: You're Done!!

2 People Made This Project!


  • Clocks Contest

    Clocks Contest
  • Water Contest

    Water Contest
  • Oil Contest

    Oil Contest

21 Discussions

why NPN transistor is used?

Do you have Proteus Simulation of this Project ... ? I need to simulate this circuit in Proteus ?

I might have read it wrong but the diode should go in parallel with the motor. Cathode (negative end) to voltage source (same connection motor pos) and anode (positive end) to the collector on the bjt. The diode provides a place for current to do when power is cut off. This circuit works (doesn't break) due to the low current, voltage, small motor, and durability of the arduino. A motor acts like an inductor and when current stops flowing an inductor tries creating a current, the current it creates has to go somewhere.

surya bhaii.....I have to do the same thing with my Raspberry Pi.....can u tell how to do?

2 replies

Find me on fackebook and we will discuss there :D

Thanks for replying mate! I actually have been able to do this with my Raspi. Anyways, thanks for this lovely instructable!

does the voltage on the motor matter

Hello sir. I have a question. We have a project called jar tester and it runs on a 24v dc motor. We want to control its speed but at the same time display the rpm accordingly. How can it be done sir? thanks ahead.

Hello sir.I have a question.Why we use trnsistor,diode and resistor?If we use only the pot and the dc motor it doesn't work?What is the purpose of this?Thank you for your time i am newbie.Please answer.

1 reply

Yes, it will work if you just hook one end of the motor to ground and the other to the PWM from the arduino, but then you are limited to the amount of power the arduino can source and run a chance of damaging the arduino.

Hooking one end of the motor to +V and using the transistor to allow power to flow through allows you to use any voltage and much higher current.

The diode prevents backflow when the motor turns off. It's usually not a problem with small toy motors, but with a heavy enough motor it will generate electricity as it is slowing down in reverse of the flow you were using to push it and can overload a circuit. It's just a good habit to get into.

The resistor is also just a good habit when working with motors.

can you please explain why we are using this line


1 reply

Correct me if I am wrong, but if I want a program on the arduino to control the speed of the motor, then the potentiometer is completely irrelevant? I say this, because another instructable shows how to control DC motor speed with a potentiometer, but no arduino. I'm not sure what is gained by directly controlling the motor speed using an arduino AND a potentiometer.

1 reply

If you want to control the speed of the motor without the potentiometer, you can replace:

sensorValue = analogRead(analogInPin)/4;
outputValue = map(sensorValue, 0, 1023, 0, 255);


outputValue = 255; // stop=0-255=full speed

And, of course, you can programmatically set outputValue to whatever value you want based on the logic of your application.

It won't work probably because my motor is 12V. Now I need to try a
boost converter or find another way. I think I would use PWM via a
555-timer if I had one. Any thoughts? In update, I now have managed PWM via L298N motor driver and a potentiometer. In order to make the speed go really slowly and constant it seems I need to use either a step motor instead of a DC motor or use speed feedback on the DC motor. Just my understanding so far.