Металл2024 Реклама
Метобр2024 Реклама

MKS Robin. Трогательный Marlin

jmz
Идет загрузка
Загрузка
29.05.2020
10031
19
Техничка

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

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

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

25

MKS Robin. Трогательный Marlin

STM32, Marlin и дивный новый HAL

Предыстория

После переезда на самодельную плату на базе STM32F4 возвращаться к STM32F1 я не планировал, но судьба распорядилась иначе.

Перед китайским новым годом кто-то на Ali решил почистить склад и объявил аттракцион неслыханной щедрости - акриловая дельта EZT-T1 за 70$ да еще и с поставкой со склада в России. В качестве электроники у дельты выступала плата на STM32F103RBT6 с цветным экраном с разрешением 128x128.

Когда я занимался запуском Marlin на “синей таблетке”, то эксперимента ради сборку под дельту я сделал. Для того, что бы прошивка уместилась в 128КБ пришлось отказаться от поддержки экрана и SD карты, что совсем не так интересно, как плата с возможностью автономной печати.И тут нате вам - STM32, те же 128КБ, но с SD картой и цветным экраном. Понятно, что прошивка базируется на каком-нибудь древнем Marlin или Repetier Firmware. Понятно, что меню куцее. Понятно, что без поддержки аппаратного USB и внешним USB-COM преобразователем. Непонятно, как к этому спокойно относится.

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

Ну где же добрый доктор? Ну что же он?

Чтобы период вынужденного ожидания не пропал зря, из запасов была извлечена SKR Mini v1.1, купленная когда-то просто так, для коллекции, как первая серийная плата на STM32 сделанная под Marlin 2.0.

Вариант использования HAL_STM32F1 не рассматривался с самого начала, так как размера флеш памяти на такие излишества, как libmapple, катастрофически не хватало.

Сборку Marlin под HAL_STM32 для линейки STM32F1 никто не практиковал, но подобными шаманскими плясками я уже успешно занимался для платы на STM32F407VET6.

После нескольких дней набивания шишек Marlin не только скомпилировался без ошибок, но и отрапортовал на COM порт об успешной загрузке.Интереса ради собрал ту же конфигурацию под HAL_STM32F1.

Полученный результат наглядно объяснил, за что же я так не люблю библиотеки mapple - размер прошивки с новым HAL уменьшился на 30% - со 173 килобайт до 120.

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

Marlin-2.0 скомпилированный под SKR Mini v1.1 (STM32F103RCT6 - 256KБ)

  • математика дельты
  • поддержка SD карт
  • поддержка графического экрана MKS_MINI_12864 и энкодера
  • HAL_STM32F1
  • DATA:    [==        ]  20.3% (used 9976 bytes from 49152 bytes)
  • PROGRAM: [=======   ]  67.6% (used 177180 bytes from 262144 bytes)

Тот же Marlin, но с HAL_STM32

  • DATA:    [=         ]  13.2% (used 6488 bytes from 49152 bytes)
  • PROGRAM: [=====     ]  47.0% (used 123080 bytes from 262144 bytes)

Поскольку резерв памяти для дельты составлял всего 6%, а внутренняя архитектура u8glib была плохо приспособлена  к 32-х битным контроллерам, то вместо допиливания графической подсистемы я решил написать реализацию пользовательского интерфейса под новый тип экрана, взяв за основу код для текстовых экранов - он проще, а от использования u8glib я мечтал отказаться еще со времени нашего второго знакомства.

При первом знакомстве я прикручивал поддержку традиционных 128x64 экраном и отторжения это не вызывало.

Второе знакомство было намного более эмоциональным насыщенным. Ограничение размера передаваемых данных в 255 байт (uint8_t), при работе с экраном 320x240, да еще и в 16-ти битном цвете очень быстро приводит к пониманию скудности своего словарного запаса в той его части, что используется для выражения сильных эмоций.

Не едет...

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

Пришлось совершить набег на радиорынок и раскошелиться на экранчик 160x128 на том же контроллере ST7735, что и в ожидаемой дельте.

SKR Mini использует разные SPI для встроенной карты и для разъемов EXP1/EXP2, что позволяет экрану узурпировать SPI в разъеме EXP2 в личное пользование и использовать DMA для передачи данных в фоновом режиме.

Плата EZT-T1 так же использует разные SPI для SD и экрана, что позволило отказаться от идеи совместного использования SPI в пользу простоты и быстродействия.Поскольку рисование, это не мое от слова совсем, то для картинки и шрифт для нового экрана были позаимствованы от традиционного 12864 интерфейса.

Внутренняя логика работы с экраном отличается кардинально, но визуальных различий получилось совсем немного - более свободное расположение элементов на основном экране, использование цвета для отображения статусов нагревателей и 8 строчек меню на экране вместо 5.MKS Robin. Трогательный Marlin

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

Сова и глобус

Продавец дельт по факту оказался продавцом воздуха и проданного количества принтеров на складе не было. В тематическом сообществе из ста с лишним покупателей принтер получили хорошо если десять. Меня в числе этих счастливчиков не оказалось, поэтому роль полигона для дальнейших экспериментов досталась MKS Robin.

SKR Mini я прошивал напрямую через ST-Link, для Robin такой вариант не подходил.Пару дней пришлось потратить на борьбу с загрузчиком и поиск ошибок в параметрах линковки, но результат того стоил.

MKS Robin. Трогательный Marlin

Теперь у меня был рабочий код для вывода картинки на экран. Осталось ерунда - эту самую картинку нарисовать. Желательно в приличном качестве.

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

Самыми удобными для использования оказались иконки от BTT TFT в варианте Material Design. Обесцвеченные, нормированные по яркости фона и сохраненные в 15-ти оттенках серого (4 бита на точку) они занимают немного места, а при использовании динамически генерируемой палитры позволяют выдавать вполне пристойную цветную картинку.

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

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

Элементы на главном экране стали активными и к ним добавилось еще две кнопки - переход в главное меню и печать с SD карты. Последняя активна только если карта есть, а принтер бездельничает.

MKS Robin. Трогательный Marlin

MKS Robin. Трогательный MarlinMKS Robin. Трогательный MarlinMKS Robin. Трогательный MarlinMKS Robin. Трогательный MarlinMKS Robin. Трогательный MarlinMKS Robin. Трогательный MarlinMKS Robin. Трогательный Marlin

TL; DR

  • На MKS Robin Marlin работает и его можно потрогать.
  • Если к SKR Mini подключить TFT экран с интерфейсом SPI, то его тоже можно будет потрогать. Но сначала придется его чем-то откалибровать.

Дополнительная информация

  • Поддерживаются как FSMC, так и SPI экраны, но SD карта и экран должны использовать разные шины SPI.
  • Код для работы с SPI тестировался только на F103. На F4 от тоже должен работать, но это еще предстоит проверить.
  • Инициализация FSMC шины пока сделана только для F103Zx. Основная часть кода универсальна, но инициализацию для F103Vx и F4 еще нужно дописать.
  • SDIO на STM32F1 в HAL_STM32 нестабилен. Изначально его совсем не было, пришлось на скорую руку прикрутить однобитный вариант, чтобы хоть как-то тестировать работу с картой. Для печати лучше пока использовать программный SPI.
  • В процессе оптимизации код работы с картинками был много раз переписан и код для экрана 128x128 перестал собираться. Проблема это временная, но сейчас единственный рабочий вариант - это экран 320x240.
  • Картинки хранятся в основной памяти, SPI флеш пока не поддерживается, хотя архитектурно возможность его использования предусмотрена.
  • Есть небольшая вероятность, что NXP выделит человека, портировать код для работы с SPI под LP1768/9. Тогда этот функционал будет доступен и на SKR 1.3/1.4
  • Запрос на включение кода в основной репозиторий отправлен и ожидает рассмотрения.

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

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

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

25
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама