что такое прошивка marlin
Marlin 2.0.6.1. Эволюция подключения экранов и интерфейсов пользователя.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Способы подключения интерфейса пользователя к 3D-принтерам на основе Marlin 2.0.6.
1. RepRap Arduino Mega Pololu Shield (RAMPS)
Прямое подключение LED 12864-экранов.
Самый древний из способов. Шина состоит из 16-ти управляемых непосредственно с Arduino Mega GPIO и питания. В настоящее время данный способ не используется.
Интерфейс пользователя всем давно знаком
2. RepRap Full Graphic Smart Controller
Для работы необходимо, чтобы LED 12864 поддерживал работу по SPI, например, используя ST7920 контроллер.
Данные передаются по трем пинам SPI-интерфейса, высвободив 13 GPIO. Помимо LED-экрана на модуль выводятся так же энкодер управления, зуммер («пищалка») и SD-карта.
На плате выглядят как два 10-пиновых разъема типа DC10P.
Классический RepRap Full Graphic Smart Controller имеет след. разводку разъемов.
LCDE(SID), LCDRS(CS), LCD4(SCLK) – огрызок SPI-интерфейса для LED 12864.
LCD5, LCD6, LCD7, KILL – по-умолчанию, не используются. Разработчики могут задействовать для своего функционала, например NeoNeoPixel LED.
BTN_ENC, BTN_EN1, BTN_E2 – подключение энкодера.
MISO, SCK, MOSI, SD_CSEL, SD_DET – интерфейс работы с SD-картой по второму SPI.
Подключение RepRap Full Graphic Smart Controller может быть реализовано на RAMPS с помощью переходника.
Интерфейс пользователя не кардинально не отличался от RAMPS.
Все взаимодействие с пользователем вынесено на внешнее устройство. Процессор даже не знает, что у него есть графический интерфейс, SD-карта, Wifi, энкодер и «пищалка». Часто даже концевые выключатели переносятся на внешнее устройство. В качестве такого устройства может выступать RaspberryPi (OrangePi) или Smart TFT-дисплей. Примером такого Smart-дисплея является JZ-TSxx, BTT TFT35 V3.0 в графическом режиме.
Это основной способ подключения TFT-дисплеев к материнским платам на 8-битном процессоре. С него снимаются все функции обработки пользовательского интерфейса, но накладываются серьезные требования в работе UART, его скорости и устойчивости работы при постоянном потоке данных. Данный способ будет хорошо работать на скоростях UART 230400, 250000 с относительно небольшими размерами буферов команд и принимаемых по UART данных (MAX_CMD_SIZE, RX_BUFFER_SIZE). Однако, некоторые платы/CPU по непонятным причинам не могут устойчиво работать на таких скоростях, максимум 115200. Тогда для организации стабильного потока команд используется максимальное увеличение буферов, контроль переполнения буфера SERIAL_XON_XOFF и ADVANCED_OK. Последние должны поддерживаться со стороны Smart TFT-дисплея. В Octoprint для RaspberryPi (OrangePi) их поддержка реализована.
При большом количестве быстро отрабатываемых команд даже эти усилия не могут спасти от опустошения буферов. Как следствие такого увеличения появляется «тормознутость» (меньшая отзывчивость) интерфейса. Нажал кнопку, планировщик команд экрана поместил соответствующую команду в начало очередной порции данных для материнки, и отправил. Команда попадает в длиннющую очередь в буферах материнки. Особенно часто это наблюдается при печати крупных объектов с длинными перемещениями на низкой скорости (печать стенок).
Интерфейс пользователя может быть любым, зависит от фантазии разработчика.
У материнских плат для 3D-принтеров плат на основе STM32 для подключения дисплея предусмотрен специальный интерфейс и называется он FSMC, его также называют контроллером внешней памяти. Смысл работы FSMC заключается в следующем, при подключении по FSMC дисплея или внешней памяти, мы можем обращаться к регистрам подключённого устройства, как будто они находятся в памяти микроконтроллера. Нам не надо дёргать за ножки и отсчитывать временные интервалы, обо всём позаботиться интерфейс.
Отличительной особенностью интерфейса является шлейф с большим количеством жил, от 20 до 22 только информационных сигналов, без учета питания.
Разъем интерфейса может выглядеть следующим образом. В шлейф так же могут включены линии для контроля Touch-панели (SPI).
Marlin и CPU материнской платы сами занимаются отрисовкой интерфейса пользователя.
Начиная с Marlin 2.0.6.1 на FSMC TFT-экране можно включить 3 разных интерфейса пользователя.
Долгое время был основным интерфейсом пользователя для FSMC TFT-экранов. Кнопки на экране заменяют управление через энкодер.
• #define TFT_LVGL_UI_FSMC – графический интерфейс от MKS.
Интерфейс пользователя появился только Marlin 2.0.6.1.
Программисты считают FSMC_GRAPHICAL_TFT наименее глючным способом подключения экранов с графическим интерфейсом пользователя.
Единственным минусом считается использование большого количества GPIO процессора для организации шины.
В Marlin появился начиная с версии 2.0.6.1. Основная идея та же что у RepRap Full Graphic Smart Controller – уход от параллельной шины, требующей большое количество GPIO, на шину SPI.
Физическое подключение – все те же два 10-ти пиновых разъема как у RepRap Full Graphic Smart Controller. Теоретически имеется полная совместимость, и на любую плату вместо LCD 12864 можно попробовать установить графический TFT экран с SPI-интерфейсом. Лишь бы памяти хватило.
В исполнении платы MKS Robin Nano 2.0 и экрана MKS TS35 v2.0 разъемы имеют следующую разводку.
VCC,+3V3, GND- питание
LCD_EN(FSMC_LIGHT|DP13) – TFT_BACKLIGHT_PIN управление подсветкой экрана
LCD_D5(LCD_D5|PE15) – в режиме SPI_GRAPHICAL_TFT не используется,
BTN_ENC(PE13), BTN_EN1(PE8), BTN_E2(PE11) – подключение энкодера,
SPI1_RS(PE12)- не используется.
На SPI_GRAPHICAL_TFT экране так же можно включить 3 разных интерфейса пользователя.
Подключение SPI_GRAPHICAL_TFT самое молодое и наименее изученное. Но мне кажется, что его будут доводить до основного способа подключения TFT-экранов к платам управления 3D-принтеров и бюджетных ЧПУ.
Про MKS Robin Nano 2.0 и экрана MKS TS35 v2.0 есть предварительный обзор типа «диванной аналитики». плата с экраном недавно покинула таможню и находится в пути.
Предварительно: полностью совместимы по посадочным отверстиям с предыдущими RobinNano, но есть UART/SPI по всем осям, Sensorless одной перемычкой, гребенка с различными напряжениями питания для периферии, SPI-подключение TFT-экрана.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Мой переход с Lerdge на Marlin
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Статья относится к принтерам:
– Вручить шашку Игорю Владимировичу, а? Любо?
Что понравилось при ознакомлении с ТТХ и беглом осмотре полученного комплекта:
Т.к. раньше с Марлином я знаком не был, и даже не знал с какого бока к нему подступиться, я сделал некое подобие стенда.
На нём я и оттачивал настройку прошивки под свои нужды. Увы, легко и без проблем Марлин мне не дался. После Лерджа несколько сложновато давался алгоритм настройки. Не зря говорят, что переучиваться сложнее, чем учиться с нуля. Нужно привыкать и приспосабливаться к немного другой логике работы. Взять хотя бы, например, управляемые разъёмы вентиляторов на плате SKR 2 – Fan0, Fan1 и Fan2. Что за что отвечает? На плате присутствует поддержка двух экструдеров E0 и E1. Соответственно, в эти разъёмы должны подключаться вентиляторы обдува детали, и обдува радиаторов этих двух экструдеров. Если следовать некой логике, то Fan0 – это разъём для вентилятора обдува радиатора экструдера E0, Fan 1 – для вентилятора обдува радиатора экструдера E1, ну и оставшийся Fan2 – для обдува детали. Так думал я, а Марлин думал иначе. Для обдува детали в прошивке где-то глубоко в коде прописан Fan0, а вот для обдува радиаторов экструдеров вентиляторы не прописаны вообще. Вероятно, предполагается, что они подключаются к неуправляемым разъёмам для вентиляторов, которые на плате тоже есть (Fan3, Fan4). Поэтому, если вы хотите иметь управляемые вентиляторы обдува радиатора, то их нужно прописать вручную. Ещё момент – если у Лердж не имеет значения, какой датчик автоуровня подключён к плате (плёночный, BL-Touch, индукционный), и его можно поменять без перепрошивки, то в Марлине нужно чётко указать, какой тип датчика подключён к плате. И без изменения этой информации в прошивке (с последующей перекомпиляцией оной и перепрошивкой платы управления) его не поменять. Ну и волшебный Z-offcet. Если у Лердж он работает сразу и всегда – внесли в него изменения (как в соответствующем меню, так и при печати с помощью подстройки), и они применяются ко всем печатям, которые вы будете проводить после этих изменений, без лишних телодвижений, то у Марлина это не так. После того, как вы внесли изменения в Z-offcet и сохранили их в EEPROM, вам, при каждой печати после автоматической парковки по G28, надо вызывать их из памяти командой M420 S1, иначе значения Z-offcet не будут использоваться. Это же верно и для карты стола. Вот этот маленький нюанс знатно попил моей крови. Но, вроде как у Марлина датчик автоуровня BL-Touch работает стабильнее и адекватнее, чем у Лердж. Сам же я работу BL-Touch не проверял, не смотря на то, что его клон (3D-Touch) от Trianglelab у меня есть. Мне просто лень его ставить, т.к. я один раз снял карту стола плёночным датчиком и печатаю дальше без перекалибровки, вызывая карту всё той же командой M420 S1, упомянутой выше. Вместе с тем сама автокалибровка стола со снятием карты с помощью BL-Touch или любого иного датчика в Марлине проходит более предсказуемо, особенно если сравнивать с работой Lerdge с прошивкой версии 4.3.3 beta 1-3. Про финальную версию прошивки Lerdge 4.3.3 я ничего сказать не могу, т.к. подзабросил наблюдение за ней. Опытные марлиноводы и марлиноведы скажут, что упомянутые выше проблемы – это пустяки, и не стоит из-за них нервничать. Но как новичок отвечу – что для вас пустяк, для новичка проблема, и, к сожалению, её не всегда получается быстро решить. Однако продолжу рассказывать дальше.
Итак, используя сделанный стенд, я произвёл в марлине настройку основных параметров принтера, таких как габариты печатного поля, управление блоком автоматического выключения питания, настройку отключения вентиляторов обдува радиатора хотенда, при охлаждении его ниже 40 градусов и т.п. И при этой настройке я был очень рад, что экран может выступать как хост по отправке команд на плату и получать от неё ответы. Это знатно экономит время и позволяет не подключать плату к компьютеру только для того, чтобы, например, опросить состояние концевиков командой M119, или проверить, адекватно ли работает блок автоматического выключения питания, отправив команду M81 на плату. Но более подробно к некоторым настройкам Марлина я вернусь немного позже.
А сейчас коротко пробегусь по подключению электронной части принтера к новой плате. Тут проблем не возникло от слова совсем. У Bigtreetech, как и у Лердж, есть достаточно подробная инструкция о том, что, как и куда подключать, а также есть полная карта распиновки разъёмов. Ну и на обратной стороне платы также есть подписи ко всем пинам.
Единственное что пришлось сделать, так это удлинить некоторые провода, т.к. они были рассчитаны под расположение разъёмов на Lerdge-K. Также пришлось смоделировать и напечатать новый корпус для экрана TFT43. На этот корпус я, помимо родных разъёмов для USB-флешки и SD-карты, расположенных на плате экрана, вывел с помощью удлинителей разъёмы для подключения micro SD-карты и USB-флешки с самой платы SKR (у неё он есть, помимо разъёма USB-B для подключения к компьютеру).
Дабы не сверлить в корпусе принтера новые отверстия, я смоделировал подложку для SKR 2 с учётом уже имевшихся отверстий для крепления подложки Лердж-K.
В общем, плата заняла положенное ей место, и можно было приступать к более тонкой настройке прошивки с учётом особенностей механики принтера. Были настроены рывки, ускорения, скорости движения осей.Ещё на стенде я протестировал работу блока автоматического выключения питания от Bigtreetech и его алгоритм работы мне не понравился. Суть его в том, что он включает плату сразу, как только на него подаётся питание 220 вольт. Я понимаю, что это сделано для возобновления печати после внезапного отключения электричества. Но у этой медали есть и обратная сторона, которая меня не устраивает от слова «Совсем». Приведу пример. Вы, по завершению печати, автоматически или через меню, выключили принтер, и ушли из дома на работу. А за время вашего отсутствия, у вас дома кратковременно отключили и включили обратно электричество. И вот вы пришли домой после работы, а принтер у вас оказался включен. А всё потому, что после отключения электричества в вашем доме и его последующего включения, плата автоматического выключения, следуя своей логике работы, включила принтер. Вот именно поэтому я и решил оставить блок автоматического выключения питания от Лердж, подключив его к SKR 2.
При подключении блока от Лердж, я исходил как из его распиновки, так и из распиновки платы управления SKR 2.
Сигнальный провод и землю от блока автоматического выключения я подключал в разъём PS-ON на плате SKR 2, в соответствии с распиновкой оного, а провод «+5v» я подключил к пину «+5v» незадействованного у меня разъёма E1DET.
Книжка была очень скучной – в ней было много букв и совсем не было картинок.
А теперь немного о том, что я изменял в Марлине под себя для того, чтобы получить нужную мне функциональность:
Сразу предупреждаю – дальше будет много скучных букв.
=== configuration.h ===
Порты подключения, модель материнской платы и количество экструдеров
Для подключения принтера к компьютеру настроил последовательный порт и указал скорость передачи данных для него. #define SERIAL_PORT 1 #define BAUDRATE 115200
Дабы прошивка правильно собралась для моей платы, указал её модель. #define MOTHERBOARD BOARD_BTT_SKR_V2_0_REV_B
Т.к. у меня одноэкструдерный принтер, без всяких смешивающих экструдеров, то указал количество экструдеров равное одному. #define EXTRUDERS 1
Работа с блоком автоматического выключения питания
Marlin/ru
Release status: рабочее
Работает на RAMPS 1.4, Ultimaker и Sanguinololu. Возможно работает на Generation_6_Electronics, и других аналогичных платах.
Contents
Общая информация
Эта прошивка гибрид от Sprinter и grbl со множеством оригинальных деталей и дополнений.
The default baudrate is 250000. This baudrate has less jitter and hence errors than the usual 115200 baud, but is less supported by drivers and host-environments.
Отличия и дополнения от Спринтер
Marlin обеспечивает упреждающий просчет рывков. Без этого происходила бы полная остановка с последующим ускорение в каждом углу. Lookahead will only decelerate and accelerate to a velocity, so that the change in vectorial velocity magnitude is less than the xy_jerk_velocity. This is only possible, if some future moves are already processed, hence the name. It leads to less over-deposition at corners, especially at flat angles.
Устранения шума дискретизации:
Для устранения шума дискретизации, чтобы сделать PID точнее, 16 АЦП измерений температуры усредняются.
Позволяет хранить данные о скорости, ускорениях, значениях PID в EEPROM. Откуда они будут прочитаны после загрузки, независимо от того, что сказано у вас Configuration.h (позволяют менять и сохранять значения без компиляции прошивки).
Если ваше оборудование позволяет, вы можете использовать LCD + CardReader+ Энкодер. Это позволит менять в реальном времени температуру, ускорения, скорости перемещения, печатать с SD карты без помощи компьютера, и.т.д. Пример рабочего железа можно посмотреть например тут: http://www.thingiverse.com/thing:12663.
Поддержка папок на SD карте:
Уведомление срабатывания концевика:
Если концевик сработал двигаясь к концевику, место, в котором прошивка считает концевик был инициализирован выводится в последовательный порт. Это полезно, потому что пользователь получает предупреждающее сообщение. Инструменты, такие как QTMarlin можно использовать, чтобы найти приемлемые комбинации скорости + ускорения.
Не важно для пользователя, но Марлин был разделен на тематические куски, и попытался по возможности применяются локальные переменные. Это сделано для того, чтобы сделать код более понятным, что с чем взаимодействует, это приводит к более высокому уровню модульности. Мы считаем, что это является предварительным шагом для портирования этой прошивки на платформу ARM в будущем. Много оперативной памяти (с поддержкой LCD
2200 байт ) было сохранено путем хранения строк сообщений в памяти программы. В последовательном соединение, #define-based уровень абстракции был осуществлен, таким образом, ясно что, некоторая передача информации (обычно начинающийся с «echo:»), ошибка «error:», или как нормальный протокол, необходимый для обратной совместимости.
Измерение температуры основанное на прерываниях:
Для АЦП измерений используются прерывания. Это позволяет сократить блокировку в процедуре управления нагревателем.
Не стандартные M-Коды, Не совпадающие со старой версией Спринтера:
Настройка и компиляция:
Скачать и установить программу Arduino IDE v0.22 http://www.arduino.cc/en/Main/Software (последняя доступная версия 1.6.5)
Для плат Gen6 и Sanguinololu папку Sanguino в папке Marlin нужно скопировать в Arduino environment. Копировать Marlin\sanguino \hardware\Sanguino
Установить Ultimaker’s RepG 25 build http://software.ultimaker.com для поддержки SD и как лучшая замена (apart from stl manipulation) download the very nice Kliment’s printrun/pronterface https://github.com/kliment/Printrun
Скопировать Ultimaker Marlin firmware https://github.com/ErikZalm/Marlin/tree/Marlin_v1 (Use the download button)
Кликнуть на кнопку Verify/Compile
Кликнуть на кнопку Upload. Если все будет хорошо то прошивка загрузиться.
Нажмите кнопку Connect.
Отчеты об ошибках
ИЗВЕСТНЫЕ ПРОБЛЕМЫ: RepG пишет на экране: Unknown: marlin x.y.z
Для сообщения о новых ошибках используйте Issue tracker on github
Уха из Марлина или разбираем прошивку по косточкам
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Занимаясь разработкой 3D принтера долгое время раздумывал над его прошивкой. Написать свой софт с нуля не хватает знаний и опыта, поэтому было принято решение об использовании опенсурсного проекта Marlin.
Погуглив немного и не найдя ничего внятного кроме процесса создания конфигурационного файла и описания G-кодов, принял решение разобраться с исходниками досконально. Для чего?
1. Дабы упростить себе процесс настройки и траблешутинга.
2. Для использования в своем проекте «экзотических» устройств, типа измерителя толщины нити, умной подсветки, вытяжки и … (по секрету) экструдера выдавливания нити из гранул.
3. Возможности писать свои скрипты и вживлять их в прошивку, создавать собственные G-коды.
4. Прочее – подскажите в комментариях.
Возможно начинающим программистам, коим я и сам являюсь, будет полезна эта информация. Гуру в языке С думаю, не найдут здесь ничего нового.
Для начала хочу остановиться на файловой структуре исходника и поделиться с вами этим, если будет интерес у сообщества – продолжу описывать свой опыт исследования прошивки.
Ныряем в папку Marlin, видим 3 папки и кучу файлов. Попытаюсь вкратце пояснить что в каком месте хранится и за что какой файл отвечает.
Сразу определимся что файлы с расширением хххххх.h –это заголовочные файлы, в них определяются переменные, функции, процедуры. Кода в них практически нет. Код содержится в файлах с расширением xxxxxx.cpp.
Configuration.h – это и есть файл конфигурации, в нем вносятся изменения до начала компиляции кода. Подробно расписывать пока не буду, информации о содержимом достаточно в русскоязычном и импортном Инете.
boards.h – содержит список всех платформ и плат, на которые можно установить Marlin. Каждой плате присвоен свой идентификатор, который прописывается в конфигурационном файле перед компиляцией. В моем случае это:
# define BOARD_ RAMPS_14_ EFB 43 // RAMPS 1.4 ( Power outputs: Extruder, Fan, Bed)
pins_хххххх.h – файлы содержат назначение пинов для каждой платформы. Я использую RAMPS, поэтому мне интересен файл pins_RAMPS_14.h. Корректировать номера выводов будет полезно в том случае, если по каким-то причинам невозможно использовать стандартное назначение (первое что приходит на ум – спалили вывод, или решили подключать внешнее устройство на другой разъем).
#define FILRUNOUT_PIN 4
watchdog.h, watchdog.cpp – файлы отвечают за фичу под названием «Сторожевой пес». Фича полезна тем, что позволяет контролировать выполнение основной программы, в случае ее зависания уводит контроллер в рестарт. Работает предельно просто – запускается отдельный аппаратный таймер, в нашем конкретном случае – на 4 сек. В основной программе периодически вызывается команда обнуления этого таймера. Если за 4 сек. его никто не обнулит – он понимает что «что-то пошло не так» и рестартует контроллер.
blinkm.cpp, blinkm.h – содержит библиотеку для управления трех-цветным светодиодом по I2C протоколу. (куда его цеплять и зачем он нужен пока остается загадкой).
buzzer.cpp, buzzer.h – управляет пищалкой. Есть два режима работы – на пищалку подается последовательность импульсов с определенной частотой (пьезоизлучатель) или просто включитьвыключить (паровозный гудок 😀 )
configuration_store.cpp, configuration_store.h – код для чтениязаписи данных в энергонезависимую память. Удобство прошивки заключается в том, что параметры, выставленные при настройке и калибровке сразу записываются в EEPROM, и их не надо каждый раз выставлять заново при включении принтера.
servo.cpp, servo.h – используются для управления сервомоторами при, например, автокалибровке стола. Я их использовать пока не планирую.
MarlinSerial.cpp, MarlinSerial.h – библиотека для работы с USB.
ultralcd.cpp, ultralcd.h – работа с экранами.
Не знаю почему, но процедура обработки датчика толщины прутка тоже попала в файл temperature.cpp.
Ну и самые интересные файлы:
Marlin_main.cpp, Marlin_main.h – это основной заголовок и основной код программы. В подпрограмме void setup() собраны подпрограммы инициализации основных устройств и назначение переменных. В void loop() – основная подпрограмма. Здесь же собраны подпрограмма чтения G-кодов и все подпрограммы обработки этих кодов.
Вот так при кодах G0 и G1 вызывается подпрограмма gcode_ G0_ G1();
// Handle a known G, M, or T
case ‘G’: switch (codenum) <
Как раз здесь можно создать свой G-код. К примеру, G777. Добавляем:
и выше, рядом с другими обработчиками, добавляем подпрограмму его обработки:
inline void gcode_ G777 () <
У меня пока все. Может по косточкам пока не удалось разобрать, но на куски уже порезали… 😀
Если у кого есть более глубокие наработки по добавлению фич в прошивку – буду рад увидеть в комментах.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.