Управление несколькими шаговыми двигателями Nema 17 одновременно или NemaStepper

в 10:34, , рубрики: arduino, c++, stepper

image

Всем привет.

Я думаю что вы, если работали с arduino+nema 17, знаете, что запустить несколько двигателей одновременно бывает очень затруднительно.

Есть разные способы решения этой проблемы, самый простой, пожалуй — использование библиотеки NemaStepper. Библиотека упрощает данную задачу во много раз, главное преимущество — она не останавливает выполнение программы. Устанавливается она также, как и все остальные библиотеки. Распространяется по MIT лицензии.

Ну что, давайте приступим. И начнем мы с подключения.

Мы будем использовать Simple Nema 17 с алиэкспресса за 500 рублей, драйвер L298N и arduino uno. Вот они:

image

image

image

  • В примере я буду показывать четыре подключенных драйвера к ардуине, хотя буду использовать только один.
  • В интернете есть много туториалов по подключению Nema 17, поэтому я не буду подробно расписывать это здесь.

Итак, подключаем мотор к драйверу:

image

image

Библиотека является объектно — ориентированной. Давайте рассмотрим пример включения одного мотора:

NemaStepper Stepper1(2, 3, 4, 5, 200, 10, false);
void Setup(){
   Stepper1.SetStepCount(100); //Запускаем вращение на 100 оборотов
}
void Update(){
   Stepper1.Step(); //Обновляем вращение
}

О всех методах библиотеки можно узнать из файлов исходного кода библиотеки (в шапке библиотеки есть описание).

*Подробнее о коде в примере.

А теперь переходим к примеру.

В библиотеке есть встроенный пример (на данный момент он там один), который позволяет управлять сразу тремя моторами с Serial.

Данный пример принимает на порт команды, указанные ниже.

Давайте его разберем.

Начнем с шапки — подключения библиотек:

//This file - example of NemaStepper library.
#include "NemaStepper.h"
String inString;
bool IsStepperEnabled = false;

Далее объявляются три мотора, со следующими параметрами:

1. Первый пин
2. Второй пин
3. Третий пин
4. Четвертый пин
5. Количество шагов за оборот — у большинства моторов Nema 17 это 200.
6. Стартовая скорость
7. Значение указывающее, нужно ли удерживать вал после остановки (при true драйверы превращаются в барбекю)

NemaStepper Stepper1(2, 3, 4, 5, 200, 10, false);
NemaStepper Stepper2(6, 7, 8, 9, 200, 10, false);
NemaStepper Stepper3(10, 11, 12, 13, 200, 10, false);

Далее инициализация порта:

void setup() {
  Serial.begin(9600);
}

Затем, ВАЖНО! В главном цикле нужно обновлять положение двигателей командой Step()

void loop() {
  if (IsStepperEnabled == true){
    Stepper1.Step();
    Stepper2.Step();
    Stepper3.Step();
  }
  GetCommandFromSerial();
}

Далее следует подпрограмма, которая получает данные с порта, включает/выключает моторы, задает скорость, тормоза, вращение.

void GetCommandFromSerial() {
  if (Serial.available() > 0) {  //если есть доступные данные
    int inChar = Serial.read();
    if (inChar == '/') {
      String command = ((String)inString[0] + (String)inString[1] + (String)inString[2]);
      String param;
      int len = inString.length();
      for (int i = 3; i < len; i++) {
        param = (String)param + (String)inString[i];
      }
      if (command == "MV1") {
        Stepper1.SetStepCount(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "MV2") {
        Stepper2.SetStepCount(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "MV3") {
        Stepper3.SetStepCount(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SS1") {
        Stepper1.SetSpeed(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SS2") {
        Stepper2.SetSpeed(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SS3") {
        Stepper3.SetSpeed(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SB1") {
        Stepper1.SetBrakes(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SB2") {
        Stepper2.SetBrakes(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "SB3") {
        Stepper3.SetBrakes(param.toInt());
        Serial.println(param.toInt());
      }
      if (command == "EMS") {
        IsStepperEnabled = true;
        Serial.println(param.toInt());
      }
      if (command == "DMS") {
        IsStepperEnabled = false;
        Serial.println(param.toInt());
      }
      inString = "";
    } else {
      inString += (char)inChar;
    }
  }
}

И так, давайте попробуем загрузить ее в плату.

Загрузили?

Тогда заходим в монитор порта и вводим команды из кода.
Каждая команда заканчивается символом /.
Первые три символа — название команды.
То, что между названием и / — параметры.
Давайте включим моторы командой «EMS/» (Enable MotorS).
Затем укажем мотору 1 скорость 60 командой «SS160/» (Set Speed), где 60 — скорость.
И наконец, включим первый мотор командой «MV1100/», (MoVe) где 100 — количество оборотов.
Все работает. Ура.

Тоже самое с остальными моторами.

Ну и где взять библиотеку.

Библиотеку можно скачать, отблагодарив создателя, по ссылке, указав ей реальную цену:

Get NemaStepper

Спасибо за прочтение, надеюсь вам помогла моя статья.

Когда я искал решение моей проблемы, единственной подходящей библиотекой оказалась она.

Автор: anunknowperson

Источник


* - обязательные к заполнению поля