Тема всевозможных станков с ЧПУ, 3d принтеров, манипуляторов и прочей роботоподобной техники мне давно интересна. Прикольно ведь, когда куча различных частей, собранных воедино определённым образом, выполняет какую-то полезную для человека деятельность. Неважно, игрушка это, робот-пылесос или марсоход. Принципы построения примерно одинаковы. Отличия лишь в материалах, качестве изготовления и глубине инженерной мысли.
Захотелось мне реализовать наконец-то давнюю задумку - собрать из имеющихся в наличии материалов и электронных компонентов простую модель трёхосевой кинематики. Для понимания можно представить (или загуглить), к примеру, «3д принтер», в основе которого и находится сия конструкция. Существует несколько видов кинематики, но в данном случае будет наиболее похож тип под названием "Prusa" (пруша), также известный как «дрыгостол». Называют его так из-за того, что одна из осей - это сам стол, на котором строится (печатается) модель, и он в процессе печати вынужден постоянно дёргаться туда-сюда. А в некоторых случаях, например при печати высоких моделей, это может быть серьёзным недостатком: модель может оторваться от стола или возможны дефекты печати (отклонения от вертикали), или ещё что-нибудь.
Я всё это говорю лишь на основании того, что видел и читал, самому позаниматься 3д печатью пока не довелось. Но тема эта весьма мне привлекательна, как в плане инженерии, так и в плане повторного использования различных видов пластика, груды которого сейчас, к сожалению, повсюду. Вот, к примеру,
YouTube-канал Brother. Парень придумывает и реализовывает крутые штуки, используя при этом вторсырьё. Моё уважение к таким технарям.
Значит, конструкция моей реализации кинематики примерно такая: стол (ось Y) перемещается по направляющим в горизонтальной плоскости. Каретка (ось Х) тоже перемещается по направляющим в горизонтальной плоскости, но в другом направлении (надеюсь, декартову (прямоугольную) систему координат, так или иначе, все помнят). Каретка представляет собой небольшую платформу, на которой впоследствии размещается какой-нибудь исполнительный механизм: экструдер 3д печати, лазерный резак, фреза и тп. Я же решил сначала установить простой карандаш, дабы отладить перемещение по координатам. Ну и сами направляющие каретки собраны в, так называемый, подвес-раму, который перемещается по вертикали (ось Z). Управление кинематикой будет осуществлять Ардуино.
Вот, собственно, 3д модель сборки этой конструкции:
Моделировал в Solid Works. Занятие тоже весьма увлекательное. Конечно, изначально всё не было так проработано, но примерно что-то похожее было, а остальное в голове, и по ходу дела корректировалось. Все модели есть в репозитории, ссылка на который в конце статьи.
Мне эта конструкция ещё напоминает мостовой кран, который частенько доводилось мне видеть на одной из прошлых работ, а иногда и взаимодействовать с ним. Вот он:
Да, немного обветшалый, но рабочий (возможно, до сих пор). По рельсам, расположенным вдоль стен цеха, катается рама из направляющих (ось Y), по которым, в свою очередь, катается платформа с лебёдками (ось Х). А сами механизмы лебёдок в данном случае можно считать осью Z. Собственно, этот механизм тоже, в какой-то мере поспособствовал моему желанию собрать сию модель. Вот более глобальный вид:
Когда-то много часов я проводил в этом цеху, да и не только, но это уже совсем другая история)… Ладно, продолжаем.
Начал изготовление со стола оси Y. В качестве платформы использовал кусок текстолита - это такой электроизоляционный материал, который применяется в электронных сборках в качестве изолирующих прокладок, элементов корпуса, основы для печатных плат и тп. Из одного такого советского устройства я его когда-то и добыл. На фото это коричневая пластина.
Тут же на ней лежат уже почти готовые опоры будущего стола. Такие вот немного хитрые конструкции из алюминиевой жести толщиной 0.5 мм.
Вообще алюминиевая жесть - очень удобный материал для создания прототипов. Его легко достать, легко обрабатывать и, в то же время, он обеспечивает достаточную жесткость конструкции. При наличии 3д принтера, можно всё это, конечно, напечатать, что значительно сократит времязатраты на изготовление, но у меня такого инструмента пока нет. С другой стороны, я вижу в этом свои преимущества: мозг больше работает, ищет варианты из доступного окружения, придумывает… Творческий процесс, смекалка, полезное занятие.
Прикрученные ролики - это подвижные части, которые контактируют с направляющими. Изготовлены из алюминиевых втулок. Они ещё и в других узлах будут применяться. Да, никаких подшипников, что конечно скажется позже на точности позиционирования, ну да ладно, для эксперимента пойдёт. Ниже представлена сборка стола и настройка под направляющие:
Направляющие-уголки были взяты также из корпусов каких-то советских электронных блоков, как и многое другое, в том числе куча крепёжа. Что сказать, качественно раньше делали технику, и с богатым потенциалом для переиспользования.
Общее основание для всей конструкции, как можно, наверное, догадаться - старая разделочная доска, что подвернулась под руку. Большая площадь, массивная, немного, правда, выгнутая от времени, но это я подкорректировал небольшими вставками под опоры направляющих, дабы они были расположены параллельно и в одной плоскости.
Боковые ролики опор стола я сделал для устранения поперечных люфтов. Подгибая их, добился более-менее чёткого перемещения. Вот как-то так, начало положено.
Далее начал обдумывать крепление шагового двигателя стола и вообще сам привод. Перебрал в голове много вариантов. По-хорошему, здесь бы использовать зубчатый ремень, как в принтерах, но такого у меня нет, поэтому решил попробовать сделать
фрикционную передачу. То есть сцепление вала двигателя с направляющей будет осуществляться за счёт силы трения. Проще говоря, вал двигателя будет прижат к направляющей и, вращаясь, будет её перемещать. В качестве фрикционного материала для вала, первой мыслью было - использовать наждачную бумагу с мелким зерном, которая довольно неплохо цепляется за поверхность алюминиевого профиля. Получилось как-то так:
Шаговый двигатель (далее шаговик) в данном случае довольно популярный 28BYJ-48 на 5V со встроенным редуктором и с драйвером ULN2003 - самое то для простых поделок на Ардуино. И у меня как раз оказалось их несколько штук (дождались малыши своего часа).
Немного о том, что такое шаговый двигатель - это двигатель, у которого несколько обмоток. Если подать на одну из них ток, то вал двигателя зафиксируется в определённом положении. Если подать ток на следующую обмотку, то вал повернётся на определённый угол - шаг, и снова зафиксируется. Если подавать импульсы тока на обмотки в определённой последовательности, то вал будет вращаться (шагать). Таким образом, мы можем следить за положением вала, просто считая импульсы (шаги), и тем самым, задавать определённое положение (координату). В данном случае у шаговика есть редуктор, причём с хорошим передаточным числом: на один оборот выходного вала редуктора двигателю надо совершить около 2048 шагов - весьма неплохая точность позиционирования. А драйвер шагового двигателя - это схема управления обмотками, в данном случае - транзисторная сборка. Ну, как-то так, очень грубо. Кому интересно, инфы в сети много.
Разместить шаговик было решено по центру стола, так сказать, наиболее оптимально. И следовательно, для него будет своя направляющая. Первоначально, был придуман вот такой кронштейн:
Размечаем, сверлим, крепим, получаем:
Испытал получившееся и понял, что оно меня не устраивает. Вал шаговика прижимается только с одной стороны и поэтому, сколько не затягивай регулировочный винт, но он (вал) всё равно иногда буксует. Ну и вообще наждачная бумага не очень подходит для этого. Покумекал немного и придумал другой вариант кронштейна (справа под шаговиком остался небольшой рудимент):
И вот эта реализация мне понравилась куда больше. Теперь направляющая обжимается с двух сторон, валы обрезиненные (использовал кусочки мягкого кембрика) и два регулировочных винта, обеспечивающие плотный контакт. Погонял стол с этим вариантом - гораздо лучше, можно двигаться дальше.
А дальше начал делать каретку с подвесом. Первоначальный вариант был такой:
Два шаговика по бокам с шестернями (для упрощения без зубьев) - это ось Z (вертикаль), а каретка перемещается по направляющей сверху. Начинаем изготовление. Заготовки, рама:
Боковые шаговики с кронштейнами:
Закрепил боковые шаговики и начал согласовывать их работу, ведь мне нужно, чтобы они работали параллельно. Решение «в лоб» - подать общий управляющий сигнал с Ардуино на оба драйвера. Но, что-то, сразу это не заработало: если подключен один драйвер, то всё ок, а как подключаешь второй, то начинаются периодические подклинивания одного из шаговиков или обоих. Как-будто сигнал «проседает», не хватает его на два драйвера. Пробовал разные библиотеки: Stepper, AccelStepper, GyverStepper. Остановился на
последней от Алекса Гайвера. К слову сказать, крутой чел, много всего делает. У него на сайтах и на канале огромное количество полезной информации по Ардуино и разным околотехническим штукам.
А решил я проблему параллельной работы двух шаговиков снижением скорости. Изначально задал довольно высокую - 500 шагов/сек, что для одного нормально, а на два уже нет. Снизил до 450 и вроде нормально стало, продолжил сборку.
Кронштейн шаговика такой же, как и на нижнем столе:
Далее сделал скобу крепления шаговика, собрал стол каретки, ну и всё это воедино:
Погонял эту конструкцию и понял, что надо переделывать. Слишком высоко расположен шаговик, из-за чего появляются периодические «перекосы» при перемещении. Прикинул и переделал, получилось вот так:
Такой вариант уже гораздо лучше работает, его пока и оставил. Далее начал объединение стола и рамы с кареткой:
Вертикальные опоры для оси Z решил сделать из таких же алюминиевых уголков, как и направляющие. А к ним крепятся зубчатые рейки, которые были добыты из старых CD/DVD - приводов (выезжающий лоток). Шестерни на боковых шаговиках оттуда же. Получилось вот так:
Далее, более-менее отцентровал всё это и начал крепление вертикальных опор к основанию. Их крепление позволяет регулировать наклон опоры и расстояние до шестерни. Вот, что получилось:
Время очередных испытаний. Но сразу же выяснилось, что в текущем виде рама с кареткой подниматься не будет. Вернее, будет, но до тех пор, пока шестерни не выйдут из зацепления с рейками. А далее рама стремительно летит вниз, прямо в стол. Одного раза мне было достаточно, чтобы понять необходимость доработки. Решил добавить на кронштейн боковых шаговиков вот такой прижимающий ролик:
Теперь с одной стороны к зубчатой рейке прижимается шестерня, а с другой - этот ролик.
Снова испытания. Теперь рама уже не срывается, но для жёсткости пришлось добавить верхнюю перекладину между вертикальными опорами:
Но тут обнаружилась другая забавная ситуация, названная мною «качели». Когда рама с кареткой поднята над столом, она висит на шестернях, а это как-бы оси вращения. И поэтому рама может свободно раскачиваться на этих осях. Покумекал ещё и решил добавить вот такие боковые упоры от рамы к вертикальной опоре:
Собственно, они обеспечивают и блокировку рамы от раскачивания, и прижим шестерён к рейке. Поэтому те прижимные ролики, что я делал ранее, уже не нужны. Вот теперь нормуль:
Но не совсем). Под нагрузкой снова появились периодические подклинивания шаговиков. Опускается нормально, а вот на подъём - тяжело. Чуть подтолкнёшь на старте и дальше уже нормально тянет. Снизил ещё скорость до 300 шагов/сек и проблема пропала. До конца пока не понял причину, но подразумеваю, что это связано с частотой импульсов, подаваемых на обмотки двигателя. Чем выше задаю скорость, тем выше частота. И возможно, при чрезмерно высокой частоте, ток в обмотке не успевает создать достаточную для поворота вала ЭДС (электродвижущую силу). Отсюда и эти подклинивания. Не знаю, может и бред, конечно, а может и нет). Когда-нибудь разберусь с этим, а пока продолжаю.
С механической частью пока всё. Далее нужно реализовать управление всем этим механизмом - время кодинга. До этого прошивка была простая: подключается драйвер одной оси и при помощи двух кнопок можно гонять туда-сюда движок. Теперь же решил сделать так. Два режима: калибровка и работа. Режим устанавливается двухпозиционным тумблером.
Режим калибровки. Можно выбрать конкретную ось (выбор устанавливается трёхпозиционным тумблером), погонять её туда-сюда (также, двумя кнопками) и, при необходимости, задать нулевое положение для этой оси (третья кнопка).
Режим работы. Кнопка установки нуля запускает процесс перемещение всех осей в нулевое положение. Одна из двух других кнопок запускает процесс движения кинематики по заданному массиву точек (координат). Другая кнопка вызывает остановку кинематики, а если она остановлена, то запускает процесс подъёма или опускания каретки (далее поясню, для чего это).
Я сразу описал весь текущий алгоритм, хотя на самом деле всё это дополнялось по ходу. Разбирать сам код здесь не буду, его можно посмотреть в репозирории, где я постарался снабдить всё комментариями. Ссылка на репозиторий будет в конце статьи.
Более-менее отладив прошивку, начал думать, какой исполнительный механизм установить на каретку. Сначала была идея установить лазер из DVD - привода, и сделать гравёр. Но, перекопав имеющиеся старые приводы, не нашел подходящего лазерного диода - все оказались довольно слабыми. Тогда не стал заморачиваться и просто решил пока закрепить карандаш.
Процесс изготовления крепления:
Карандаш зажимается хомутом, а хомут через подвижное соединение крепится к опоре шаговика. Подвижность необходима для того, чтобы прижимать карандаш к поверхности стола с определённым усилием, которое обеспечивает небольшая пружина. Кусок пластиковой трубки подходящего диаметра является направляющей для карандаша.
Для этого я и сделал в прошивке возможность поднимать и опускать каретку по нажатию кнопки. В нижнем положения каретки (как правило, это ноль оси Z) карандаш прижат к поверхности стола. В верхнем положении - поднят на определенное количество шагов. Текущее положение каретки контролируется прошивкой. Как-то так. Вот что получилось:
Потом ещё добавил накладку на стол оси Y и начал испытания.
И тут обнаружился очередной недостаток (но не фатальный) - погрешность во время движения по оси Х. При смене направления движения, каретка слегка наклоняется в сторону нового движения и далее уже перемещается нормально. Но вот этого «слегка» достаточно, чтобы пропустить около полусотни шагов.
И это всё из-за того, что шаговик каретки расположен сверху. Хоть я и опустил его немного, но всё-таки лучше, чтобы он находился вообще под платформой, как у стола оси Y. Тогда он своим весом прижимает платформу к направляющим и никаких наклонов уже нет. Но такими глобальными переделками на тот момент мне заниматься совсем не хотелось, поэтому решил добавить этакий костыль в виде «ушей» с роликами на кронштейн шаговика каретки:
Эти «уши» упираются в направляющую и тем самым уменьшают наклон каретки.
Но полностью избавиться от наклона всё равно не удалось, поэтому реализовал программную коррекцию этой погрешности. Суть её в следующем. Запоминается последнее направление движения каретки. Далее, перед перемещением к новой координате выполняется проверка. Если направление движения к новой координате совпадает с последним направлением движения каретки, то коррекция не нужна (погрешности в этом случае не будет). А если направления не совпадают, то к значению новой координаты добавляется величина коррекции, которая задаётся константой в разделе конфигурации. Вот, как-то так.
Таким образом, мне удалось избавиться от погрешности практически полностью, что для такой реализации кинематики, как мне кажется, весьма неплохо.
Далее продолжал испытания. Рисовал разные фигуры, вспоминал школьную геометрию и алгебру. Прикольное занятие, кстати. Вот если бы в школе оно так преподавалось. Тут ты понимаешь необходимость, зачем тебе нужна конкретная формула, и видишь на практике результат её применения. Очень занимательно.
В процессе испытаний обнаружился ещё один баг, устранение которого было для меня также довольно интересным. Баг этот проявился, когда возникла необходимость синхронной работы осей X и Y. То есть, если рисовать прямоугольник, то проблем нет, так как в этом случае оси работают по очереди. А вот если нужно провести наклонную линию, то есть одновременно задействовать обе оси, то тут нежданчик. Та ось, смещение по которой меньше, раньше завершает свою работу и останавливается. А вторая ось в этот момент ещё не отработала и в итоге линия как бы «ломается». Вот как это примерно выглядит (стрелками показаны направления движения каретки):
Поразмышляв некоторое время, я всё-таки догадался, как решить эту проблему. И решение, как это часто бывает, оказалось довольно простым. Нужно перед запуском движения к очередной координате, подкорректировать скорость одного из шаговиков. Алгоритм следующий. Сначала задаём обоим шаговикам максимально возможную скорость, которая прописывается в конфигурации. Далее определяем расстояние, на которое необходимо сместиться по каждой из осей (разница между текущей и новой позицией). Выбираем из них наибольшее значение и вычисляем время, необходимое для преодоления этого расстояния (расстояние делим на скорость). Затем, вычисляем под это время скорость движения по другой оси, то есть замедляем её настолько, чтобы она работала синхронно с первой (расстояние делим на время). Ну и задаём полученное значение скорости шаговику этой оси. Школьная физика в действии).
В общем, много ещё разных интересных моментов было в процессе конструирования, кодинга и отладки. Интересующиеся могут полистать прошивку, почитать комментарии, посмеяться. Наверняка многие моменты я реализовал неправильно или неэффективно. Но с другой стороны - это же хобби-проект, чистое творчество (как и то, что я сейчас пишу), так чего докапываться).
Вот ещё несколько фото текущего состояния:
На последнем видно всю электронику (кроме движков). Четыре маленькие платы - это драйвера шаговиков. Два тумблера: один переключает режимы работы, другой - оси в режиме калибровки. На макетной плате (по центру) две кнопки (должно быть три, но не нашлось свободной, поэтому третья - это жёлтый провод справа), несколько резисторов на 10 кОм и разная коммутация. Резисторы нужны для кнопок и тумблеров, чтобы контроллер Ардуино имел стабильный сигнал низкого уровня (логический ноль) в тот момент, когда кнопки не нажаты, а тумблеры в положении ВЫКЛ. Если же у него не будет этой стабильности, то он будет глючить (помехи, неопределённость). Ну и синяя плата сверху, к которой идёт куча проводов - это и есть мозг сего агрегата - Arduino UNO.
Схема коммутации всей электроники:
Ну, вот и подошёл я наконец-то к завершению сего повествования. Хотя, процесс построения занял немало времени (примерно полтора месяца), но я ничуть не жалею об этом. Узнал много нового, применил на практике некоторые, в том числе школьные знания (предварительно их вспомнив), а главное - получил кучу положительной энергии. Мне просто в кайф заниматься такими проектами.
Спасибо за внимание и время, уделённое на чтение этой публикации. Надеюсь, что оно было потрачено вами не зря.
Краткий обзор и демонстрация работы:
Click to view
Полезные ссылки:
Репозиторий с прошивкой, 3d-моделями, схемой YouTube-канал Brother (3d печать, самоделки…) Библиотека для работы с шаговым двигателем от Алекса Гайвера