domingo, 10 de julio de 2022

Arduino - Motores paso a paso Bipolares y Unipolares - DRV8825 - ULN2003

  Página principal

Arduino
Motores paso a paso Bipolares y Unipolares
DRV8825 - ULN2003

Había trabajado hace tiempo con este tipo de motores paso a paso, pero no había realizado ningún artículo.



Motores Bipolares




Control de paso a paso con DRV8825
//SETA43
//http: / / seta43.duckdns.org
//http: / / seta43.blogspot.com

#define dirPin 2
#define stepPin 3
#define enablePin 13

void setup()
{
  pinMode(enablePin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop()
{
  Pasos(200,1,1000);
  delay(500); 
  Pasos(200,0,1000);
  delay(500); 
}

void Pasos(int pasos,bool direccion,int timePaso)

  digitalWrite(dirPin, direccion);
  digitalWrite(enablePin, LOW);
  for(int i = 0; i < pasos; i++)
    {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(timePaso);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(timePaso);
    }
  digitalWrite(enablePin, HIGH);
}


Motores Unipolares





El modelo 28byj48 tiene engranajes para producir mas fuerza.




-Relación de reducción de engranajes
Según la hoja de datos, cuando el motor 28BYJ-48 funciona en modo de paso completo, cada paso corresponde a una rotación de 11,25°. Esto significa que hay 32 pasos por revolución (360°/11,25° = 32).

Aparte de esto, el motor tiene un juego de engranajes reductores de 1/64. (en realidad es 1/63.68395 pero para la mayoría de los propósitos 1/64 es una aproximación lo suficientemente buena)

Esto significa que en realidad hay 2038 pasos (32*63,68395 pasos por revolución = 2037,8864 aproximadamente 2038 pasos).

-El consumo de energía
El 28BYJ-48 normalmente consume alrededor de 240 mA.

Dado que el motor consume mucha energía, es mejor alimentarlo directamente desde una fuente de alimentación externa de 5 V en lugar de extraer esa energía del Arduino.
Fuente:  https://lastminuteengineers.com/28byj48-stepper-motor-arduino-tutorial/

//modificado por SETA43
//http: / / seta43.duckdns.org
//http: / / seta43.blogspot.com
//https://www.luisllamas.es/motor-paso-paso-28byj-48-arduino-driver-uln2003/


//definicion de pins
const int motorPin1 = 2;    // 28BYJ48 In1
const int motorPin2 = 3;    // 28BYJ48 In2
const int motorPin3 = 4;   // 28BYJ48 In3
const int motorPin4 = 5;   // 28BYJ48 In4
                  

int stepCounter = 0;     // contador para los pasos
int stepsPerRev = 4076;  // pasos para una vuelta completa


#define FASE3

#ifdef FASE1
//secuencia 1-fase
const int numSteps = 4;
const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };
#endif

#ifdef FASE2
//secuencia 2-fases
const int numSteps = 4;
const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };
#endif

#ifdef FASE3
//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
#endif

void setup()
{
  //declarar pines como salida
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{
  Pasos(1000,1,1000);
  delay(500); 
  Pasos(1000,0,1000);
  delay(500);
}



void Pasos(int pasos,bool direccion,int timePaso)
{
  for(int i = 0; i < pasos; i++)
    {
    if(direccion==1)
      {
        stepCounter++;
        if (stepCounter >= numSteps) stepCounter = 0;
        setOutput(stepCounter);
        delayMicroseconds(timePaso);
      }
      else
      {
        stepCounter--;
        if (stepCounter < 0) stepCounter = numSteps - 1;
        setOutput(stepCounter);
        delayMicroseconds(timePaso);
      }
    }
  digitalWrite(motorPin1, 0);
  digitalWrite(motorPin2, 0);
  digitalWrite(motorPin3, 0);
  digitalWrite(motorPin4, 0);
}

void setOutput(int step)
{
  digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
  digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
  digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
  digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}

AVISO:
En muchos de los montajes que he visto, al parar el motor se sigue alimentando la bobinas.
Esto produce un alto consumo de intensidad, por lo cual se calienta tanto el driver como los motores.
Por lo cual, cuando están parados los motores, deshabilito el paso de corriente por los bobinados de los motores.
En el caso de los unipolares:

  digitalWrite(motorPin1, 0);
  digitalWrite(motorPin2, 0);
  digitalWrite(motorPin3, 0);
  digitalWrite(motorPin4, 0);
Los bipolares con:

  digitalWrite(enablePin, HIGH);


VIDEO

Saludos.
Juan Galaz



Bibliografía:

https://www.luisllamas.es/motores-paso-paso-arduino-driver-a4988-drv8825/
https://lastminuteengineers.com/28byj48-stepper-motor-arduino-tutorial/

No hay comentarios:

Publicar un comentario