Spisu treści:

Lego Mini Memory Game: 5 kroków (ze zdjęciami)
Lego Mini Memory Game: 5 kroków (ze zdjęciami)

Wideo: Lego Mini Memory Game: 5 kroków (ze zdjęciami)

Wideo: Lego Mini Memory Game: 5 kroków (ze zdjęciami)
Wideo: 🤣 Bobo wyścig | Blue | Disney Junior Polska 2024, Lipiec
Anonim
Image
Image
Lego Mini gra pamięciowa
Lego Mini gra pamięciowa

Mniej więcej rok temu napisałem Instruktaż o instalowaniu kilku diod LED w Lego Mini Cooper. Innowacja, taka jaka była, polegała na tym, że diodami LED można było sterować za pomocą smartfona (lub dowolnej przeglądarki internetowej).

Jak mozolnie opisałem w tym Instruktażowym, większość wysiłku w tamtych czasach dotyczyła okablowania Mini bez rozpadu całej rzeczy. Nieco ku mojemu zdziwieniu Mini przetrwał później podróż z Connecticut do Toronto i od tego czasu mniej więcej działa.

„Jeśli nie był zepsuty, naprawiał go, aż „będzie moim epitafium w najlepszym razie, więc gdy Mini wrócił do domu na święta, nadszedł czas na Lego Mini 2.0. W końcu, jeśli Tesla może przesyłać aktualizacje oprogramowania do swoich samochodów, jak trudne może to być?

Miałem kilka pomysłów:

  • Popraw raczej niezgrabny interfejs użytkownika
  • Dodaj róg!
  • Ulepsz funkcję „automatycznego oświetlenia”; i co najważniejsze
  • Dodaj funkcję gry (nawet ja rozpoznałem, że nowość polegająca na włączaniu i wyłączaniu świateł Mini za pomocą telefonu prędzej czy później zniknie)

Funkcja gry była największym zadaniem, nie tylko dlatego, że nie było dla mnie od razu oczywiste, jaki to może być rodzaj gry. Mini jest zbyt delikatny, aby utrzymać grę z jego obsługą (z wyjątkiem być może przygnębiającego wariantu Jengi). Kolejną przeszkodą było to, że nigdy w życiu nie programowałem gry.

Po roku bezowocnych rozważań natknąłem się na projekt na Hacksterze, w którym Arduino Uno służy do naśladowania zabawki z gry pamięciowej z lat 70. o nazwie Simon. Krótko mówiąc, urządzenie Simon odtwarzało sekwencję świateł, które gracz musiał następnie zapamiętać i odtworzyć, naciskając przyciski. Po każdej udanej rundzie sekwencja była wydłużana.

Pomimo tego, że jest to wymagany rocznik, właściwie nigdy nie słyszałem o tej grze i muszę powiedzieć, że to niesamowite, co kiedyś uchodziło za zabawę. Jeszcze bardziej niesamowite jest to, że gra Simon jest nadal w sprzedaży i zbiera entuzjastyczne recenzje na Amazon. Najwyraźniej musiał to być główny kandydat do przystosowania się do moich celów. W końcu Mini miał już światła, więc wszystko, co musiałem zrobić, to porzucić fizyczne przyciski i mieć dane wejściowe użytkownika za pośrednictwem smartfona. Po stronie oprogramowania wydawało się więc, że będzie to w dużej mierze praca polegająca na wycinaniu i wklejaniu.

Ale najpierw musiałem dokonać drobnych modyfikacji w sprzęcie.

Krok 1: Komponenty, narzędzia i zasoby

Komponenty, narzędzia i zasoby
Komponenty, narzędzia i zasoby

Jeśli replikujesz ten projekt za pomocą Lego Mini, będziesz potrzebować wszystkich rzeczy wymienionych w moim wcześniejszym Instructable. Jedyną dodatkową rzeczą, której potrzebujesz, jest pasywny brzęczyk, który jest używany do klaksonu i wydaje kilka irytujących dźwięków podczas gry (które można wyłączyć).

Jak stanie się jasne podczas omawiania oprogramowania, nie ma rzeczywistej potrzeby używania Lego Mini do gry. Możesz użyć innego zestawu Lego, a nawet kilku diod LED na płytce stykowej podłączonej do dowolnej płytki rozwojowej ESP8266. Z niektórymi przekaźnikami możesz nawet użyć oświetlenia pokoju w domu. Dzieci, najpierw zapytajcie o to rodziców.

Podobnie nie są potrzebne żadne dodatkowe narzędzia ani zasoby poza tymi wymienionymi w oryginalnym projekcie.

Jeśli jesteś wśród garstki osób, które przeczytały oryginalny opis projektu, dowiesz się, że Lego Mini zostało pierwotnie kupione jako prezent dla mojej dorosłej córki, która ma prawie identyczne „prawdziwe” Mini lub prawie identyczne jak można by powiedzieć, że jest to Nowy Mini, a nie „Klasyczny”. Brak jakichkolwiek znaczących dodatkowych elementów sprawił, że ten nowy projekt był jeszcze bardziej atrakcyjny, ponieważ umożliwiłby mi skuteczne ponowne podarowanie Lego Mini 2.0 jako nowego prezentu świątecznego, nie kosztując ani grosza. Geniusz!

Krok 2: Modyfikacja sprzętu

Modyfikacja sprzętu
Modyfikacja sprzętu

Oryginalny projekt miał indywidualnie sterowane wewnętrzne diody LED RGB. Zużyły one trzy piny na NodeMCU, którego używałem jako płytki rozwojowej. Po dyskretnych konsultacjach z właścicielem Lego Mini ustalono, że diody RGB są niedostatecznie wykorzystywaną funkcją. To była ważna inteligencja, ponieważ musiałem zwolnić pin do brzęczyka/klaksonu.

Powyższy schemat obwodu pochodzi z oryginalnego projektu. Jedyną zmianą potrzebną w tym projekcie było usunięcie diod LED RGB i użycie trzech zwolnionych pinów w następujący sposób:

  • D1 dla sygnału sterującego brzęczykiem (który jest również podłączony bezpośrednio do zasilacza 5VDC)
  • D7 dla białej wewnętrznej diody LED
  • D8 dla jednej z tych migających kolorowych diod LED, które nazwałem światłem „dyskotekowym”

Sam brzęczyk jest schludnie schowany pod komorą silnika, więc poprowadzenie przewodów z powrotem do NodeMCU było bardzo proste.

Krok 3: Aktualizacja GUI

Aktualizacja GUI
Aktualizacja GUI
Aktualizacja GUI
Aktualizacja GUI
Aktualizacja GUI
Aktualizacja GUI

Pierwszym krokiem w aktualizacji GUI było utworzenie czterech oddzielnych stron internetowych:

  • „Ekran powitalny”, który uruchamia się za pomocą niestandardowej ikony na smartfonie i prowadzi do innych stron
  • Zakładka "Sterowanie" która, no cóż, steruje światłami (a teraz oczywiście klaksonem)
  • Strona „Gra”
  • Strona konfiguracji, która zawiera opcje konfiguracji, takie jak:

    • Włączanie i wyłączanie dźwięku
    • Ustawianie strefy czasowej (Mini pobiera czas z Internetu, dzięki czemu może migać światłami o odpowiedniej godzinie)
    • Regulacja, kiedy "automatyczne światła" będą włączać i wyłączać reflektory w oparciu o poziom oświetlenia otoczenia
    • Resetowanie nazwy High Score i High Scorer (przechowywanej w EEPROM)

Oddzielenie funkcji w ten sposób zapewnia znacznie bardziej zbliżone do aplikacji doświadczenie. Jednym z wyzwań dla tego projektu było umożliwienie NodeMCU obsługi wielu stron. Po wypróbowaniu kilku różnych podejść natknąłem się na kod widoczny w liniach od 232 do 236 głównego szkicu Arduino. Działa to świetnie - po prostu utwórz plik indeksu, a następnie nazwij kolejne strony page1, page2 itd. Zauważyłem, że muszę umieścić wszystkie pliki zasobów (CSS i obrazy) w głównym folderze danych, ale tak naprawdę nie stanowi to problemu w przypadku witryn ten rozmiar.

Następnie musiałem zabrać się do pracy z CSS i Javascriptem, aby stworzyć coś, co wyglądało, jakby należało do Lego Mini. Ponieważ nie wiem nic na ten temat, było tu dużo googlowania, zanim dostałem coś, z czego byłem zadowolony. Zacząłem od bezwstydnego kopiowania klocków lego w stylu CSS na CodePen tutaj. Chciałem też odejść od oznaczania przycisków tekstem i skończyć na prostej grafice z Icons8, która była idealna do moich celów. Reszta ułożyła się stamtąd na swoim miejscu. Strony renderują się całkiem dobrze na wszystkich iPhone'ach, na których je testowałem. Mam nadzieję, że to samo dotyczy telefonów z Androidem (wygląda dobrze w przeglądarce Chrome na komputerze stacjonarnym).

Krok 4: Kod gry

Kod gry
Kod gry

Komunikacja między serwerem NodeMCU a przeglądarką smartfona odbywa się za pośrednictwem Websocketów. Po naciśnięciu przycisku przez użytkownika przeglądarka wysyła znak tekstowy do NodeMCU, który odpowiada jednemu lub więcej świateł Mini. Dodatkowe postacie są wysyłane w celu kontrolowania przebiegu gry. Kod Arduino podejmuje następnie działanie na podstawie otrzymanego znaku. Komunikacja Websocket może obsługiwać tylko znaki binarne i tekstowe, więc wymagana jest pewna konwersja dla liczb całkowitych (np. strefa czasowa).

Jak wspomniałem, pierwotnie przewidywałem użycie kodu z połączonego projektu Hackster do podstawowych funkcji gry. Spodziewałem się, że po naciśnięciu przycisku przez gracza zaświeci się odpowiednia dioda LED, a kod wykona cyfrowy odczyt na wszystkich diodach LED, aby sprawdzić, czy świeci się właściwa (projekt Hackster sprawdza fizyczne wejścia przycisków, ale to ten sam pomysł). W pewnym sensie to zadziałało, ale z powodów, które wciąż są dla mnie niejasne, nie idealnie. Około 10% przypadków Mini powiedziałby, że został naciśnięty niewłaściwy przycisk, podczas gdy w rzeczywistości był prawidłowy. Wszystko wydawało się w porządku na podstawie tego, co widziałem na monitorze szeregowym iw konsoli przeglądarki, więc nie mam pojęcia, dlaczego to nie działało.

Po wielu kłopotach z próbą wprowadzenia sprawdzania błędów porzuciłem cały pomysł odczytywania stanów diod LED i stworzyłem tablicę „odpowiedzi”, która sprawdza, czy otrzymany tekst Websocket odpowiada prawidłowemu pinowi zapisanemu w tablicy „sekwencji”. odtwarza sekwencję świateł do zapamiętania. Wydaje się to być w 100% niezawodne, nawet jeśli sposób, w jaki go zaimplementowałem, jest trochę nudny. Po wymyśleniu tej metody natknąłem się na to, co jest ciekawą eksploracją sposobu działania niektórych cyfrowych zamków i analogiczną do podejścia zastosowanego w grze.

Czas wprowadzania przycisków jest teraz obsługiwany przez JavaScript po stronie przeglądarki (pozwalam na bardzo hojne 10 sekund między przyciskami), a przebieg gry jest teraz całkowicie kontrolowany przez gracza, a nie na stałe. Wyświetlacz zawiera okna pokazujące czas pozostały do następnego naciśnięcia przycisku oraz liczbę wejść pozostałych do poprawnego przesłania sekwencji przez gracza.

Wysoki wynik jest przechowywany w EEPROM (lub tym, co uchodzi za EEPROM w świecie ESP8266), a jeśli gracz osiągnie nowy wysoki wynik, wyskakujące okienko pozwala mu wpisać wybraną nazwę, która jest również przechowywana w EEPROM. Te wartości można zresetować za pośrednictwem strony konfiguracji (jestem pewien, że mogą być ku temu uzasadnione powody).

Biorąc to wszystko pod uwagę, ponownie wykorzystałem przyzwoitą część kodu gry Hackster, co znacznie przyspieszyło.

Krok 5: Reszta Kodeksu

Reszta Kodeksu
Reszta Kodeksu

W porównaniu z kodem projektu Hackster, mój szkic Arduino wygląda niesamowicie, nawet bez całego kodu HTML, CSS i JavaScript w plikach danych. Ale większość szkicu to kilka funkcji związanych z podstawowymi operacjami, takimi jak tworzenie i zarządzanie serwerem, uzyskiwanie czasu NTP, mDNS, udostępnianie aktualizacji bezprzewodowej, zarządzanie Wi-Fi, zarządzanie plikami SPIFFS i tym podobne.

JavaScript w plikach HTML służy przede wszystkim do obsługi wiadomości Websocket (odbieranych i wysyłanych) oraz zwiększania interaktywności GUI.

Jak wspomniałem, chciałem poprawić funkcjonalność funkcji „automatycznego oświetlenia”, która wykorzystuje rezystor zależny od światła na jedynym pinze analogowym NodeMCU do wykrywania światła otoczenia i włączania świateł Mini na ustalonym poziomie (gdy nie jest w trybie gry, oczywiście). Chociaż jest to bardzo niepoważna funkcja w niepoważnym projekcie, przeszkadzało mi, że w oryginalnym projekcie na stałe zakodowałem próg włączenia i że użytkownik nie miał możliwości sprawdzenia, w jaki sposób dominujący poziom światła jest powiązany z tym progiem. Teraz odczyt poziomu światła jest wysyłany do strony konfiguracji co pięć sekund, a strona ta wyświetla również aktualne progi włączania i wyłączania (które mogą być skonfigurowane przez użytkownika). Więc robota wykonana na tym.

Och, prawie zapomniałem. Kod znajduje się na GitHub tutaj. Po pobraniu umieść całą paczkę w nowym folderze, wgraj szkic Arduino, a następnie zawartość folderu data do SPIFFS.

Zalecana: