Проблема в управлении шаговым мотором
- Войдите на сайт для отправки комментариев
Втр, 29/12/2015 - 14:21
Привет всем. Делаю первые шаги в изучении adruino, в программировании на C++ ничего не знаю, начинаю изучать, я механик, но немного понимаю и электронику.
Первый проект сделал часы с указанием даты и температуры. Теперь взял от сюда http://our-factory.com/arduino/28-arduino-visual-c проект. Подключил двигатель через драйвер как тут http://ecnc.ru/articles/tb6560a .
Проблема в том что двигатель при установленных параметрах 200 шагов, вместо оборота делает примерно 1\4.
Прошу помощи, драйвер менял на другой, та же история, как и при смене arduino.
Двигатель Nema 17 менял то-же.
#include <Stepper.h> #define steps 100 //Количество шагов вправо #define steps2 200 //Количество шагов влево int inSize=0; // Переменная которая будет содержать размер буфера char str[128]; // Так как типа string тут нет, будем использовать массив символов Stepper stepper(steps, 8, 9); const int stepsPerRevolution = 200; void setup() { stepper.setSpeed(100);//обороты в минуту Serial.begin(9600); // Открываем порт с скоростью передачи в 9600 бод(бит/с) } void right() { stepper.step(steps); delay(100); } void left () { stepper.step(-1*steps2); delay(100); } void loop() { inSize=0; // Сбрасываем переменную memset(str, '\0', 128); // Очищаем массив if(Serial.available() > 0) { delay(20); // Ждем, для того, чтобы пришли все данные inSize = Serial.available(); // Получаем длину строки и записываем ее в переменную for (int i = 0; i < inSize; i++) { str[i] = Serial.read(); // Читаем каждый символ, и пишем его в массив } // Сравнять массив с строкой будем используя функцию strcmp if (strcmp(str, "right") == 0) // Если было передано строку "right" - вращаем вперед { Serial.println(steps); // Отправляем сообщение компьютеру right(); } else if (strcmp(str, "left") == 0) // Если было передано строку "left" - вращаем назад { Serial.println(steps2); left(); } else { Serial.println("Error command!"); } } }
у вас скорее всего стоит микрошаг на драйвере. Попробуйте увеличить количество шагов или перенастройте драйвер.
Микрошаг стоит 1 к одному, ставлю 1 к 2 пробегает в два раза меньше.
Настраивал по этой статье http://totcnc.com/tblog/9_instruction-bl-tb6560-v2-0
Попробуйте перевести S3 и S4 на противоположную сторону - он должен в 8 раз меньше крутануться.
Попробовал так и есть меньше в 8 раз. Насчет напряжения я уверен, подключил драйвер к аккумулятору, напряжение 12.6V при работе не изменяется.
const int stepsPerRevolution = 200;
Поставьте 400 или 800
const int stepsPerRevolution = 200;
Поставьте 400 или 800
Поставил 800 ничего не изменилось, всеравно 1\4 оборота
stepper.step(stepsPerRevolution); насколько крутит?
крутит на 1/8 оборота
попробовал этот код крутит на пол оборота?
S3, S4 в " Off " ( на красном дипсвиче, как на картинке) - должен шаг в шаг работать.....
При предыдущем испытании забыл S3, сделал off и этот код заработал, но все-таки хотелось бы по первому коду разобратся. Он так и работает на 1\4
В последнем коде 19 и 23 строка если значение 500 двигатель пропускает шаги, а еще ниже вообще не работает.
Вот и закрались сомнения о библиотеке Stepper, возможно просто там малое время для отработки и ардуина не успевает? А может и мотор? Как увеличить время в библиотеке есть ли такая возможность?
Сейчас заряжаю еще один аккумулятор, хочу подать на драйвер не 12, а 24 вольта, есть вероятность что малое напряжение не успевает создать нужную ЭДС из за кратковременности импульса.
Запитал драйвер 25.6V, не чего не изменилось, при steps =400 крутит пол оборота. В чем загвоздка?
И не изменится. Ток остался прежний.
Для регулировки тока служат другие переключатели
Попробуйте на 12 Вольтах ( для начала) поднять Running Current - это переключатели SW1, SW2, Sw3, S1
Там табличка есть и похоже токи в Амперах обозначены.
Но похоже ваши шаги не из-за нехватки мощьности.
Попробуйте погонять мотор много раз в одну-другую сторону.
Если он собьётся - тогда или ток мал ( или напряжения для его роста мало) или частота слишком высокая.
400- полоборота? умножайте на два.
Попробуйте другую более продвинутую библиотеку- https://www.pjrc.com/teensy/td_libs_AccelStepper.html
У меня двигатели с током 0,4 А, выставлял от 0,3 до 1,0А реакции ноль.
Двигатели брал у этого продавца http://ru.aliexpress.com/item/Free-shipping-1set-Hybrid-Nema17-bipolar-step-stepper-motor-0-4A-34mm-length-26Ncm-4-leads/32268465289.html?detailNewVersion=2
я был в шоке прешли на пятый день. Драйвера с руганью пришли через 70 дней из Брюсселя, может нам скидывают возврат?
Пробовал такой код stepper.step(4*steps); крутят правильно, но поскольку код нестандартный, посматриваю в сторону вторго кода. Задача проста, прокрутить влево или вправо всегда на одну позицию при получению команды с компьютера. Установил vb6 на свой компьютер неделю назад после семи летнего перерыва, написал программу передачи и приема, через сом порт, писал на API. В бейсеке была возможность прервать операцию по достижению равенства(например х=а then End If), как здесь остановить пока не пойму. Может поможете со вторым скетчем? Смысл в чем, пришла команда двигатель повернулся, а на комп передано например(ОК) тогда он пришлет вторую, если нет, то ждет команды.
Какая разница какой у вас там ток.
Вам мощьность нужна или вы шаги не можете отработать те что подали?
Подайте двести шагов влево, пауза, двести шагов вправо, пауза и так 10000 раз.
Попробуйте несильно ( или сильно) пальцами тормозить.
Когда слетит с фаз - вы это услышите и почувствуете.
Если вернётся в начальное положение значит с драйвером, его питанием, током, стартом и торможением всё в порядке.
Попробовал, диаметр шкива 20мм, остановить руками не могу, шаги не слетают.
Попробовал AccelStepper, все что нужно в одной библиотеке trembo спасибо, за подсказку.