1 RPM to 3000 RPM and everything in between


I'm new to the world of microcontrollers and motors and I set out with the intention of powering a 3V DC motor and controlling the speed from 1 RPM to 3000 RPM.

After doing some research, I've learned that it is possible to take a 3V DC motor capable of 50,000 RPM and reduce the RPM to lower than the motor's lowest achievable RPM by using gears and playing around with gear ratios to bring the RPM down. I'd assume you can do the opposite and take a motor capable of 1000 RPM and use it to turn something at faster speeds by playing around with the gear ratios.

As far as I can tell, there's no way to get 1 RPM and 3000 RPM from the same setup, without shifting from one gear ratio to another. I'm not sure how I'd be able to set something like this up, since I'm working with very limited space inside a 1/48 scale model. I'm beginning to think it is impossible to achieve.

I've looked into other types of motor, such as stepper motors and planetary motors, but I don't think they are suitable either. With my limited knowledge, it always comes down to shifting from one gear to another, but I cannot find any advice on this when it comes to miniature scale.

Have I missed something very obvious? Any advice would be most welcome!

Search for "Arduino motor PWM". You can control speed over a wide range but small DC motors won't usually run at VERY low speeds. So you'll need to do some investigating of specifications and probably some testing but I doubt if a range of 3000:1 will work well. How did you choose those specific speeds?


Motor RPM, motor power and motor torque are all mathematically related. When you use gears to increase the RPM, you reduce the power and torque by the same ratio.
What are you trying to accomplish?

@slipstick Thanks for the response! I've played around with an Arduino and an L293D motor driver, setting the PWM values between 0 and 255, but of course the motor won't turn at 0. It can vary between setups, but you usually need a much higher value to actually get the motor to turn at all, even with no load. Once I input the correct value, the motor will turn, but the RPM will be much higher than 1.

@Paul_KD7HB Thank you for the reply! Yes, I figured I'd hit a brick wall when I tried calculating some examples. The intention is to spin a model propeller or rotor blade, to simulate the realistic slow start and eventual high speed. That speed will depend on whether it's an engine propeller, main rotor or tail rotor, etc. But the gradual, slow increase from 1 RPM and upwards is what I'm trying to achieve.

Have you looked at sample programs that use a potentiometer to vary a small motor RPM? You can do something similar, but change the PWM as if there was a slow turning potentiometer being used.

Thanks again! I'm not sure if I understand what you're suggesting. Do you mean use an Arduino sketch that can read the finer values of a potentiometer, but instead of actually using the potentiometer to input the values, I leave the potentiometer out and just manually type them into the sketch?

The potentiometer values will be increased every so many milliseconds until the maximum speed is reached. Your program loop() will have code to determine the time each increment in speed will be computed.

I think this is beyond what I'm able to figure out on my own. I looked through some sketches, but some refer to converting readings from the potentiometer into PWM values between 0 and 255 to control speed. But I can already control the speed with these values directly and cannot get the motor to turn slow enough. I didn't see anything about speed over time or millisecond inputs, but each sketch I saw looked very different from the next. I'm haven't practiced with IDE software enough to know what all of the coding means.

But yes, small speed increments spread out over an allotted time is how I imagined I'd have to write the code. Say I wanted to go from no speed to full speed in 4 minutes. I'd input the lowest value to get the motor turning and then make small speed increments spread out even across those 4 minutes to make the increase in speed appear smooth.

At the moment the lowest PWM value to get the motor turning is starting the motor at an RPM that is too high.

Unless I've misunderstood your point entirely or overlooked something significant, I'm confused with how I can proceed with your suggestion.

It's a tricky one to figure out, I thought it would have been a simple effect to achieve, but maybe that's why I can't find anything about it.

You could try with a 1:10 geared motor and low-frequency PWM.

Yes you can, this is done with closed-loop control, and is called a servomotor.

Welcome to the forum.

What 1/48th scale model needs 1 RPM, and why such a wide range?

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

I asked that question a while ago and got no answer. But the fact still remains that no very small 50,000rpm DC motor will run at 1 rpm without a lot of gearing by which time it's no longer a very small motor.


Hi, @unobravo

Can you please tell us your electronics, programming, arduino, hardware experience?

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

Perhaps a Brushless DC (BLDC) motor would do the trick. They have coils and magnets like a stepper motor but they are designed for much higher speeds.

Here is a project for using an Arduino to directly control a BLDC motor:

Note: You needs a 'sensored' motor because the sensorless motors have a minimum speed, probably way above 1 RPM.

@Wawa The problem with gearing down to a lower RPM is that the motor will no longer be able to reach the higher RPM that I'm looking for. I've seen geared dc motors that are capable of low RPM, but without shifting gear ratio to something else I can't get back up to higher speeds. So that's why I considered having to build some kind of small gear box, but with limited space it would be tricky.

@MarkT While I was looking at servos, I realised they are great for fine control at lower speeds. A digital continuous servo motor can produce very smooth movement, but as far as I can tell, I cannot get one small enough for the purpose in mind.

@ TomGeorge The reason for the low RPM requirement is to realistically simulate the slow start of a helicopter rotor. The model is a replica/presentation/display piece and not a toy. Also, my knowledge of electronics is basic and I'm relatively new to Arduino and the IDE software.

@ johnwasser Thanks John, I'd never heard of a sensored motor before. I looked into it and yes they are capable of slow starts with high control even at 1 RPM. They can also run at fast enough speeds. I think the problem is their size and availability. The smallest that were readily available were the kind found in larger scale RC cars and too big for my project. I searched for small, micro, miniature, mini sensored motors, but found nothing.

Something that caught my eye was a custom built, 3D printed, miniature gearbox that had at least 3 gear ratios and looked like the perfect size. Sadly, I don't have the expertise or the resources to pull something like that off, but at least I know it is possible.

Thank you for the suggestions, much appreciated!

Let's look at your problem from a different perspective! How does a real helicopter do the real thing that you are trying to emulate? I am sure they don't shift gears.

If you are going to fly this helicopter, have you calculated the torque required?

The motor and gearbox characteristics, if you use one just to get slow on the ground RPM, will depend on this factor.

Tom... :smiley: :+1: :coffee: :australia:

@Paul_KD7HB Thanks, it makes sense to take that approach. I read through the following page, but I'm unable to decipher most of it.

The second diagram mentions a "planetary gear case" and the description of that can be found below the diagram. It refers to a first and second stage planetary gear section. I'm guessing that means there's a shift in gear ratios at that point, but I couldn't say for certain.

@TomGeorge The helicopter will not be able to fly. That's not my intention. It's just a display model with some bells and whistles to bring it to life through light, sound and motion.

Thinking along the lines of a 3-stage gear shift. Would it be possible to use 3 small dc motors and apply a gear ratio to each of them. 1 capable of the lowest RPM required and 1 capable of the highest RPM required. The third motor would bridge the gap between the other two. All three of them would be connected to the main rotor shaft, but only one of them would be supplied with power at any given time. I could cut power to the first motor and have the second take over and then cut power to the second and have the third take over.

I think one of the problems with this could be the fact that they are all connected to the main shaft at the same time. The gears for the motors that are not powered would still be turning which would generate some kind of energy in the coils of the unpowered motors? Again my lack of understanding doesn't help matters.

Could something like that work do you think?


Why 3000RPM?
Most real helicopters rarely get over 500RPM.

Its only models that get to 3000RPM and that is to get actual lift not for a realistic effect.
Tom... :smiley: :+1: :coffee: :australia:

Perhaps there is a way to add hall-effect sensors to a sensorless BLDC motor.