Драйвер шагового двигателя EasyDriver V44 A3967 для Arduino

EasyDriver представляет собой простой в использовании драйвер шагового двигателя, совместимы со всеми двигателями, которые работают с логикой от 0 до 5 вольта (или от 0 до 3,3 вольта , если закрыть вывод SJ2 на драйвере EasyDriver). EasyDriver работает с питанием шаговых двигателей от 7Вольт до 30 Вольт. EasyDriver имеет стабилизатор напряжения для цифрового интерфейса, который может быть установлен на 5V или 3.3V.
EasyDriver подключается как к шаговым двигателям (4,6 или 8 проводным шаговым двигателям) та и биполярным.

 

EasyDriver V44 A3967 для Arduino EasyDriver V44 A3967 для Arduino
EasyDriver V44 A3967 для Arduino  

 

A3967 микрошаговый драйвер.

MS1 и MS2 контакты изменяют микрошаг (Microstepping) на полный, половина, четверть и одну восьмую шагов (по умолчанию восьмой).

Совместимость с 4, 6 и 8 проводными шаговыми двигателями любого напряжения.

Регулируемый ток от 150 мА / фазы до 750 мА / фазы.

Диапазон напряжения питания от 7В до 30В. Чем выше напряжение, тем выше крутящий момент при высоких скоростях.

Включение (ВКЛ). При включении активный низкий вход сохраняется на всех выводах .

Спящий режим (SLEEP). Активным низким уровнем входного сигнала используется для минимизации энергопотребления, когда двигатель не используется. Отключает большую часть внутренней схемы в том числе выходов. Высокий логический вывод обеспечивает нормальное функционирование и запуск устройства с исходногого положение.

 

Схема подключения к L298N  Подключение к L298N увеличивает мощность.

Схема подключения к L298N

Подключение к L298N увеличивает мощность.

Схема подключения с использование биполярных транзисторов TIP120
Схема подключения с использование биполярных транзисторов TIP120

 

  Пример подключнения 3 осей
 Пример подключнения 3 осей
 Пример подключения
 Пример подключения

 

С помощью программы можно продемонстрировать работу шагового двигателя. Выполняются две функции, поворот на 90 градусов (отрицательное вращение вращение в противоположном направлении), микрошаг (8)

Обе функции со скоростью .01 и 1. Скорость .01 медлено но большое усилие, и 1 с быстрой скорость но малым усилием.

 

 

Sketch code

//Released under the MIT License - Please reuse change and share
//Using the easy stepper with your arduino
//use rotate and/or rotateDeg to controll stepper motor
//speed is any number from .01 -> 1 with 1 being fastest -
//Slower Speed == Stronger movement


#define DIR_PIN 2
#define STEP_PIN 3

void setup() {
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
}

void loop(){

  //rotate a specific number of degrees
  rotateDeg(360, 1);
  delay(1000);

  rotateDeg(-360, .1);  //reverse
  delay(1000);


  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  rotate(1600, .5);
  delay(1000);

  rotate(-1600, .25); //reverse
  delay(1000);
}

void rotate(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir);

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir);

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

 

Sketch code

/*Пример программы
Table 1.   Microstep Resolution Truth Table
 MS1  MS2   Resolution
 L    L     Full step (2 phase)
 H    L     Half step
 L    H     Quarter step
 H    H     Eighth step

 DIR = D6
 Step = D5  // LOW to HIGH
 SLEEP = D7 // active LOW
 MS1 =   D8
 MS2 = D9
 Enable = D10 // active LOW

 */

#define DIR_PIN 6
#define STEP_PIN 5
#define SLEEP 7
#define MS1 8
#define MS2 9
#define ENABLE 10

void setup()
{
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  pinMode(SLEEP, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(ENABLE, OUTPUT);

  digitalWrite(DIR_PIN, LOW);
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(SLEEP, HIGH);
  digitalWrite(MS1, LOW); // set for single step
  digitalWrite(MS2, LOW);
  digitalWrite(ENABLE, HIGH);  // motor off

}  // end setup

void loop()
{

  int i;

  motorOff();
  delay(2000); // wait for 3 seconds
  digitalWrite(DIR_PIN, LOW);     // Set the direction.
  fullStep();
  motorOn();

  for (i = 0; i< 200; i++)       // Iterate for 200 microsteps.
  {
    pulseOut(STEP_PIN);
    delay(5);
  }

  motorOff();
  delay(2000); // wait for 3 seconds
  digitalWrite(DIR_PIN, HIGH);     // Set the direction.
  halfStep();
  motorOn();

  for (i = 0; i< 400; i++)       // Iterate for 400 microsteps.
  {
    pulseOut(STEP_PIN);
    delay(2);
  }

  motorOff();
  delay(2000); // wait for 3 seconds
  digitalWrite(DIR_PIN, LOW);     // Set the direction.
  quarterStep();
  motorOn();

  for (i = 0; i< 800; i++)       // Iterate for 800 microsteps.
  {
    pulseOut(STEP_PIN);
    delay(1);
  }

  motorOff();
  delay(2000); // wait for 3 seconds
  digitalWrite(DIR_PIN, HIGH);     // Set the direction.
  eighthStep();
  motorOn();

  for (i = 0; i< 1600; i++)       // Iterate for 1600 microsteps.
  {
    pulseOut(STEP_PIN);
    delay(2);
  }

} // end loop

// inverts state of pin, delays, then reverts state back
void    pulseOut(byte x)   {
  byte z = digitalRead(x);
  delayMicroseconds(10);
  z = !z; // reverse state
  digitalWrite(x, z);
  z = !z; // return to original state
  digitalWrite(x, z);
} // end pulsout()


void fullStep(void)   {
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, LOW);
}

void halfStep(void)   {
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, LOW);
}

void quarterStep(void)   {
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, HIGH);
}

void eighthStep(void)   {
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
}


void motorOff(void)   {
  digitalWrite(ENABLE, HIGH);
}

void motorOn(void)   {
  digitalWrite(ENABLE, LOW);
}

Sketch code

//Пример программы управления двигателем с помощью джойстика

#define step_pin 3  // Pin 3 connected to Steps pin on EasyDriver
#define dir_pin 2   // Pin 2 connected to Direction pin
#define MS1 5       // Pin 5 connected to MS1 pin
#define MS2 4       // Pin 4 connected to MS2 pin
#define SLEEP 7     // Pin 7 connected to SLEEP pin
#define X_pin A0    // Pin A0 connected to joystick x axis

int direction;    // Variable to set Rotation (CW-CCW) of the motor
int steps = 1025; // Assumes the belt clip is in the Middle

void setup() {
   pinMode(MS1, OUTPUT);
   pinMode(MS2, OUTPUT);
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   pinMode(SLEEP, OUTPUT);
   
   digitalWrite(SLEEP, HIGH);  // Wake up EasyDriver
   delay(5);  // Wait for EasyDriver wake up
   

/* Configure type of Steps on EasyDriver:
// MS1 MS2
//
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //
*/

   digitalWrite(MS1, LOW);      // Configures to Full Steps
   digitalWrite(MS2, LOW);    // Configures to Full Steps
   
}

void loop() {
  while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 100) {
    if (steps > 0) {
      digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
      digitalWrite(step_pin, HIGH);
      delay(1);
      digitalWrite(step_pin, LOW);
      delay(1);
      steps--;
    }      
  }
 
    while (analogRead(X_pin) > 100 && analogRead(X_pin) <= 400) {
      if (steps < 512) {
        digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps++;
      }    
      if (steps > 512) {
        digitalWrite(dir_pin, HIGH);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps--;
      }
    }    
      
    while (analogRead(X_pin) > 401 && analogRead(X_pin) <= 600) {
      if (steps < 1025) {
        digitalWrite(dir_pin, LOW);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps++;
      }    
      if (steps > 1025) {
        digitalWrite(dir_pin, HIGH);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps--;
      }
    }

    while (analogRead(X_pin) > 601 && analogRead(X_pin) <= 900) {
      if (steps < 1535) {
        digitalWrite(dir_pin, LOW);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps++;
      }    
      if (steps > 1535) {
        digitalWrite(dir_pin, HIGH);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps--;
      }    
    }   
   
    while (analogRead(X_pin) > 900 && analogRead(X_pin) <= 1024) {
      if (steps < 2050) {
        digitalWrite(dir_pin, LOW);
        digitalWrite(step_pin, HIGH);
        delay(1);
         digitalWrite(step_pin, LOW);
        delay(1);
        steps++;
      }
    }
}

 

Рекомендуем:

Подключение клавиатуры и мыши

Как подключить и управлять шаговым двигателем с ИК-пульта дистанционного управления

Отображения результатов на LCD-дисплее

Управление шаговым двигателем с помощью джойстика

Подключение и использование модуля реле с инфракрасным датчиком движения HC-SR501

Запись с Arduino времени и даты события на MicroSD

Использование модуля DS1307 RTC

Использование пульта дистанционного управления в Arduino проекте