Точное управление 3 Stepper

Обновить

Здесь обновленная информация о коде, который я пытался запрограммировать. У меня есть шаговый двигатель с прикрепленным диском с небольшими отверстиями через каждые 45 градусов, в которые может входить микропереключатель (отверстие соответствует точному размеру микропереключателя; тогда оно должно быть в выключенном положении). Я бы хотел, чтобы шаговик переместился на 45 градусов (до отверстия 1), а затем (в качестве первого шага) подождал 3 секунды, а затем переместился еще на 45 градусов до отверстия и остановился и т. д.

В качестве следующего шага я бы хотел, чтобы им управляли через последовательный порт из другого программного обеспечения. Итак, я могу отправить на последовательный порт команду «перемещение», а затем произойдет то же самое, что описано выше, как только Arduino получит команду «перемещение».

Ниже моя попытка. Он выполняет возврат в исходное положение, но не очень плавно, а следующий шаг (всего лишь перемещение на 3 секунды) — очень грубое движение. Вот мои вопросы:

  1. Как мне сделать этот шаг плавным?
  2. Как мне адаптировать этот код, чтобы шаговый двигатель останавливался, когда он окажется в отверстии?
  3. Как заставить микропереключатель выйти из отверстия после того, как он там остался?

Большое спасибо за помощь!

Код

#include "AccelStepper.h"

int M2dirpin = 4;  //Вывод направления Y двигателя
int M2steppin = 5; //Вывод шага двигателя Y
int M2en=12;  //Вывод включения двигателя Y
#define home_switch 9 // Контакт 9 подключен к Home Switch (MicroSwitch)

// Настройка AccelStepper
AccelStepper stepperX(1, 5, 4);   // (1,2,3) = (Выделенная плата, ШАГ, НАПРАВЛЕНИЕ)
// Переменные шагового хода
long initial_homing = -1; // Используется для домашнего шагового двигателя при запуске


void setup() {

  pinMode(home_switch, INPUT_PULLUP);
  pinMode(M2dirpin,OUTPUT);
  pinMode(M2steppin,OUTPUT);
  pinMode(M2en,OUTPUT);
  digitalWrite(M2en,LOW);
  Serial.begin(9600);  // Запускаем последовательный монитор со скоростью 9600 Бод
  stepperX.setMaxSpeed(50.0);      // Установка максимальной скорости шагового двигателя (медленнее, чтобы повысить точность)
  stepperX.setAcceleration(50.0);  // Установка ускорения шагового двигателя

  // Запускаем процедуру возврата шагового двигателя при запуске
  Serial.print("Stepper is Homing . . . . . . . . . . . ");

  while (digitalRead(home_switch)) {  // Заставляем шаговый двигатель двигаться против часовой стрелки, пока переключатель не будет активирован
    stepperX.moveTo(initial_homing);  // Устанавливаем позицию для перемещения
    initial_homing--;  // Уменьшаем на 1 для следующего хода, если необходимо
    stepperX.run();  // Начинаем перемещать степпер
    delay(20);
  }

  stepperX.setCurrentPosition(0);  // Устанавливаем текущую позицию как ноль
  stepperX.setMaxSpeed(50.0);      // Установка максимальной скорости шагового двигателя (медленнее, чтобы повысить точность)
  stepperX.setAcceleration(50.0);  // Установка ускорения шагового двигателя
  initial_homing = 1;

  while (!digitalRead(home_switch)) { // Заставляем шаговый двигатель двигаться по часовой стрелке, пока переключатель не будет деактивирован
    stepperX.moveTo(initial_homing);
    stepperX.run();
    initial_homing++;
    delay(20);
  }

  stepperX.setCurrentPosition(0);
  Serial.println("Homing Completed");
  Serial.println("");

 // Двигаемся на 10 шагов вперед от концевого выключателя (чтобы выйти из переключателя)
  while (stepperX.currentPosition() != 10) 
  {
    stepperX.setSpeed(10);
    stepperX.run();

}
}
void loop()
{
stepper1();
}

void stepper1() 
{
  stepperX.move(22);
  unsigned long startMillis = millis();
  while( millis()-startMillis<3000 )
{
  stepperX.run();
}
}

Старый вопрос: Прошу прощения за высокоуровневый вопрос о псевдокоде, но я пытаюсь концептуально понять, как я могу добиться следующего:

У меня есть 3 шаговых двигателя (1 кругового движения, 2 линейных), которые я хотел бы останавливать каждый раз в одном и том же положении. Первый шаговый двигатель должен повернуться, например, на 45 градусов и остановиться, после чего второй шаговый двигатель должен нажать вниз (как линейный привод), остаться в этом положении на определенное время и вернуться в исходное положение, после этого третий шаговый двигатель также должен (линейный привод) движение) перейти в определенное положение и вернуться. Эти три шага будут повторяться очень долго.

Накапливают ли степперы ошибки в положении, и если да, то как я могу убедиться, что этого не происходит?

Я читал о «наведении» и пробовал микропереключатели, но не смог совместить их с трехшаговой установкой. Кроме того, 3D-принтеры всегда должны останавливаться точно в одном и том же месте, и поэтому я предположил, что для этой проблемы должно быть решение.

Есть ли код шаблона, с которого я могу начать, аналогичный описанной настройке?

Как я могу убедиться, что эти шаги выполняются строго друг за другом.

Еще раз прошу прощения за вопрос высокого уровня, но все мои попытки решить его пока не увенчались успехом.

Спасибо!

, 👍0

Обсуждение

Шаговые двигатели могут пропускать шаги, если испытывают слишком высокое сопротивление (или слишком быстрое ускорение)., @Gerben

Вы можете возвращать все три шаговых двигателя каждый раз, когда он движется назад. Итак, продвиньтесь вперед на X шагов, вернитесь назад на столько шагов, сколько необходимо для активации концевого выключателя., @Gerben

Как я могу убедиться, что эти шаги выполняются строго друг за другом. ..... я думаю, что вам нужно запустить несколько примеров скетчей в Arduino IDE, чтобы понять, как работает микроконтроллер, @jsotola

все мои попытки решить эту проблему не увенчались успехом ..... добавьте код, который вы пробовали, и схему подключения в свой пост, @jsotola


1 ответ


Лучший ответ:

1

Об ошибках шаговых двигателей: Шаговые двигатели вносят ошибки в зависимости от сил, которые на них действуют. Например: если у вашего шагового двигателя недостаточно мощности для ускорения прикрепленного груза, он будет терять шаги при попытке (это означает, что ротор не выполняет шаг, несмотря на то, что катушки контролируются для шага). (То же самое, конечно, относится и к торможению или наезду на препятствие.) Поскольку при подсчете шагов, которые вы «отправляете» мотору, вы знаете только позицию, вы получаете ошибку.

У вас есть два варианта предотвратить это: 1. Выберите подходящую мощность двигателей для вашего применения и не перегружайте двигатели в любой момент работы. 2. Вы можете прикрепить к ротору датчик поворота, чтобы проверить, действительно ли ротор переместился на количество шагов, которое вы ему приказали сделать. (При этом убедитесь, что количество шагов поворотного энкодера и двигателя совпадают, или рассчитаны правильно, если они не совпадают). Тогда позиция в вашей программе будет обновляться только на основе поворотного энкодера. Это решение более сложное, поскольку вам нужны дополнительные детали и хороший код, который не пропустит ни одного импульса поворотного энкодера.

О возврате к исходному состоянию: Да, это можно использовать для предотвращения накопления ошибок во время длительной работы. Также это часто используется, чтобы устройству не приходилось постоянно сохранять свою текущую позицию в постоянном хранилище. Если питание будет отключено, устройство забудет свое положение и откалибрует его снова после повторного включения с помощью концевых выключателей. Также это означает, что в выключенном состоянии это не проблема, когда двигатель смещается со своего места под действием внешних сил.

Непонятно, насколько точным должно быть приложение и какие ошибки реально допускаются. Возможно, вам будет достаточно просто определить положение двигателей путем возврата в исходное положение при включении устройства, а затем просто позволить ему работать. Если этого недостаточно, вы можете выполнить цикл возврата в исходное положение после каждой последовательности. То же самое касается и решения с поворотным энкодером. Здесь это может быть излишним, в зависимости от конкретных свойств приложения.

Код шаблона: Я просто погуглил «Наведение с шаговым двигателем Arduino» и нашел несколько статей об этом, которые также содержат примеры кода. Это должно позволить вам писать код для вашего собственного приложения. Поскольку вы на самом деле не описали, какова ваша настройка, мы не можем увидеть, действительно ли она соответствует вашему приложению. Но Хоминг везде один и тот же.

Шаги строго друг за другом: Вы можете просто написать программу, чтобы завершить одну часть и затем перейти к следующей (блокирующий код). Или, если вы хотите, чтобы он был более сложным и гибким, вы можете использовать неблокирующий код (как в примере BlinkWithoutDelay библиотеки Arduino) с конечным автоматом. Штаты могут быть тремя частями вашей программы или разделены дальше. В каждом состоянии вы делаете только одно дело и по завершении переходите в следующее состояние. Код в каждом состоянии должен быть неблокирующим, чтобы он что-то делал только тогда, когда это необходимо, а иначе пусть программа продолжит работу (например: При перемещении степпера с определенной скоростью вы делаете 1 шаг, затем ждете немного, затем делаем следующий шаг и т. д. Пока вы ждете, вы можете заняться другими делами.)

Вы не упомянули, какие у вас были проблемы с концевыми выключателями, поэтому мы не можем вам с этим помочь. Таким образом, этот ответ такого же высокого уровня, как и ваш вопрос. Надеюсь, это поможет.

,

Спасибо за длинный и подробный ответ, это очень полезно. Я знаю подэтапы (как описано выше), но, похоже, у меня проблемы с объединением этих шагов в один код. В любом случае спасибо, попробую найти решение., @digit