Как стать автором
Поиск
Написать публикацию
Обновить

Как я научил Espruino на ESP-32 понимать кириллицу

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.8K

Преамбула

Как‑то на просторах интернета мне попалась интересная вещь, а именно — микроконтроллер ESP-32. Ранее я о нем слышал и даже хотел собрать себе простенькую «мыльницу». До этого тыкал ардуино (вспомнил о нем потому, что принцип программирования у них схож). В то время меня это не сильно зацепило, поэтому я бы и в этот раз прошел мимо, если бы не одно but... (Решил добавить немного междунородности в пост 👽).

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

Погодите...

Дак такое ведь уже есть! Уже давно все придумано, стоило только ввести правильный вопрос в гугл (Яндекс sore)

В общем — это интерпретатор Espruino https://www.espruino.com/

Амбула.

Корзина заказа
Корзина заказа

Поехал — купил.
Подключил — прошил.
Короче, слово за слово, Hello об World, начал думать, что именно за сущность я хочу получить.
Решил начать с простого, с задержкой выводить на дисплей приятные(мотивационные) пожелания на день. (Массив фраз, который просто отображается в рандомном порядке)

Проблема №1

Не получилось найти автоматически библиотеку для подключения моего дисплея, но есть две новости:

Хорошая — мы с нее ведро раков сняли (чуть анекдотов вам 🪗)
после танцев с бубном и ручным подключением библиотеки запустить дисплей получалось.

Плохая — текст разрезан по горизонтали и перепутан верхняя и нижняя части.
Вот так вот было и у меня

Текст отображался в черной полоске вверх экрана и быстро пробегал
Текст отображался в черной полоске вверх экрана и быстро пробегал

Там на видео понятна проблема:

По итогу все решилось перепрошивкой с оф сайта. прям там я просто нажал 3 кнопки и все само перепрошилось. https://www.espruino.com/Espressif+Flash

Проблема №2

Текст начал выводится, ура! Но тут опять 2 стула (как же удивительно...).

Выводится только Английский. Мне то нужен Русский (Русские есть ?)

Пробовал загружать русский шрифт в сам контроллер и использовать его - не работает. https://www.espruino.com/Fonts

Пробовал загружать сторонние библиотеки, например (компактная библиотека для OLED дисплея 128х64 с кириллицей UTF-8) https://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8

Вся загвоздка в том, что Espruino не поддерживает кириллические символы в юникоде (например, «А», «Б»), поскольку Espruino работает с 8-битными строками и использует кодировку, совместимую только с латиницей и символами в пределах диапазона от 0 до 255.

Когда ты передаешь кириллические символы в функцию drawText, они не соответствуют никакому из символов в наборе Espruino (который поддерживает только ASCII или ISO8859-1 символы), и поэтому проверка в функции не срабатывает. В результате, функция не может найти нужные битмапы для кириллических символов, и текст не выводится.

Пришлось облазить очень много сайтов, форумов, перешерстить весь ютюб - безрезультатно.

А как же ИИ ?

Пробовал и его, но чат gpt сразу сказал: «Старина...иди нафиг».
Но все таки, стоит отдать должное, он предложил вариант из которого в будущем и появится моя библиотека, а именно он предложил создать буквы как изображения, а потом склеить их в слова, а слова в предложения и тд. Эта информация есть и на офсайте
https://www.espruino.com/Image+Converter

Выглядело это вот так (на примере буквы Б):

I2C1.setup({ scl: D22, sda: D21, bitrate: 400000 });  
var font = {  
width: 12,  
height: 16, 
characters: "Б",
data: String.fromCharCode(
0b111111111111, // ████████████  
0b100000000000, // █            
0b100000000000, // █            
0b100000000000, // █            
0b100000000000, // █            
0b100000000000, // █            
0b100000000000, // █            
0b111111111110, // ███████████   
0b100000000010, // █          █  
0b100000000010, // █          █  
0b100000000010, // █          █  
0b100000000010, // █          █  
0b100000000010, // █          █  
0b100000000010, // █          █  
0b111111111110, // ███████████   
0b000000000000  //               
)  
};  
function start() {  
g.clear();  
g.setFontCustom(font.data, font.characters.charCodeAt(0), font.width, font.height);  
g.drawString("Б", 10, 10);  
g.flip();  
}  
let g = require("SH1106").connect(I2C1, start, {  
height: 64,  
width: 128,  
address: 0x3C  
});

Но и тут по началу буква просто выводилась лежащей на боку. Эхх, если честно, уже не помню как именно я это пофиксил, но букву я перевернул и буква вывелась на дисплей - это была победа! Хоть и маленькая, но Victori.

Суть

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

Грубо говоря мне придется написать библиотеку кириллицы. Если ее нет в интернете - сделай сам!

На следующий день библиотека была написана, но шрифт был мелковат (5 на 5), увеличил его до 7 на 7.

Как же она работает?

Мы пишем нашу фразу на латинице, по специальному словарю.

Изначально некоторые буквы ( Ш-Я-Ю...) писались с помощью 2-ух английских букв (Sh, Ya..), это усложняло и местами ломало работу скрипта и программы.

Скрипт некорректно обрабатывает буквы
Скрипт некорректно обрабатывает буквы

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

Вот что получилось:

{
"A": "А", "B": "Б", "V": "В", "G": "Г", "D": "Д", "E": "Е",  "E": "Ё", 
"J": "Ж", "Z": "З", "I": "И", "Y": "Й", "K": "К", "L": "Л", "M": "М",
"N": "Н", "O": "О", "P": "П", "R": "Р", "S": "С", "T": "Т", "U": "У",
"F": "Ф", "H": "Х", "C": "Ц", "^": "Ч", "W": "Ш", "%": "Щ",
 "&": "Ы", "'": "Ь", "#": "Э", "Q": "Ю", "@": "Я"
}

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

Просто фото процесса (не несет смысловой нагрузки, как и весь пост)
Просто фото процесса (не несет смысловой нагрузки, как и весь пост)

Что мы получили по итогу ?

Итоговый вывод Русского текста
Итоговый вывод Русского текста
И еще одно фото результата
И еще одно фото результата


Я потратил на это около 2-3 вечеров и в процессе поиска информации и написания кода, мое настроение менялось с аццко-горящего, на дофомино-эндорфиновое.

У меня все получилось.

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

P.S.

Рад поделиться своим творением, надеюсь хоть кому-нибудь я помогу!

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

Дос!

Ключевые слова для поиска: библиотека для отображения Русских букв или библиотека русского шрифта/кириллицы для Эспруино Espruino ESP-32.

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

Теги:
Хабы:
+8
Комментарии7

Публикации

Ближайшие события