Нужна помощь в выяснении того, как организовать систему для запуска шагового двигателя на низкой скорости без пропуска шагов.
TL;DR : Как предотвратить пропуск ступеней с двигателем с редуктором NEMA на низкой скорости.
Я нахожусь в процессе создания системы, в которой я хочу, чтобы объект поворачивался на тарелке и показывал букву в зависимости от угла поворота. Объект довольно тяжелый, поэтому вращение должно быть довольно медленным, поэтому я взял шаговый двигатель NEMA с планетарной коробкой передач.
Моя система состоит из:
- Ардуино Уно
- Шаговый двигатель NEMA
- Драйвер A4988
- Несколько проводов
- 2 железные пластины
- Элемент шарикоподшипника между железными пластинами
- Винты, чтобы собрать все вместе.
Вот код, который у меня получился:
// Определяем подключения шагового двигателя и количество шагов на оборот:
#define dirPin 6
#define stepPin 7
#define stepsPerRevolution 5373
int degree_init = 1;
int mouvement=0;
// создаем сопоставление между буквами и градусами
int letterToDegree[33] ;
int degree;
// функция для преобразования букв в градусы
int mapLetterToDegree(char letter) {
if (letter=='.'){
return letterToDegree[27];
}
else if (letter==':'){
return letterToDegree[28];
}
else if (letter=="\'"){
return letterToDegree[29];
}
else if (letter==' '){
return letterToDegree[30];
}
else {
int letterIndex = letter - 'A'; // получаем индекс буквы в алфавите
return letterToDegree[letterIndex]; // вернуть степень, связанную с этой буквой
}
}
void setup() {
// Объявить выводы выводом:
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
Serial.begin(9600);
for (int i = 0; i < 33; i++){
letterToDegree[i]= degree_init;
degree_init=degree_init+10;
}
}
void loop() {
int p= NULL;
// Установить направление вращения по часовой стрелке:
digitalWrite(dirPin, HIGH);
String input= "NOW THE NOW THE AAAAA";
// цикл по буквам
for (int i = 0; i < input.length(); i++) {
// получить степень для каждой буквы
degree = mapLetterToDegree(input[i]);
Serial.print("Letter: ");
Serial.print(input[i]);
Serial.print(" Degrees: ");
Serial.println(degree);
// ждем завершения движения
delay(1000);
int p_new= map(degree,0,360,0,5373);
Serial.print(" position: ");
Serial.println(p_new);
if (p!=NULL){
mouvement=p_new-p;
p=p_new;
Serial.print(" mouvement: ");
Serial.println(mouvement);
}
else{
p = p_new;
}
if (mouvement<0){
digitalWrite(dirPin, LOW);
mouvement=abs(mouvement);
Serial.println("change de direction");
}
Serial.print(" stepper: ");
Serial.println(mouvement);
// Медленно поверните шаговый двигатель на 1 оборот:
for (int i = 0; i < mouvement; i++) {
// Эти четыре строки приводят к 1 шагу:
digitalWrite(stepPin, HIGH);
delay(20);
digitalWrite(stepPin, LOW);
delay(20);
}
delay(1000);
digitalWrite(dirPin, HIGH);
}
}
Я пытался следовать этому руководству, и в общих чертах оно работает но иногда мотор пропускает шаги, особенно при смене направления.
Кажется, я не понимаю, как работает крутящий момент в этой системе и как минимизировать нагрузку на двигатель. Моя гипотеза состоит в том, что, поскольку система находится в равновесии и трение сведено к минимуму благодаря шарикоподшипнику, не должно быть необходимости в большой мощности двигателя, и этого двигателя должно хватить.
Моя гипотеза о том, почему шаги пропускаются:
- Слишком высокая скорость для двигателя.
- Недостаточный крутящий момент.
- Недостаточно хорошее электроснабжение двигателя.
Я не знаю, как проверить эти гипотезы и верны ли они. У меня также много проблем с пониманием взаимосвязи между временной задержкой в коде и движением мотора.
Особенно этот момент:
for (int i = 0; i < mouvement; i++) {
// Эти четыре строки приводят к 1 шагу:
digitalWrite(stepPin, HIGH);
delay(20);
digitalWrite(stepPin, LOW);
delay(20);
}
Можно ли изменить их, как это сделал я? должны ли они быть симметричными (одинаковая задержка для высоких и низких частот)?
Я также ищу объяснение того, как применять алгоритмы ускорения и замедления для шагового двигателя, хотя я не уверен, что это имеет смысл при такой скорости.
Мои вопросы:
- Как рассчитать наилучшую скорость для такой системы и как ее реализовать?
- Есть ли необходимость в ускорении/торможении?
- Имеет ли смысл использовать микрошаг при использовании редуктора?
- Есть ли какие-то очевидные недостатки в моей системе/коде, которые я упускаю?
@Guillaume_slize, 👍1
Обсуждение1 ответ
Лучший ответ:
Как рассчитать наилучшую скорость для такой системы и как это реализовать?
Не существует лучшей скорости. Это зависит от ваших требований, крутящего момента двигателя с подаваемой мощностью и приводом, а также инерции вращения объекта на оси двигателя. Вы можете измерить инерцию вращения и задать себе значение ускорения (даже если вы не будете писать программу для ускорения, оно будет ускоряться на первых шагах), которое вы хотите иметь. Затем вы можете проверить, достаточно ли для этого крутящего момента вашего двигателя.
Кстати, о двигателе: проверьте номинальные характеристики двигателя. Хороший поставщик также должен предоставить вам информацию о том, какой крутящий момент имеет ваш двигатель при определенных токах. Затем проверьте, может ли ваш драйвер выдерживать ток (эти маленькие драйверы палочек часто не могут выдерживать большой ток, например, 1 или 2 А максимум). Эти драйверы также имеют на борту небольшой потенциометр, который регулирует ток двигателя. Ваш поставщик также должен предоставить информацию о том, как правильно его настроить (проверив напряжение на одном из контактов). Вы даже можете найти информацию об этом в Интернете, когда будете искать свой тип драйвера. Неправильная настройка может привести либо к недостаточной производительности двигателя, либо к его перегреву. Поэтому при настройке тока двигателя с помощью потенциометра проверьте температуру двигателя во время его работы. У каждого мотора свой температурный диапазон, но я бы не советовал допускать, чтобы он был слишком горячим.
Сделав все вышеперечисленное, вы можете запустить тест для проверки скорости двигателя. Забудьте о вашем текущем коде на некоторое время. Просто управляйте двигателем с определенной скоростью, начиная всего с нескольких шагов в секунду и увеличивая ее до тех пор, пока не заметите, что двигатель прыгает. Тогда вы знаете, как быстро вы можете управлять двигателем в вашей конфигурации без пропусков и ускорений. Если это достаточно быстро для вас, вы можете просто придерживаться этого.
Есть ли необходимость в ускорении/торможении?
Это зависит от вышеизложенного. Если скорость без пропуска недостаточна, вы можете ускориться, постепенно увеличивая количество шагов в секунду (т. е. уменьшая задержку между шаговыми импульсами). Чтобы остановиться в определенной позиции, вам нужно замедлиться, поэтому вам нужно спланировать движение и соответственно контролировать количество шагов в секунду. Если вы не хотите делать это самостоятельно, я бы посоветовал использовать библиотеку AccelStepper
. Там вы можете установить целевую скорость и максимальное ускорение, после чего библиотека будет управлять двигателем за вас.
Вы написали в комментарии, что пробовали библиотеку AccelStepper
, и она не помогла. Хотя вы не указали, как именно это не помогло и что именно вы пробовали. Возможно, вы просто неправильно использовали библиотеку.
Имеет ли смысл использовать микрошаг при использовании редуктора?
С микрошагом вы можете получить более плавное движение, хотя я сомневаюсь, что здесь проблема именно в этом. Активация микрошага, конечно же, будет означать, что вам нужно отправить драйверу больше импульсов для той же скорости. Просто имейте это в виду.
Можно ли изменить их, как это сделал я? должны ли они быть симметричными (одинаковая задержка для высоких и низких частот)?
Первая задержка устанавливает пульс для водителя. Он должен быть достаточно большим, чтобы водитель распознал пульс. 20 мс очень долго для этого. Если вы посмотрите на таблицу данных вашего чипа драйвера, там должна быть некоторая информация об этом. Раньше я использовал задержку около 50 мкс (так что delayMicroseconds(50)
), хотя вы можете сделать ее еще короче.
Вторая задержка обрабатывает время между импульсами, т. е. скорость двигателя. Однако имейте в виду, что первая задержка также остается константой в этом уравнении. Тогда скорость в шагах в секунду будет равна 1/(delay1+delay2)
(без учета времени выполнения остального кода, так как имеет значение только при высоких скоростях).
Спасибо за подробный ответ, в конце концов я выбрал более крупный двигатель с замкнутым контуром, но это помогло мне понять, как это сделать., @Guillaume_slize
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Питание двух шаговых двигателей с драйверами A4988
- Шаговый двигатель не работает с платой A4988
- AnalogWrite не работает - при попытке контролировать скорость двигателя постоянного тока
- Как правильно использовать микрошаговый драйвер с шаговым двигателем более низкого напряжения
- Шаговые двигатели Adafruit Motor Shield не вращаются.
- Как изменить направление шагового двигателя с помощью библиотеки AccelStepper?
Если объект тяжелый, мгновенный пуск/останов/изменение направления может привести к пробуксовке двигателя из-за инерции объекта. Хотите сделать алгоритм ускорения самостоятельно? Если нет, попробуйте библиотеку AccelStepper, которая сделает это за вас., @chrisl
у вас есть ненужный код в блоке
if (p != NULL) {
...else
не нужен... всегда выполняетсяp = p_new;
... putp = p_new;
после блокаif
, @jsotolaвы ничего не сказали о желаемой скорости вращения, @jsotola
Общий вопрос: рассматривали ли вы возможность использования концевого выключателя (исходное положение) и поворотного энкодера (отслеживание шагов)?, @Roland J.
@jsotola Спасибо, что заметили это, я изменил это. Скорость вращения должна быть очень медленной., @Guillaume_slize
@chrisl Я пробовал с Accelstepper, но это не помогло, @Guillaume_slize
@РоландДж. Это решение, которое я изучаю в данный момент, спасибо за его предложение., @Guillaume_slize