Про профессиональные праздники

В качестве хобби немного преподаю в МИЭМ, и вот что подумал — если это не только «Московский институт элегантных мужчин», но и «Московский институт электронного машиностроения», то я имею все основания отмечать профессиональные праздники непрерывно — от дня машиностроителя (последнее воскресенье сентября) до дня работника электронной промышленности (первое воскресенье октября). В общем, стоит накатить!

Про азиатский work-life balance

Вытащу из комментов в ЖЖ, потому что в очередной раз вспомнил, как один из коллег по Ху-ю (не Хундаю) пытался объяснить китайскому боссу, что он не хочет работать 5 дней в неделю, а хочет работать 4, а 3 отдыхать — а китайский босс искренне не понимал, что значит «не хочу так работать» (все осложнялось еще и плохим английским минимум у одной из сторон дискуссии). Для начала — само по себе представление о том, что «жизнь» и «работа» как-то разделяются — это штука довольно неочевидная. Да, у условного фабрично-заводского рабочего, или у офисного клерка такое разделение есть, но вот представьте себе крестьянина, или мелкого ремесленника, «кустаря-одиночку с мотором» — и внезапно окажется, что и «рабочее время», и весь новомодный work-life balance оказываются довольно сложной абстракцией.

Но это еще не все! «Крестьянская» прошивка у немалого числа китайцев довольно здорово отличается, скажем, от «русской». Наши основные сельскохозяйственные культуры, пшеница и рожь, даже в среднерусской зоне рискованного земледелия буквально «растут сами», требуя приложения сил дважды в год, в посевную и уборочную (да, я сознательно многое упрощаю, не надо писать злобные комменты). Отсюда, скажем, производят нашу тягу к авралам, штурмовщине, работе перед «дедлайном» — то есть максимальному напряжению сил «к нужному моменту». Вся же юго-восточная Азия возделывает рис, который, во-первых, дает несколько урожаев в год, сезонность там выражена слабее, а во-вторых, крайне сложен в посадке (растет не из зерен, а из этакой «рассады»), требует постоянного ухода и поддержания системы орошения. Из-за этого южнокитайский крестьянин вкалывает постоянно, без ярко выраженной сезонности (и не только китайский, кстати — подумайте о происхождении, скажем, «корейской системы крафта«).

Разумеется, Китай довольно неоднороден — но именно на китайцах можно наглядно увидеть разницу менталитета «хлеборобов» (к северу от Янцзы, меньшинство населения) и «рисоводов» (к югу от Янцзы)! Она проявляется во всякого рода психологических тестах, и в целом с таким разделением согласны и сами китайцы, вот достаточно «популярное» изложение «рисовой теории»:

https://scholarworks.gvsu.edu/orpc/vol4/iss1/7/

А теперь представьте, что мы имеем дело с потомками рисоводов в первом, если повезет — втором поколении, то есть умножаем отсутствие разделения «личного» и «рабочего» на вот такую вот закрепленную в пресловутом «менталитете» привычку к каждодневному труду (замечу, правда, что не всегда это положительная характеристика, как в том анекдоте — хули думать, дергать надо!).

Самодельный зубофрезерный станок в действии

И как это обычно бывает — только после сборки этого станочка, скомпонованного «по мотивам» полноразмерных зубофрезерных станков, наткнулся на Jacobs Gear Hobbing Machine, которая, возможно, немного удачнее в плане жесткости конструкции.

Настольный зубофрезерный станок

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

Итак, начнем с того, что мне понадобились косозубые шестерни с модулем 0,5, вроде бы понятными количеством зубьев и толщиной — ну а прочие параметры пока что не столь критичны. Возможно, будь дело где-то в Америке из воспоминаний Фейнмана, я бы просто взял каталог фирмы Boston Gear (в распространенном переводе «Вы, конечно, шутите, мистер Фейнман» его обозвали «Бостонским каталогом шестерен») и нашел бы там нужную деталь; если бы дело было в Германии, то наверное, стоило бы воспользоваться аналогичным каталогом Zahnradfabric Friedrichshafen — но, конечно, не уверен, что это было бы достаточно дешево. А какие опции доступны «микропроизводству» в Москве в 2025 году? Конечно, можно купить какие-то компоненты на Алиэкспрессе — и для некоторых типов шестерней это самый понятный вариант. Да, если речь идет о сотнях-тысячах деталей, придется подумать о вариантах доставки из Китая — но это будет работать только в случае, если эти детали достаточно «стандартные» (всякие компоненты для тех же 3D-принтеров или хоббийных станков, например). Прямозубые шестерни для игрушек с тем же модулем стоят копейки — можно даже купить в Чип-и-Дипе набор игрушечных шестерен, и может быть, если бы мне подходили стандартные шестерни из этого набора, это было бы даже экономически оправдано в варианте «покупаем набор и 90% из него выкидываем» — но мне понадобились более сложные, косозубые. Их, к сожалению, не получится сделать на термопластавтомате (а я даже приценивался к мини-ТПА, это внезапно не так дорого) — так что пришлось смотреть на другие, более традиционные методы изготовления зубчатых колес.

Чаще всего в этом контексте упоминают нарезание зубчатых колес модульной фрезой на фрезерном станке с делительной головкой, или что-то аналогичное — метод простой, не требующий специального оборудования, подходящий, к примеру, для ремонтных работ — сделать на универсальном станке в одном экземпляре шестерню взамен сломанной — и абсолютно не подходящий для более-менее серийного изготовления, даже если оснастить станок какой-то системой ЧПУ. Если же нужно делать шестерни хоть какой-то серией — то единственно оправданным методом становится зубофрезеровка, и на первый взгляд, это сложно и дорого. «Взрослый» зуборезный станок, какой-нибудь 5К32 — это дура в две тонны весом, расчитанная на нарезку здоровенных крупномодульных колес. Можно, конечно, обратиться и к [info]bougaev, у которого в мастерской есть аж настоящий Pfauter — но что-то мне подсказывает, что партия шестерен фирмы «жадинка Михалыч» выйдет буквально золотой :) Впрочем, на другом «полюсе» есть нищебродские методы, наподобие нарезания червячных эрзац-передач метчиком с крупным шагом — о которых даже пишут на Hackaday!

Что же лежит между этим нищебродством и использованием «настоящих» зуборезных станков? Дело в том, что запатентованный герром Пфаутером в 1897 году метод нарезания зубчатых колес с помощью червячных фрез довольно сложен, требует согласованного вращения фрезы и заготовки, и сложной настройки передач зубофрезерного станка — у которого есть аж две гитары — соло и бас вращения заготовки и подачи фрезы, а для нарезания косозубых шестерен добавляется еще и дифференциал с еще одной гитарой. Если добавить еще и ударные инструменты (без кувалды и зубила ты не слесарь, а мудила) — можно играть heavy metal! Какой-нибудь «справочник зубореза» состоит в основном из таблиц настройки этих гитар — которые еще и здорово отличаются у разных станков!

Я не зря вспомнил Фейнмана — потому что задачей получения заданного передаточного отношения с помощью подбора шестерен он в своих мемуарах и занимался. Но сейчас у нас не 1941 год, и даже токари-любители-ардуинщики придумали «электронную гитару» — несложный проект, позволяющий с помощью сравнительно недорогих компонентов получить любой коэффициент деления в широких пределах. В общем, дальнейшая идея почти очевидна — соорудить действующий макет зуборезного станка, использовав вместо механических передач «электронные». Может быть, так сработало место расположения моей мастерской, в районе остатков завода «Фрезер», может, дотянулись какие-то флюиды от Станкиновского учебного корпуса неподалеку — но мне это показалось достаточно заслуживающим внимания.

Мелкомодульную червячную фрезу по ГОСТ 10331-81 удалось недорого найти на Озоне, а остальные компоненты станка — «общего назначения» — алюминиевый профиль, Hiwin-овские направляющие, энкодер, шаговые двигатели — в общем, ничего редкого и дефицитного. Изготавливать пришлось лишь несколько пластин из капролона (для этого использовал макет фрезерного станка под названием CNC 3018) и вал для фрезы, но при наличии токарного станка последняя задача несложная, даже если учитывать то, что точил хоть какую-то деталь я в первый раз (но резьбовую пластинку все же сломал дважды). А, ну еще и надо токарить всякие оправки для закрепления заготовок — но это даже особо внимания не заслуживает.

Компоновка станка — «по мотивам» настоящих, «взрослых» зубофрезерных станков. Справа — неподвижная стойка, по ней в вертикальном направлении ездит установленная на поворотном столе ось фрезы. Стойка слева, с приводом заготовки в трехкулачковом патроне, подвижная, может двигаться вперед-назад. Возможно, я где-то немного прогадал с размерами — но сейчас сюда влезают заготовки радиусом до 40 мм, мне это «за глаза», возможная высота заготовки — тоже порядка нескольких сантиметров, если буду обрабатывать по много одинаковых колес «пакетом» — пригодится.

«Электронная гитара» на Arduino — проект прикольный, я частично подсмотрел там работу с шаговиками и энкодером — но потом все равно все переделал, конечно же :) Как это выглядит? На вал шпинделя (или, в нашем случае, червячной фрезы) ставится энкодер, выдающий, стандартно, 600 импульсов на оборот. Все же зависящие от количества оборотов шестерни передачи оснащаются шаговыми двигателями со стандартными, знакомыми многим по 3D-принтерам, драйверами, у меня завалялось несколько A4988 и TMC2208 (опять же, в виде готовых модулей для тех же 3D-принтеров). В режиме «микрошага» x16 для полного оборота шагового двигателя необходимо выдать 16*200=3200 импульсов, да еще и привод заготовки оснащен редуктором 1:4. В прошивке «электронной гитары» для этого вычисляется целая и дробная часть коэффициента деления — скажем, если мы будем резать шестерню на 127 зубьев (специально подобрал не очень хорошее число — но такие шестерни иногда нужны), то надо сделать один оборот заготовки на 127 оборотов фрезы. Соответственно, 76 200 импульсов энкодера будут соответствовать 12 800 импульсам, которые надо выдать на шаговый двигатель. Делим, и получаем, что коэффициент деления нашей «электронной гитары» должен составлять 5,953125. В ардуиновской прошивке с Chipmaker для такого дробного деления заводятся две переменных, Ks_divisor, с целой частью коэффициента деления, и Km_divisor, с дробной — давайте я приведу здесь максимально упрощенный код, без учета направления вращения вала (можете найти подобное в обработчике прерывания от энкодера):

int Ks_divisor = 5;
int Km_divisor = 9531;
int Ks_counter = 0;
int Km_counter = 0;
void isr(void){
    Ks_counter++;
    if(Ks_counter > Ks_divisor){
        step();
        Km_counter += Km_divisor;
        if(Km_counter > Km_divisor) {
            Km_counter -= 10000;
            Ks_counter = 0;
        } else {
            Ks_counter = 1;
        }
    }
}

В общем, можно понять, что автор ардуиновской прошивки пытается с помощью целочисленных переменных имитировать вычисления с точность 1/10000 (или 4 знака после десятичной запятой). Метод, может, и работающий, но имеющий очевидный недостаток — вы видите в этой программе число 5,953125, полученное в ходе расчетов? Дробную часть пришлось округлить, и это не очень хорошо — при большом количестве оборотов, то есть медленной и печальной, с подачей 0,1 мм на оборот, обработке даже не очень длинной заготовки — скажем, длиной 10 мм — ваша заготовка сделает 100 оборотов, фреза — 12700, ошибка на один шаг уже вылезет. Может, это и немного — но учитывая жесткость станка, точнее, ее отсутствие, вытекающие отсюда небольшие подачи и такой же небольшой съем материала — накапливающаяся ошибка становится проблемой.

Увеличивать разрядность в расчетах можно (хотя на Ардуине это проблема), но давайте посмотрим на задачу с другой стороны. Нам надо на каждые 76 200 шагов по одной «координате» равномерно сделать 12 800 шагов по другой. Классический алгоритм для этого был предложен Брезенхемом из IBM в 1962 году (да, все хорошее в программировании было придумано либо IBM в 60-х, либо DEC в 70-х) — и в аналогично упрощенном виде целочисленный алгоритм Брезенхема будет выглядеть так:

int dx = 76200;
int dy = 12800;
int err = 0;
void isr(void){
    err += dy;
    if(2*err > dx){
        step();
        err -= dx;
    }
}

Конечно, переменнные dx и dy можно и даже, наверное, нужно сократить на общий множитель (заодно вычисления будут умещаться в меньшую разрядность, полезно, если у вас 16-битный int на AtMega), а умножение на 2, если вы не доверяете оптимизации компилятора, заменить битовым сдвигом — но в целом тут и вычисления проще, и, что важно, ошибка не превышает 1/2 шага и не накапливается. Таким же образом можно получить и любые коэффициенты деления, выражающиеся простыми несократимыми дробями — полезно, если вам надо заменить настоящую чугунную гитару.

Разумеется, все «наработки» по этому станочку (чертежи деталей и исходники софта) я выложу на какой-нибудь гитхаб — а может, и даже на его российский клон. Пока еще не все идеально работает, нужна, очевидно, некоторая наладка механики, надо все-таки поставить отдельный двигатель, а не изгаляться с шуруповертом — но сама идея, кажется, вполне себе жизнеспособна. Во всяком случае, заготовки из капролона станочек режет довольно бодро, есть мнение, что и с латунью сможет справиться.

UPD Латунь («сыпучку», ЛС59-1) станочек вполне успешно обрабатывает с вертикальной подачей 0,3 мм/оборот.

Если вы думаете, что я шутил…

Читаю в телеграме один женский канальчик про электронику и около (не этот), и там есть «нерегулярная рубрика» «Что я сломала и что проебала». Мне вести такую рубрику лень — но вот не могу не поделиться сгоревшим LDO на очередной Nucleo:

Очень удобно на таких бумажках вести «список покупок» взамен сломанных и проебанных деталей и инструмента! А если вы думали, что я шутил — то я не шучу, у меня и чувства юмора нет.