Перейти к содержимому


Фотография

28BYJ-48 не собирается вращаться против часовой стрелки и прочие вопросы

двигатель шаговый вращение arduino 28BYJ-48 ULN2003 мотор

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 vintproykt

vintproykt

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений
  • ГородЯкутск

Отправлено 28 Апрель 2017 - 13:26

Недавно купил здесь шаговые двигатели 28BYJ-48 на 5 В и платы-драйверы на базе ULN2003A для моего графопостроителя с ЧПУ.

Не знаю, что хуже: либо то, что я купил это всё, не зная производителей; либо то, что у меня на руках поддельная плата Arduino UNO R3, которой хотелось бы найти применение.

 

Мой скетч на Arduino

 

Использую связь через последовательный порт, чтобы "менять вещи".

 

Когда ввожу go, двигатель делает полный оборот по часовой стрелке.

 

После всего, dir изменяет будущее направление на вращение против часовой стрелки.

 

Теперь после go двигатель вращает вал по часовой стрелке, а также дребезжит против часовой стрелке на случайное число шагов, и вновь перемещая по часовой, и так много-много раз.  :mellow: Показывая некое сопротивление, так выглядит, будто он может призвать демона.  :wacko:

 

В итоге двигатель не перемещается в правильное положение, когда методы библиотеки AccelStepper выводят импульсы в обратном порядке (для вращения против часовой стрелки).

 

Вопросы:

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

Решение найдено!


Сообщение отредактировал vintproykt: 28 Апрель 2017 - 16:22

  • admin это нравится

Делаю планшетный перьевой графопостроитель с ЧПУ для моего дипломного проекта. Я буду рад любой помощи при его монтаже.  :rolleyes:


#2 vintproykt

vintproykt

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений
  • ГородЯкутск

Отправлено 28 Апрель 2017 - 13:41

Код из скетча:

/*
Unknown Nonblocking CNC
Автор: VINTproYKT
*/

#include <AccelStepper.h>
#include <MultiStepper.h>

// Наиболее предпочтительная максимальная скорость для купленных двигателей, экспериментально вычисленная путём проверки на дребезжание вала
#define MOTORS_MAXSPEED 360
// Ускорение должно быть настолько минимальным, чтобы двигатель избегал дребезжания
#define MOTORS_ACCELERATION 100
#define MOTORS_STEPS_PER_REVOLUTION 2048

/* Предмет: двигатель 28BYJ-48 - 5V
Соедините его к плате-драйверу на базе ULN2003A
Соедините левые выводы платы-драйвера:
+ VCC к Vin Arduino
+ GND к GND
+ IN1 к D2 (цифровой вывод 2 у Arduino)
+ IN2 к D3
+ IN3 к D4
+ IN4 к D5
Затем используйте внешнее питание на 5 В, подключив его к плате Arduino.
*/
AccelStepper motorX(AccelStepper::FULL4WIRE, 2, 3, 4, 5);
// Не удаётся запустить в полушаговом режиме, поэтому делаем лучшее в полношаговом

short motorX_dir = 1;// [ ПЧС : -1 ] <=> [ 1 : ЧС ]
int motorX_avgSpeed = MOTORS_MAXSPEED;// Средняя скорость

String input = "";

void doCommand(String command, String param) {// Проводник команд по последовательному порту
if (command == "go") {
long steps = param.toInt();
if (steps == 0) steps = MOTORS_STEPS_PER_REVOLUTION;// Делать полный оборот по умолчанию
_go(steps);
}
else if (command == "stop") _stop();
else if (command == "dir") _dir();
else if (command == "speed") {
float speed = param.toInt();
if (speed == 0) speed = MOTORS_MAXSPEED;// Средняя скорость равняется максимальной по умолчанию
_speed(speed);
}
}

void setup() {
Serial.begin(115200);// Максимальное число бит в секунду для работы с Arduino UNO
Serial.println("setup");

input.reserve(128);

motorX.setMaxSpeed(MOTORS_MAXSPEED);
motorX.setAcceleration(MOTORS_ACCELERATION);
}

void loop() {
while (Serial.available()) {
input = Serial.readStringUntil('\n');
input.trim();
int input_sp = input.indexOf(' ');// Проверка на присутствие знака пробела во входной строке
String input_command = input;
String input_param;
if (input_sp > 0) {
input_command = input.substring(0, input_sp);
input_param = input.substring(input_sp + 1);
input_param.trim();
}
doCommand(input_command, input_param);
input = "";
}

measureSteps();

motorX.run();
}

void _go(long increment) {
if (motorX.speed() == 0) {
motorX.setSpeed(motorX_avgSpeed);
motorX.moveTo(motorX.currentPosition() + motorX_dir * increment);
Serial.print("Move to ");
Serial.print(motorX.targetPosition());
Serial.print(" (rotate by ");
Serial.print((float)increment / (float)MOTORS_STEPS_PER_REVOLUTION * 360);
Serial.print("° ");
if (motorX_dir > 0) Serial.print("clockwise");
else Serial.print("counterclockwise");
Serial.println(")");
}
}

void _stop() {
motorX.stop();
motorX.setSpeed(0);
Serial.println("Stop");
}

void _dir() {
motorX_dir = -motorX_dir;
if (motorX_dir > 0) Serial.println("CW");
else Serial.println("CCW");
}

void _speed(float speed) {
motorX_avgSpeed = speed;
Serial.print("Average speed changed to ");
Serial.println(speed);
}

void measureSteps() {
if (motorX.speed() != 0) {
Serial.print("Position: ");
Serial.print(motorX.currentPosition());
Serial.print(" | Speed: ");
Serial.println(motorX.speed());
}
}

 
Также перечисленные вопросы были заданы на форуме Arduino, если кому интересно: ссылка.


  • admin это нравится

Делаю планшетный перьевой графопостроитель с ЧПУ для моего дипломного проекта. Я буду рад любой помощи при его монтаже.  :rolleyes:


#3 vintproykt

vintproykt

    Новичок

  • Пользователи
  • Pip
  • 6 сообщений
  • ГородЯкутск

Отправлено 28 Апрель 2017 - 16:12

Ура! Вопросы решены благодаря товарищу MarkT с forum.arduino.cc.

 

Оказалось, что на драйвере неправильно расположены выводы IN2 и IN3. Достаточно было поменять местами эти два соединения и всё заработало как часы (в двух направлениях)!

 

Обновил скетч для работы в полушаговом режиме: ссылка.

 

P.S.: Ох уж доставил головной боли китайский производитель HEX!!! Наверное, им так с рук это не сошло, раз у них нет общедоступного сайта в Интернете - поделом.


  • admin это нравится

Делаю планшетный перьевой графопостроитель с ЧПУ для моего дипломного проекта. Я буду рад любой помощи при его монтаже.  :rolleyes:






Темы с аналогичным тегами двигатель, шаговый, вращение, arduino, 28BYJ-48, ULN2003, мотор

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных