Introduction: Simple 2-way Motor Control for the Arduino

Picture of Simple 2-way Motor Control for the Arduino

WARNING: This is not a safe way to control a motor. Each I/O pin can only handle 40 mA of current. I would recommend using a H-Bridge or something along those lines.

When I say simple, I don't mean use a speed control. But control the motor directly without any external circuitry. Here's how:


How this came about:

I recently was working on an instructable about charlieplexing with an arduino. And I was wondering if the same principle would work with motors to some extent. So I came up with the idea that if you used a motor instead of an led you could have 2-way control of it & if you used 2 PWM (Pulse Width Modulation) ports you could have 2-way variable speed control for a motor with no external hardware!! So I decided to post my findings. Have fun!If you have any questions Please ask them.

I am not responsible for any thing bad that happens to you or to your arduino!

Step 1: The Stuff You Need:

Picture of The Stuff You Need:

Parts:
- Arduino
- Small DC motor
- Wire for motor

Tools:
- Computer with Arduino IDE installed
- A-B USB cord

Step 2: Connecting the Motor

Picture of Connecting the Motor

Connect your DC motor to your arduino.

- Connect one wire from the motor to pin 5 on you arduino
- Connect the other wire from your motor to pin 6 on your arduino

The hardware setup for this is pretty simple.

Step 3: Coding the Arduino

Picture of Coding the Arduino

Here's some basic steps to program your arduino.

1) Download the source code from below
2) Open the file in the Arduino IDE
3) Press the "Upload to I/O Board" button
4) Once the program is uploaded it will start running


I tried to add a good amount of comments to the code, but if you have any questions, please ask them.

Step 4: How This Works & More Ideas

Picture of How This Works & More Ideas

How This Works:
When you make one pin HIGH & another LOW, the pin that is HIGH has a positive voltage & the pin that is LOW works like a ground(-).

Note: The rotation direction maybe different than below.

Pin 5:Pin 6:Rotates: HIGH LOW CCW LOW HIGH CW PWM: 127 LOW CCW 1/2 Speed
CCW = Counter Clockwise
CW = Clockwise

Ideas:
Add a second motor. Sorry I don't have any code for this, But there is a schematic posted below.

Comments

JosuaR1 (author)2017-08-30

This is not a good way of controlling motors. First, a simple way to do this is to use an NPN transmitter, however you don't get direction control, however you do get speed control if you also use a capacitor. If you also want direction control, I recomend using a motor driver such as the L293D since it is also quite easy to use and can control 2 motors at a time.

Sriram.1 (author)2016-12-04

pls send us the code

Sebasti√°nV17 (author)2016-08-14

WTF!!!!!!

Inductive loads like relays or motors NEVER should be connected directly to arduino. For inductive loads you need a transistor and a flywheel diode.

matthiasl2 (author)2015-10-15

BEGINNERS READ: Do NOT try this out, there is no transistor, no protecting diode in this circuit. Your chance to ruin your MCU is very high with this. Author: Please delete this pages.

Bidoof (author)matthiasl22016-08-05

Is there any way to do this without ruining the MCU?

rajesh_ghosh (author)2015-11-06

The warning you have put should be more bold and bright. This shall surely fry the MCU in long run. Better would be to remove the article or post a better one with safety precautions to the MCU.

DudiG (author)2015-09-12

ggv2 (author)2015-08-05

This is not a stepper motor, right? Can Darligton pair be used instead of H-bridge?

fritte89 (author)2015-07-20

Okay, first off, I'm really not trying to be mean or anything. That said, could you please take this instructable down for the sake of very beginners? I believe it would be really frustrating and for some people even spirit crushing to fry their first arduino. This is a really bad idea in so many ways.The ultimate hardware killer.

It would be very kind if you would either take it down or change it a little bit and make it better :) (This will help: http://embedded-lab.com/blog/wp-content/uploads/20...

StevenV2 (author)2015-05-09

Saying that this is not the safest way to control a motor is putting it mildly. I would recommend NOT to do this. The 40 mA is a story in itself (in short: it's less!), but even smaller motors will ultimately damage the I/O pins. Even if it seems to work perfectly. If you don't want to damage your Arduino, use an H-bridge.

danimalik (author)2014-05-07

im using arduino with atmega 328p-pu

motor is not runing. wat isue can be ?

dsilva33 (author)danimalik2014-05-19

The motor is not running because the motor is using to much current from the arduino. You can damage your arduino because the pins can short out. I don't recomend this method for you.

kpnd.dang (author)dsilva332014-08-05

the out current is about 50mA, it is not enough to load the motor. I have a tips that you can use 2 pin mode as an output, and those connect to one pole of the motor, so it can double the current :D

StevenV2 (author)kpnd.dang2015-05-09

@kpnd.dang -

NEVER do this when you're using digitalWrite and esp. analogWrite to
control the pins! Between two Writes the connected pins are at a different level
and the pins are short-circuited.

FrancescoP3 (author)kpnd.dang2015-02-01

yes maybe it works but I would recommend to drive it using transistors and protection diodes, because even if you double the current for the motor, when the motor stop it will generate too much current in reverse on your IC(whatever is) pin, frying it =D

check this schem =D

http://www.thebox.myzen.co.uk/Workshop/Motors_1_files/shapeimage_2.png

phillip.manock (author)2015-04-15

Hi computergeek,

could you explain what the rotateright/rotateleft values indicate or used for (are those timers or voltages ?)

JishnuM (author)2015-02-05

the code saves as a tmp file on my computer for some reason how do i fix it or can i just get a picture of the code

Abhineet Mishra (author)JishnuM2015-04-07

Just go to the property of the file and make one necessary change................................i.e., change the extension from .tmp to .pde and open it in IDE........................it worked for me in the same way!!!!!!!!!!

Abhineet Mishra (author)2015-04-07

I tried and it worked for me............................I used Arduino UNO and a DC Motor...........................

MaxA3 (author)2015-02-21

Hi,

Is there an one way version of this code?

Btw this two way one didnt work. for some reason my motor wouldnt run eventhough it is a 3V 0,13A motor and I know it works fine when I attach it to my ground and 5v pins.

AbdulGhaffarB (author)2015-02-15

I tried this method on AD mega 2560, I also use Transistor and diode but its not working as its mentioned here. Motors only work CW. on LOW one motor stops and other still running. but I need two way control. any idea ? so I can move my stuff farward and backword

daaryancode (author)2014-11-15

What you are doing is wrong. The motor will obviously drain more than 40mA from the Arduino board, damaging it badly. Why don't you try using traditional combination of transistor and drain (diode 1N4007)?

FrancescoP3 (author)daaryancode2015-01-12

How? =D I'm working on a nanoquadrotor drone, and I have to use 4 dc motors, at first I think I could use 4 555 timer's, what do you suggest?

Thanks in advance =D

Maybe you need to use rc motors with speed controller.I want to make this project too but only tricopter with leds when turn right and left and more cool things.

I've tried with an npn and a protecting diode and it works well(if you'r using 3.7v micromotors, if you want to drive larger motors I think a mosfet will be better, or you can directly buy a cheap esc, but I think it's more fun to project and assemble from parts rather than buying it =D)

Yes it's more fun to project and assamble from parts rather than buying it

But i need to buy the ESC because the motors dont get enoung energy from arduino,and i put only the signal.And the controls....well i use visual studio to make one cool control system, now i'm working on xbox360 control.

If you want the visual studio projectfiles i give it:D. I like to help people :D

If i can help you with coding or something tell me!

shortcircuitaz (author)2011-02-16

I tried this and my motor must be too big or something.. do I need to send any information through the interface to the controller?

vivek177 (author)shortcircuitaz2015-01-30

no just use bigger battery

mouaz.alhayek.3 (author)2014-11-27

hello, im working on a project where we control a miniature house via PS3 cotroller (preferably bluetooth connection). the house has 2 servo motors, for a door and a window. one Dc motor (fan) and LED lights. its my first time to use arduino and this type of circuits. help would be great.

mseeds1 (author)mouaz.alhayek.32014-12-08

Hi sounds like a cool project, what do need help with?

Tischer (author)2014-11-06

Worked great.

hasan.zaidalkilani (author)2014-10-28

hello,,i need this cod ..pleas

asarris (author)2013-05-08

I am not sure if this is my fault or instructable's fault, but when I try to download this file I get a temporary file.

rikovgy (author)asarris2014-10-15

u probly already figured this but just change the tmp to pde works fine

captin.ahmed100 (author)2014-09-30

i can't understand the instruction [rotateleft(150,500)] plz any one answer me .... i have project

captin.ahmed100 (author)2014-09-30

i can't understand the instruction [rotateleft(150,500)] plz any one answer me .... i have project

tonyGV (author)2014-07-09

hello, i'd want to know if it's possible to control two 48 lbs trolling motors with the apm 2.6, i was looking for an ESC from VANTEC but the one that would work for this proyect is targeted for 12-48 vdc systems, i'm using LiPo batteries and the ESC is the following: Vantec RDFR47 E

Targeted for 12 - 48 VDC SYSTEMS.
VOLTAGE RANGE: 9 - 55
Continuous Amps: 75A Con't; 220A Starting Surge
SIZE: 6.25 X 2.3 X 4.5"
1/4" Thick sustantial aluminum U-extrusion

Wt. 43 oz

racataca (author)2014-03-28

that I can do to convert 2 PWM inputs (rc servo) to 5Vdc analog?

mfusaro (author)2013-12-30

my motor runs when hooked up to a 1.5v battery, yet when I run this code hooked up to my laptop, I get nothing. Why?

shanymz (author)2013-03-03

Hi,
I tried your code to run a 12 V dc motor, and it doesnt work. I just hear beeping from motor,
it is connected directly to computer using arduino uno.
I am a newbie! so I really appreciate your help

diy_bloke (author)shanymz2013-10-03

the arduino is 5Volt, yr moor is 12 Volt. I am sure you can do the math on that yourself :-)

Girinata (author)2012-12-18

Good Tutorial,

msurguy (author)2012-12-12

So I am planning to drive a small Electromagnetic coil with this code, it is 120 Ohms so the power consumption will only be 20-40mah max, this code should work, right?

Lenny24 (author)msurguy2012-12-14

Hey, since motors, coils and/or speakers are complex loads, meaning they do not only consist of a resistance that might be defined by Ohm's Law, even a small electromagnet with a static resistance thats > 1000 Ohms could easily kill your Arduino.
The Code should work just fine, but you might consider using an H-Bridge for controlling current.

msurguy (author)Lenny242012-12-14

Thanks ! I might use TI DRV883x series chip for the H Bridge driver then!

acain3 (author)2012-06-25

I'm working on a schematic that uses four transistors per engine, a universal ground, a universal power, and an Arduino Uno. It will allow you to use two wires to control both motor directions. It switches two transistors on at a time.

vkarpuram1 (author)2012-06-04

You must not use this method to control a motor with the arduino as it could blow up the whole board, instead you could use a motor driver like the l298n. Here's a tutorial - http://vkwarehouse.blogspot.in/2012/05/bidirectional-motor-control.html

acain3 (author)vkarpuram12012-06-25

Your link popped up containing Malware.

David97 (author)2012-02-19

I wold not trythhis with big motors anyone looking at doing it for several reasons.
#The current draw would be too big for the arduino
#the back EMF could produce a huge voltag spike and blowing up your arduino.
#Do you think its a good idea when most instructables and projects have motorcontrollers to prevent blowing up the arduino?

Eonir (author)2009-11-02

The power limits of the microprocessor are not the only thing you should be worried about.

A motor is not an entirely resistive object. It has also some inductance. What does that mean? It means that when you reverse the voltage on the pins, the current doesn't change its direction immediately. So, for a short moment, the motor acts like a current source.

And that could effectively blow up your microprocessor.