Лілка - DIY портативна консоль!

Опубліковано 18.12.2024, 14:01 в категорії YouTube

Bad Apple на Лілці!

В даній статті мова піде про Лілку. Це дуже цікавий український проєкт від ютубера Андерсона та його спільноти. Я дуже давно слідкую за цим проєктом, і мені нарешті випала можливість особисто ознайомитись з ним!

Лілка - це проєкт на базі мікроконтролеру ESP32, це щось середнє між девбордом та ігровою консоллю, хоча сам автор не позиціонує її прям як ігрову консоль. Її доволі легко зібрати, до того ж вже написано немало цікавих програм для неї, тому зібравши її ви точно знайдете чим зайнятись.

Як я вже казав, це проєкт ютубера Андерсона та його спільноти. Майже рік тому ютуб закинув мені в рекомендації його відео про комп'ютер на процесорі 6502.

Мені дуже сподобалось те відео, і тому я підписався на його канал. До речі Андерсон більше всього надихнув мене створювати свої власні відео. В нього на каналі було ще немало цікавих відео, одне з них і було про Лілку. З тих самих пір я чекав офіційного анонсу проєкту, і нещодавно це сталося!

Андерсон домовився з магазином Imrad про продаж комплектів для збірки Лілки, таких собі DIY конструкторів, і я потрапив в ряди тих щасливчиків які встигли замовити першу партію! На момент написання статті всі комплекти вже на жаль розпродані, але Андерсон обіцяє якнайшвидше забезпечити нас додатковими партіями. Тому раджу вам підписатись на його канал та Discord спільноту, щоб не пропустити інформацію про нові надходження.

Окрім того що Лілка це цікавий український проєкт який легко зібрати, вона ще й цікава тим що дуже гарно задокументована. Серйозно, читати цю документацію одне задоволення. А в раніше згаданій Discrod спільноті є купа досвідчених людей, які з радістю допомагають з вирішенням проблем.Все це робить Лілку ідеальним проєктом навіть для початківців.

Комплектація

Щож, давайте вже поглянемо з чого складається цей DIY конструктор:

Назва Кількість
ESP32-S3-WROOM-1-N16R8 1 шт
Гайка - М2 (3 шт) 1 шт
Гвинт - М2.5х6 (12шт) 1 шт
Гвинт - М2х6 (3 шт) 1 шт
Дисплей для ARDUINO - TFT LCD 1.69" 240x280 IPS SPI HD (ST7735) 1 шт
Зумер Пасивний 12x8.5 1.5-12V 1 шт
Кнопка тактова – 12х12х7 мм 8 шт
Кнопка тактова - 6x6x6мм 3 шт
Ковпачок для кнопки - MEC12P 8 шт
Конденсатор керамічний - 1 uF, 50 В (діелектрик - Y5V (F)) 3 шт
Модуль для зчитування та запису microSD карт 1 шт
Перемикач повзунковий MSK-05G2.0 1 шт
Плата - "ЛІЛКА" 1 шт
Плата-перехідник гніздо USB Type-C на DIP (2.54) 4 pin 1 шт
Резистор – 10 кОм (0.25 Вт) 1 шт
Резистор – 100 кОм (0.25 Вт) 1 шт
Роз'єм штирьовий - PBS-8 1 шт
Роз'єм штирьовий - PLS-12 1 шт
Роз'єм штирьовий PLS-4 1 шт
Стабілізатор напруги з низьким падінням TLV1117LV33D 1 шт
Стійки дистанційні TFF-M2.5X10 6 шт
Стійки дистанційні TFM-M2x10 3 шт

Компоненти

До речі додатково до нього я взяв ще комплект для відтворення звуку. Він не обов'язковий, адже в Лілки є Buzzer, або ж П’єзо-динамік, який дозволяє відтворювати примітивні звуки.

Найголовніше що є в комплекті - це плата, адже все інше можна запросто купити в багатьох магазинах мікроелектроніки, а отримати плату вже складніше.

Плата

До речі якщо ви досвідчений в цьому плані і зможете самі підібрати компоненти, і вам потрібна лише плата, можливо у когось є зайва в діскорд спільноті.

Ця плата це цілий витвір мистецтва, з купую відсилок і просто цікавих моментів.

Збірка

Все що є в комплекті треба спаяти все до купи. В цьому нам допоможе як доволі інформативна шовкографія на платі, так і дуже крута покрокова інструкція в документації. На мою думку найскладніше що треба припаяти, це мікроконтролер. Все інше паяється доволі легко. Не дивлячись на те, що я вже немало всього паяв, і маю певний досвід в пайці і роботі зі схемами, все одно круто мати під рукою настільки детальну покрокову інструкцію. До того ж можна прочитати навіщо кожний з елементів на платі, що робить проєкт не тільки цікавим для початківців, а ще й корисним.

Прошивка

Зібрана плата

Після того як всі компоненти були запаяні, треба прошити мікроконтролер. По суті ми отримали повноцінний крутий девборд, з кнопками, дисплеєм, динаміком, і портом для підключення додаткової периферії. Тобто на основі цього девборду ви можете написати що тільки побажаєте.

Але для лілки вже написана ціла операційна система на базі Free Real Time Operating System (Free RTOS). Вона називається Keira OS. Для початку пропоную обрати її як відправну точку, тим паче можливостей там вдосталь. Окрім Keira OS є ще як мінімум два цікавих проєкти - RUSTілка, яка додає підтримку мови Rust для Лілки, а також MeowUI - альтернативний UI для Лілки. Ви і самі можете написати щось своє якщо хочете, але розпочати я пропоную саме з Keria OS.

Її треба скомпілювати і залити на мікроконтролер. В цьому нам допоможе вже неодноразово згаданий мною PlatformIO.Прошивка мікроконтролеру теж дуже детально описана в документації, але якщо коротко, то треба клонувати репозиторій проєкту, зібрати прошивку, і прошити мікроконтролер.

Прошивається лілка за допомогою Type C кабелю, тому підключаємо лілку до комп'ютеру.До речі на Linux можна легко перевірити чи вдалось комп'ютеру з'єднатись з мікроконтролером за допомогою команди sudo dmesg -w. Якщо при підключенні Лілки до комп'ютеру там з'явиться інформація про новий USB пристрій, то все гаразд. Якщо ні - то слід перевірити пайку, або впевнитись що ваш Type C кабель вміє передавати дані. Також не слід використовувати Type-C - Type-C кабель. Це набагато зручніше ніж на вінді, де треба лізти в диспетчер пристроїв, і шукати пристрій там, навіть не знаючи чи є він взагалі.

В PlatformIO натискаємо кнопку Upload та чекаємо.

Запуск KeiraOS

Задоволення від пайки підкріпилось ще й тим, що все запрацювало з першого разу. Впевнившись що все працює, я допаяв модуль для звуку та динамік, і прикрутив акрилову панель, завдяки якій Лілку дуже зручно тримати.

Задня акрилова панель

Пізніше ще колись допаяю сюди акумулятор, і буде повністю завершений пристрій! Наразі на жаль не маю потрібного акумулятору та транзистору.

Keira OS

Також для Лілки не завадить мати якусь невеличку карту пам'яті. Я знайшов в себе карту пам'яті на 1 гігабайт. Її треба певним чином форматувати, інструкція є в документації, там всього лише пара команд в терміналі. Але я це зробив в програмі Gparted - форматував її в FAT32 і все запрацювало.

Повертаючись до Keira OS, пропоную переглянути її функціонал.

По перше тут є ціла купа різноманітних візуальних демок, які дозволять вам насолодитись цим крутим TFT дисплейчиком. Деякі демки до речі цікаві не тільки в плані візуалу, а і коду. Раджу подивитись відео про це на каналі Андерсона.

Також тут є низка різних тестів, які допоможуть вам при відладці деяких моментів, коли ви використовуєте Лілку як девборд.

Підключившись до мережі WiFi, та ввівши свої координати, можна дивитись погоду.

Є тетріс. перепрошую, летріс :D Тамагочі. Є ще дуже крутий трьох канальний трекер - програма для написання музики. Обираючи ноти, та форму хвилі, ви можете легко писати круті треки.

ЛілТрекер

Я ось наприклад відтворив шматочок головної теми з гри та аніме Steins;Gate. А також "Kagome-Kagome" з Robotics;Notes. Синусоіда для цього підійшла ідеально, і воно звучить прямо як в грі.

Так, я трішки повернутий на серії ігор Саянс Адвенча, не звертайте уваги))00

Є ще пара прикладів крутих треків, написаних Андерсоном, які дозволяють побачити весь потенціал трекера.

Ще з цікавого - можливість використовувати Лілку як бездротовий Bluetooth геймпад. Доволі цікаве рішення, враховуючи які в неї круті механічні кнопки. Але в мене поки виходить такий собі "дротовий бездротовий" геймпад, бо лілка поки не має акумулятору, і її треба якось живити :D

Також в Kiera OS вбудовано повноцінний NES емулятор, тому на ній можна легко грати в ігри з NES. Я протестував 3 з них - Super Mario, Contra, та Final Fantasy - всі 3 працювали без проблем.

Емулятор NES

Враховуючи наскільки мало важать ігри для NES, можна легко організувати собі всю бібліотеку NES в кишені, і це буде набагато цікавіше емулятора на смартфоні, адже Лілка має повноцінні фізичні кнопки.

If it has a CPU, it can run DOOM

DOOM на Лілці

Також я думаю багато хто з вас знайомий з мемом "if it has a cpu it can run doom". Він полягає в тому, що люди портують перший DOOM на все що тільки можливо. І Лілка не стала виключеням, на ній також можна цілком комфортно пограти в DOOM!

Ну і є ще пару цікавих моментів, типу FTP серверу або вбудованого MOD плеєру, і усілякого такого. А коли здавалось би функціонал Keria OS добігає кінця, на сцену виходить найцікавіше - ви і самі можете писати програми для Keira OS!

Це можна зробити за допомогою мови C++, або Lua. В обох випадках, через те що проєкт повністю Open Source, для вас є ціла купа прикладів, а також документація, тому від вас потрібно лише бажання, ну і хоча б базові знання в програмуванні. Для програм написаних на С++ прошивку треба перекомпілювати, та заново прошити Лілку. До речі я знаходив пару цікавих емуляторів GameBoy Color на ESP32, і намагався портувати їх на Лілку. Але в мене їх не те щоб портувати не вийшло, я навіть компілювати їх вихідний код не зміг! А шкода, було б весело пограти на Лілці в якихось покеомнів. Тому якщо ви гарно розбираєтесь в цій темі - можете спробувати портувати щось подібне, було б дуже круто.

У випадку з Lua - в Keria OS є інтерпретатор мови Lua, тому достатньо просто скинути на карту пам'яті файл з кодом в форматі .lua. Я наприклад вперше в житті побачив як виглядає мова програмування Lua, але це не завадило мені за допомогою документації Лілки і інтернету, за один вечер написати ось таку прикольну програму.

-- Завантажуємо зображення
no = resources.load_image("no.bmp")
left = resources.load_image("left.bmp")
right = resources.load_image("right.bmp")
both = resources.load_image("both.bmp")

-- Створюємо змінну в яку буде записуватись стан кнопок
state = controller.get_state()

function lilka.update(delta)

    -- Оновлюємо змінну з станом кнопок    
    state = controller.get_state()

    -- Якщо була натиснута кнопка - відтворюємо звук
    if state.b.just_pressed or state.d.just_pressed then
        buzzer.play(40, 100)
    end

    -- Завершуємо програму при натисканні кнопки "A"
    if state.a.pressed then
        util.exit()
    end
end

function lilka.draw()

    -- Перевіряємо стан кнопок і відмальовуємо відповідне зображення 
    display.draw_image(no, 0, 0)
    if state.d.pressed then
        display.draw_image(left, 0, 0)
    end
    if state.b.pressed then
        display.draw_image(right, 0, 0)
    end
    if state.b.pressed and state.d.pressed then
        display.draw_image(both, 0, 0)
    end
    if state.c.pressed then
        util.sleep(0.1)
        display.draw_image(both, 0, 0)
        buzzer.play(40, 100)
        display.queue_draw()
        util.sleep(0.1)
        display.draw_image(no, 0, 0)
    end
end

Bongo Cat

Будь хто хто розуміє як працює стейтмент if-else може написати щось подібне. А розбираючись трішки більше, можна навіть повноцінні ігри писати! Парочка таких вже знаходиться в репозиторії Лілки. Залишилось лише написати під неї якийсь крутий годинник, щоб коли вона не використовувалась вона могла гарно собі стояти на полиці як годинник.

Я дуже радий що зміг нарешті доторкнутись до настільки крутого проєкту, адже він створювався буквально на моїх очах, і мені дуже нетерпілось по-скоріше отримати власну Лілку. Стаття не передасть того, наскільки вона крута - наскільки круті її кнопки та дисплей. Та наскільки цікаво робити навіть базові речі на ній. Ось наприклад цей скрипт з котом який я написав, я вже дуже давно не писав чогось настільки простого та веселого.

Я дуже вдячний Андерсону та всім хто приймав участь в створенні Лілки. Якщо вас зацікавив даний проєкт - закликаю вас підписатись на канал Андерсона, в нього дуже круті та цікаві технічні відео, а також завітати до спільноти в Discord. Там ви знайдете купу цікавих людей, а також зможете напряму контактувати з людьми які приймали участь в розробці Лілки. Може ви навіть зможете зробити свій внесок в Лілку!

Post Scriptum

Це текстова версія відео з мого YouTube каналу. Відео набагато детальніше передає процес збірки, ну і також більш детальніше показує можливості Лілки, тому раджу переглянути його за посиланням