Проблема в управлении шаговым мотором

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Привет всем. Делаю первые шаги в изучении 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!");
  }
 }
}
nevkon
Offline
Зарегистрирован: 20.01.2015

у вас скорее всего стоит микрошаг на драйвере. Попробуйте увеличить количество шагов или перенастройте драйвер.

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Микрошаг стоит 1 к одному, ставлю 1 к 2 пробегает в два раза меньше.

Настраивал по этой статье http://totcnc.com/tblog/9_instruction-bl-tb6560-v2-0

nevkon
Offline
Зарегистрирован: 20.01.2015

Попробуйте перевести S3 и S4 на противоположную сторону - он должен в 8 раз меньше крутануться.

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Попробовал так и есть меньше в 8 раз. Насчет напряжения я уверен, подключил драйвер к аккумулятору, напряжение 12.6V при работе не изменяется.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

const int stepsPerRevolution = 200;

Поставьте 400 или 800

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

trembo пишет:

const int stepsPerRevolution = 200;

Поставьте 400 или 800

Поставил 800 ничего не изменилось, всеравно 1\4 оборота

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

stepper.step(stepsPerRevolution); насколько крутит?

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

trembo пишет:
stepper.step(stepsPerRevolution); насколько крутит?

крутит на 1/8 оборота

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

попробовал этот код крутит на пол оборота?

int Distance = 0; // записываем количество шагов, которое было совершено

void setup() {

pinMode(8, OUTPUT);

pinMode(9, OUTPUT);

digitalWrite(8, LOW);

digitalWrite(9, LOW);

}

void loop() {

digitalWrite(9, HIGH);

delayMicroseconds(600);

digitalWrite(9, LOW);

delayMicroseconds(600);

Distance = Distance + 1; // записываем этот шаг

// проверяем, не находимся ли мы в конце перемещения

// два поворота при мосте 1/8 и 1 поворот для моста 1/6 (для этого скетча)

if (Distance == 200) { // Мы добрались до крайней точки, начинаем вращение в противоположном направлении

if (digitalRead(8) == LOW) {

digitalWrite(8, HIGH); }

else {

digitalWrite(8, LOW);

} // Обнуляем расстояние, так как мы начинаем новое движение

Distance = 0;

// Делаем паузу на пол секунды

delay(500);

}

}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

S3, S4  в  " Off " ( на красном дипсвиче, как на картинке) - должен шаг в шаг работать.....

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

При предыдущем испытании забыл S3, сделал off и этот код заработал, но все-таки хотелось бы по первому коду разобратся. Он так и работает на 1\4

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

В последнем коде 19 и 23 строка если значение 500 двигатель пропускает шаги, а еще ниже вообще не работает.

Вот и закрались сомнения о библиотеке Stepper, возможно просто там малое время для отработки и ардуина не успевает? А может и мотор? Как увеличить время в библиотеке есть ли такая возможность?

 

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Сейчас заряжаю еще один аккумулятор, хочу подать на драйвер не 12, а 24 вольта, есть вероятность что малое напряжение не успевает создать нужную ЭДС из за кратковременности импульса.

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Запитал драйвер 25.6V, не чего не изменилось, при steps =400 крутит пол оборота. В чем загвоздка?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

И не изменится. Ток остался прежний.
Для регулировки тока служат другие переключатели
Попробуйте на 12 Вольтах ( для начала) поднять Running Current  - это переключатели SW1, SW2, Sw3, S1

Там табличка есть и похоже токи в Амперах обозначены.
 

Но похоже ваши шаги не из-за нехватки мощьности.
Попробуйте погонять мотор  много раз в одну-другую сторону.
Если он собьётся - тогда или ток мал ( или напряжения для его роста мало)  или частота слишком высокая.
400- полоборота? умножайте на два.

Попробуйте  другую более продвинутую библиотеку- https://www.pjrc.com/teensy/td_libs_AccelStepper.html

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

У меня двигатели с током 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), как здесь остановить пока не пойму. Может поможете со вторым скетчем? Смысл в чем, пришла команда  двигатель повернулся, а на комп передано например(ОК) тогда он пришлет вторую, если нет, то ждет команды.

 
 
 
 
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Какая разница какой у вас там ток.
Вам мощьность нужна или вы  шаги не можете отработать те что подали?
Подайте двести шагов влево, пауза, двести  шагов вправо, пауза и так 10000 раз.
Попробуйте несильно ( или сильно) пальцами тормозить.
Когда слетит с фаз - вы это услышите и почувствуете.

Если вернётся в начальное положение значит с драйвером, его питанием, током, стартом и торможением всё в порядке.

 

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Попробовал, диаметр шкива 20мм, остановить руками не могу, шаги не слетают.

Rus-Skipper
Offline
Зарегистрирован: 29.12.2015

Попробовал AccelStepper, все что нужно в одной библиотеке  trembo спасибо, за подсказку.