Programowanie kostki LED Arduino 4x4x4 LED, aby zrobić jeszcze więcej niesamowitych rzeczy

  • Brian Curtis
  • 0
  • 4558
  • 927
Reklama

W zeszłym tygodniu zbudowałem kostkę LED Jak zrobić pulsującą kostkę LED Arduino, która wygląda na to, że pochodzi z przyszłości Jak zrobić pulsującą kostkę LED Arduino, która wygląda na to, że pochodzi z przyszłości Jeśli zająłeś się niektórymi projektami Arduino dla początkujących , ale szukają czegoś trwałego i na zupełnie innym poziomie niesamowitości, to skromna kostka LED 4 x 4 x 4 to… - 64 diody LED że możesz zaprogramować tworzenie fantastycznych futurystycznych pokazów świetlnych - i mam nadzieję, że Ty też to zrobiłeś, ponieważ jest to świetny projekt, aby zmotywować cię i rozwinąć umiejętności Arduino. Zostawiłem ci kilka podstawowych aplikacji, abyś mógł się zastanowić, ale dziś przedstawię jeszcze kilka fragmentów oprogramowania, które stworzyłem dla kostki, wraz z objaśnieniami do kodu. Ma to na celu zarówno zapewnienie więcej ładnych pokazów świetlnych do uruchomienia, ale także poznanie niektórych ograniczeń programowania kostki i poznanie nowych koncepcji programowania w tym procesie.

To jest dość zaawansowane kodowanie; naprawdę musisz przeczytać wszystkie moje poprzednie samouczki Arduino i nasz przewodnik dla początkujących Arduino przed dostosowaniem dostarczonego kodu.

Aplikacja 1: Mini Snake

Zamiast uruchamiać ustaloną sekwencję wzorców przypominającą węża, chciałem zaprogramować węża - sztuczny, który dokonywałby własnych losowych wyborów i byłby całkowicie nieprzewidywalny. Jest ograniczony tylko do 2 segmentów, które wyjaśnię później, a demo możesz zobaczyć poniżej. Pobierz pełny kod tutaj.

Podczas pracy z przestrzenią 3D potrzebujesz 3 współrzędnych dla jednego punktu: X, Y, i Z.

Jednak w naszej kostce płaszczyzny X i Z są reprezentowane przez piny LED, podczas gdy Y jest bezpośrednio odwzorowane na płaszczyźnie katody. Aby ułatwić pracę z tymi współrzędnymi i ustalenie ruchu wokół sześcianu, stworzyłem nowy typ danych (przy użyciu struct) reprezentować pojedynczy punkt na sześcianie - który nazwałem “xyz”. Składa się tylko z dwóch liczb całkowitych: “xz”, i “y”. Dzięki tej strukturze mógłbym również reprezentować kierunek wskazany poniżej w naszym specjalnym układzie współrzędnych (xz, y):

Ruch Y. (Góra dół): (xz, y + 1), (xz, y-1)
Z ruch (do przodu, do tyłu): (xz-1, y), (xz + 1, y)
Ruch X (Lewo prawo): (xz + 4, y), (xz-4, y)

Na przykład, aby przesunąć diodę LED na pozycję (0,0) jeden do lewej, aplikujemy (xz + 4, y) i skończyć z (0,4).

Istnieją pewne ograniczenia dotyczące ruchu - mianowicie, że współrzędne Y mogą być tylko możliwe Od 0 do 3 (0 oznacza dolną warstwę, 3 oznacza górną), a współrzędne XZ mogą być tylko Od 0 do 15. Dalszy limit jest ustalony dla ruchu Z, aby zapobiec “skoki” od tyłu do przodu sześcianu i odwrotnie. W tym przypadku używamy funkcji modułu do testowania wielokrotności 4 i odrzucamy tę próbę ruchu. Ta logika jest reprezentowana w ważny() funkcja, która zwraca wartość true, jeśli proponowany kierunek jest dopuszczalnym ruchem, a false w przeciwnym razie. Dodałem kolejną funkcję, aby sprawdzić odwrotny kierunek - oznacza to, że jeśli wąż zmierza w jednym kierunku, nie chcemy, aby cofał się sam, nawet jeśli jest to prawidłowa lokalizacja do przeniesienia się - i ruszaj się() funkcja, która przyjmuje współrzędną, kierunek i zwraca nową współrzędną.

The XYZ typ danych, ważny(), ruszaj się() i odwrotność() wszystkie funkcje można znaleźć w xyz.h plik w plikach do pobrania. Jeśli zastanawiasz się, dlaczego został on umieszczony w osobnym pliku zamiast w głównym pliku programu, jest to spowodowane skomplikowanymi regułami kompilatora Arduino, które uniemożliwiają działanie funkcji zwracanie niestandardowych typów danych; należy je umieścić we własnym pliku, a następnie zaimportować na początku pliku głównego.

W głównym pliku środowiska wykonawczego tablica wskazówek przechowuje wszystkie możliwe ruchy, które może wykonać wąż; możemy po prostu wybrać losowego członka tablicy, aby uzyskać nowy kierunek. Zmienne są również tworzone w celu przechowywania bieżącej lokalizacji (teraz), poprzedniej kierunek i poprzednie Lokalizacja. Reszta kodu powinna być dla ciebie dość oczywista; tylko for pętle oraz włączanie i wyłączanie diod LED. W głównej pętli sprawdzamy, czy proponowany kierunek jest prawidłowy, a jeśli tak, to idziemy tą drogą. Jeśli nie, wybieramy nowy kierunek.

Jedyną rzeczą, na którą należy zwrócić uwagę w głównej pętli, są pewne kontrole w celu znalezienia błędu polegającego na multipleksowaniu: jeśli nowa lokalizacja znajdowała się na tej samej płaszczyźnie katody lub tym samym pinie anody, wyłączenie poprzedniej diody LED spowodowałoby zgaśnięcie obu. Również w tym momencie zdałem sobie sprawę, że wyjście poza węża 2-segmentowego będzie niemożliwe w mojej obecnej implementacji: spróbuj zapalić 3 diody LED w ustawieniu narożnym. Nie możesz, ponieważ przy aktywowanych pinach 2 warstw i 2 diod LED zapalą się 4 diody LED, a nie 3. Jest to nieodłączny problem z naszą ograniczoną multipleksową konstrukcją kostki, ale nie martw się: po prostu musimy użyć mocy utrzymywanie wizji przepisać metodę rysowania.

Trwałość widzenia oznacza, że ​​kiedy światło dociera do naszych oczu sekwencyjnie - szybciej niż możemy to przetworzyć - wydaje się być pojedynczym obrazem. W naszym przypadku, zamiast rysować wszystkie cztery warstwy w tym samym czasie, powinniśmy narysować pierwszą, dezaktywować ją, narysować drugą i dezaktywować: szybciej niż jesteśmy w stanie stwierdzić, że nawet zmiana się dzieje. Jest to zasada, na której działają autorzy wiadomości, jak ta:

Nowa metoda rysowania z wykorzystaniem trwałości widzenia

Najpierw nowa procedura losowania. Stworzyłem Dwuwymiarowa tablica 4 x 16 bitów (prawda lub fałsz), aby być dosłowną reprezentacją stanu kostki LED. Procedura losowania zapewni trwałość widzenia, po prostu iterując nad tym i wypłukując każdą warstwę do kostki na krótką chwilę. Będzie nadal rysował się w bieżącym stanie, aż upłynie czas odświeżania, w którym to momencie przekażemy kontrolę z powrotem do głównej pętli (). Zapisałem tę sekcję kodu w tym pliku LED_cube_POV, więc jeśli chcesz po prostu wskoczyć do programowania własnych gier i nie krępuj się, użyj tego jako podstawy.

App 2: Game of Life

Na razie opracujmy to w podstawową wersję Gry życia Conwaya. Dla tych z was, którzy są nieznani (spróbuj googlować, aby znaleźć niesamowitą animację pisanek), Gra życia jest przykładem automatów komórkowych, które tworzą fascynujący wzorzec zachowań wschodzących, biorąc pod uwagę tylko kilka prostych zasad.

Tak wyglądają na przykład mrówki poruszające się z inteligencją i umysłem ulowym, pomimo faktu, że faktycznie przestrzegają bardzo podstawowych zasad hormonalnych. Oto pełny kod do pobrania: naciśnij nastawić przycisk, aby zrestartować. Jeśli zauważysz, że ciągle pojawia się ten sam wzór, spróbuj dłużej przytrzymać przycisk odpoczynku.

Oto zasady gry w życie:

  • Każda żywa komórka z mniej niż dwoma żywymi sąsiadami umiera, jakby była spowodowana niedostateczną populacją.
  • Każda żywa komórka z dwoma lub trzema żyjącymi sąsiadami żyje w następnym pokoleniu.
  • Każda żywa komórka z więcej niż trzema żywymi sąsiadami umiera, jakby była przeludniona.
  • Każda martwa komórka z dokładnie trzema żywymi sąsiadami staje się żywą komórką, jakby przez rozmnażanie.

Uruchom kod. Zauważysz w ciągu 5 do 10 “pokolenia”, automaty prawdopodobnie zatrzymały się, stabilizując się na określonej pozycji; czasami ten stabilny wzór zmienia lokalizację i przesuwa się po planszy. W rzadkich przypadkach mogą nawet całkowicie wymrzeć. Jest to ograniczenie polegające na pracy tylko z diodami LED 4x4x4, ale i tak jest to dobre ćwiczenie edukacyjne.

Aby wyjaśnić kod:

  • Możesz być nieznany memcpy () funkcjonować. Użyłem tego, aby zapisać poprzedni stan gry, ponieważ tablice nie mogą być po prostu przypisane do siebie jak normalne zmienne - musisz faktycznie skopiować w przestrzeni pamięci (w tym przypadku 64 bity).
  • howManyNeighbours () funkcja powinna być zrozumiała, ale w innym przypadku - ta metoda przyjmuje pojedynczą współrzędną i przebiega przez każdego możliwego sąsiada (ta sama tablica kierunków, której poprzednio używaliśmy w aplikacji węża), aby sprawdzić, czy są poprawne. Następnie sprawdza, czy sąsiednie diody LED były „włączone” w poprzednim stanie gry, i liczy, ile ich jest.
  • Główną funkcją tej aplikacji Game of Life jest progressGame (), który stosuje reguły automatów do bieżącego stanu gry.

Ulepszenia: Do tej pory spędziłem na tym zdecydowanie za dużo czasu, ale możesz spróbować dodać czek, który automatycznie resetuje płytkę po około 5 generacjach tego samego wzoru. proszę daj mi znać! Proponuję również spróbować dodać metodologię POV do gry w węża, aby, mam nadzieję, umożliwić dłuższy wąż.

To wszystko ode mnie dzisiaj. W późniejszym czasie mogę ponownie odwiedzić kilka aplikacji kostki Arduino LED, ale mam nadzieję, że powinieneś być w stanie zmodyfikować mój kod i stworzyć własne reguły gry: daj nam znać, co wymyśliłeś w komentarzach, abyśmy wszyscy mogli pobrać twoje dzieła! Jak zawsze będę tutaj, aby odpowiedzieć na twoje pytania i bronić moich przerażających umiejętności kodowania.

Źródło zdjęcia: współrzędne kartezjańskie - użytkownik Wikimedia Sakurambo




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.