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

Всем привет.

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

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

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

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

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

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

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

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

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

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

Оставить комментарий