Фото из первых тестов
Фото из первых тестов

Никогда не думал, что программированием можно увлечься, но около года назад я узнал про существование микроконтроллеров — и тут началось.

«Мне нужен шрифт, причём срочно!» — так я подумал спустя полгода. В сумбурном поиске я попробовал много вариантов, приводивших к систематическому разочарованию. Спустя ещё пару месяцев этот вопрос начал тормозить моё обучение и вводить в депрессию.

Зачем

  1. Я обычный пользователь и не могу смотреть на моноширинные шрифты — кровь из глаз

  2. То, что я находил требует значительной переработки

  3. Я не шрифтовик, нужна хорошая точка отправления

  4. Перевод вектора в растр на низком разрешении крайне плохая идея, всё будет кривое

Старый телефон — спасенье

Когда‑то у меня был Nokia 3310. Я хорошо помнил этот экран и шрифт, то, как я вглядывался в эти пиксели, пытаясь понять, почему буква «у» такая кривая, а «А» странная (я не помню, почему именно эти буквы вызывали странные чувства). Но сейчас, понимая ограничения и глядя на свой дисплей 128×64 пикселя, понимаешь, насколько это была хорошая работа.

Так выглядит собранный макет на базе ESP32-S2, справа Nokia 2100
Так выглядит собранный макет на базе ESP32-S2, справа Nokia 2100

Готовые библиотеки

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

nokia-3310-fonts — готовая библиотека, также была использована как точка отсчёта. Очень много осталось без изменений. Автор Přemysl Eric Janouch отрисовал 3 начертания, но, увы, все на английском языке. Ссылка.

Боже, как это редактировать

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

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

Первый блин

Помучавшись, мне удалось создать редактор на JavaScript — конечно, нейросетью, за 100 500 итераций. Я вообще не понимал, что делаю, но надо.

Самодельный редактор в браузере
Самодельный редактор в браузере

В процессе я столкнулся со сложностями: массив, в который были записаны буквы, был 8-битным и 8-строковым. Соответственно, русская буква «Щ» без доработок напильником в него не влезла, как и буквы «Й», «Ё» из‑за верхних выносных элементов. И тогда я не понимал этой проблемы. Ну а в Си изменить массив — это попахивает переписыванием проекта: заголовочный файл, сам массив, метод отрисовки. Да ладно проект, у меня снова нет редактора, и теперь было понятно, что в массиве что‑то не так.

// Часть исходного массива с буквой «Щ» (уже исправленный массив)
{  9, 10, { 
0x0000, 0x0000, 0xDB00, 0xDB00, 0xDB00, 0xDB00, 0xDB00, 0xDB00, 0xFF80, 0x0080 } },

// Таже часть в двоичном виде (c пробелами для наглядности)
{  9, 10, {                 // 9 и 10 - в десятичном виде, хранят ширину буквы и отступ
0 0 0 0 0 0 0 0 0 0000000,
0 0 0 0 0 0 0 0 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 0 1 1 0 1 1 0 0000000,
1 1 1 1 1 1 1 1 1 0000000,
0 0 0 0 0 0 0 0 1 0000000
}}, // Кто увидел букву Щ?

Первый запуск шрифта был на STM32F103, и всё шло отлично, пока я не увидел отзеркаленную «Щ» хвостом вперёд :)

Итог

Спустя какое‑то время я вернулся к идее. Расширил структуры и работал со шрифтом уже в локальном сервере на Си — чтобы проще парсить массив и отдавать в браузер для визуализации. Купил на Авито Nokia 2100 и отрисовал шрифт.

Nokia 2100 — в процессе отрисовки
Nokia 2100 — в процессе отрисовки

Сразу скажу: то, что я отрисовал, мне не понравилось. Некоторые русские буквы были сжаты по ширине, и я корректировал их, несколько искажая ритм.

Вывод в эмулятор дисплея — браузер ПК
Вывод в эмулятор дисплея — браузер ПК
Вывод на крупном дисплее, с большой плотностью пикселей (маленький шрифт уже плохо видно)
Вывод на крупном дисплее, с большой плотностью пикселей (маленький шрифт уже плохо видно)

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

Итоговый шрифт можно скачать на GitHub

Комментарии (21)


  1. zgwerby
    25.05.2026 08:28

    Держи "+" за работу, сам в своё время рисовал уродце-шрифт для ублюд-экрана, где каждая буква была в строгое знакоместо 15х7 (НЕ СПРАШИВАЙ) и нужен был набор R/I/B/BI, но последнее я уже не осилил.


  1. CitizenOfDreams
    25.05.2026 08:28

    Это вы еще не пробовали рисовать букву "Щ" в знакоместе 5x7.


    1. Dovgaluk
      25.05.2026 08:28

      На Спектруме в каком-то редакторе был режим 3x8.


  1. lommmaster
    25.05.2026 08:28

    Как бы подобные шрифты существуют. Хотя бы от Гайвера...


    1. ponikrf
      25.05.2026 08:28

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


    1. Yurmach Автор
      25.05.2026 08:28

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


      1. CitizenOfDreams
        25.05.2026 08:28

        Сегодня на работе видел переведённые шрифты на дорогущей новенькой кофемашине :)

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


  1. Kotofay
    25.05.2026 08:28

    Незаслуженно забыты векторные шрифты BGI:


    1. Yurmach Автор
      25.05.2026 08:28

      Шрифт и правда интересный, но опять же в растр переводить.


      1. Kotofay
        25.05.2026 08:28

        Не нужно. Рендер там копеешный. ~100 строк на С.


        1. Kotofay
          25.05.2026 08:28

          1. Yurmach Автор
            25.05.2026 08:28

            Посмотрю в выходные, спасибо!


            1. Kotofay
              25.05.2026 08:28

              Должно быть примерно такое:


  1. gnomeby
    25.05.2026 08:28

    Я не знаю почему, но прям радует глаз ваш шрифт.


    1. THEOILMAN
      25.05.2026 08:28

      Old but gold


  1. osmanpasha
    25.05.2026 08:28

    Неужели ничего из сотни шрифтов библиотеки u8g2 вам не подошло? Там кириллица много где отсутствует, но думаю все равно можно найти не один вариант по своему вкусу.


    1. Yurmach Автор
      25.05.2026 08:28

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


  1. makaleks
    25.05.2026 08:28

    Тоже делал рисовалку, правда без вайбкодинга. Наверное, все через это проходят : )


    1. Mih-mih
      25.05.2026 08:28

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


  1. fiego
    25.05.2026 08:28

    Мой первый редактор матричных шрифтов я делал на MSX-BASIC... Там была масса операций над матрицей, копирование... Когда последний раз понадобился шрифт, что воспользовался проектом https://github.com/Llerr/FontCreator


  1. LAutour
    25.05.2026 08:28

    Обычно в MatrixFont делаю\переделываю вручную, с переделанным кодогенератором под Adafruit GFX.