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

Модуль экрана с энкодером и SD-картридером

iSnail
Идет загрузка
Загрузка
08.04.2019
7894
7
RepRap

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

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

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

14
Итак, факты: я делаю принтер; Mega 2650 + RAMPS; принтер иногда будет мигрировать и должен уметь печатать с карты; у меня завалялся без дела экран 16×2 символов (1602).

Следствие: надо бы сделать себе контроллер для принтера типа RepRap Discount Smart Controller, в котором бы был задействован этот экран и с функцией чтения SD-карт, и в корпусе, заточенном под конкретный принтер. Всё это будет использоваться под Марлин 1.1.9.

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

Шаги на пути к изготовлению модуля контроллера с экраном:
  • Нужно проверить экран (первый старт не удался — экран оказался вообще однострочным, другой экран — нерабочим, и только герой текущей повести подходит).
  • Нужен энкодер или кнопки (можно выковырять из магнитолы, легко купить).
  • Нужен как минимум голый картридер (к нему тогда стабилизатор и обвязка для согласования уровней, добыть несложно, но геморройно собирать), как максимум готовый SPI-модуль (например, для ардуино) с разъёмом, согласованием 5-3,3 вольта и автодетектом карт (легко покупается, этот вариант лучше).
  • Нужно найти готовый, адаптировать похожий или разработать новый корпус. В моём случае его придётся с 0 сделать, так как экраны 1602 не часто используются с энкодерами в принтерах, а чаще только как голая индикация, да и всё равно их нет с нужным мне креплением на стойку рамы.
  • Нужна кастомная проводка и разъёмы для RAMPS, так как стандартно экраны с ридерами висят на двух весьма специфических шлейфах, втыкающихся в толстый и страшный переходник, который ещё и денег стоит, а у меня всё будет напрямую заводиться на рампс (AUX3/AUX4). Это целый ворох проводов, десятки минут прозвонок, отсчётов контактов и прочего развлечения.
  • Нужно включить всё это в прошивке (конкретно — в марлине 1.1.9), и разобраться с правильной настройкой.



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

Начал я делать всё с корпуса и проводки. Корпус прошёл много итераций разработки и прототипирования и прошёл три стадии «ну, вот теперь точно всё», о разработке корпусов можно писать очень долго, так что лучше я сэкономлю половину объёма статьи, исключив его историю. Все версии печатались из ABS. Провода я делал под конкретный принтер (по длине и месту отвода проводов) из МГТФ. Исключение – цветные провода питания в ПВХ изоляции. Вся проводка в кабельной оплётке от старого блока питания, в итоге эстетично и красиво.
Модуль экрана с энкодером и SD-картридером
Сверху – первая версия корпуса (плоская, ибо тогда повёрнутый вариант я только ещё держал в уме), снизу – исходники проводки (оплётка, провод МГТФ, коннкеторы) и готовые жгуты (розовый – на экран, энкодер и пищалку, а цветной – на картридер).

Коннекторы у меня были только 4×1, но и этого досточно. Из них с помощью суперклея делается разъём AUX3 (4×2 контакта) и частичный разъём AUX4 (12×1), итого пять коннкекторов, пинов 5 * 4 — 2 (пустые) = 18 штук. Провод я взял МГТФ, купленный лет 8 назад «до лучших времён», но я подумал, что эти времена при моей жизни могут и не наступить, и пусть идёт в дело. А для красоты тут кабельная оплётка от старого блока питания. Мотка мне не хватило всего на два провода и их пришлось собирать из обрезков по 2 и 3 куска соответственно, но это на качество не влияет.

Итак. Корпус сделан, проводка создана. Теперь надо начинать припаивать проводку к экрану.
Модуль экрана с энкодером и SD-картридером
Схема приведена для ReprapDiscountSmartController, всё, в принципе, соответствует правде и я собирал её. Схма взята в вики у конкурентов, там ещё есть немного информации.

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

Следующий шаг — тестирование экрана, но он (как мне подсказывает логика) ничего не будет показывать, будет работать голая подсветка. Почему? Потому что нужно включить его в прошивке.
Модуль экрана с энкодером и SD-картридером
Пример включения символьных экранов, к примеру, через директиву #define REPRAP_DISCOUNT_SMART_CONTROLLER и определение размера

Тут есть несколько путей:
  • В случае, если экран нужен без энкодера и прочего (чисто температуру показывать), то раскомментируется дефайн ULTRA_LCD и задаются размеры экрана через дефайны LCD_WIDTH и LCD_HEIGHT (по умолчанию они чаще всего 20×4).
  • В случае, если экран 16×2 (как у меня), на нём энкодер, пищалка и картридер, можно просто раскомментировать дефайн MAKEBOARD_MINI_2_LINE_DISPLAY_1602, и всё заработает само (он в Conditionals_LCD.h всё равно сам определяет упоминающийся ниже Репрап Смарт Контроллер и прописывает ему размер экрана 16×2 символов, так что технически функционал тот же на все 100%).
  • Если экран иного размера (например, 20×2), то лучше начать с дефайна близкой сердцу панели, но у большинства панелей с завода идёт экран 20×4 или 20×2. Панель лучше раскоментировать REPRAP_DISCOUNT_SMART_CONTROLLER как популярную. Затем нужно будет вручную добавить дефайны LCD_WIDTH 16 и LCD HEIGHT 2 (или иные значеня), иначе в Conditionals_LCD.h эти параметры определятся по умолчанию как упомянуто чуть выше и работать всё нормально не будет.



Раскомментирование REPRAP_DISCOUNT_SMART_CONTROLLER также включает кнопку KILL (она не везде есть, как я понял) и однотональную (как я понял) пищалку.
Модуль экрана с энкодером и SD-картридером
Ура, оно живое!

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

Дальше заводим энкодер. Его я купил года полтора назад за что-то около 37 рублей. Обычный и ничем не выделяющийся.
Модуль экрана с энкодером и SD-картридером
Схема ног стандартного поворотного энкодера, почти как у меня. Земля это GND, A0 - кнопка, а D2 и D3 – контакты самого энкодера.

Энкодер не будет работать, если не включена панель с его поддержкой. REPRAP_DISCOUNT_SMART_CONTROLLER и ULTIPANEL подходят, на других не проверял. На одном лишь дефайне ULTRA_LCD энкодер не включится.

Нажимаем на энкодер (если всё ок, откроется меню принтера). Проверяем: поворот «вправо» должен смещать курсор меню вниз, а «влево» смещать вверх. Это можно инвертировать в прошивке, но лучше правильно спаять (или переставить пины в разъёме). Можно поглядеть в дефайны ENCODER_PULSES_PER_STEP и ENCODER_STEPS_PER_MENU_ITEM, если для сдвига меню требуется слишком долго крутить ручку или же наоборот происходит перескок через пункты. Пропуски реакции всё равно будут из-за особенностей конструкции энкодера, но если что-то совсем уж не так, эти пункты могут помочь.

Итак, экран показывает, энкодер щёлкает и позволяет гулять по меню. Уже можно делать почти всё, но нельзя печатать с карты, так как нет картридера. Раскомментируем #define SDSUPPORT, чтобы принтер начал опрашивать картридер. Если панель поддерживает авто-детект, то принтер ещё и на перетыкание карты будет реагировать. Это справедливо для выбранного мной REPRAP_DISCOUNT_SMART_CONTROLLER. В ULTIPANEL, которую я тут упоминал уже, детект вроде как инвертирован и работать нормально не будет с обычными разъёмами карт памяти, однако в меню появятся пункты монтирования и замены карты, что в принципе тоже совместимо с жизнью и будет работать. Есть настройка SD_DETECT_INVERTED в Configuration_adv.h для экспериментов с детектом, но я её не пробовал.

Первый картридер для тестов я сделал из переходника SD-microSD. Этот вариант в случае «ультра-бомж-режима» тоже имеет право на жизнь. Необходим стабилизатор питания на 3,3 вольта (некоторые карты памяти и 5 вольт кушают, но некоторые сгорают и что самое ужасное — не сразу), фильтрующий конденсатор питания (как можно ближе к выводам питания карты), а также блок согласования сигналов SCK, MISO и CS, так как они тоже должны быть 3,3 вольта (MOSI выходной, его 3,3 вольта всё ещё подпадает под логическую единицу у ардуины, так что он коннектится напрямую — см. схему). Согласование делается или через буферную микросхему (так правильно) или через диод и резистор (так было у меня сделано: тоже имеет право на жизнь, хоть и не совсем корректно, однако фактически кроме чуть большего энергопотребления ничем не чревато).

Эту странную схему я делал тоже больше года назад для тестов и уже не помню номиналов резисторов, но тогда ещё сам поражался гениальности этого способа, и тому, что во время тестов работал он тоже безотказно. Так что это надо гуглить, если будет интересно.
Модуль экрана с энкодером и SD-картридером
Такая схема превращает переходник в картридер с согласованием логических уровней, она даже работала, да :)

Минусом этой схемы является повышенная колхозность, отсутствие фиксации, а также отсутствие сигнала наличия карты. Так что я решил, что сменю своё творение на что-то приличное. Пошёл я и купил SPI-модуль под microSD в ближайшем Ардуино-магазине аж за 55 рублей, с мыслью, если что-то не будет работать, я оттуда возьму только сам коннектор для карты.
Модуль экрана с энкодером и SD-картридером
Вот такой модуль для ардуины я забрал в магазине. Выступающие части, правда, пришлось подпилить, а штырьковый коннектор — выпаять, но вмешиваться в схему нужды не было.

Модуль на вид качественный, построен на базе буферной микросхемы LVC125A и обычного стабилизатора AMS1117 на 3,3 В. Коннектор имеет вывод детектора, который не разведён на плате (ну, и фиг с ним, к нему напрямую припаяться можно и всё ок), входы заводятся на карту через буфер и всё работает нормально.

Правда, по началу у меня ничего не заработало. При дёргании карты туды-сюды «нагорячую» экран сильно притухал, а ардуина вообще творила чудеса в течение примерно секунды, потом её «отпускало». В момент «прихода», например, загорался светодиод включения обдува, показания температур со средних 25-27 падали до 5-7 градусов, а веселее всего было то, что неосторожное тыкание пальцем в контакты SD через раз вешало плату, что меня очень удивляло и даже вводило в ступор. Напряжения на плате есть, короткого замыкания не нашлось (на всякий случай перепаял все провода заново и поаккуратнее, ибо всё было наспех), но чудеса продолжались. Меня смутило, что вместо +5 вольт идёт +4,6, но принтер уже запускался и показывал своей работой, что ему этого достаточно. Всё же я вспомнил, что при первой сборке принтера пару месяцев назад уже что-то дымилось слегка (ну, как слегка — с хлопком и вонью, у меня иначе не бывает), но я на это традиционно забил. Даже если руки кривые, проблему можно исправить, когда она видна, а работало тогда всё как ни в чём ни бывало и лечить работающую плату мне не хотелось. Репрапщики и просто бывалые должны догадаться, что там дымилось — да, это оно самое.
Модуль экрана с энкодером и SD-картридером
Слева — стабилизатор курильщика, справа — стабилизатор здорового человека.

Да, пришлось лезть на плату ардуины и менять стабилизатор, в котором уже недоставало фрагмента от замыкания, но он на 2/3 мощности даже работал. Мелкие SMD версии я не перевариваю, ибо мрут иногда даже сами по себе, и для надёжности вместо него был заброшен 7805, обещающий ток до 1,5 А (ну, ладно, радиатора нет, но и токов таких тоже) и не сгорающий от первого сквозняка.

После замены стабилизатора плата перестала сходить с ума от недостатка питания, питание по цепи +5 В встало как вкопанное (причём, на китайском тестере ровно 5,00), но проблема неработоспособности картридера не ушла, и я даже не сразу вкурил, почему. Дело оказалось в том, что я выпаял с модуля штырьковый разъём и паялся на плату напрямую. Меряя напряжение везде, я пришёл к выводу, что этого достаточно (ибо оно на месте), а так как осциллографа у меня нет, в линии данных я даже смотреть смысла не вижу. Оказалось, что это либо у китайцев брак со сквозной металлизацией отверстий либо это я перестарался, выпаивая разъём, и повредил металлизацию внутри. В любом случае, оказалось, что просто-напросто надо подпаиваться к другой стороне платы.
Модуль экрана с энкодером и SD-картридером
Ура, карта видится, печать с карты запускается! Тут видны эксперименты с Ultipanel, в ней есть пункт меню по смене карты памяти, хоть и подпаян провод авто-детекта.

В общем, всё заработало и по отдельности и вместе.

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

Пищалку я сделал быстро — сам пьезоэлемент (или не пьезо, фиг разберёшь) из каких-то часов (со школы ещё их накопил с дюжину всяких разных), резистор 100 Ом (150 не нашлось) и транзистор КТ315В (старше меня раза в полтора). Протестировать пищалку в марлине можно командой, к примеру, M300 S500 P200 (частота и длительность). В моём случае она явно работала, но вместо звука частотой 500 Гц длительностью 0,2 сек она как-то нечленораздельно и очень кратко попёрдывала (как будто напряжение просто подавалось, а потом снималось через эти 0,2 сек), так что пришлось раскомментировать #define SPEAKER, после чего пищалка «запела», то есть ей стал подаваться явно частотно-модулированный сигнал, а не реагировать на постоянный уровень. Ну, и какие-то попикивания в меню нормальные появились при нажатии на энкодер. Их можно настроить через LCD_FEEDBACK_FREQUENCY_DURATION_MS и LCD_FEEDBACK_FREQUENCY_HZ, но я не стал париться, пикает и ладно.

За 10 минут я сваял «на глаз» адаптер для кнопки, распечатал, увидел, что кнопка не лезет, увеличил зазоры, снова распечатал и всё. Всего 20 минут потребовалось на внедрение кнопки вообще без люфтов и каких-то проблем. Правда, в кнопке я разочаровался. Она именно «Kill», а не «reset», и принтер всё равно надо резетить вручную, да и в некоторых ситуациях она не работает вовсе. Из этого вывод — если нужно срочно остановить печать, то всё равно придётся лезть в недры принтера за сбросом или же дёргать питание. Неудобно, но раз сделано, пусть будет.

Ладно, уже собрав всё и оттестировав, я понял, что зря не слушал своего самого надёжного советника — себя же. Изначально я полагал, что «прямое» исполнение экрана мне может не понравиться и я его разобью молотком. Бить я его, конечно, не стал, но то, что экран, смотрящий чётко вперёд относительно принтера, это неудобно, всё же — факт. Нужно его непременно повернуть вверх градусов на 30. Решено было сделать это, хоть и ценой получаса работы и необходимости полтора часа перепечатывать корпус, а затем полчаса аккуратно пересаживать внутренние органы. А потом всё пришлось повторить ещё раз, ибо за корпус задевал стол принтера. Поломки я не хотел.
Модуль экрана с энкодером и SD-картридером
1. Внутренности; 2. Сборка финальной версии с наклоном; 3. Кнопка отдельно; 4. Примерка и проверка ещё без ручки энкодера.

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

Первое, что лучше сделать на двустрочном экране, это закомментировать #define SHOW_BOOTSCREEN. Он ни на что особо не влияет, кроме времени запуска принтера, однако бут-анимация тупо не влезает на экран и выглядит как-то странно. Вырезаем и радуемся быстрой загрузке. Или можно, кстати, добавить текст в опции SHORT_BUILD_VERSION и WEBSITE_URL, но они влияют только на вторую строку (и окно About printer, кажется), к ним всё равно прибавляется муть типа версии и адреса марлина в интернете, так что лучше не париться.

Дабы вместо «3D printer ready.» было нечто другое (название моего шедевра, к примеру), меняется строчка #define CUSTOM_MACHINE_NAME 'Snail 3D'.

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

А чтобы вместо «ready» было «готов», да и меню на родном языке, можно попытаться внести правки «#define LCD_LANGUAGE ru» и «#define DISPLAY_CHARSET_HD44780 CYRILLIC», но это имеет смысл только если в экран зашита кириллическая кодовая страница. Меня устраивает английский и менять его я не хотел, но я для эксперимента включил русский язык, а получил японские иероглифы с редкими вкраплениями английских символов. Ну, собственно, чего я и ожидал от японского экрана. Возвращаемся к английскому, он в японском имеется, и оставляем этот параграф в разделе теоретических.

Из прочих настроек есть NO_LCD_MENUS и SLIM_LCD_MENUS. Они могут быть интересными, но нифига не заработали… Почему-то только чёрные квадраты или ноль эффекта.

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

Да, в разделе настройки температур есть ещё и #define PID_AUTOTUNE_MENU, позволяющий откалибровать PID без лишних телодвижений автоматом. До конца калибровки у меня терпения не хватило, но по крайней мере сама калибровка запустилась.

Далее – Configuration_adv.h:

Самая вкусная опция это #define LCD_INFO_MENU. Она добавляет пункт «About printer», куда впихнута куча инфы разной степени полезности, из которой интересны значения некоторых параметров (например, настроенные ограничения температуры), а также счётчик запущенных/проваленных печатей, наработка в часах и счётчик потраченного пластика (но это всё есть только если включен #define PRINTCOUNTER, насколько я понимаю).

Сразу на ней идёт #define STATUS_MESSAGE_SCROLLING. Если активировать, то статусная строка домашнего экрана начнёт прокручиваться, чтобы показать весь длинный текст. Актуально для надписей, которые не влезают в столь маленький экран (например, если имя принтера длинное и на экране показывается что-то типа «3D Flugegeheimen v2.0 special edition ready.»). Однозначно полезно.

А чуть позже - #define SCROLL_LONG_FILENAMES. Позволит видеть имена файлов на SD-карте целиком (ну, не сразу, а с прокруткой). Ещё более полезная вещь, учитывая только 16 символов ширины, из которых только 14 отводятся под имя файла.

Есть ещё #define CUSTOM_USER_MENUS. Включает меню с любыми собственными командами в виде g-кода. Я применения ему пока не придумал, но выглядит многообещающе.

Я ещё включил LCD_PROGRESS_BAR. Полезная вещь, когда печатаешь с SD карты. Каждые пару секунд включается прогресс-полоска, показывающая процент печати, а потом обратно переключается на статус-сообщение. Если кода на печать нет, а проверить функцию хочется, есть опция LCD_PROGRESS_BAR_TEST, добавляющая тестовое меню, где прогресс меняется поворотом энкодера. Потом её лучше выключить, чтобы меню не захламлялось.

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

В общем, особо интересного я больше не нашёл, распечатал накнец-то ручку энкодера, закрепил экран и протянул провода. Начал пользоваться, и только кайфую.
Модуль экрана с энкодером и SD-картридером
Так выглядит экран в последней итерации (при печати по USB). Проводка культурно пропущена по раме, красиво закреплена и точно подходит под принтер. Ручка с Thingiverse, первая попавшаяся.

Что же даёт даже такой маленький экран с энкодером:
  • Возможность автономного управления принтером — можно начинать, останавливать или ставить на паузу печать, менять множители скорости и потока во время печати. Короче, нужна только розетка и карта памяти.
  • Можно менять настройки шагов на мм, джерков, скоростей и ускорений, смещения позиции «дома», настраивать ПИД вручную или калибровать автоматически, настраивать температуры преднагрева для ABS и PLA, задавать коэффициент для Linear Advance и прочее. Напомню, всё это можно делать 'на лету' во время печати, что очень полезно для меня (принтер ещё до сих пор не завершён и тестируется).
  • Всегда можно видеть температуры и состояние принтера.
  • Можно хоумить принтер, дрыгать осями, выставлять любую температуру, запускать преднагрев, отключать нагрев и шаговики.
  • Резко останавливать печать, когда что-то идёт не так, одной кнопкой.
  • Видеть статистику по съеденному пластику, наработке принтера, настройкам и ограничениям и прочую информацию.
  • В G-код можно добавлять команды попикивания пищалкой и модуль будет напевать мелодии.

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

Финальные затраты:
  • Энкодер + картридер: меньше 100 рублей
  • Пластик: метров 200 (на прототипы и финальный принт), так что будем считать рублей в 300
  • Провода: у меня их море, но других длинных не было, так что возьмём использованный моточек условно за 100 рублей.

Итого: грубо 500 российских денег. Столько же, для сравнения, стоит купить готовый контроллер Micromake Makeboard mini с Китая с аналогичным функционалом (однако, он продаётся без корпуса, и его нужно будет изготовить). С новым экраном вышло бы ещё рублей на 200-500 больше (зависит от магазина, сетки символов и языка) и уже не так интересно.

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

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

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

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

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

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

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