[Из песочницы] Программирование на JavaScript для токарного станка

Эту статью следовало бы назвать «генерирование комбинаций шестерен гитары китайского токарного станка для подбора шага подачи с помощью скрипта на JavaScript», но это звучит не так интригующе.

lepuxdjjdt3tzro-xsczrsr8fps.jpeg


Самый дешевый токарный станок с Aliexpress MX-180V удивительным образом веселит меня с самого своего появления в моей домашней мастерской уже больше полугода. Несмотря на то, что китайцы забыли прикрутить его к ящику, вследствие чего была помята лицевая панель.

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

yiswd87lly9pgiydijdf5qz2xd8.jpeg

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

xjhugysl9r1qq9ulfnyogrnrips.jpeg


На валу шестерня с 80 зубами, затем 52, а между этой шестернёй и шпинделем должна стоять шестеренка с 50 зубами. Но среди 10 шестерен в моём наборе с 50 зубами не было.

hvhf_9y-tnn4v8grk55zmddfzji.jpeg


Тут я начал в очередной раз расстраиваться, ну как же так, братья китайцы! Окончательно меня добил тот факт, что в моём наборе не было еще и второй шестерни на 80 зубов и 66, и 33-х-зубых шестерен. Немного поразмыслив, я понял, что для подачи в 1 мм на оборот важно лишь соотношение зубов на шпинделе и на валу, а промежуточные шестерни могут быть любыми, главное, чтобы они помещались туда. В итоге, первую в своей жизни резьбу М6×1 с помощью резца, а не плашки, я нарезал!

erwnielubqesgmyoqlqfc5wayf0.jpeg


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

Устройство редуктора не сложно и схематично четыре способа установки шестеренок (безотносительно их диаметров) можно изобразить так:

lioq58sigjtkzjplgrqkjunhtts.png


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

rysomj_upcsylrfaf2vaf_iay5k.jpeg


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

cu4tjbm0ujfdbvrddfurwrbxiew.jpegjyi3lf_zwzmbocnsgv1nhb0oi-w.jpeg
Физическая попытка брутфорса этой задачи показала, что допустимых комбинаций достаточно много. На листочке уже стало не хватать места для ещё не проверенных наборов, я стал путаться. Был велик шанс пропустить комбинацию, либо наоборот, записать уже проверенную. Желание заниматься слепым перебором вариантов, сидя в неудобной позе перед станком, улетучилось очень быстро. Сколько и какие вообще комбинации и подачи возможны на этом станке? Требовалось призвать на помощь теорию, а труды по перебору вариантов возложить на компьютер, чтобы зря не стоял.

nisfspos0hfv0glupiwoozg3sue.jpeg


Надо будет найти или написать генератор размещений без повторений, так как каждая шестерня у меня только в одном экземпляре. Способов выбрать из 10 вариантов 3, 4 и 5 шестерен достаточно много, но какие-то из них, очевидно, следует отбросить из-за геометрических соображений. Понадобится фильтр, пропускающий только подходящие наборы шестерен. После фильтрации наверняка останется много комбинаций, которые будут давать одинаковый шаг подачи, не отличаясь при этом схемами зацепления и наборами шестерен, т.е. будут эквивалентные перестановки. От них тоже следует избавиться.

Не раздумывая, программировать решил на JS, хотя мог и на C++, но в своей практике я ещё не сталкивался с задачей, которую нельзя было бы решить в браузерном JS, когда дело не доходит до сброса данных на диск. В этом способе меня привлекает минимализм и достаточность инфраструктуры, блокнот и браузер, всё остальное лишне. Язык дает алгоритмизацию, браузер — графический интерфейс, интерпретатор и отладчик. Любую библиотеку можно либо быстро написать самому, либо найти и скачать. Когда не занимаешься промышленным или коммерческим программированием, то достаточно, просто, универсального калькулятора.

Генератор размещений я нашел и адаптировал быстро. Его назначение в программе переставлять индексы массива, в котором будут храниться экземпляры шестерен. Здесь в функции search генерируются размещения, а прошедшие фильтр запихиваются в массив result функцией test. Кроме того, в последней функции вычисляется подача. Для определенности обозначим все шестерни так, как на рисунке.

qo4v7eeojthp_pho51-hujegizk.png


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

s8dro2fyxfol5v1kibahal_-p2m.png


то оказывается, что их можно свести к одной, совпадающей с IV, если положить:

pfc8nzbszbcpejprd5hp32a7_34.png


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

Сторона L которого измеряется непосредственно, а остальные вычисляются из радиусов шестерен. Радиус шестерен меньше их наружного радиуса на величину перехлеста при зацеплении. Поскольку шестерни изготовлены не идеально величину перехлеста следует установить эмпирически. Перехлест должен быть таким, чтобы обеспечивал зацепление, но предотвращал заклинивание шестерен. В моём случае он оказался равен 1 мм. На сторону S накладывается следующее ограничение, ось верхней промежуточной шестерни не должна касаться шкива шпинделя. Она измеряется непосредственно, когда направляющая с осью верхнем положении повернута максимально близко к шпинделю, ось при этом должна почти касаться шкива. Расстояние V не может быть больше дистанции между осью вала и верхней промежуточной осью, отодвинутой до упора вверх по пазу. Также следует наложить ограничение на угол между L и V. Повернув рейку без шестерен и осей максимально близко к шпинделю, измерить или вычислить расстояние S между осью шпинделя и верхней точкой направляющей и рассчитать угол по формуле

nytih_eo4ksgoy7pcsmzbassfbw.png


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

gd_zx1pnpge3p7uzjkehiksoz58.png


Кроме этого, шестерня B не может быть больше A, а C не может быть больше, чем D. D не должна касаться вала, а C не должна цепляться за A, при зацеплении B и D.

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

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

4r9p8yrh3urvnoqkpstdh8nlkai.jpeg


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

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

Скрытый текст




© Habrahabr.ru