Деление окружности на равные части с сохранением целостности обхода

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Не знаю, как правильней назвать тему, звиняйте. Нарвался на пробел в знаниях, не зазорно и подучиться, что называется. Посему буду благодарен пинку в правильном направлении. Вводные простые:

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

2. Направление обхода может меняться в любое время, т.е. - идём вперёд два раз, потом - можем пойти назад три раза;

3. На окружности есть N ключевых точек, расстояния между которыми надо рассчитывать динамически, без предварительного занесения в таблицу (ибо таблица может получиться огромной, и не влезет никуда);

4. Шаги мы можем делать - только целые, семенить - нельзя;

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

Задача: правильно рассчитать корректировочные поправки, равномерно раскидав их по окружности.

Простой пример: допустим, у нас 200 шагов, чтобы обойти окружность, и нам надо расставить по окружности 19 точек. Получаем: 200/19 = 10.526315789473684210526315789474 шагов между соседними двумя точками. Поскольку шагаем мы целыми шагами, то предварительно можем расставить эти точки через каждые 10 шагов, накопив таким образом итоговую ошибку в 0.52631578947368421052631578947368*19 = 10 шагов. Очевидно, по вводным, что каждый второй проход мы должны делать не 10, а 11 шагов, и останется напоследок - один шаг добавить к последнему проходу.

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

Рассмотрим упрощённый пример: 3 точки на окружности, 5 шагов, чтобы обойти всю окружность. Двигаясь вперёд, я должен сделать 1 шаг, потом - 2 шага, потом - 2 шага, т.е. развёрнутый в линию график обхода будет таким: 1-2-2. И расчёт расстояния между соседними точками должен всегда сохранять этот график. При этом существенно, чтобы многократные проходы окружности целиком - не приводили к смещению контрольных точек, т.е. - где бы я ни находился и в какую сторону не захотел бы двинуться - я был бы уверен, что всегла правильно рассчитаю расстояние межлу точками, как если бы график всегда был 1-2-2.

Задача - минимизировать ошибку алгоритмически. Надеюсь, объяснил внятно, буду рад любой помощи знающих математику потуже, чем я. Я, конечно, кой-чего уже накидал, но что-то мне не нравится, если честно - возможно, не вижу каких-то очевидных подводных камней. Короче, хелп.

Ясное дело, для чего сия мутота: правильно поделить окружность на части при помощи шагового. Посмотрел тут прошивку товарища http://www.liming.org/millindex/ - так она там не парится вообще с накопленной ошибкой - тупо делит кол-во шагов на оборот на кол-во частей, получает в uint32_t целое кол-во шагов, и всё - мне бы так жить, блин, и не париться. В видео показывает, что якобы у него точность позиционирования - ну прям зашибись. Я же утверждаю, что там будет накапливаться ошибка, и это даже видно на видео, к слову - делил он всего на пять частей, фрезеровал. Когда прошёл окружность целиком и начал повторно фрезеровать первую плоскость - было видно, как летит стружка, при том, что там передаточное 5:1, т.е. получается 1000 шагов на оборот от исходных стандартных 200. Ну минимизировал он ошибку редуктором в 5 раз, но блин, видно же - хорошо так стружка летит, когда второй раз стартовую плоскость фрезерует. Ок, там может быть дело в неточном передаточном числе, но я больше чем уверен - если бы он поделил уже на 6 частей - была бы ошибка либо в 2, либо в 4 шага на окружность, что даёт погрешность от 0.2 до 0.4%. А если редуктор 1:1? Вообще беда. Вот, кстати, тот видос: https://youtu.be/ODf9sJzXHzA?t=133 - гляньте, мож я уже в глазёнки долблюсь :) 

З.Ы. Или может я зря заморачиваюсь? Заставить себя видеть в составе конструкции редуктор минимум 5:1, и всё, что называется? Но, блин, неаккуратненько. Хотя и понимаю, что с использованием редуктора ошибка позиционирования убегает в далёкие дали и, по сути, только для одной или пары точек на окружности может быть актуально добавить пару шагов. Но даже при таких допущениях - хочется всё же это учитывать. Насколько это будет актуально на практике - пока хз, если честно. Но лично мне бы не понравилось, если, прокрутив головку десяток циклов подряд - я бы увидел, что позиция уплывает.

З.З.Ы. Козломордому веселуху подкинул :) Козлёночек - фас!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот кстати, товарищ поднимает совершенно правильный вопрос (взято отсюда: https://www.homemodelenginemachinist.com/threads/electronic-dividing-head-using-the-arduino.17896/page-9#post-287666):

Цитата:
 

I want to be able to cut gears up to 127 teeth ....

so would 4000 steps get me to 127 divisions?

Ну ещё бы: 4000/127 = 31.496062992125984251968503937008 шага на позицию :) Нарежет он там с целочисленными вычислениями: 127*31 = 3937 шагов, минус 63 шага на окружность, ошибка в 1.575%. Куда такая шестерня встанет - разве только известным тут персонажам, подвеской на межушный ганглий :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Промежуточные наброски - покритикуйте, плз:

//--------------------------------------------------------------------------------
// движение по часовой
//--------------------------------------------------------------------------------

	float totalNumOfDivisions = ...;
	
	float stepsPerDivision = getStepsPerRevolution() / totalNumOfDivisions;
	int currentStepsCount = currentPosition * stepsPerDivision;
	int nextStepsCount = (currentPosition + 1.00)  * stepsPerDivision;
	
	moveForward(nextStepsCount - currentStepsCount);
	
	currentPosition++;
	
	if(currentPosition == totalNumOfDivisions) 
		currentPosition = 0; 


//--------------------------------------------------------------------------------
// движение против часовой
//--------------------------------------------------------------------------------	

	float totalNumOfDivisions = ...;
	
	float stepsPerDivision = getStepsPerRevolution() / totalNumOfDivisions;

	if(currentPosition == 0)
	{
		int currentStepsCount = getStepsPerRevolution();
		int nextStepsCount = stepsPerDivision * (totalNumOfDivisions - 1.00);
		
		moveBackward(currentStepsCount - nextStepsCount);
		
		currentPosition = totalNumOfDivisions - 1;
	}
	else
	{
		int currentStepsCount = currentPosition * stepsPerDivision;
		int nextStepsCount = (currentPosition - 1)  * stepsPerDivision;
		
		moveBackward(currentStepsCount - nextStepsCount);
		
		currentPosition--;
	}
//--------------------------------------------------------------------------------

Не соображу - есть ли подводные камни.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Проверил на отладочном выхлопе - всё работает норм, на первый взгляд, считает шаги нормально, располагает их равномерно. Если вдруг что проглядел - буду признателен за замечание ;)

Текущий расчёт выглядит так:

  int32_t stepsComputed = 0;
  float stepsPerRevolution = MotorController.getStepsPerRevolution();
  float stepsPerDivision = stepsPerRevolution / totalNumOfDivisions;

  DBG(F("Steps per REV: "));
  DBGLN(stepsPerRevolution);

  DBG(F("Steps per DIV: "));
  DBGLN(stepsPerDivision);

  if(!ccw) // движемся по часовой
  {
        
    int currentStepsCount = currentPosition * stepsPerDivision;
    int nextStepsCount = (currentPosition + 1.00)  * stepsPerDivision;
    
    stepsComputed = (nextStepsCount - currentStepsCount);
    
  }
  else // движемся против часовой
  {
      if(currentPosition == 0)
      {
        int currentStepsCount = stepsPerRevolution;
        int nextStepsCount = stepsPerDivision * (totalNumOfDivisions - 1.00);
        
        stepsComputed = (currentStepsCount - nextStepsCount);        
      }
      else
      {
        int currentStepsCount = currentPosition * stepsPerDivision;
        int nextStepsCount = (currentPosition - 1)  * stepsPerDivision;
        
        stepsComputed = (currentStepsCount - nextStepsCount);
        
      }
    
  } // else

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нинаю, я бы всё на 100 умножал и работал с целыми.  Но я, скорее всего, неправ. 

я бы так делил, наерна 

https://inter-net.pro/arifmetika/delenie-okruzhnosti-koef

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

нинаю, я бы всё на 100 умножал и работал с целыми.  Но я, скорее всего, неправ. 

я бы так делил, наерна 

https://inter-net.pro/arifmetika/delenie-okruzhnosti-koef

Деда, спс, но там синусы, а это несколько затратно :) В приведённых набросках выше - простые действия, по сути. Сходу проверил на разных неудобных числах - раскладывает шаги с учётом погрешности, пока не удалось получить НЕ 200 шагов на полный оборот. При этом при движении вперёд/назад вперемешку вектор распределения интервалов по окружности - не меняет направления, что мне и нужно было.

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

Замечал за собой - бывает, тупишь-тупишь, тупишь-тупишь (ночь, фигли) - а потом, стоит только написать на форум - вот оно, более-менее приемлемое решение. Возможно, кому-то пригодится, хотя - особой ценности там я не вижу, архат скоро подтвердит, ты ж его знаешь :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И чо я полез советовать профессионалам, да еще спахмелью?  Тут щас и без меня бойня будет, особенно когда одиозный пенсионер с одними заглавными буквами в нике праснёца. 

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

особенно когда одиозный пенсионер с одними заглавными буквами в нике праснёца. 

Ну вот, и ты тоже произнёс заклинание :) Теперь точно появятся обе, шерочка с машерочкой :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да правильно всё. Тем более, как понимаю, эта тема возникла в понимании афтора, что делительная головка это не только "экран с клавиатурой" и произвольное переназначение кнопок не решает задачу "проехту" .. позорище, ну да ладно, его право сесть в лужу..

Там, в табличке коэффициентов, ещё стоит учесть (если оно для изготовления шестеренок) что количество зубьев у шестеренок далеко не "произвольное число" и делить "до бесконечности" нет никакого резону. А кроме этого, есть диаметр шестерни (ну или делительной головки) и есть некая пороговая точность, что практически исключает коэффициенты с 4-я знаками и вообще делает все вычисления в плавающих числах .. глупостью. :)

Последнее до афтара не дойдет никогда, ибо работу в целых числах он так и не освоил явно.

P.S. Приведенный по вашей ссылке метод - имхо, самый годный для работы с микроконтроллером.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

Тогда у нас возникает 360 градусов и радиус окружности. Соответственно все шаги будут вычислятся как деление 360 градусов на заданное количество шагов. Точность в данном случае определяется точностью измерения углов (например энкодером с редуктором). Радиус не имеет значения.

Logik
Offline
Зарегистрирован: 05.08.2014

//Надеюсь, объяснил внятно

Не особо.

//так она там не парится вообще с накопленной ошибкой - тупо делит кол-во шагов на оборот на кол-во частей, получает в uint32_t целое кол-во шагов,

Это понятно грубовато.

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

//100 умножал и работал с целыми.

Тоже годно, но точность до сотой может и не хватить. Да и 100 - не в тему, пусть уж 128. Лучше уж формат с фиксированой запятой.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Logik пишет:

Тоже годно, но точность до сотой может и не хватить. Да и 100 - не в тему, пусть уж 128. Лучше уж формат с фиксированой запятой.

тогда, кошерные 1024. 

Logik
Offline
Зарегистрирован: 05.08.2014

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

У шаговика целое значение шагов на один оборот, и при делении шага соотвнтственно тоже.

если не перегружен и не проскальзывает, то зачем энкодер?

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

vvadim
Offline
Зарегистрирован: 23.05.2012

рассматриваем только перемещение на 360 градусов.
потом обязательно возвращаемся в ноль.
так обеспечим повторяемость.
точность - редуктор или микрошаги.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

inspiritus пишет:

У шаговика целое значение шагов на один оборот, и при делении шага соотвнтственно тоже.

Необязательно, если рассматривать передаточное отношение, как часть системы - там может вылезти и дробное кол-во шагов на оборот ;) Например, 200 шагов на оборот и передаточное отношение 7/3 - получаем 466,66666666666666666666666666667 шагов на оборот, и с этим надо как-то жить, максимально минимизируя ошибку относительного позиционирования.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mykaida пишет:

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

Никакой ошибки, ибо разницы, с чем работать - нет, т.к. простое отношение: в 360 градусах - N шагов. Меняй одно на другое - сколько угодно, результаты вычислений от этого не изменятся, т.к. оперируем мы, в конечном итоге, только целыми шагами.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Logik пишет:

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

Ага, спс, это и было, в конечном итоге, реализовано. Как писал выше - бывает, тупишь-тупишь, а потом - бац, и понятно, что зря тупил, надо было просто не рефлексировать и применить простое решение вместо того, чтобы писать тут простыню на форум. Но архата тоже надо кормить чем-то - загнётся, бедняга, без корма-то, куда  ж мы без него :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vvadim пишет:

точность - редуктор или микрошаги.

Именно так. При этом второе - НЕ предпочтительно, первое - предпочтительно. 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

Давайте по существу глаголить.  

Согласен. Для интересующихся этим вопросом просто оставлю это здесь: https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5

И приведу простой пример клиноременной передачи, как частного случая редуктора (механизма с передаточным отношением больше 1, в обиходе - понижающий редуктор, в отличие от мультипликатора - механизма с передаточным отношением меньше 1, в обиходе - повышающий редуктор, что само по себе - оксюморон, но - так повелось): на ведущем валу стоит шкив с длиной окружности 3, на ведомом - с длиной окружности 7. Передаточное отношение: 7/3, момент силы на ведомом валу возрастает в 7/3 = 2.3333333333333333333333333333333 раза.

Применительно к нашей задаче - обойти окружность полностью и вводным, что при передаточном отношении 1/1 мы для этого должны сделать 200 шагов, путём нехитрых вычислений получаем, что для того, чтобы пройти всю окружность при использовании указанного выше редуктора, нам надо сделать 466.66666666666666666666666666667 шагов.

Далее: например, нам надо поделить окружность на 17 частей, получаем при таких раскладах  27.450980392156862745098039215686 шагов на часть. Собственно, наглядная иллюстрация неточности позиционирования, которая, во-первых, минимизируется использованием редуктора с бОльшим передаточным отношением и, во-вторых - использованием режима микрошага. Остальное - корректируется программно.

И никакое кол-во зубьев на какой-то гипотетической шестерёнке - тут неважно, ибо мы никакими зубьями тут не оперируем - мы берём в расчёт только параметры системы, в частности - передаточное отношение. А оно, по определению - может быть любым рациональным числом, например, 15/6. Тот факт, что в реальной жизни распространены редукторы с целым передаточным отношением (самое популярное - 40/1) - не отменяет формулы передаточного отношения, от слова "совсем". И я не хочу изначально загоняться в узкие рамки, отдав на откуп компромиссам обработку ошибок. Естественно, что в конечном устройстве я буду стараться приблизиться к целочисленному передаточному отношению, ибо стандартизация - хорошая и нужная вещь, но - я должен быть уверен, что возможные ошибки точности позиционирования будут в любом случае откорректированы программно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты все-таки подумай, рациональное число передачи редуктора всегда (почти) можно выразить натуральной дробью, те же 15 на 6 или 7 на 3.  где числитель и знаменатель - целые.  Если использовать их ка домножатели, можно работать с целыми, что не в пример быстрее. 

Может, канеш, я и неправ, не спорю.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

ты все-таки подумай, рациональное число передачи редуктора всегда (почти) можно выразить натуральной дробью, те же 15 на 6 или 7 на 3.  где числитель и знаменатель - целые.  Если использовать их ка домножатели, можно работать с целыми, что не в пример быстрее. 

Может, канеш, я и неправ, не спорю.

Ок, подумаю ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Дед, соотношения (зубьев) редуктора завсегда .. ЦЕЛЫЕ и числитель и знаменатель (ибо зубья).. :) Клиноременные передачи (и прочие "гладкие" их несколько) использовать в качестве редуктора для шагового двигателя (позиционируемого!) - есть идиотизм высшей пробы, поскольку в них есть такое явление как ПРОСКАЛЬЗЫВАНИЕ.

А вообще-то, передаточное отношение любого редуктора ВЫБИРАЕТ конструктор девайса исходя из "конструктивных" соображений, как-то: необходимость получения требуемого момента на вых. валу; заданной скорости его вращения; плавность, шумность, точность передачи и .. в т.ч. по параметрам исходного движителя (двигла).

Отсюда: имеем двигло "шаговик", подбираем НУЖНЫЙ (по остальным параметрам) редуктор и УДОБНЫЙ для двигла .. задача из конструкторского "детского сада". Или наброс автора, не понимающего "что к чему". Да, и вообще-то, шаговиков напридумано столько, что КАК ПРАВИЛО стараются выбрать подходящий и вовсе БЕЗ редуктора.. но это, так .. ваще "высший пилотаж" для автора..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Arhat109-2 пишет:

Дед, соотношения (зубьев) редуктора завсегда .. ЦЕЛЫЕ и числитель и знаменатель (ибо зубья).. :) Клиноременные передачи (и прочие "гладкие" их несколько) использовать в качестве редуктора для шагового двигателя (позиционируемого!) - есть идиотизм высшей пробы, поскольку в них есть такое явление как ПРОСКАЛЬЗЫВАНИЕ.

рассказать про зубчатые ремни?   и не нада эпитетов, плиз. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Потёр, чтобы деда не спился :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Иопвашумать.   Вот теперь наданапица.  А не хотел сёдня. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

рассказать про зубчатые ремни?   и не нада эпитетов, плиз. 

Деда, не надо - вгонишь в когнитивный диссонанс: ну где это видано, что под ремень GT2 существуют зубчатые шкивы на 60 и 40 зубов, при этом редуктор получается с передаточным отношением 1.5, и без проскальзывания? Это, по-архатовски - незачёт и не должно входить в реальность, потому что, по-архатовски (процитирую тут очередное его мешание мух с котлетами, чтобы на память, значицца):

Arhat109-2 пишет:

Дед, соотношения (зубьев) редуктора завсегда .. ЦЕЛЫЕ и числитель и знаменатель (ибо зубья).. :) 

:) Кол-во зубов - да, всегда целое, т.к. пол-зуба - бывает только в ротовой полости архата :) А вот соотношение, ВНЕЗАПНО - вполне себе может быть и не целым. Тупые конструкторы зубчатых шкивов, куда они только смотрят?

Чтобы не быть голословным:

Раз: https://ru.aliexpress.com/item/LUPULLEY-5PCS-GT2-40T-Timing-Pulley-Bore-...

Два: https://ru.aliexpress.com/item/High-quality-1pc-60-teeth-Bore-5mm-GT2-Timing-Pulley-fit-width-6mm-of-2GT-timing/32656535008.html

У одного - 40 зубов, у второго - 60. Какое будет передаточное отношение, если на 60 зубов - стоит на ведомом валу? Не подскажешь, архат?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

А главное там было (другие читают сей бред тожеж!) в том, что выбрав "шаговик" в качестве двигла, по потерянным волосам (клиноременным передачам) не плачут. И вопрос редуктора тут, если и стоит, то совершенно в иной плоскости, а не "как захотелось". А то ведь кто-нить из детского возрасту и впрям решит что бывают шестеренки с тремя зубьями.. (да и на 7 зубьев - редкость и пользуются только в крайних случаях).

Механика - этож не клавиатура, где можно "любую клавишу переназначить" как хочется..

P.S. по теме:

1. Если надо делить коружность, то можно использовать табличку коэффициентов по длине хорды, как было указано выше. Все одно, делить надо на определенные части и их не так много.

2. Но, правильней перейти к полярным координатам и делить 360 градусов, соотнося результат с шагами движка, можно и через редуктор, который удобно(!) выбирать в этом разе так, чтобы число шагов оставалось целым числом.

Этих пунктов ДОСТАТОЧНО чтобы решить задачу, имея требуемый шаг деления и конкретный шаговик под рукой.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

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

Да тут уже все увидели, какую дичь ты тут порешь, не сомневайся. То тебе ВНЕЗАПНО проскальзывание не угодило, то ещё какую оправдашку найдёшь - архат такой архат.

Специально для тебя: я делаю - для себя, и ещё не знаю, что конкретно будет по передаточным отношениям и двигателям. И, представь, что существуют двигатели с шагом на оборот, отличным от 200. Возьмём простой пример - 70 шагов на оборот, передаточное отношение 1.5, полношаговый режим и задачу - поделить окружность на 11 частей. Ты понимаешь, хоть маленько, что при таких вводных получается дробный шаг? Я специально оговорился, что буду стремиться к использованию стандартных решений, а пока моя задача - минимизировать возможные ошибки позиционирования - программно. Но ты это благополучно не прочитал, наверное, в тех предложениях буквы незнакомые были.

Впрочем, кому я объясняю...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Уймись, истеричка! Тебя же внятно попросили .. очередной ПМС что ли?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

Уймись, истеричка! Тебя же внятно попросили .. очередной ПМС что ли?

Иди козу дрючь, выхухоль. Займись любимым делом.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Неизлечимая баба. В бан. Пиши исчо.. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Более того - писал выше, выхолощенный СТАНДАРТНЫЙ пример: 200 шагов на оборот, редуктор с передаточным отношением 1/1, деление на 6 частей. Где тут проскальзывание, каким оно боком вообще к проблеме неточности позиционирования - сие ведомо только диванным аналитикам. Для меня же очевидно, что в этом СТАНДАРТНОМ случае перемещение не одну позицию будет занимать 33.333333333333333333333333333333 шага, и если не учитывать эту ошибку, то прокрутив 10 раз на 360 градусов, мы уплывём на 200*6 - (33*6*10) = 20 шагов, что при шаге в 1.8 градуса составляет 36 градусов. Норм делительная головка, архат рекомендует: всё стандартное, все зубы целые, вот только не делит нормально нихера.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Arhat109-2 пишет:

Неизлечимая баба. В бан. Пиши исчо.. :)

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

Вот только ты слова никогда не держишь, балабол.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я считаю, что разбираться с абсолютной точностью бессмыслено. Значит весь вопрос в размере допустимой погрешности. Если достаточная погрешность 1/1000 круга (при 200 шагов двигателя на круг), тогда выбираем редуктор 5/1 и получаем ее, работая только в целых числах. Если надо меньшить погрешность - изменяем передаточное число и опять-же работаем с целыми числами. Что бы погрешность е накапливалась желательно начинать движение каждый раз с одной и той-же точки или раскидывать погрешность в случайном порядке во время движения..

Кстати можно пользоваться градами для простоты вычислений.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mykaida пишет:

Я считаю, что разбираться с абсолютной точностью бессмыслено. Значит весь вопрос в размере допустимой погрешности. Если достаточная погрешность 1/1000 круга (при 200 шагов двигателя на круг), тогда выбираем редуктор 5/1 и получаем ее, работая только в целых числах. Если надо меньшить погрешность - изменяем передаточное число и опять-же работаем с целыми числами. Что бы погрешность е накапливалась желательно начинать движение каждый раз с одной и той-же точки или раскидывать погрешность в случайном порядке во время движения..

Совершенно согласен! Вопрос именно в размере допустимой погрешности (что нивелируется бОльшим передаточным числом и введением микрошага) и в раскидывании возможной погрешности равномерно по окружности. Что, собственно, уже и реализовано ;)

На практике, ессно - буду уже всё просчитывать, сходу видится редуктор с передаточным не менее 5/1, кстати. С этим, к слову - тоже надо работать, и подбирать комфортные условия, чтобы и скорость вращения была приемлемой, и погрешности - по максимуму убирались входными параметрами системы. Хотя сами эти вводные не отменяют того факта, что погрешность может возникнуть на этапе деления на N частей, когда одна часть - получается с дробным кол-вом шагов. Повторюсь - это уже корректируется программно.

Начинать же движение с одной точки - в случае делительной головки - это больше условность, т.к. стартовую позицию подбирает пользователь: например, можно подогнать в режиме шагания фрезу к условной метке на детали - и вперёд. Тут больше вопрос практического характера: если не учитывать погрешность, то при цикличном переходе по графику позиций 1-2-3 и в обратном порядке (простые "качельки" туда-сюда) - то будет видно, что точность позиционирования относительно условной метки на детали - уплывёт.

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

mykaida пишет:

Если достаточная погрешность 1/1000 круга (при 200 шагов двигателя на круг), тогда выбираем редуктор 5/1

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

Ардуинщик321
Offline
Зарегистрирован: 01.10.2018

Конечно, никто и никогда не считает в механике "сферических коней в вакууме" - это не "программирование". Шаговик с 200 шагами на оборот, имеем угол шага в 1,8*. Надо поделить на 19 частей: 360/19 = 18,947368421* что само по себе есть проблема, при любом шаговике или делительной головке. Может поэтому шестеренок с некоторым количеством зубьев как-бы и не бывает? Не на всё может делить "делительная головка", а только на то - что требуется. Может автору сначала озадачиться требуемыми параметрами головки, а уже потом сочинять программу? Собственно это похоже и писали тут выше.

А вообще, топик конечно жесть .. автор, поучись для начала. Уже боюсь обидеть, но с таким пониманием задачи, выглядишь этаким "сферическим дураком в вакууме". :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я не могу себя пересилить и написать ответ на твою задачу, уж прости... это у меня нервное ;).

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

Решается учетом накопления ошибки и коррекции на +/- 1 пиксель (в твоем случае 1 шаг ШД) по мере достижения. То есть на каждом шаге ты прибавляешь (или убавляешь) счетчик ошибки, он у тебя тоже целочисленный в "долях" шага, сам понимаешь. При кореекции на шаг, ты, ессно, учитываешь остаток, а не тупо обнуляешь. Для повторяемости точек после оборота нужно просто обнулить ошибку при переходе нулевой отметки. Никаких таблиц не надо.

==============

Прости за наглость, но понял? или расписать на Си?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ардуинщик321 пишет:

А вообще, топик конечно жесть .. автор, поучись для начала. Уже боюсь обидеть, но с таким пониманием задачи, выглядишь этаким "сферическим дураком в вакууме". :)

Архат - перелогинься, плз, палишься.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

wdrakula пишет:

Я не могу себя пересилить и написать ответ на твою задачу, уж прости... это у меня нервное ;).

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

Решается учетом накопления ошибки и коррекции на +/- 1 пиксель (в твоем случае 1 шаг ШД) по мере достижения. То есть на каждом шаге ты прибавляешь (или убавляешь) счетчик ошибки, он у тебя тоже целочисленный в "долях" шага, сам понимаешь. При кореекции на шаг, ты, ессно, учитываешь остаток, а не тупо обнуляешь. Для повторяемости точек после оборота нужно просто обнулить ошибку при переходе нулевой отметки. Никаких таблиц не надо.

==============

Прости за наглость, но понял? или расписать на Си?

Спс. Дык - решил уже, именно таким способом, код - выше выложен.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ардуинщик321 пишет:

Конечно, никто и никогда не считает в механике "сферических коней в вакууме" - это не "программирование". Шаговик с 200 шагами на оборот, имеем угол шага в 1,8*. Надо поделить на 19 частей: 360/19 = 18,947368421* что само по себе есть проблема, при любом шаговике или делительной головке. Может поэтому шестеренок с некоторым количеством зубьев как-бы и не бывает?

Для упарантов-неофитов поясняю ещё раз: делительная головка - не только для нарезания шестерён, убогие вы создания. В вашу голову может придти простая мысль, что мне надо просверлить 19 отверстий на окружности, а?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DIYMan пишет:
Нарежет он там с целочисленными вычислениями: 127*31 = 3937 шагов, минус 63 шага на окружность, ошибка в 1.575%. Куда такая шестерня встанет - разве только известным тут персонажам, подвеской на межушный ганглий :)
Та нормально встанет. По любому прямозубые шестрени всегда стучать будут. Вот по этой причине и делают свециализированые станки.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Нужно просто всё считать от одной точки, все шаги. Например, если мы в 3-й точке, а нужно сделать два шага назад, то считаем первую точку от 0-вой. А уже затем, если нужна дельта, считаем дельту между третьей и первой, причем сначала округлив положение третей точки.

Если непонятно, то нафиг.