шаговик 28byj-48 + ардуино уно

LoGO
Offline
Зарегистрирован: 10.04.2018

Приветствую дорогие форумчане! Задумал я один проект в котором участвует шаговик  28byj-48 в связке с ардуино уно через драйвер ULN2003/ вся суть в том чтобы двигатель проварачивался на определенный угол, делал паузу, затем те же действия бесконечное количество раз. В програмирование я новичок, но все таки разобравшись заливаю скейч с библиотеки stepper

#include <Stepper_28BYJ.h>
 
// количество шагов на один оборот
const int stepsPerRevolution = 815.155;  // change this to fit the number of steps per revolution
                                     // for your motor
 
// initialize the stepper library on pins 8 through 11:
// инициализируем библиотеку Stepper_28BYJ на выходы 8-11
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11);            
 
void setup() {
  // set the speed at 3 rpm:
  // установим скорость 3 об/мин
  myStepper_28BYJ.setSpeed(30);
  // initialize the serial port:
  // инициализируем последовательный порт
  Serial.begin(9600);
}
 
void loop() {
  // step one revolution  in one direction:
  // шагаем 1 оборот в одном направлении
   Serial.println("clockwise");
  myStepper_28BYJ.step(stepsPerRevolution);
  delay(5000);
  
 
}
мне нужно чтоб шаговить кнутился и останавливался в 5 местах,т.е. 4075.775(полный оборот двигателя) делим на 5 получается 815.155 шагов на нужный мне угол.
Теперь суть проблемы такова- шаговик после 3-4 полных оборотов начинает отставать, остановка уже происходит не в том месте, а раньше. не понимаю в чем погрешность.
Ели нет вариации как написать программу чтобы исключить эту погрешность, то помогите написать программу чтобы сначала прокручивал вперед на 5 равных углов(815.155 шагов), затем 1 оборот назад без остановок , затем те же операции бесконечное количество раз. Думаю таким образом может добиться точного позицианирования.
Заранее намного благодарен)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Переменная типа int не может быть равной 815.155, 0.155 будут утеряны. Поэтому и отставание начинается. А на float шаги Stepper.h не крутит.

 

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

const int stepsPerRevolution = 815.155;
int - это целое число.

LoGO
Offline
Зарегистрирован: 10.04.2018

Я пробовал ставить целое число и 815 и 816, все равно происходит отставание

LoGO
Offline
Зарегистрирован: 10.04.2018

Как же исправить этот недочёт, или как то возможно эти хвосты в конце каждого оборота добавить

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Сделать это можно через альтернативные библиотеки. AccelStepper, вроде есть и CustomStepper. Но и вручную покрутить двигатель тоже легко. Вопрос только в том - сумеете ли управиться с фором и ифами.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я тут глянул на спецификацию этого мотора: полушаг тоже не поможет, потому что  у него "Step Angle (8-Step sequence: Internal Motor alone): 5.625° (64 steps per revolution)". Таким образом - вы не получите 1/5 круга на полном числе шагов/полушагов. Если нужна более-менее точная позиция, переходите на двигатель с шагом 1.8°, такой как двигатель формфактора NEMA 17, например (https://www.pololu.com/product/2267). Но к нему уже и драйвер другой полагается и питание не от ардуины.

b707
Онлайн
Зарегистрирован: 26.05.2017

А никого не смутила это дикая цифра -  4075.775 шагов на оборот? Автор, откуда эти данные?

Что касается сути вопроса - по-моему. дело не в углах. Все проще, кмк - отставание есть, потому мотор явно пропускает шаги - либо библиотека работает не вполне верно, либо питание слабое, или , банально - усилие на валу слишком велико.

LoGO
Offline
Зарегистрирован: 10.04.2018
Угол шага Полушаговый режим: 8-шаговая управляющая сигнальная последовательность (рекомендовано). 5.625 градусов на шаг, т.е. 360/ 5.625=64 шага на оборот внутреннего вала мотора
Передаточное отношение редуктора Производителем заявлено 64:1. Однако, некоторые пытливые товарищи с форума Arduino разобрали редуктор и определили, что, в действительности передаточное число равно 63.68395:1. Это означает, что в рекомендованном полушаговом режиме мы имеем: 64 шага на оборот мотора помноженное на передаточное число 63.684 ≈ 4075.7728 шагов на полный оборот. вот эта цифра, если округлим до целого получим 4076.

Что касается пропускания шагов, двигатель 5v питается отдельно от блока питания такого же номинала. усилие на вал небольшое, двигатель крутит диск массой примерно 30 г. Ну а библиотека, вы сами видете стандартная, не знаю на сколько она правильная

LoGO
Offline
Зарегистрирован: 10.04.2018

может кто поможет написать скетч, о том что я описывал выше

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

Какая разница сколько шагов и какое передаточное ?
Если вы подали N импульсов ( N - число целое , обычно называемое шагом от которого и пошло название двигателя)
сначала в одну сторону, а потом в другую ,
то вал ДОЛЖЕН вернуться в стартовое положение .
И так 100500 раз подряд вплоть до выключения питания.
Это шаговик, детка!

LoGO
Offline
Зарегистрирован: 10.04.2018

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

sadman41
Offline
Зарегистрирован: 19.10.2016

LoGO пишет:
Изначально первозадачей было крутить только вперёд бесконечное количество раз, но ситуация такова что с каждым оборотом все больше не доходит до нуля. Поэтому я обращаюсь за помощью, как решить данную задачку

Для начала вам нужно определиться - какая нужна точность позиционирования. Если +/- 10 шагов устроит - плюсуйте или минусуйте шаги на каждом секторе. Не устроит - переходите на другой мотор с кратным необходимому углу поворота на шаг. Можете, конечно, еще через доп. редуктор всё это протащить. Но его придется расчитать, естественно. И изготовить. И люфты учесть.

Я бы на вашем месте тупо взял другой шаговик по габаритам.

LoGO
Offline
Зарегистрирован: 10.04.2018

sadman41 пишет:

LoGO пишет:
Изначально первозадачей было крутить только вперёд бесконечное количество раз, но ситуация такова что с каждым оборотом все больше не доходит до нуля. Поэтому я обращаюсь за помощью, как решить данную задачку

Для начала вам нужно определиться - какая нужна точность позиционирования. Если +/- 10 шагов устроит - плюсуйте или минусуйте шаги на каждом секторе. Не устроит - переходите на другой мотор с кратным необходимому углу поворота на шаг. Можете, конечно, еще через доп. редуктор всё это протащить. Но его придется расчитать, естественно. И изготовить. И люфты учесть.

Я бы на вашем месте тупо взял другой шаговик по габаритам.

какой командой это можно сделать, на первом обороте каждый сектор более менее точно.думаю нужно в конце каждого оборота добавляь шаги , чтобы оборот доходил до нуля.как это все провернуть в скетче?

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

А никого не смутила это дикая цифра -  4075.775 шагов на оборот? 

Да там хоть что напиши - это скажется только на скорости. Степать мотор будет всё равно на угол минимального полушага- 5.625° . А 360/5 никак не кратно этому углу. В любом случае начнутся ошибки позиционирования, если не предпринимать каких-то мер.

Кстати, FRAM пришел ли? А то что-то этот продавец почтой занзибара мне отправил... Даже и не знаю, где эта посылка теперь - может ее уже мартышки дербанят.

sadman41
Offline
Зарегистрирован: 19.10.2016

LoGO пишет:

на первом обороте каждый сектор более менее точно.думаю нужно в конце каждого оборота добавляь шаги , чтобы оборот доходил до нуля.

Вы подумали о том, что написали? Если на каждом обороте добавлять шаги, то ситуация никак не изменится. Нужно на каждом N-ном добавлять K шагов. 

LoGO пишет:

как это все провернуть в скетче?

Нужна переменная счетчик оборотов. Или цикл for(). Знаете такие слова?  2 раза делаете нормальный оборот на stepsPerRevolution, третий - на stepsPerRevolution+K.

...Прямо вот последовательно даже в луп напишите три эти строки. Только K будете подбирать экспериментально.

 

LoGO
Offline
Зарегистрирован: 10.04.2018

sadman41 пишет:

LoGO пишет:

на первом обороте каждый сектор более менее точно.думаю нужно в конце каждого оборота добавляь шаги , чтобы оборот доходил до нуля.

Вы подумали о том, что написали? Если на каждом обороте добавлять шаги, то ситуация никак не изменится. Нужно на каждом N-ном добавлять K шагов. 

LoGO пишет:

как это все провернуть в скетче?

Нужна переменная счетчик оборотов. Или цикл for(). Знаете такие слова?  2 раза делаете нормальный оборот на stepsPerRevolution, третий - на stepsPerRevolution+K.

...Прямо вот последовательно даже в луп напишите три эти строки. Только K будете подбирать экспериментально.

 

к сожалению для меня это просто слова, опыта по созданию программ, подробнее можете описать на этом примере

#include <Stepper_28BYJ.h>
 
// количество шагов на один оборот
const int stepsPerRevolution = 815;  // change this to fit the number of steps per revolution
                                     // for your motor
 
// initialize the stepper library on pins 8 through 11:
// инициализируем библиотеку Stepper_28BYJ на выходы 8-11
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11);            
 
void setup() {
  // set the speed at 3 rpm:
  // установим скорость 3 об/мин
  myStepper_28BYJ.setSpeed(30);
  // initialize the serial port:
  // инициализируем последовательный порт
  Serial.begin(9600);
}
 
void loop() {
  // step one revolution  in one direction:
  // шагаем 1 оборот в одном направлении
   Serial.println("clockwise");
  myStepper_28BYJ.step(stepsPerRevolution);
  delay(5000);
  
 
}
буду благодарен)
sadman41
Offline
Зарегистрирован: 19.10.2016
LoGO
Offline
Зарегистрирован: 10.04.2018
sadman41
Offline
Зарегистрирован: 19.10.2016

Ваш скейч - это код. Если вы настолько торопитесь, что вам некогда вникать в простые вещи - то и мне недосуг вам разжевывать.

LoGO
Offline
Зарегистрирован: 10.04.2018

sadman41 пишет:

Ваш скейч - это код. Если вы настолько торопитесь, что вам некогда вникать в простые вещи - то и мне недосуг вам разжевывать.

вы меня просто в пропасть закинули и там оставили))вы говорили про переменную счетчик оборотов

int brightness = 0;
int fadeAmount = 5;
 
void setup()  {
  pinMode(9, OUTPUT);
}
 
void loop()  {
  analogWrite(9, brightness);  
  brightness = brightness + fadeAmount;
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }  
  delay(30);                          

}

я так понимаю этот код полностью на 3 оборот  

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Это что вы вообще вставили, для чего тут светодиод? Вставляйте свой скетч с мотором и номерами строк. 

LoGO
Offline
Зарегистрирован: 10.04.2018

LoGO пишет:

что за код?

эта сылка на что вообще?

bwn
Offline
Зарегистрирован: 25.08.2014

LoGO пишет:

LoGO пишет:

что за код?

эта сылка на что вообще?

Может все таки попробовать открыть? Поверьте, религиозные чуйства не оскорбит, на похабные картинки не нарветесь.

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Кстати, FRAM пришел ли? А то что-то этот продавец почтой занзибара мне отправил... Даже и не знаю, где эта посылка теперь - может ее уже мартышки дербанят.

мне тоже пока не пришло.

Но у меня из 8 посылок. высланных с Али в начале марта, на сегодня пришли только две. Так что этот лот из общей массы не особо выделяется.

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

мне тоже пока не пришло.

Но у меня из 8 посылок. высланных с Али в начале марта, на сегодня пришли только две. Так что этот лот из общей массы не особо выделяется.

У меня аналогично, тоже где то блукают. Хотя уже и сроки подходят.

vosara
vosara аватар
Онлайн
Зарегистрирован: 08.02.2014
LoGO:
Как вариант - в начале цыкла установите концевик (или чтото подобное) это и будет нулевая точка. После прохождения пяти цыклов возвращаетесь назад до сработки концевика, тоесть нуля - это и будет коректировка. 
uragan
Offline
Зарегистрирован: 23.02.2015

С запасом по шагам ставите на упор - это и будет "0".

sadman41
Offline
Зарегистрирован: 19.10.2016

Чтобы в упор шагать - механизм иметь нужно чугунный. А то ведь можно и зубья шестерням поломать ;) Да и вообще можно получить ошибку позиционирования после отпускания обмоток. Немного, но таки назад откинуть может. К данному мотору не относится, но привычку лучше не формировать.

LoGO
Offline
Зарегистрирован: 10.04.2018

vosara пишет:

LoGO:
Как вариант - в начале цыкла установите концевик (или чтото подобное) это и будет нулевая точка. После прохождения пяти цыклов возвращаетесь назад до сработки концевика, тоесть нуля - это и будет коректировка. 


Спасибо, уже работаю в этом направлении, будет что то вроде магнитной кнопки