Шаговый двигатель не поворачивается/не поворачивается против часовой стрелки

Прежде чем кого-либо беспокоить, я гуглил эту проблему в течение последних трех недель и не смог ее решить, поэтому должен обратиться за помощью.

Мой сын выполнил несколько проектов Arduino после подписки на Creation Crate, и теперь мы вместе работаем над одним проектом. Мы купили шаговый двигатель 28BYJ-48 с драйвером и решили, что это будет просто вопрос копирования и вставки кода, и мы будем в бизнесе.

Я пробовал библиотеку Arduino, библиотеку AccelStepper, множество других скетчей с разных веб-сайтов, и по какой-то причине степпер вибрирует только тогда, когда он должен вращаться против часовой стрелки. Был один скетч, который мы использовали, который использовал Serial Monitor для ввода количества шагов, и когда я делал минус количество шагов, он шел против часовой стрелки, но на следующий день это уже не так! Я думал, что это проблема с двигателем или драйвером, но мы купили еще три двигателя/драйвера, и проблема все еще та же. При поиске ответа я видел, как некоторые люди говорили, что нужно переключить IN 3 & 4, но я все еще получаю те же результаты.

Мы подключили 8 к IN1, 9 к IN2, 10 к IN3 и 11 к IN4. Использование отдельного источника питания 5 В для драйвера, который также заземлен на Arduino (на всякий случай попробовал оба контакта заземления, но нет). Мы также пробовали перейти на другой Arduino, и это тоже ничего не изменило.

мы попробовали несколько скетчей из разных источников, вот один в качестве примера:

#include <Stepper.h>

const int stepsPerRevolution = 200;  // изменить это, чтобы соответствовать количеству шагов за оборот
// для вашего мотора

// инициализируем библиотеку шаговых двигателей на контактах с 8 по 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // устанавливаем скорость 60 об/мин:
  myStepper.setSpeed(60);
  // инициализируем последовательный порт:
  Serial.begin(9600);
}

void loop() {
  // делаем один оборот в одном направлении:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // делаем один оборот в другом направлении:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

Серийный монитор покажет, что он вращается против часовой стрелки, но это не так. Любая помощь приветствуется! То, что мы считали простым шагом в нашем проекте, стало серьезным препятствием!

, 👍0

Обсуждение

какой драйвер вы используете?, @jsotola

здесь кроется одна из проблем: «думал, что это будет просто вопрос копирования и вставки кода»... единственный раз, когда вы должны копировать и вставлять, это когда вы действительно понимаете код, который вы копируете, и вы на 100% уверены, что ошибок нет ............... возможно, вы можете начать с активации обмоток шагового двигателя одну за другой с помощью digitalWrite() с паузой в 1 секунду между шагами. ... это должно заставить двигатель двигаться между шагами, @jsotola

похоже, это решает вашу проблему https://www.instructables.com/id/BYJ48-Stepper-Motor/, @jsotola

Я использую плату драйвера ULN2003, спасибо!, @Matt

затем посмотрите на страницу instructables.com, @jsotola

Я могу подтвердить, что он работает с переключением проводов, у меня работали 2,4,3,5., @joop


2 ответа


3

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

У меня был успех при управлении 4 фазами драйвера по следующему шаблону (на полшага):

1000
1100
0100
0110
0010
0011
0001
1001

Я также нашел подсказки в Интернете (на немецкий сайт, просто для справки, если вы умеете читать по-немецки), что, несмотря на то, что он предназначен для полушагов, вы также можете управлять двигателем с полными шагами с библиотекой Stepper. Вам придется изменить порядок выводов в определении шагового двигателя:

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

Это предполагает подключение следующим образом: D8->IN1, D9->IN2, D10->IN3, D11->IN4. Обратите внимание, что использование полных шагов означает 2048 шагов на оборот.


Я также нашел специальную библиотеку для этого шагового двигателя, но не тестировал ее: Stepper_28BYJ_48


Теперь вы сами можете решить, по какому пути вам идти. Лично я бы выполнил все шаги с официальной библиотекой Arduino Stepper.


Насчет количества шагов на оборот: я не знаю, почему степпер не работает с vale 2048. Но так как библиотека использует это только для заворачивания правильных фаз для оборотов, вы можете использовать более низкое значение, которое делится на 4. Например, 32, что является количеством полных шагов на оборот фактического двигателя (привязано к шестерням с коэффициентом 64). Это должно сработать.

,

Спасибо за вклад - действительно, изменение порядка контактов на 8,10,9,11 помогло. Однако, как ни странно, когда я изменяю переменную шагов на оборот с 200 на 2048 (истинное количество шагов на один оборот для этого мотора), он захлебывается и вообще не крутится. 200 поворачивает его примерно на одну десятую оборота. Я играл с этой переменной и могу изменить ее на 660 (около четверти оборота), но любое число больше этого и шаговый двигатель вообще не будет вращаться. Любые мысли оценены!, @Matt

@Matt Я отредактировал ответ и добавил свои мысли по этому поводу. Надеюсь, это поможет., @chrisl

Изменение паттерна на **8 полушагов** помогло. Спасибо!, @MLu


1

https://forum.arduino.cc/index.php?topic=549927.0

Этот парень просто перевернул IN2 и IN3, и это решило проблему перехода вперед и назад. Это сработало для меня, и вот код.

#include <Stepper.h> // Подключаем заголовочный файл

// изменить это на количество шагов на вашем двигателе
#define STEPS 64

// создаем экземпляр класса шагового двигателя, используя шаги и штифты
Stepper stepper(STEPS, 8, 10, 9, 11);

int Pval = 0;
int potVal = 0;

void setup() {
  Serial.begin(9600);
  stepper.setSpeed(200);
}

void loop() {

potVal = map(analogRead(A0),0,1024,0,100);
if (potVal>Pval)
  stepper.step(10);
if (potVal<Pval)
  stepper.step(-10);

Pval = potVal;

Serial.println(Pval); //для отладки
}
,