Съдържание:

Lego Mini Memory Memory: 5 стъпки (със снимки)
Lego Mini Memory Memory: 5 стъпки (със снимки)

Видео: Lego Mini Memory Memory: 5 стъпки (със снимки)

Видео: Lego Mini Memory Memory: 5 стъпки (със снимки)
Видео: РАЗДАЕТ WIFI СЛЕДИТ ЗА ЧЕЛОВЕКОМ 4G камера видеонаблюдения 2024, Ноември
Anonim
Image
Image
Лего Мини игра с памет
Лего Мини игра с памет

Преди около година написах инструкция за инсталирането на куп светодиоди в Lego Mini Cooper. Иновацията, каквато беше, беше, че светодиодите можеха да се управляват със смартфон (или чрез всеки уеб браузър, по този въпрос).

Както упорито описах в този Instructable, по -голямата част от тогавашните усилия бяха свързани с свързването на Mini, без всичко да се разпадне. Донякъде за моя изненада, Mini впоследствие оцеля след пътуване от Кънектикът до Торонто и оттогава работи, повече или по -малко.

„Ако не беше счупен, той го поправи, докато не беше“ще бъде моята надпис в най -добрия случай, така че когато Mini се върна у дома за Коледа, беше време за Lego Mini 2.0. В крайна сметка, ако Tesla може да прокара софтуерни актуализации на своите автомобили, колко трудно би могло да бъде?

Имах няколко идеи:

  • Подобрете доста тромавия потребителски интерфейс
  • Добавете рог!
  • Подобрете функцията „автоматични светлини“; и най -важното
  • Добавете функция за игра (дори аз осъзнах, че новостта на включването и изключването на светлините на Mini с телефона ви ще падне рано или късно)

Игралната функция беше най -голямата задача, не на последно място, защото не ми беше очевидно веднага каква игра може да бъде. Mini е твърде крехък, за да поддържа игра, включваща обработката му (освен вероятно депресиращ вариант на Jenga). Друго препятствие беше, че никога през живота си не съм програмирал игра.

След една година безплодно размишление, попаднах на проект за Hackster, в който Arduino Uno се използва за подражание на играчка за памет, датираща от 70 -те години, наречена Simon. Накратко, устройството на Simon възпроизвежда последователност от светлини, които след това играчът трябваше да запомни и възпроизведе чрез натискане на бутони. След всеки успешен кръг последователността се увеличава по дължина.

Въпреки че е с необходимата реколта, всъщност никога не бях чувал за тази игра и трябва да кажа, че е невероятно това, което мина за забавление през деня. Още по -невероятно е, че играта на Саймън все още се продава и събира възторжени отзиви в Amazon. Ясно е, че това трябваше да бъде основният кандидат за адаптиране към моите цели. В края на краищата, Mini вече имаше светлини, така че всичко, което трябваше да направя, е да изхвърля физическите бутони и да предоставям потребителски вход чрез смартфон. Следователно от страна на софтуера изглеждаше, че това ще бъде до голяма степен работа с изрязване и поставяне.

Но първо трябваше да направя някои малки промени в хардуера.

Стъпка 1: Компоненти, инструменти и ресурси

Компоненти, инструменти и ресурси
Компоненти, инструменти и ресурси

Ако възпроизвеждате този проект с Lego Mini, ще ви трябват всички неща, изброени в по -ранния ми Instructable. Единственото допълнително нещо, от което се нуждаете, е пасивен зумер, който се използва за клаксона и за издаване на куп досадни звуци по време на играта (които могат да бъдат деактивирани).

Както ще стане ясно при обсъждането на софтуера, няма реална нужда да използвате Lego Mini за играта. Можете да използвате друг комплект Lego или наистина куп светодиоди на макет, свързан към всяка платка за разработка на ESP8266. С някои релета можете дори да използвате стайното осветление на дома си. Деца, попитайте първо родителите си по този въпрос.

По същия начин не са необходими допълнителни инструменти или ресурси, освен изброените за първоначалния проект.

Ако сте сред шепата хора, които са прочели оригиналното описание на проекта, ще знаете, че Lego Mini първоначално е закупен като подарък на порасналата ми дъщеря, която има почти идентичен „истински“Mini, или почти идентичен като може да се даде, че е нов мини, а не "класически". Липсата на каквито и да било значими допълнителни компоненти направи този нов проект още по-привлекателен, тъй като щеше да ми позволи ефективно да подаря отново Lego Mini 2.0 като нов коледен подарък, без да струва почти нито стотинка. Гениално!

Стъпка 2: Промяна на хардуера

Хардуерна модификация
Хардуерна модификация

Първоначалният проект имаше индивидуално контролируеми RGB интериорни светодиоди. Те консумираха три пина на NodeMCU, които използвах като платка за разработка. След дискретна консултация със собственика на Lego Mini беше установено, че RGB светодиодите са недостатъчно използвана функция. Това беше важна информация, защото трябваше да освободя щифт за зумера/клаксона.

Горната схема е от оригиналния проект. Единствената промяна, необходима за този проект, беше да премахнете RGB светодиодите и да използвате трите освободени щифта, както следва:

  • D1 за сигнала за управление на зумера (който също е свързан директно към 5VDC захранването)
  • D7 за бял вътрешен светодиод
  • D8 за един от онези мигащи цветни светодиоди, които нарекох "диско" светлина

Самият зумер се прибира добре под двигателното отделение, така че прокарването на проводниците обратно към NodeMCU беше лесно.

Стъпка 3: Актуализиране на GUI

Актуализиране на GUI
Актуализиране на GUI
Актуализиране на GUI
Актуализиране на GUI
Актуализиране на GUI
Актуализиране на GUI

Първата стъпка в актуализирането на GUI беше създаването на четири отделни уеб страници:

  • „Начален екран“, който се стартира чрез персонализирана икона на вашия смартфон и връзки към другите страници
  • Страницата „Контроли“, която контролира светлините (и сега, разбира се, клаксона)
  • Страницата „Игра“
  • Страница за настройка, която съдържа опции за конфигуриране като:

    • Включване и изключване на звука
    • Настройка на часовата зона (Mini получава време от интернет, за да може да мига със светлините си в часа със съответното време)
    • Регулиране кога „автоматичните светлини“ще включва и изключва фаровете въз основа на нивото на околната светлина
    • Нулиране на името на най -високия и най -високия резултат (съхранявано в EEPROM)

Разделянето на функциите по този начин прави много по-подобно на приложение. Получаването на NodeMCU да обслужва множество страници беше едно от предизвикателствата за този проект. След като опитах няколко различни подхода, попаднах на кода, който виждате в редове 232 до 236 на основната скица на Arduino. Това работи чудесно - просто създайте индексния си файл, след което назовете следващите страници page1, page2 и т.н. Намерих, че трябва да поставя всички файлове с ресурси (CSS и изображения) в основната папка с данни, но това всъщност не е проблем за сайтове с този размер.

След това трябваше да започна работа с CSS и Javascript, за да направя нещо, което изглеждаше като че ли принадлежи на Lego Mini. Тъй като знам почти нищо по нито една от темите, тук имаше много гугъл, преди да получа нещо, от което бях доволен. Започнах с безсрамно копиране на лего тухла в стил CSS на CodePen тук. Исках също така да се отклоня от етикетирането на бутоните с текст и в крайна сметка да използвам прости графики от Icons8, които бяха идеални за моите цели. Останалите някак си паднаха оттам. Страниците се изобразяват доста добре на всички iPhone, на които съм ги тествал. Надяваме се, че същото важи и за телефоните с Android (изглежда добре в настолен браузър Chrome).

Стъпка 4: Кодът на играта

Кодът на играта
Кодът на играта

Комуникацията между сървъра NodeMCU и браузъра на смартфона се осъществява чрез Websockets. След като потребителят натисне бутон, браузърът изпраща текстов знак до NodeMCU, който съответства на една или повече от светлините на Mini. Допълнителни герои се изпращат, за да контролират потока на играта. След това кодът Arduino предприема действия въз основа на получения знак. Комуникацията с Websocket може да обработва само двоични и текстови знаци, така че е необходимо известно преобразуване за цели числа (например часовата зона).

Както споменах, първоначално очаквах да използвам кода от свързания проект Hackster за основните функции на играта. Очаквах да се случи, че след като играч натисне бутон, съответният светодиод ще светне и кодът ще направи цифрово четене на всички светодиоди, за да види дали десният свети (проектът Hackster проверява физическите входове на бутоните, но това е същата идея). Това наистина свърши работа, но по причини, които все още са ми неясни, не напълно. Около 10% от времето, когато Mini би казал, че е натиснат неправилен бутон, когато всъщност е бил правилният. Всичко изглеждаше добре въз основа на това, което видях в серийния монитор и в конзолата на браузъра, така че нямам представа защо не работи.

След много фафове с опити за въвеждане на някаква проверка на грешки, аз отхвърлих цялата идея за четене на състоянията на светодиодите и създадох масив "отговор", който проверява дали полученият текст на Websocket съответства на правилния щифт, съхраняван в масива "последователност", който възпроизвежда светлинната последователност за запомняне. Изглежда, че това е 100% надеждно, дори ако начинът, по който го прилагам, е малко труден. След като измислих този метод, се натъкнах на това, което е интересно проучване на начина, по който работят някои цифрови брави, и аналогично на подхода, използван в играта.

Времето за въвеждане на бутони вече се обработва с Javascript от страна на браузъра (позволявам много щедри 10 секунди между въвеждането на бутони) и потокът от играта вече се контролира изцяло от играча, а не с твърдо кодиране. Дисплеят включва прозорци, показващи оставащото време за натискане на следващия бутон и броя на оставащите входове, преди поредицата да бъде изпратена правилно от плейъра.

Високият резултат се съхранява в EEPROM (или това, което преминава за EEPROM в света на ESP8266) и ако играч постигне нов висок резултат, изскачащо поле им позволява да въведат име, което са избрали, което също се съхранява в EEPROM. Тези стойности могат да бъдат нулирани чрез страницата за настройка (сигурен съм, че може да има основателни причини за това).

С всичко казано, повторно използвах прилична част от кода на играта Hackster, което ускори нещата много.

Стъпка 5: Останалата част от кодекса

Останалата част от кодекса
Останалата част от кодекса

В сравнение с кода на проекта Hackster, моята скица на Arduino изглежда огромна, дори без всички HTML, CSS и Javascript във файловете с данни. Но по-голямата част от скицата е куп функции, свързани с основни операции, като например създаване и управление на сървъра, получаване на NTP време, mDNS, осигуряване на актуализиране по въздуха, управление на WiFi, управление на SPIFFS файлове и други подобни.

Javascript в HTML файловете е предимно за обработка на съобщенията Websocket (получени и изпратени) и увеличаване на интерактивността на GUI.

Както споменах, исках да подобря функционалността на функцията „автоматични светлини“, която използва зависим от светлината резистор на единствения аналогов щифт на NodeMCU, за да открие околната светлина и да включи светлините на Mini на предварително зададено ниво (когато не е в Game Mode, разбира се). Въпреки че това е много несериозна функция в несериозен проект, ме притесни, че в първоначалния проект съм закодирал твърдо прага на включване и че потребителят няма начин да види как преобладаващото ниво на светлина е свързано с този праг. Сега отчитането на нивото на осветеност се изпраща на страницата за настройка на всеки пет секунди и тази страница също показва текущите прагове за включване и изключване (което може да бъде конфигурирано от потребителя). Така че работата е свършена по този въпрос.

О, почти забравих. Кодът е на GitHub тук. След изтеглянето поставете целия пакет в нова папка, качете скицата на Arduino, след това съдържанието на папката с данни в SPIFFS.

Препоръчано: