How to achive less then 1 rpm in stepper motors?

Hello guys,

I'm totally new in the Arduino world.

I´ve connected a display (128x32) and a Stepper (the cheapest on earth) and sorted out how to work with them.

My problem is: how to achieve slow speeds in the Stepper? Like, 0.2 rpm?
It´s going to be used on a 3D printed project and i thought to make a reduction gear, but i don´t think thats the best idea...

I've read about micro-step or half step, do i need a specific controller for it? Could this be the solution?

I don't know much about codding, just got some codes and mixed them together to try to make what i wanted...

#include <Stepper.h>
#define STEPS 2038 // the number of steps in one revolution of your motor (28BYJ-48)
Stepper stepper(STEPS, 8, 10, 9, 11);

//Linhas inicialização do display 
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <gfxfont.h>

Adafruit_SSD1306 dsp(-1);//cria o objeto do display para i2c 

int rpm = 0;
int passos = 0;


void setup() {
    Serial.begin(9600);
  // Display inicio do programa
    dsp.begin(SSD1306_SWITCHCAPVCC, 0x3C);//inicia o display com endereco padrao
  dsp.clearDisplay();//limpa a tela
 
 
  dsp.setTextColor(WHITE);//define o texto para branco (no display ficara azul)
 
  dsp.setTextSize(2);//define o tamanho do texto
  dsp.println("Iniciando programa");//escreve na tela a mensagem
  dsp.display();//mostra as alteracoes no display, sem isso nao ira mostrar nada!!
  delay(2000);
  dsp.clearDisplay();

  //Nada pra motor de passo!
 
}

void initlapse(int tempo, int graus){
//int passosint = passos.toInt()
Serial.print("Tempo ="); Serial.print(tempo);

// tempo = quantos segundos para 1 rotação
  rpm = 60/tempo;
  Serial.print("RPM ="); Serial.print(rpm);
  passos = (2038/ (360/graus));
  Serial.print("Passos =" );Serial.print(passos);
  
  
  //ajusta rpm para qtde de graus
  //rpm = rpm * (360/graus);



  dsp.clearDisplay(); 
  dsp.setTextSize(1);//define o tamanho do texto
  dsp.setCursor(0,0);
  dsp.println("Tempo = " + String(tempo));
  Serial.print("Tempo=" + tempo);
  dsp.println("Graus = " + String(graus));
   Serial.print("Graus = " + graus);
  dsp.println("Steps =" + String(passos));
  dsp.println("Rpm =" + String(rpm));
    dsp.display();//escreve na tela a mensagem

  stepper.setSpeed(rpm);
  stepper.step(passos); // do 2038 steps -- corresponds to one revolution in one minute
    
 delay(5000); // wait 

 
}





void loop() {
  
initlapse(61,360);
dsp.clearDisplay(); 
  dsp.setTextSize(2);//define o tamanho do texto
  dsp.setCursor(0,0);
  dsp.println("Acabou");
   dsp.display();
  delay(6000);
   
 
 
  //stepper.setSpeed(rpm); // 1 rpm
  //stepper.step(2038); // do 2038 steps -- corresponds to one revolution in one minute

  
  /*
  dsp.clearDisplay();
  dsp.setTextSize(1);//define o tamanho do texto
  dsp.println("Rodando a ");//escreve na tela a mensagem
   dsp.println(rpm);
  dsp.display();//mostra as alteracoes no display, sem isso nao ira mostrar nada!!
  
    rpm = 6;
  stepper.setSpeed(rpm); // 6 rpm
  stepper.step(-2038); // do 2038 steps in the other direction with faster speed -- corresponds to one revolution in 10 seconds
*/
}

By know you know the stepper motor moves in "steps". If the proper current is supplied to the motor windings, the time to move one step will always be the same. To get slower RPM, the time BETWEEN steps must be increased. As you can see, you will never get a smooth rotation of the motor.

If you program the controller for 1/2 steps or 1/4 steps, etc. you can get a bit smother motion, but still steps.

But you still need time between the small steps to get slower rotation.

Paul

The "cheapest on earth" ones if being the 28BYJ-48 (from the code posted) usually come with a ULN2003 driver chip and the stepper is already geared down. So driving them slow is what these were made for.

Post a link or ID on the stepper.

To make the motor move slowly use the Stepper library to move the motor in single steps and create your own interval between steps. You could take one step per day if you wished.

...R

Its normal practice to use microstepping anyway, as there is less vibration and noise when
moving quickly and less obvious steps when moving slowly. x16 is a good place to start.