NodeMCU и шаговик 28byj-48 с драйвером uln2003
- Войдите на сайт для отправки комментариев
Всех приветствую.
Пытаюсь заставить работать Nodemcu и шаговик.
Появилась такая проблема:
при достаточно невысокой, "нормальной" скорости - шаговик начинает дребезжать, просто останавливается на месте и не может провернуться. Спустя какое-то кол-во времени - уже может перестать так делать (подозреваю, что скорость движения падает, вот он и перестает дребезжать и начинает прокручиваться).
Также, чем больше указываю скорость в прошивке - тем "меньше" двигатель может выдержать нагрузки. Типа, при высокой скорости - просто так же начинает дребезжать и не крутиться.
Из-за чего это может быть? Пины правильные, питаю их отдельно от powerbank'а на 5В 16000 мАч.
Прошивка, на которой все работает более-менее, но иногда все равно пропускает шаги:
#include<AccelStepper.h> #include <Servo.h> // создаем экземпляр AccelStepper #define IN1 D0 #define IN2 D1 #define IN3 D2 #define IN4 D3 #define IN1_1 D4 #define IN2_1 D5 #define IN3_1 D6 #define IN4_1 D7 #define SERVO_PIN D8 AccelStepper step_motor(8, IN1, IN3, IN2, IN4); AccelStepper step_motor_y(8, IN1_1, IN3_1, IN2_1, IN4_1); Servo servo1; int z = 150; int x = 0; int y = 0; bool valueIsChanged = false; int multipler = 1; void setup(){ Serial.begin(9600); Serial.setTimeout(10); servo1.attach(SERVO_PIN); step_motor.setMaxSpeed(800.0*multipler); step_motor.setAcceleration(80.0*multipler); step_motor.setSpeed(300*multipler); step_motor_y.setMaxSpeed(800.0*multipler); step_motor_y.setAcceleration(80.0*multipler); step_motor_y.setSpeed(300*multipler); } void loop(){ if (step_motor.distanceToGo() == 0 && step_motor_y.distanceToGo() == 0){ String request = Serial.readString(); if (request.length() > 1) { x = getValue(request, ':', 0).toInt(); y = getValue(request, ':', 1).toInt(); z = getValue(request, ':', 2).toInt(); valueIsChanged = true; } } step_motor_y.moveTo(y); step_motor.moveTo(x); servo1.write(z); step_motor.run(); step_motor_y.run(); if (step_motor_y.distanceToGo() == 0 && step_motor.distanceToGo() == 0 && valueIsChanged){ Serial.println("OK"); valueIsChanged = false; } } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; }
Прошивка, при которой скорость работы нормальная (не особо уж и быстрая), но мощность мотора очень сильно падает (начинает дребезжать и пропускать шаги):
Почему так может быть? Из-за NodeMCU и ее 3.3-х вольт? Из-за библиотеки?
Кстати, вобрал всю эту конструкцию на макетной плате, может быть контакт там плохой? Да вродь нормальный, если бы там был плохой контакт - то такая проблема была бы на всех уровнях ускорения двигателя.
Прошу помощи.
Чем меньше межшаговая задержка (выше скорость), тем меньше драйвер успевает вкачать в обмотки лепестричества. Соответственно - моща падает и вал двигателя не может быть провернут. Это в целом.
В данном конкретном случае возьмите Example от стоковой библиотеки Stepper и проверьте - действительно ли дело в скорости или таки пауэрбанк не затаскивает.
Чем меньше межшаговая задержка (выше скорость), тем меньше драйвер успевает вкачать в обмотки лепестричества. Соответственно - моща падает и вал двигателя не может быть провернут. Это в целом.
В данном конкретном случае возьмите Example от стоковой библиотеки Stepper и проверьте - действительно ли дело в скорости или таки пауэрбанк не затаскивает.
хм, со стандартным примером работает хорошо, зависаний нет даже на скорости 120, ездит туда-сюда
Значит берёте стоковый пример от аксельстеппера и начинаете его терзать... мошт параметры неправильные задаете. Как заездит хорошо - переходите к водным процедурам... Т.е. - "дефектному" скетчу.
хм, со стандартным примером работает хорошо, зависаний нет даже на скорости 120
Фраза "даже на скорости 120" намекает на то, что это довольно большая скорость. Так почему вы в своем примере ставите скорость 800? - Может попробовать на скорости пониже?
хм, со стандартным примером работает хорошо, зависаний нет даже на скорости 120
Фраза "даже на скорости 120" намекает на то, что это довольно большая скорость. Так почему вы в своем примере ставите скорость 800? - Может попробовать на скорости пониже?
120 в этой библиотеке быстрее, чем 800 в той
120 в этой библиотеке быстрее, чем 800 в той
а примеры от той библиотеки, где 800 - работают?