Всем привет.
Я думаю что вы, если работали с 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 — количество оборотов.
Все работает. Ура.
Тоже самое с остальными моторами.
Ну и где взять библиотеку.
Библиотеку можно скачать, отблагодарив создателя, по ссылке, указав ей реальную цену:
Спасибо за прочтение, надеюсь вам помогла моя статья.
Когда я искал решение моей проблемы, единственной подходящей библиотекой оказалась она.
Автор: anunknowperson