Фотополимерный 3d принтер своими руками пошаговая инструкция

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

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

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

Устройство 3D-принтера, его разновидности и принцип работы. Создание 3D-модели и ее печать

Два пути сборки 3D-принтера своими руками. Плюсы и минусы самостоятельной сборки

Пожалуй, стоит начать с того, что самодельный принтер — это де-факто тот же самый 3D-принтер, что можно приобрести в готовом виде. Само по себе устройство и принцип работы абсолютно идентичны, поэтому единственное, что может их различать — индивидуальность сборки самодельного принтера и отличие конкретных комплектующих.

Есть два пути сборки 3D-принтера своими руками:

  1. С использованием укомплектованного набора для сборки

  2. Полностью самостоятельная сборка — усложненный вариант без инструкции и с большей ответственностью 

Стоит понимать, что при одинаковом процессе сборки и полученном опыте в первом случае вы почти стопроцентно и без потери нервов на выходе получите работоспособный и приличный принтер. 

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

Теперь перейдём ближе к теме и посмотрим, какие конкретно плюсы и минусы есть у самодельного принтера.

Плюсы

Более низкая стоимость в сравнении с готовыми вариантами

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

Цены на 3D-принтеры начинаются с 12 тыс. рублей, и в первых рядах наиболее выгодных позиций стоят именно наборы для сборки.

Кстати, ознакомиться с такими комплектами на нашем сайте можно здесь: Наборы для сборки

Стоит понимать, что речь идёт о полностью укомплектованных наборах. Конечно, при самостоятельном поиске комплектующих можно даже уложиться в бюджет до 10 тыс. рублей, однако насколько это будет оправдано — большой вопрос. Посудите сами: оптовые цены на детали для массового производства в любом случае ниже розничных экземпляров, поэтому основная накрутка денег происходит за сборку 3D-принтера. В готовых наборах эта накрутка будет минимальна по понятным причинам, а вот при экономии средств велик шанс покупки либо неподходящих компонентов, либо вовсе негодных для сборки.

Возможность кастомизации

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

Ценный опыт и знания

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

Теперь перейдём к минусам.

Минусы

Процесс сборки

Да, никто и не говорит, что сборка 3D-принтера своими руками займет часик-другой. Вот только тут рассмотрение минуса кардинально разнится в зависимости от выбранного вами пути сборки: если вы выбрали набор, то особых трудностей возникнуть не может. Все детали заранее укомплектованы и подогнаны друг под друга, а сам комплект неизменно входит инструкция по сборке и прилагается электронный носитель для прошивки принтера. Прямо-таки прокаченный конструктор!

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

Теперь вернемся к сути минуса. Возможно, придётся просидеть не один вечер за деталями, чтобы качественно и без косяков собрать рабочий 3D-принтер самому. С другой стороны, если человеку некогда этим заниматься, он бы изначально не рассматривал вариант со сборкой 3D-принтера своими руками. Поэтому если вы из тех, кто не боится этого дела — вам можно только позавидовать, ведь этот процесс уж точно подарит непередаваемые ощущения и опыт. А как потом будет приятно наблюдать за работой собственноручно собранного устройства!

Настройка принтера

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

Выбор прототипа 3D-принтера для сборки своими руками

Кинематика

Наиболее распространены в использовании филаментные и фотополимерные принтеры, однако в подавляющем большинстве случаев для сборки принтера своими руками выбираются FDM-принтеры, использующие в печати расплавленный пластик (филамент). Поэтому и рассматривать для сборки будем именно FDM-принтер.

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

Теперь по конструкции. По большему счету все принтеры различаются за счёт кинематики движения. Это может быть кинематика H-bot, CoreXY, Delta, конструкции с подвижным столом (Prusa, Felix, Cube) и др. Однако наиболее распространенной, в частности, для самостоятельной сборки, является кинематика 3D-принтера типа Mendel. Ее мы и рассмотрим.

Суть данной конструкции в следующем: по оси Y с помощью зубчатых ремней и шаговых моторов перемещается стол для печати. По оси Z с помощью винтовых направляющих перемещается рама, внутри которой находится механизм перемещения экструдера по оси X и, собственно, сам экструдер. Таким образом, слаженная работа всех вышеперечисленных узлов и приводит в действие процесс печати (изображение ниже для наглядности).

1.png

Принтер на фото: Anycubic Mega-S

Для самостоятельной сборки можно выбрать в качестве прототипа принтеры типа Mendel или Prusa, информации по которым вполне достаточно в различных источниках в Интернете.

2.png


Принтер типа Mendel

Электронная база принтера

На данный момент есть множество разнообразных способов снабдить принтер электронными “мозгами”, однако наиболее распространённый вариант это использовать плату Arduino (в частности, Arduino Mega 2560), установленную на специальный “шилд” (что-то вроде материнской платы, только для 3D-принтера) вкупе с драйверами мотором и др.

3.png


Arduino Mega 2560

Для прошивки понадобятся среды Arduino IDE и Marlin (последняя и является по сути конституцией принтера, задающей правила его работы). Для дальнейшей настройки удобно использовать программу Pronterface (о ней поговорим ближе к концу статьи).

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

Итак, предположим, вы выбрали мастер-модель и определились с прошивкой. Теперь перейдем к конструкции принтера.

Детали самодельного 3D-принтера. Приобретение запчастей для сборки принтера своими руками

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

Однако даже при выборе готового комплекта не будет лишним прочесть этот пункт для общего развития в теме. Итак, приступим:

Корпус (рама, каркас)

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

4.jpg

Пример самодельного корпуса для 3D-принтера

5.png


А вот и пример рамы из фанеры

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

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

Приобрести шпильки можно практически в любом строительном магазине или рынке.

6.jpg


Рама принтера, собранная целиком из шпилек

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

Реализация кинематики

В этот список входят:

  1. Шаговые двигатели (моторчики)

  2. Зубчатые ремни

  3. Шестеренки, колесики и т.п.

  4. Направляющие и др.

8.jpg


Слева — шаговый мотор, справа — моток зубчатого ремня

Электрика принтера

9.jpg

  1. Платы управления током и всеми узлами 3D-принтера, использующими ток, драйвера моторов

  2. Панель управления принтером

  3. Провода, кабели и др.

  4. 10.png

  5. Стоп-энды (концевые выключатели) — концевые датчики касания, нужны для определения конечного положения двигательных элементов принтера по осям)

Также вне экструдера могут использоваться вентиляторы охлаждения, блоки аварийного питания и прочие обвесы, однако это всё не обязательно. А вот что обязательно, так это кабель питания самого 3D-принтера :)

Детали экструдера

Половину составляющих экструдера можно причислить к 1 или 2 пункту, однако для разбора устройства экструдера рассмотрим их отдельно:

  1. Основа экструдера. Можно покупать детали для основы отдельно, однако для примера возьмем уже собранный вариант:

  2. 11.png

  3. Шаговый мотор и зубчатые колеса. Мотор приводит в движение колесики, которые, за счёт сцепления зубьев с пластиковой нитью, протянутой в специальное отверстие в экструдере, проталкивают ее к нагревательному элементу и далее, через сопло — наружу.

  4. 12.png

  5. Нагревательный элемент. В названии кроется функционал — термоэлемент разогревает пластик и приводит его в расплавленное состояние.

  6. 13.png

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

  8. 14.png

Стол для печати

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

16.png

Итак, с деталями для сборки 3D-принтера своими руками мы разобрались. 

Большинство из комплектующих на нашем сайте можно найти по этой ссылке: Запчасти для 3D-принтера

Теперь же перейдём к самому процессу сборки.

Сборка 3D-принтера своими руками

Сборка принтера с использованием готового комплекта составляющих

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

Сборка 3D-принтера из разных комплектующих

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

  1. Итак, первый этап — сборка корпуса. Соединяем воедино раму, шпильки и крепежные элементы согласно схеме. Болтики, гайки, шурупы и стяжки — в помощь.

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

  3. Основа принтера готова. Устанавливаем стол для печати на его законное место и закрепляем.

  4. Теперь черед электроники. Согласно чертежу или изображению помещаем на место платы, ставим концевые выключатели (датчики) и закрепляем винтами. Тоже самое и с экструдером — собираем воедино термоэлемент, зубчатые колеса и шаговый двигатель и прикрепляем вентиляторы.

  5. Пора задуматься о проводке. Подключаем соответствующие кабели в нужные разъемы, если нужна пайка — паяльник в помощь. Главное — не спешить: если изначально неразумно разместить провода, то чтобы потом разобраться в получившейся “паутине” можно потратить много времени, а это совершенно ни к чему.

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

Запуск и калибровка 3D-принтера

Теперь нужно вдохнуть жизнь в пока что неподвижный механизм. Для этого вспоминаем то, что мы обговаривали в пункте 2.2: Arduino IDE и Marlin. Если вы собираете принтер полностью самостоятельно, то информацию по прошивке придется поискать на соответствующих интернет-ресурсах.

Теперь, как мы и говорили, для настройки и работы с 3D-принтером будем использовать программу Pronterface.

17.png


Внешний вид программы Pronterface

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

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

Итог 

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

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

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

Спасибо вам за прочтение статьи. Успехов на поприще 3D-печати!

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

37

Друзья, привет!

Продолжаем собирать Ultimaker.

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

Общий план претерпел небольшие изменения.

1. Вводный. Приобретение всего необходимого.
2. Сборка принтера. Часть первая. Корпус и механика.
3. Сборка принтера. Часть вторая. Электроника.
3.1. Дополнительные фотографии.

3.2. Подключение электроники

4. Прошивка и настройка принтера – Marlin.

5. Прошивка и настройка принтера — Repetier-Firmware.

И так что же я сделал? но не сфотографировал и либо начну следующий пост с этих фотографий либо сделаю дополнение к этому посту:

1. Собрал Е3Д согласно инструкции от них же

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

2. Проложил 4 провода длинной 1,5 м сечением 0,22 кв.мм. от печатной головы. Охлаждение печатной головы и печатаемой модели.

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

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

4. Фторопластовую трубку (боуден) длинной 70 см проложил от печатной головы экструдеру.

5. окультурил изолентой соеденив провода в оплетке и боуден трубку.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

6. по чертежу (печатаем со 100% масштабом) вырезаем из алюминиевой банки экран, сгибаем и приклеиваем к обдуву печатаемой модели.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

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

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 3.1.

Часть 3.1. Дополнительные фотографии. >> http://3dtoday.ru/blogs/plastmaska/collect-a-3d-printer-with-your-hands-step-by-step-instructions-part-31/Часть 3.2. Подключение электроники. >> http://3dtoday.ru/blogs/plastmaska/collect-a-3d-printer-with-your-hands-step-by-step-instructions-part-32/Часть 4. Установка и настройка прошивки Marlin. >> http://3dtoday.ru/blogs/plastmaska/collect-a-3d-printer-with-your-hands-step-by-step-instructions-part-4/Часть 5. Обновления и дополнения. >> http://3dtoday.ru/blogs/plastmaska/small-update-ultimaker/Просьба поддержать данный проект в соц.сетях. Нужен репост статьи!

На всякий случай я в контакте.

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

37

Комментарии к статье

Еще больше интересных статей

Стабильный подогрев фотополимера при печати

20

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

Большую часть времени печатаю инженерными фотополимерами, имеющими высокую вязкость: (POM-like и Con…

Причины разрывов, отрывов, разломов и прочих (де)ламинарий в фотополимерной печати

Vicinext

Идет загрузка
Загрузка

21.04.2023

2519

19

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

Как и все, я не мог не столкнуться с проблемами расслоений, разрывов и образования удивительных хлоп…

Собираем 3D-принтер своими руками. Пошаговая инструкция. Часть 1.

198

Подпишитесь на автора

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Подписаться

Всем привет!

Как уже анонсировал Серега, я начинаю публиковать цикл статей по сборк…

Читайте в блогах

Время на прочтение
16 мин

Количество просмотров 4.6K

image

… или как я изобретал собственные велосипеды с преферансами и гейшами на свой вкус — писал с нуля прошивку для фотополимерного принтера. На данный момент прошивка уже вполне работоспособна.

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

Часть 1: 1. Пользовательский интерфейс.
Часть 2: 2. Работа с файловой системой на USB-флэшке. 3. Управление шаговым двигателем для движения платформы.
Часть 3: 4. Вывод изображений слоев на дисплей засветки. 5. Всякая мелочь типа управления засветкой и вентиляторами, загрузки и сохранения настроек и т.п. 6. Дополнительные возможности для комфорта и удобства.

Для лучшего понимания дам очень короткое описание работы фотополимерных LCD 3D-принтеров для тех, кто с ними не знаком:

Короткое объяснение принципа работы большинства ‘бытовых’ фотополимерных принтеров

Главная часть такого принтера — LCD-дисплей высокого разрешения (как правило, это матрица с диагональю 5.5″ и разрешением 2560х1440 (размер пикселя — 47.25 мкм). Под этим дисплеем находится источник УФ с длиной волны 405 нм. Над дисплеем находится ванна с фотополимером, у которой в качестве дна тонкая прозрачная FEP-пленка. В ванну опускается платформа, на которой «выращивается» модель. В начале печати платформа опускается на высоту одного слоя от пленки, на дисплей выводится изображение первого слоя и на заданное время включается УФ-засветка. Засветка, попадая через «открытые» пиксели дисплея и пленку на фотополимер отверждает его, так получается затвердевший слой. Первый слой прилипает к платформе. Затем засветка выключается, платформа приподнимается на высоту следующего слоя, на дисплей выводится изображение этого слоя и включается засветка. Второй слой отверждается, свариваясь с предыдущим слоем. И так повторяется раз за разом, пока не будет напечатана вся модель.

Предыстория

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

Предыстория получилась длинной, поэтому убрал ее под спойлер

Лет 5 назад я заинтересовался 3D-печатью. Не в профессиональном плане, а просто стало любопытно что же это такое, что она может и как работает. Сначала был приобретен FDM-принтер, один из самых бюджетных на тот момент — Anet A8. И в общем-то мне понравилось, учитывая, что чудес от него я не ждал. На нем я до сих пор иногда печатаю что-то утилитарное — какие-нибудь крепления, подставки, корпуса. А затем мне стало интересно пощупать фотополимерную печать с ее потрясающей детализацией, но тогда фотополимерные принтеры назвать бюджетными было никак нельзя. И вот пару лет назад я все-таки созрел на покупку одного из них — Anycubic Photon S. Уже и цены были не такими высокими, и я смог себе позволить потратить энную сумму просто для удовлетворения любопытства.

Сначала, конечно же, был эффект «вау» — он печатает такие мельчайшие детали, да так аккуратно. Никаких слоев, прыщей и т.п., присущих FDM-принтерам. Область печати, конечно, не ахти — всего примерно 115х65 мм, но фигурки и модельки получаются очень хорошо :) Когда эффект «вау» прошел, я понял, что детализация у него не такая хорошая, какая могла бы быть. После чего я по примеру знакомого его слегка модернизировал. Пришла новая волна «вау» — детализация повысилась в разы. Правда, стали четко видны границы пикселей, но только если рассматривать модель на расстоянии 20-30 см. Кстати, последующая покраска напечатанных моделей оказалась довольно неплохим способом отдохнуть от работы — мозг отдыхает, руки возятся. Результат дарится знакомым как интересный сувенир.

Но по мере освоения принтера я начал замечать недостатки в работе принтера. Нельзя настроить это, сложно изменить то, не работает так как хотелось бы и т.д. В частности, например, мой принтер не умел работать с каталогами на флэшке, не поддерживал кириллические имена файлов, скорость движения платформы в определенных случаях была не той, что бы меня устроила. Я даже дизассемблировал прошивку и начал разбираться с ее внутренностями. Реализовал работу с кириллицей в именах файлов, изменил процесс вывода на интерфейсный экран (ускорил), переделал работу с языками. Но все это было несерьезно, нужно было иметь исходники, чтобы можно было нормально переделать все что хотелось. А исходники никто из производителей почему-то не дает. И вот несколько месяцев назад я узнал, что есть такой набор для фотополимерного принтера от довольно известного в сфере 3D-печати производителя — MKS DLP. В набор входят: сама материнская плата, дисплей засветки с защитным стеклом (5.5″, 2560х1440) и интерфейсный дисплей с сенсорной панелью (3.5″, 480х320). И для этого набора идут открытые исходники и схема — бери и переделывай как угодно! И я приобрел этот набор, рассчитывая изменить в исходниках то, что мне не нравится.

Когда я получил комплект и скачал с гитхаба исходники, приготовившись их слегка модифицировать, у меня случился легкий шок. Ну, во-первых их родная прошивка оказалась в принципе работоспособна, но это и все, что можно сказать о ней хорошего. Недостатков в ней полно и печатать с ней было бы очень не комфортно. Уже на этапе проб родной прошивки у меня начала закрадываться мысль, что модифицировать придется не так уж слегка. А когда я открыл их проект с исходниками… Во-первых, это жуткая мешанина Ардуины и библиотек CMSIS и HAL от ST (плата построена на микроконтроллере STM32F407). Во-вторых, в проект впихнута полная версия Marlin 3D. Кто не знает — Marlin 3D — это проект для управления FDM 3D-принтерами. Он поддерживает работу до 6 шаговыми двигателями, несколькими нагревателями с контролем температуры, кучи концевиков, парсинг G-кода с построением траекторий движения осей и много-много чего еще. Больше 3 МБ исходников. И сюда он был целиком впихнут только ради управления одним шаговым двигателем. Причем это управление было сделано совершенно без заморочек — в текстовой строке формировался G-код движения оси и эта строка передавалась на вход парсера Мерлина. Ну это как если бы взяли целиком автомобиль для того, чтобы использовать одну из его фар для освещения. Вообще создалось впечатление, что производитель взял исходники от своих плат для FDM-принтеров и просто сверху прикостылял код для работы с фотополимерной частью.

Кроме того, там была еще GUI-библиотека в бинарнике, без исходников. И я понял, что проще будет написать свою прошивку с нуля, чем пытаться что-то сделать с родными исходниками.

Итак, что мы имеем:

  • комплект MKS DLP, в который входят: материнская плата, интерфейсный дисплей 3.5″ 480х320 и дисплей засветки 5.5″ 2560х1440
  • родные исходники от производителя
  • схема материнской платы (без названий активных и номиналов пассивных компонентов)

Материнская плата построена на основе микроконтроллера STM32F407. Для управления дисплеем засветки на плате стоит FPGA китайского производителя GW1N-LV4LQ144ES, SDRAM и две микросхемы MIPI-интерфейса SSD2828. Микроконтроллер загоняет в FPGA изображение слоя, FPGA сохраняет его в SDRAM и оттуда рефрешит дисплей через SSD2828. Конфигурацию (прошивку) FPGA производитель, кстати, не предоставляет в исходниках :( Кроме этого, на материнской плате есть:

  • вход питания 12-24 вольта
  • USB A разъем для подключения флэшки/картридера
  • коммутируемые выходы питания для засветки и двух вентиляторов
  • драйвер шагового двигателя A4988 и разъем для подключения двигателя
  • два разъема для подключения концевиков оси Z — верхнего и нижнего
  • разъем для подключения модуля WiFi
  • микросхема FLASH-памяти W25Q64
  • микросхема EEPROM-памяти AT24C16

Интерфейсный дисплей с резистивной тач-панелью подключается плоским 40-пиновым шлейфом. Контроллер дисплея — ILI9488, контроллер тач-панели — HR2046 (аналог TSC2046).

Для инициализации периферии я использовал программу STM32CUBE MX. Но не использовал напрямую полученный из него результат, а вставлял нужные куски в свои исходники. При работе с периферией использовал библиотеки HAL от ST, а там, где нужно было получить максимальную скорость — работал с регистрами напрямую.

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

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

1. Пользовательский интерфейс

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

1.1 Шрифты

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

typedef struct
{
	uint16_t	*width;
	uint8_t		*data;
	uint8_t		height;
	uint16_t	symcount;
} LCDUI_FONT;

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

Например, взять тот же шрифт 5х8. Если битовые данные хранятся по строкам, то для каждой строки получается избыток 3 бита. Или 3 байта на символ:

image

Или шрифт 7х12 с хранением данных по колонкам, тогда получается избыток данных 4 бита на колонку или 3.5 байта на символ:

image

В моей библиотеке битовые данные непрерывны для символа и выравнивание по границе байта идет только в конце символа.

Плюс есть еще одна небольшая хитрость, позволяющая слегка уменьшить хранимый размер шрифта: символ может не иметь битовых данных, а ссылаться на другой символ с таким же начертанием. К примеру, кириллические буквы «А», «В», «Е», «К» и т.д. могут иметь отсылку на латинские буквы с тем же начертанием. Это делается с помощью указания отрицательного значения ширины соответствующего символа в массиве ширин символов. Если там стоит отрицательное значение, значит изображение этого символа берется из символа в позиции (ширина * -1).

Вот процедура нахождения в массиве данных символа:

uint8_t*	_lcdui_GetCharData(char c)
{
	if (c < 32)
		return 0;
	if (c > 126)
		c -= 65;
	c -= 32;
	if (c >= lcdui_current_font->symcount)
		return 0;
	uint16_t c1 = lcdui_current_font->width[c];
	if (c1 & 0x8000)
		c = (c1 & 0x7FFF);
	uint16_t ch = lcdui_current_font->height;
	int32_t i = 0, ptr = 0, bits = 0, line_bits = ch;
	for (i = 0; i < c; i++)
	{
		if (lcdui_current_font->width[i] & 0x8000)
			continue;
		bits = lcdui_current_font->width[i] * line_bits;
		ptr += bits >> 3;
		if (bits & 0x07)
			ptr++;
	}

	return &(lcdui_current_font->data[ptr]);
}

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

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

Например, на фото ниже голубой текст и верхняя белая строка отрисованы моей библиотекой, а белая нижняя — стандартной ардуино-подобной библиотекой из родных исходников:

image

Голубой текст отрисовался в несколько раз быстрее, чем нижняя белая строка.

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

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

1.2 Вывод изображений интерфейса

Для пользовательского интерфейса понадобится выводить на дисплей изображения — фон, иконки, кнопки. Сначала я решил сильно не заморачиваться и хранить все изображения в формате .bmp в 8-мегабайтной флэш-памяти, имеющейся на плате. И даже уже написал для этого процедуру. Файл сохраняется в 16-битном формате (R5 G6 B5) с прямым или обратным порядком строк, и может уже быть напрямую скормленным процедуре отрисовки. Но размер фоновой картинки размером 480х320 выходит более 300 Кбайт. С учетом того, что часть этой флэш-памяти будет отводиться под обновление прошивки, 30 фоновых изображений займут всю память. Вроде и немало, но все же меньше, чем хотелось бы иметь на всякий случай. А ведь должны быть еще кнопки, иконки и т.п. Поэтому было решено преобразовывать изображения в какой-то сжатый формат.

Со сжатием вариантов немного — все более-менее хорошо сжимающие изображения алгоритмы требуют или прилично оперативки (по меркам микроконтроллера) или прилично времени на разжатие. Картинки же должны выводиться, разжимаясь на лету, и желательно чтобы картинка при выводе не уподоблялась ползущему прогресс-бару. Поэтому я остановился на RLE-сжатии — 1 байт кодирует количество повторов, а два следующих за ним — цвет. Для этого так же была написана утилита, преобразующая файлы .bmp в сжатые таким образом изображения. Заголовок состоит всего из 4 байт — по 2 байта на ширину и высоту изображения. В среднем фоновые изображения сжимаются таким способом в 5-7 раз, сильно зависит от размера одноцветных участков (чего и следовало ожидать). Например вот такая картинка сжалась с исходных 307 КБ до 74 КБ:

image

А вот такая — до 23 КБ с тех же 307:


Да, кстати, дизайнер из меня еще более фиговый, чем программист…

Меня такой результат устроил. Декодирование и вывод изображений происходит очень быстро — примерно 40 миллисекунд на полное фоновое изображение. Так что на таком варианте я и остановился.

И, кстати, переход на режим DMA для вывода данных в дисплей не дал почти никакого ускорения вывода. Дисплей подключен по внешней 16-битной шине данных как внешняя память, но вот его тайминги довольно печальны, что и сводит почти на нет преимущества DMA-вывода перед попиксельным выводом «вручную».

1.3 Основа GUI

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

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

Вот вкратце ее принцип работы

Изначально всем кнопкам присваивается статус «СВОБОДНА». По прерыванию таймера вызывается процесс опроса кнопок (100-150 раз в секунду). Если кнопка оказывается нажата, то ей присваивается статус «ПРЕДНАЖАТА». При следующем опросе если она все еще остается нажатой, ее счетчик увеличивается на единицу. Если оказывается, что счетчик достиг определенного значения, то кнопке присваивается статус «НАЖАТА», а счетчик обнуляется. Если при очередном опросе кнопка оказалась не нажатой, имея статус «ПРЕДНАЖАТА», то ее статус меняется на «СВОБОДНА». Когда оказывается отпущенной кнопка со статусом «НАЖАТА», ей дается статус «ОТПУЩЕНА». Основная программа просто опрашивает когда может статус кнопок и если у какой-то кнопки статус оказывается «НАЖАТА» или «ОТПУЩЕНА», то вызывается процедура обработки нажатия или отпускания этой кнопки. Тут реализуется и программный фильтр дребезга контактов (статус «ПРЕДНАЖАТА»), и срабатывание нажатия кнопки даже если основная программа во время нажатия была чем-то занята. Кроме того, там еще есть статусы и для длительного нажатия, и для повторяющегося ввода при длительном нажатии.

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

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

В конечном итоге я пришел к такой схеме: интерфейс состоит из двух основных типов элементов — экранов и кнопок.

Экран — это своего рода полноэкранный контейнер для кнопок. У экрана есть следующие свойства:

  • фоновое изображение
  • цвет фона
  • способ отрисовки фона — заливка фоновым цветом или вывод изображения
  • текст заголовка
  • цвет текста заголовка
  • шрифт текста заголовка
  • указатель на родительский экран (в который нужно вернуться при закрытии этого)
  • массив указателей на кнопки
  • указатель на процедуру обработки событий (вызывается периодически в основном цикле программы)
  • указатель на процедуру отрисовки экрана

Структура экрана

typedef struct
{
	void				*addparameter;

	char				*bgimagename;
	
	void				*prevscreen;
	
	LNG_STRING_ID		name;
	TG_RECT				nameposition;
	TG_TEXTOPTIONS		nameoptions;
	
	uint8_t				btns_count;
	TG_BUTTON			*buttons;
	
	LCDUI_FONT_TYPE		font;
	LCDUI_FONT_TYPE		namefont;
	uint16_t			textcolor;
	uint16_t			nametextcolor;
	uint16_t			backcolor;

	struct {
		paintfunc		_callpaint;	// repaint screen
		processfunc		_process;	// screen process handling (check for changes, touch pressed, etc)
	} funcs;
} TG_SCREEN;

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

Свойства кнопок:

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

Структура кнопки

typedef struct
{
	void				*addparameter;
	
	uint8_t				button_id;
	

	int8_t				group_id;		// for swithed options buttons, >0 - single selection from group (select), <0 - multiple selection (switch)
	
	TG_RECT				position;
	
	void				*parentscreen;
	void				*childscreen;

	char				*bgimagename_en;
	char				*bgimagename_press;
	char				*bgimagename_dis;
	char				*bgimagename_act;	// for swithed options buttons

	LNG_STRING_ID		text;
	TG_RECT				textposition;
	LCDUI_FONT_TYPE		font;
	uint16_t			textcolor_en;
	uint16_t			textcolor_press;
	uint16_t			textcolor_dis;
	uint16_t			textcolor_act;	// for swithed options buttons
	uint16_t			backcolor_en;
	uint16_t			backcolor_press;
	uint16_t			backcolor_dis;
	uint16_t			backcolor_act;	// for swithed options buttons
	
	struct {
		uint8_t				active:1;		// for swithed options buttons
		uint8_t				needrepaint:1;
		uint8_t				pressed:1;
		uint8_t				disabled:1;
		uint8_t				repaintonpress:1;		// repaint or not when pressed - for indicate pressed state
		BGPAINT_TYPE		bgpaint:2;
	} options;
	
	TG_TEXTOPTIONS	textoptions;

	struct {
		paintfunc		_call_paint;	// repaint button
		pressfunc		_call_press;	// touch events handling
		pressfunc		_call_longpress;	// touch events handling
		processfunc		_call_process;	// periodical processing (for example text value refresh)
	} funcs;
} TG_BUTTON;

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

А вот на что не хватило возможностей этой схемы — так это на модальные окна с сообщениями или вопросами (типа MessageBox в Windows API), поэтому для них я сделал отдельный тип экранов. Без фоновых изображений и с размером, определяющимся заголовком или самим сообщением — что окажется больше. Эти сообщения могут быть созданы в четырех вариантах — с кнопками «Да/Нет», с кнопками «Ок/Отмена», с одной кнопкой «Ок» или вообще без кнопок (типа «Подождите, идет загрузка данных…»).

Структура окна сообщений

typedef struct
{
	MSGBOXTYPE			type;
	
	void				*prevscreen;
	
	char				caption[128];
	char				text[512];
	TG_RECT				boxpos;
	
	uint8_t				btns_count;
	TG_BUTTON			buttons[TG_BTN_CNT_MSGBOX];
	
	uint16_t			caption_height;
	
	LCDUI_FONT_TYPE		font_caption;
	LCDUI_FONT_TYPE		font_text;
	uint16_t			text_color;
	uint16_t			box_backcolor;
	uint16_t			capt_textcolor;
	uint16_t			capt_backcolor;
} TG_MSGBOX;

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

1.4 Мультиязычность

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

	char *mshortname = LANG_GetString(LSTR_SHORT_JANUARY);

При изменении языка происходит просто изменение указателя с массива текстов на старом языке на массив с текстами на новом языке:

void		LANG_SetLanguage(uint8_t lang)
{
	lngCurrent = lngLanguages[lang].strings;
	
	return;
}

Все тексты в исходниках — в кодировке UTF-8. С этими кодировками тоже пришлось повозиться. Тексты — в UTF-8, кириллица файлов — в Unicode-16, некоторые строки — в обычном ANSI. Тянуть в прошивку целый набор библиотек для поддержки многобайтовых кодировок не хотелось, поэтому было написано несколько функций для преобразований из кодировки в кодировку и для операций с текстами в разных кодировках, например, добавить к концу строки Unicode16 строку в UTF-8.
Добавление нового языка теперь свелось к созданию таблицы текстов на нем и к изменению значения константы LNG_LANGS_COUNT. Правда, остается вопрос со шрифтами, если в новом языке используются символы помимо кириллицы и латинницы… Сейчас я поддерживаю в исходниках русский и гуглопереведенный английский.

1.5 Хранение изображений и прочих ресурсов

Для хранения больших ресурсов на плате имеется SPI-флэш на 8 мегабайт W25Q64. Изначально я хотел поступить как всегда — задать смещение для каждого ресурса внутри флэши и сохранять их туда как просто бинарные данные. Но потом понял, что проблемы с таким способом мне гарантированно обеспечены как только количество сохраняемых ресурсов перевалит за пару десятков и мне захочется изменить, например, какую-то картинку, которая сохранена шестой по порядку. Если ее размер увеличится, то придется сдвигать адреса всех следующих ресурсов и перезаписывать их заново. Или оставлять после каждого ресурса запасное пространство неизвестного размера — кто его знает как может измениться какой-то из ресурсов. Да в гробу я видал эту возню :) Поэтому я плюнул и организовал на этой флэши файловую систему. К тому времени у меня уже работала файловая система для USB на основе библиотеки FatFS, так что мне было достаточно просто написать отдельные низкоуровневые функции чтения/записи секторов. Одно только меня слегка расстроило — размер стираемого сектора в этой микросхеме аж целых 4 КБ. Это во-первых приводит к тому, что файлы будут занимать место порциями по 4 КБ (записал файл 200 байт — он занял 4 КБ флэши), а во-вторых буфер в структуре каждого файлового указателя будет отъедать те же 4 КБ оперативки, которой в микроконтроллере не так уж много — 192 КБ. Можно было бы, конечно, извратиться и написать низкоуровневые функции так, чтобы они могли писать и читать и меньшими порциями, рапортуя о размере сектора, например, 512 байт. Но это замедлило бы работу с флэш, так что оставил размер сектора 4 КБ. Так что обращение к любому ресурсу осуществляется просто по имени его файла, что оказалось очень удобным. На данный момент, например, количество хранимых ресурсов перевалило уже за 90. И их обновление я сделал максимально простым — обновляемые (или новые) ресурсы записываются на USB-флэшку в определенный каталог, флэшка вставляется в плату, плата перезагружается в сервисный режим (во время включения или перезагрузки нажать и держать правый верхний угол дисплея) и автоматически копирует все найденные в этом каталоге файлы с USB-флэшки в SPI-флэш.

Продолжение следует…

По интерфейсу вышла, пожалуй, самая объемная часть. Если эта статья окажется интересной сообществу, то во вторую часть постараюсь вместить все остальное.

Ну и буду рад вопросам и замечаниям.

Часть 1: 1. Пользовательский интерфейс.
Часть 2: 2. Работа с файловой системой на USB-флэшке. 3. Управление шаговым двигателем для движения платформы.
Часть 3: 4. Вывод изображений слоев на дисплей засветки. 5. Всякая мелочь типа управления засветкой и вентиляторами, загрузки и сохранения настроек и т.п. 6. Дополнительные возможности для комфорта и удобства.

Ссылки

Комплект MKS DLP на Алиэкспресс
Исходники оригинальной прошивки от производителя на Гитхабе
Схемы от производителя двух версий платы на Гитхабе
Мои исходники на Гитхабе

Фотополимерный 3D принтер DLP «Spirit of scale building»

PDV

Начитался статей в интернете о самодельных фотополимерных принтерах и решил заняться постройкой этого чуда…
Вот эта статья — 3deshnik.ru/forum/viewtopic.php?t=172 внушила уверенность в реальности самостоятельной постройки. Поэтому заказал предложенную в ней электронику, но направляющие и ШВП заказал на свой вкус. Конструкция будет собственной разработки.
Далее буду здесь рассказывать о том что из этого выйдет. Советы и замечания основанные на личном опыте и знаниях приветствуются…!😃

PDV

PDV

Заказал еще пленку на дно ванны с тефлоновым покрытием.
ru.aliexpress.com/item/…/32784841969.html
Вроде все из заказного… Остальное из подручных средств и материалов, кроме проектора разумеется. Проектор буду покупать после того как заработает механика.

hitman

Проектор буду покупать после того как заработает механика.

Уже есть на примете?

PDV

Есть пока только понимание бюджета на это устройство — 50т.р.
Как я понял, есть 3 важные, основные характеристики проектора, кроме того что он обязательно должен быть DLP.

  1. Разрешение матрицы — тут прямая зависимость с качеством печати, чем выше тем лучше. Я планирую 1920х1080.
  2. Яркость — тут понятно, что от этого зависит время экспозиции, чем короче, тем быстрее идет процесс печати. Должно быть не менее 3000 Ansi lm.
  3. Контрастность — от этого параметра тоже зависит качество печати, такая характеристика, как паразитная засветка, чем контрастность выше тем меньше света проникает туда где он не нужен. должно быть от 10000:1.
    Ну и вот первая модель на вскидку…, — www.ulmart.ru/goods/4145731
    Наверняка можно найти немного дешевле…

PDV

Сегодня получил все платки, собрал пазл и залил прошивку. И… все заработало! Комп увидел устройство, программа начала показывать слайды нарезки.

Все чего не знаешь кажется сложным. Теперь надо подключить ШД и ждать когда приедет ШВП с направляющими. Далее соберу платформу и ванну. Тут я думаю проблем не должно быть.

PDV

Подключил ШД. Вроде все работает как надо…

PDV

Уже есть на примете?

Пока прицелился на этот аппарат — hdmir.ru/multy_med/…/optoma_hd142x
Очень радуют цена и характеристики…

PDV

Почти собрал ось Z из “говна и палок” (кусок гетинакса из гаража, алюминиевый пруток и россыпь железок из “Максидома”). Рабочий ход 230мм. Все работает как надо.

Дальше уперся в отсутствие DLP проектора. Пришло время раскошелиться…

PDV

Соорудил ванну также из товаров строймага. Рабочее окно 170мм на 105мм.

Испытание на герметичность.

PDV

Проектор материализовался…

Сразу начал колотить скворечник…

Примерочная компоновка…

hitman

PDV

Странно, гугель шалит…

…google.com/…/AF1QipP2D4pv0i8EwCb1Mdx-I8o9RtLFvlpq… — сделал новый альбом по этой теме…

ADF

А дно ванны — это просто стекло или с хитростями? Как будет обеспечиваться, чтобы заготовка не прилипла к стеклу?

Прошу простить, если вопросы глупые.

PDV

А дно ванны — это просто стекло или с хитростями? Как будет обеспечиваться, чтобы заготовка не прилипла к стеклу?

Вопрос не в бровь, а в пах…)
Ванна это достаточно сложный механизм, хоть и не выглядит таковым на первый взгляд. Она должна иметь стабильно ровную, максимально прозрачную поверхность и обеспечить мягкий отрыв полимера. Для этого придумано много разных конструкций с магнитами, дополнительными сдвигами позволяющими более менее мягко отрывать полимер от поверхности ванны. Я буду пробовать способ описанный в статье ссылку на которую, давал в первом посте. На дно ванны в нагретом состоянии устанавливается оргстекло, для того чтобы не провисало, когда теплый воздух от проектора повысит его температуру, а на него укладывается (не наклеивается) пленка с тефлоновым покрытием, ссылку на нее я тоже давал. Полимер при отклеивании тянет пленку и отрыв происходит мягко…, а натянутая поверхность основы позволяет пленке принять первоначальное положение. Но — это в теории, мне пока не позволяет это проверить почта России… Пленка уже неделю мотается по городу из одного сортировочного пункта к другому… Ждемс…

PDV

Дождался… С приветом от почты России…

Что делать, теперь ума не приложу… Опять ждать 20 дней и не факт, что не получу тоже самое.

ADF

Черти, слов нет!

Мне как-то липошка с вмятым от удара углом пришла по чопте. Очень расстроился, что там же у них не вспыхнула.

PDV

Вроде наш аналог может прокатить — Фторопласт-4мб называется. Только пока не понимаю, в каких местах эту пленку можно поискать? В интернете все предложения промышленных объемов…

ADF

Попробовать в кипяток окунуть один лист — может обратно отыграет.

Airliner-rc

При очередном заказе попросить продавца положить плёнку между двумя кусками картона, просил так упаковывать декали для стендовых моделек. Все идеально доходило.

PDV

Попробовать в кипяток окунуть один лист — может обратно отыграет.

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

При очередном заказе попросить продавца положить плёнку между двумя кусками картона, просил так упаковывать декали для стендовых моделек. Все идеально доходило.

Теперь конечно и обязательно, но мне казалось что продавец с опытом по умолчанию подумает об этом. Ан нет…

ADF

По опыту, продавцы плевали на просьбы об упаковке. На моей памяти, ни разу никто не упаковывал товар как-то дополнительно — по сравнению с их стандартным способом упаковывания. Если там два листа картона лежало — так они, очень вероятно, всегда эти два листа кладут 😃 Кстати, в случае чего, пара листов картона не помогут. Туда бронепластины толщиной миллиметров по 10 класть надо. И то — одну потеряют, вторую сломают…

PDV

Для экспериментов создал модель для тестов, с расчетом, чтобы не занимала много времени при печати 15х15х5 мм.

Первый результат…

ADF

А можно, если не трудно, фотографию через отверстия? Хочется оценить, как там всё без поддержек получилось.

И да, поздравляю! 😃

PDV

С отверстиями там все более менее нормально, но это самый первый пробник. Печатался на полусобранном принтере на максимальном поле, ближе пока не могу проектор приблизить, так как линзы еще не приехали, а курочить проектор не хочется. По X,Y размер пикселя получился — 83мк, а по Z — 40мк.

Неделю назад я рассказывал о возможностях 3D-печати и том, как именно FDM-технология облегчает нашу жизнь. Статья набрала пусть и немного, но вполне достаточно положительных откликов, чтобы продолжать данную тему, а значит цикл материалов можно считать открытым:)

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

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

Перед тем, как отдать свои кровные

Первое предупреждение — будет непросто. Самостоятельная сборка 3D-принтера требует усидчивости и терпения. Я буду счастлив, если у вас все будет получаться с первого раза, но, по собственному опыту скажу, что без ложки дегтя в 3D-печати не бывает.

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

И дело не совсем в экономии. Лично мне бы очень хотелось, чтобы вы испытали тот восторг, который наступает после печати первой детали на устройстве, которое создано вашими руками.

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

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

Механика

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

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

Корпус

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

Варианты. Чертеж рамы есть в открытом доступе (тут или тут). Дальше остается обратиться в конторы, занимающиеся резкой фанеры, ДСП, акрила или металла.

Из стали 3-4 миллиметра выйдет подороже, потяжелее, но надежнее. Из фанеры 6 – 8 мм дешевле. Есть варианты и из акрила.

Финансовый совет. Готовые варианты рам на AliExpress и Ebay сразу отметайте. Там просят в три-четыре раза большую сумму. Полистайте доски объявлений по месту жительства. Средняя стоимость корпуса из фанеры варьируется в пределах 600 – 1000 рублей. Все, что дороже — от лукавого.

Цена вопроса: 800 рублей (здесь и далее – приблизительная стоимость).

Направляющие (валы)

На что влияет. Плавность хода сопла, ровность слоев.

Варианты. Направляющих для Prusa i3 нужно ровно шесть штук. По две на каждую ось (X, Y, Z). Размеры следующие:

  • 2 x 370мм (ось X)
  • 2 x 350мм (ось Y)
  • 2 x 320мм (ось Z)

Общепринятый стандарт для валов 3D-принтера — 8 мм. И гнаться за 10 или 12 мм смысла нет. Вес головы хотэнда не такой значительный, что бы на расстоянии в 370 мм гнуть вал.

Хотя, если у вас есть лишние деньги, можно извратиться и купить 12 миллиметровые валы. Вот только подшипники и подгонка пластиковых деталей потом выйдет дороговато.

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

К слову, валы можно купить как на AliExpress (тут или тут), так и по месту с тех же досок объявлений. Самый доступный вариант — отправиться на блошиный рынок и найти на разборке принтеров и старой оргтехники (МФУ, сканеры) шесть нормальных валов.

Главное, вооружитесь штангенциркулем. Все валы должны быть строго одного диаметра. Цена за штуку получится в районе 60 – 70 рублей.

Цена вопроса: 420 рублей (вариант блошинного рынка).

Подшипники

На что влияет. Уровень шума, качество печати, ровность слоев и граней детали.

Варианты. И снова все упирается в бюджет. Можно заказать подшипник в блоке (модель SC8UU, например, тут). Можно просто линейный подшипник LM8UU. Можно остановиться на бронзовых или латунных втулках генератора автомобиля. Главное, подобрать нужный размер.

Наконец, можно заказать подшипники у 3D-печатника, у которого будете покупать детали для своего принтера (об этом ниже). Готовые подшипники всех размеров есть тут.

Запомните, для Prusa i3 вам нужны 12 линейных подшипников.

Финансовый совет. Не спешите заказывать подшпиники в Китае. Не факт, что выйдет дешевле. Варианты по 40 – 60 рублей за штуку можно найти и в «родных краях».

Цена вопроса: 600 рублей.

Пластиковые детали

Самое время обратиться к тем, у кого уже есть 3D-принтер. Поищите объявления «3D печать в вашем городе». Обсудите стоимость печати комплекта деталей для Prusa i3.

Как правило, оценивают за грамм печати, но есть и готовые комплекты. Тянуть это добро из Китая нет никакого смысла.

Цена вопроса: около 1000 рублей, но зависит от наглости печатника.

Ремни, шкивы, шпильки и прочая мелочь

Для самостоятельной сборки механики принтера остается совсем немного. По сути, это недорогие детали, рассказывать о которых слишком много не имеет смысла. Поэтому, приведу список.

  • ремень GT2 – служит для перемещения хотэнда и столика вдоль осей X и Y. Выглядит вот так. 2 метра хватит с головой.
  • шкивы GT 2 — внутренний диаметр 5 мм, количество зубьев (как правило) 20. Надеваются на шаговые двигатели (на два) для перемещения ремня GT2. Достаточно двух штук. Выглядят так.
  • шпильки — модные трапецеидальные винты с гайкой не берем. Во-первых, дорого. Во-вторых, бессмысленно. Это не ЧПУ станок. Со скоростями выше попы прыгнуть не получится, поэтому не тратьте деньги. Обычная строительная метровая шпилька диаметром 5 мм для оси Z (разрежем на два) и такая же диаметром 8 мм для закрепления частей корпуса.
  • подшипники — два для связки с ремнем GT2. Будут выполнять роль натяжителей. Желательно, чтобы внешний диаметр подшипника был равен внешнему диаметру шкива в области зубьев. Как вариант, но 50 штук вам не нужно, только два.
  • гайки, болты, шайбы — в магазине крепежа хорошенько запаситесь болтами M3 размером от 10 до 60 миллиметров. Соответственно, гайки (нужны еще и 8-миллиметровые для шпилек корпуса) и шайбы. Приблизительный список список можно найти тут.
  • муфты — будут удерживать шпильки 5 мм по оси Z. Нужно две штуки. Купить можно, например, тут. А можно попросить напечатать 3D-печатника, взяв модель отсюда.

Финансовый совет. Не стремитесь взять самое лучшее. Подходите с умом и проверяйте диаметры. Так, шпильки для Z оптимальны именно 5-миллиметровый. У 8-миллиметровых больший шаг резьбы, что отразиться на качестве печати (будут слишком характерная слоистость).

Гнаться за шкивами для ремня тоже нет смысла. Подойдет обычный подшипник. При покупке включайте фантазию. Вариант «тупо купить по списку» здесь не работает.

Цена вопроса: при большом желании можно легко вписаться в 700 – 800 рублей.

Электроника

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

Шаговые двигатели

Это самая дорогостоящая статья расходов при самостоятельно сборке 3D-принтера. Нужно 5 штук Nema 17. Как правило, беру на 1.7А по току. Их мощности будет предостаточно. Диаметр валов – 5 мм. Присмотреться можно тут.

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

Финансовый совет. И снова блошиный рынок и разборка МФУ, принтеров и плоттеров. Поинтересуйте о ценах на шаговые двигатели. Иногда пять движков Nema 17 можно прикупить за смешные 800 – 900 рублей.

Важно: выбирайте движки так, чтобы у них было одинаковое количество шагов на оборот (например, 200). Двигатели без маркировки брать несколько геморройно, поскольку потом замучаетесь подбирать правильные параметры при настройке ПО.

Плата управления

Эталон для Prusa i3: плата Arduino Mega + модуль расширения Ramps 1.4 (например, такой вариант). Это самый доступный и универсальный вариант для управления принтером.

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

Драйвера шаговых двигателей

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

  • 2 драйвера A4988 для оси Z (вот такие)
  • 1 драйвер A4988 для оси Y
  • 1 драйвер A4988 для оси X
  • 1 драйвер DRV8825 для экструдера (например, такие)

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

Теоретически можно взять и все пять A4988 или комплект из пяти DRV8825. Тут уж решать вам, но один DRV8825 в сборке строго приветствуется.

Совет. Попадете на распродажу, не поленитесь взять парочку драйверов про запас. При первичной сборке есть риск, что один из драйверов обязательно спалите:)

Дисплей

На нем будем следить за состоянием печати и управлять принтером. Настоящая классика — четырехстрочный LCD2004 за 350 рублей.

Совет. Обязательно берите дисплей с шилдом и шлейфом (по ссылке выше как раз такой). Потратите минимум времени на подключение.

Хотэнд и механизм подачи пластика

Именно в этом блоке происходит магия 3D-печати. Тут греется пруток пластика и выдавливается сквозь миниатюрное сопло. Не буду ходить вокруг да около. Проверенный годами вариант — версия хотэнда V6 с кулером, терморезистором 100к, нагревательным элементом, радиатором, тефлоновой трубкой. Например, такой.

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

Столик, пружины, стекло, концевики

Платформа, на которой будет расположена 3D-модель, должна иметь обязательный подогрев. Температуры тут доходят до 100 – 110 градусов по Цельсию в зависимости от типа пластика.

Самый доступный и проверенный временем вариант – MK2 размером 214 х 214 мм. Не забудьте приобрести пружины для столика (нужно 4 штуки). С ними намного легче выставлять уровень сопла.

Сверху столик накрывают обычным стеклом толщиной 3-4 мм. В идеале – зеркалом. Размеры 200 х 200 мм с небольшими скосами по краям для крепежа винтов. Цена вопроса у стекольщика – около 60 рублей, везти из Китая нет смысла.

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

Блок питания

Один из ключевых элементов все электроники – блок питания. Готовый вариант, заточенный на 3D-принтеры, обойдется в 800 – 1200 рублей. Все зависит от мощности блока. Сразу скажу, что 15 А и 12 Вольт для 3D-принтера с двумя экструдерами и одним нагревательным столом будет достаточно.

Финансовый совет. Как вариант, можно задействовать компьютерный БП аналогичной мощности. Б/у вариант обойдется в 200 – 300 рублей, а работать будет также. Единственное, придется немного повозиться с развязкой проводов.

И сколько вышло?

Проведем приблизительные подсчеты. Рассчитываем самый бюджетный вариант. Учтите, что экономия требует затрат времени — придется побегать.

  • Корпус — 800 рублей
  • Валы — 420 рублей
  • Линейные подшипники — 600 рублей
  • Пластиковые детали — 400 рублей
  • Мелочь (подшипники, шкивы, шпильки, ремни) — 700 рублей
  • Двигатели (б/у разборка) — 900 рублей
  • Электроника (столик, плата Arduino + Ramps, 5 драйверов, дисплей, концевики) — 2600 рублей
  • Блок питания — 400 рублей
  • Набор гаек, болтов, шайб — 150 рублей
  • Хотэнд, механизм подачи пластика — 450 рублей
  • Про запас — 580 руб

ИТОГО: 7420 руб + 580 руб (на всякий случай) = 8 000 рублей.

Что ж, я обещал, что мы соберем 3D-принтер за 10 000 рублей. И мы это сделали. Да, придется побегать, поискать и потратить время, но моя задача была доказать, что 3D-печать – не так дорого, как может показаться на первый взгляд.

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

Если чего не сказал – не судите строго. Я готов поделиться опытом и посоветовать максимально эффективные варианты решения той или иной проблемы по 3D-печати. В данном случае, по закупке комплектующих.

Продолжение следует;)

1 Звезд2 Звезды3 Звезды4 Звезды5 Звезд (24 голосов, общий рейтинг: 4.71 из 5)

🤓 Хочешь больше? Подпишись на наш Telegram.

undefined

iPhones.ru


Пришло время закупаться.

  • гаджеты,
  • От редакции,
  • Это интересно

Владимир Кузин avatar

Владимир Кузин

@xakerbox

DIY-техноман. Уверен, что все можно сделать своими руками. Коллайдер не в счет.

Понравилась статья? Поделить с друзьями:
  • Casio ga 2100 инструкция на русском языке
  • Паста для лица очищающая payot инструкция по применению
  • Апизартрон мазь инструкция купить в москве
  • Samsung scx 4100 мануал
  • Долфин для промывания носа детский инструкция по применению отзывы врачей