Motor pas a pas 28BYJ-48: tot el que has de saber

28byj-48 motor pas a pas

El 28BYJ-48 és un motor pas a pas unipolar de baix cost i gran precisió, ideal per a projectes d'electrònica, per a impressores 3D, màquines CNC, i robòtica. La seva mida compacta, baix consum i facilitat dús el converteixen en una opció popular per a aficionats i professionals de lelectrònica.

A més, juntament amb aquest motor, també se sol vendre un mòdul amb ULN2003, pel seu control. D'aquesta manera, tenim tot allò necessari per poder utilitzar aquest sistema de forma completa, utilitzant un microcontrolador o una placa Arduí o similars.

Què és el motor pas a pas 28BYJ-48?

motor elèctric interior: estator-rotor

Un motor pas a pas és un tipus de motor elèctric que es mou en petits passos angulars discrets, en lloc duna rotació contínua. Funciona fent servir un conjunt d'electroimants que s'activen en una seqüència específica. En activar diferents electroimants, es crea un camp magnètic que atrau el rotor del motor, fent que giri un pas alhora. La quantitat de passos per revolució i la precisió del moviment depenen del disseny específic del motor i de la seqüència de control utilitzada.

Dins dels motors pas a pas tenim dos tipus:

  • Unipolars: tenen un sol conjunt de bobines i requereixen un controlador especial per invertir el corrent i fer que el motor giri en les dues direccions.
  • Bipolars: tenen dos conjunts de bobines independents, cosa que els permet girar en les dues direccions sense necessitat d'un controlador especial.

En el cas del 28BYJ-28 és de tipus unipolar, com he comentat anteriorment. I, dins aquest grup, es caracteritza per tenir les següents ESPECIFICACIONS:

  • Pas a pas unipolar: control senzill amb només 4 cables.
  • Reductor integrat: ofereix alta precisió (0.088° per pas) i parell motor (3 N·cm).
  • baix consum: 83 mA (model 5V) o 32 mA (model 12V).
  • Alimentació: 5V o 12V (segons model).
  • preu econòmic: des de 1.2€ per unitat, o una mica més si inclouen un mòdul ULN2003.

Quant a les possibles aplicacions, ja en citi abans algunes, però aquí et poso novament algunes idees per als teus projectes:

  • Control de vàlvules hidràuliques i pneumàtiques.
  • Robots articulats i braços robòtics.
  • Posicionament de sensors.
  • Taules giratòries per a escàners.
  • Impressores 3D.
  • Màquines CNC.

El motor pas a pas no funciona sol, necessita un altre element. En aquest cas, el 28BYJ-48 es controla mitjançant una placa amb un integrat ULN2003, que permet amplificar el corrent de les sortides d'Arduino per alimentar les bobines del motor. En activar les bobines a la seqüència correcta, el motor gira pas a pas amb gran precisió.

Tipus de seqüències de control i fases

Existeixen diverses seqüències de control per al 28BYJ-48, les més comunes són:

  • Seqüència d'ona completa: activa totes les bobines alhora.
  • Seqüència de mig pas: activa dues bobines adjacents alhora.
  • Seqüència de pas microscòpic: activa una bobina alhora.

Vegem les fases de forma detallada:

  • Seqüència 1-fase: en seqüència d'1-fase encenem una única bobina cada cop. Portant aquesta seqüència d'encesa a una taula, al pinout del motor caldria generar el següent:
Pas A B A ' B '
1 ON OFF OFF OFF
2 OFF ON OFF OFF
3 OFF OFF ON OFF
4 OFF OFF OFF ON
  • Seqüència 2-fases: encenem dues bobines correlatives en cada fase, per la qual cosa el camp magnètic generat és més gran (un 41% més) per la qual cosa el motor té més parell, és a dir, obtenim més força. Com a punt negatiu, augmentem el consum energètic al doble. Pel que fa a la taula, seria:
Pas A B A ' B '
1 ON ON OFF OFF
2 OFF ON ON OFF
3 OFF OFF ON ON
4 ON OFF OFF ON
  • Seqüència en mig pas (half-step): aquesta és una altra de les etapes que veurem, tu pots experimentar el que més t'interessi. Aquí encenem alternativament un i dues bobines, aconseguint una precisió de la meitat del pas. S'utilitza en aplicacions on es necessiti més precisió, encara que podria haver-hi problemes quan l'aplicació estigui al límit de parell. Expressant la seqüència en forma de taula resulta:
Mitjà-pas A B A ' B '
1 ON OFF OFF OFF
2 ON ON OFF OFF
3 OFF ON OFF OFF
4 OFF ON ON OFF
5 OFF OFF ON OFF
6 OFF OFF ON ON
7 OFF OFF OFF ON
8 ON OFF OFF ON

28BYJ-28 amb Arduino

28byj-48 amb Arduino

El primer és connectar de forma adequada el mòdul i el motor 28byj-48 a la nostra placa d'Arduino, per això, simplement has de realitzar les connexions següents:

  • Pin – de l'ULN2003 a GND d'Arduino.
  • Pin + de l'ULN2003 a Vcc (5v o en altres casos, si és un motor de 12v, caldria fer servir una font d'alimentació amb aquest voltatge) d'Arduino.
  • IN1, IN2, IN3 i IN4 de l'ULN2003 a les entrades digitals D8, D9, D10 i D11 d'Arduino.
  • El motor 28byj-48, simplement connectar-lo al port que hi ha al mòdul ULN2003.

Ara que està connectat, el següent és fer servir un exemple a Arduino IDE, que tu podràs fer servir tal qual per experimentar o modificar-lo al teu gust. En aquest exemple, totes les taules de fases estan comentades, com // davant de la línia, ja saps… Si vols utilitzar-ne una, simplement esborra // davant de les instruccions.

//Definir los pines
const int motorPin1 = 8;    // 28BYJ48 In1
const int motorPin2 = 9;    // 28BYJ48 In2
const int motorPin3 = 10;   // 28BYJ48 In3
const int motorPin4 = 11;   // 28BYJ48 In4
                   
//Definición de variables
int motorSpeed = 1200;   //Velocidad del motor
int stepCounter = 0;     //Contador de pasos
int stepsPerRev = 4076;  //Pasos para un giro completo

//Tablas de secuencia (descomentar la que necesites)
//Secuencia 1-fase
//const int numSteps = 4;
//const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };

//Secuencia 2-fases
//const int numSteps = 4;
//const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };

//Secuencia media fase
//const int numSteps = 8;
//const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };

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

void loop()
{
  for (int i = 0; i < stepsPerRev * 2; i++)
  {
    clockwise();
    delayMicroseconds(motorSpeed);
  }
  for (int i = 0; i < stepsPerRev * 2; i++)
  {
    anticlockwise();
    delayMicroseconds(motorSpeed);
  }
  delay(1000);
}

void clockwise()
{
  stepCounter++;
  if (stepCounter >= numSteps) stepCounter = 0;
  setOutput(stepCounter);
}

void anticlockwise()
{
  stepCounter--;
  if (stepCounter < 0) stepCounter = numSteps - 1;
  setOutput(stepCounter);
}

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));
}