Spisu treści:

Osu! Klawiatura: 8 kroków (ze zdjęciami)
Osu! Klawiatura: 8 kroków (ze zdjęciami)

Wideo: Osu! Klawiatura: 8 kroków (ze zdjęciami)

Wideo: Osu! Klawiatura: 8 kroków (ze zdjęciami)
Wideo: 32 sekretne kombinacje na twojej klawiaturze 2024, Lipiec
Anonim
Osu! Klawiatura
Osu! Klawiatura

Niedawno zacząłem grać w grę rytmiczną o nazwie osu! a po obejrzeniu filmu z komercyjną mini klawiaturą pomyślałem, że fajnie byłoby zaprojektować ją samemu. Niedługo potem zdecydowałem, że dobrym pomysłem będzie umieszczenie go w instruktażach jako mój pierwszy projekt.

Jeśli chcesz odtworzyć ten projekt dokładnie do ostatniej instrukcji, to zapraszam do siebie, ale niektóre z moich decyzji nie są oparte na najniższej cenie lub najlepszej jakości. Niektóre komponenty są wybierane niemal wyłącznie dlatego, że leżały w pobliżu. Jeśli sobie z tym poradzisz, zachęcam do dostosowania projektu.

Uwaga 1: Używane są komponenty SMD (mała elektronika), więc jeśli powielisz ten projekt, wymagane są umiejętności lutowania. może zostanie dodana wersja łatwa do lutowania, ale te diody led nie są dostarczane w pakiecie z otworami korytowymi

Uwaga 2: Zaktualizowałem kod wiele razy i jestem teraz do wersji 3ish. Zostawię cały kod online, ale polecam użyć ostatniej wersji. Obecnie nie ma funkcji led, ale powinna być najlepiej działająca.

Krok 1: Materiały i wyjaśnienia

Materiały i wyjaśnienia
Materiały i wyjaśnienia

W zależności od tego, jak zrobisz swój projekt, możesz potrzebować różnych komponentów, ale te komponenty są tymi, których użyłem. Jeśli masz czas i chcesz zaoszczędzić pieniądze, zamów formularz aliexpress i nie zamawiaj PCB.

1 Arduino pro micro + kabel USB

3 czerwone przełączniki Kailh BOX

3 rezystor 10k (0805 SMD)

3 kondensator 100nF (0805 SMD)

4 diody rgb APA102 (5050 SMD)

3 klawisze

1 Płytka drukowana (PCB) dostarczona w tym projekcie

1 etui wydrukowane w 3D dostarczone w tym projekcie

Dlaczego używam Arduino pro micro?

Większość płyt Arduino, takich jak Uno (Atmega328), nie ma natywnej obsługi komunikacji USB. Tak, można je bardzo łatwo zaprogramować przez USB i myślę, że istnieją obejście, ale lubię zachować prostotę, jeśli chodzi o komunikację USB i nie wiem, czy obejścia są tak responsywne. Płyty te wykorzystują zewnętrzny układ scalony, aby umożliwić komunikację USB, podczas gdy Arduino pro micro (Atmega32U4) ma go wbudowaną.

Przełączniki

Istnieje wiele przełączników mechanicznych, których możesz użyć. Linearny, dotykowy lub klikalny od Kailh lub Cherry MX. Wybierz, co chcesz. Użyłem przełączników Kailh, ponieważ były tanie na Ailexpress. Jeśli zdecydujesz się na użycie płytki drukowanej, będziesz potrzebować przełączników Kailh BOX. Kolor określa uczucie.

Komponenty elektroniczne

Niewiele wyjaśniam na ich temat w tym rozdziale, ale jeśli nie używasz płytki drukowanej, polecam zwykłe elementy z otworami korytowymi dla ułatwienia lutowania. Niestety zastosowane diody nie są dostępne w pakietach z otworami korytowymi. Nie polecałbym również używania przewodów na pakietach SMD, chyba że jesteś bardzo pewny swoich umiejętności lutowania. Nawet dla SMD na płytce PCB wymagane są „zaawansowane” umiejętności lutowania.

Obudowa

Zapewniam obudowę w tym projekcie, ale w tej chwili jest to wadliwe. Konieczne są modyfikacje w celu dopasowania śrub, otwory na diody nie są optymalne, arduino jest odsłonięte i trzeba wyciąć część, aby pasowała do USB. W przyszłości może zostać dodana nowa obudowa. Jeśli masz drukarkę 3D, wydrukuj ją, ale nie wychodź z siebie, aby wydrukować tę wadliwą obudowę, jeśli tego nie zrobisz i po prostu użyjesz jakiegoś pudełka projektu.

Krok 2: Schemat

Schemat
Schemat

Schemat tego projektu jest dość prosty, ale chcę wyjaśnić komponenty osobom, które są zainteresowane i nie znają tej implementacji.

Przełącz połączenia z Arduino

Przełączniki są podłączone do pinów 0, 2 i 3 Arduino, ponieważ te piny mogą być używane jako zewnętrzne przerwania. Jest to dokładniej wyjaśnione w sekcji kodu.

Obwód odbicia

Po lewej stronie schematu znajduje się obwód, który jest kopiowany 3 razy. Ten obwód służy do odbicia przełącznika. Aby wiedzieć, czym jest odbijanie, musisz zrozumieć odbijanie przełączników i nie jest to trudne do zrozumienia.

Najpierw spójrz na tę symulację, aby namalować pierwszy obraz (szybko kliknij przełącznik i spójrz na sygnał poniżej)

Po naciśnięciu lub zwolnieniu przełącznika odbija się on, a sygnał zmienia się kilka razy między wysokim a niskim przez kilka milisekund. Arduino jest naprawdę szybkie i odczytuje każdy wysoki i niski poziom w tak krótkim czasie. Program wysyła naciśnięcie lub zwolnienie klawisza za każdym razem, gdy odczytany zostanie wysoki lub niski poziom, więc z każdym naciśnięciem komputer otrzyma wielokrotne naciśnięcia klawiszy. Nie jest idealny do gry rytmicznej.

Ten obwód debounce spowolni opadające zbocze sygnału. Sygnał do Arduino nie będzie mógł się zmienić tak szybko, jak nastąpi odbicie, więc zostanie odczytany jako jedno naciśnięcie. Nie martw się, że spadnie zbyt wolno do następnej prawdziwej prasy, ponieważ tak się stanie.

Zaawansowany:

Atmaga32U4 odczytuje cyfrowy niski przy 0,2 Vcc - 0,1 V = 0,9 wolta. Napięcie kondensatora w dowolnym momencie rozładowania wynosi Vcc * e^ (-t / RC). Jeśli zmierzysz inny czas odbicia na swoim przełączniku, możesz obliczyć wartości rezystora i kondensatora.

formularz formuły

Diody LED

Diody rgb to diody APA102, które można indywidualnie adresować za pomocą zegara i linii danych. Do ich działania nie są potrzebne żadne komponenty zewnętrzne. W przypadku wielu diod LED powinieneś użyć kondensatora równoległego do 5 V i masy, ale przy zaledwie 4 diodach LED go nie potrzebujesz.

Krok 3: Projekt tablicy

Projekt płyty
Projekt płyty

Płytka została zaprojektowana w JLCPCB. Nie jestem przez nich sponsorowany, ale do tanich prototypów robią doskonałe płytki PCB. Za 2 dolary dostajesz 10 takich samych płyt, ale wysyłka kosztowała dla mnie około 11 dolarów. Jeśli niekoniecznie potrzebujesz oświetlenia rgb i planujesz zrobić tylko jedno, powinieneś rozważyć zrobienie klawiatury bez PCB.

Projekt płyty był dość prosty. Musiałem tylko dodać komponent do przełączników, ale po obejrzeniu kilku filmów zrozumiałem to. Jedyną wadą, z której się zorientowałem, jest umieszczenie otworów nieco zbyt blisko przełączników.

Aby zamówić płytkę wejdź na https://jlcpcb.com/ i wybierz opcję 2 warstwową. Poprosi cię o plik Gerber. pobierz plik „.zip” i przeciągnij go do okna. Nie musisz go rozpinać. Ustawienia powinny być w porządku i możesz śmiało sfinalizować zamówienie.

Krok 4: Wskazówki dotyczące projektowania obudowy i montażu

Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy
Wskazówki dotyczące projektowania i montażu obudowy

Projekt

Jak wspomniałem wcześniej, mój projekt jest wadliwy, ale nadal możesz go wydrukować, jeśli chcesz. projekt został wykonany w Fusion 360. Jest to darmowe oprogramowanie do modelowania 3D, a dzięki mojemu doświadczeniu od wynalazcy i solidworks było dość łatwe w obsłudze. Kółka na rogach obudowy mają zapobiegać odrywaniu się od podłoża.

Jeśli tworzysz własną sprawę, tylko jedna rzecz jest naprawdę ważna. Twoje przełączniki muszą być mocno umieszczone i nie mogą się poruszać. Dołączyłem zdjęcia kwadratowych wycięć z wymiarami, abyś mógł ich użyć do własnego projektu, zakładając, że używasz przełączników Kailh BOX.

montaż

Teraz masz wszystkie elementy potrzebne do montażu. Jest zamówienie zmontowania tej pierwszej wersji, ponieważ przełączniki są lutowane.

1. Przylutuj elementy SMD. to są rezystory, kondensatory i diody LED.

2. Przylutuj Arduino pro micro.

3. Umieść 3 przełączniki w wydrukowanej w 3D nakładce przed lutowaniem. Nakładki nie można zdjąć po wlutowaniu przełączników. Nie zaleca się wylutowywania przełączników i może je zniszczyć.

4. Teraz przylutuj przełączniki na miejscu. Zrób to tak szybko, jak to możliwe, ponieważ plastikowe przełączniki mogą się stopić i zniszczyć lub drastycznie zmniejszyć liczbę kliknięć.

5. Umieść zmontowaną nakładkę w wydrukowanej obudowie 3D i zabezpiecz taśmą lub użyj śrub, jeśli nie kolidują z nasadkami klawiszy.

6. Umieść keyCaps na przełącznikach i gotowe.

Rekomendacje

Wylutuj lub zamaskuj diody na arduino po wgraniu kodu. Diody są ładne, jeśli kod się nie ładuje, ale nie są ładne, jeśli chodzi o gotowy produkt. Wymagane są umiejętności i szpiczaste pęsety.

Również niektóre uchwyty na spodzie są przyjemne dla antypoślizgu i pozwalają prześwitywać światło rgb.

Krok 5: Kod V1 (odbicie sprzętowe)

Kod V1 (odbicie sprzętowe)
Kod V1 (odbicie sprzętowe)
Kod V1 (odbicie sprzętowe)
Kod V1 (odbicie sprzętowe)

Kod tego projektu nie jest przyjazny dla początkujących, więc jeśli dopiero zaczynasz programować w arduino, ten kod może cię trochę przestraszyć. Jednak postaram się jak najlepiej wyjaśnić o co chodzi. Niektóre rzeczy są wyjaśnione w dalszej części tego tekstu, więc jeśli masz pytania, najpierw przeczytaj całość.

Wgrywanie kodu

Najpierw pobierz wszystkie 3 pliki ".ino" i umieść je w jednym folderze. Jeśli nie masz Arduino IDE, po prostu pobierz je za darmo z oficjalnej strony arduino.

Podłącz Arduino do komputera i otwórz „OSU_Keyboard_code_V1.ino”. W Tablicy Narzędzi wybierz "Arduino/Genuino Micro". Również w Narzędziach wybierz odpowiedni port COM. Czasami może się to zmienić. Aby przesłać kod do Arduino, wystarczy kliknąć strzałkę w lewym górnym rogu ekranu i poczekać, aż poinformuje o zakończeniu w lewym dolnym rogu.

OSU_Keyboard_code_V1

Uwzględnianie i definiowanie

Najpierw musisz dołączyć bibliotekę klawiatury. Umożliwia to wykorzystanie Arduino jako klawiatury.

Następnie definiuję kilka wartości. Define jest jak zmienna, ale nie może się zmieniać podczas działania programu. Pierwsze 9 to znak klawiatury, numer pinu arduino i bity portu.

Następnie bity portu danych LED i zegara.

Zdefiniowana jest również liczba diod LED oraz zmienna dla kąta koła kolorów.

Ustawiać

Ta część kodu zostanie wykonana tylko raz, gdy arduino jest podłączone.

Najpierw piny zegara i danych diod LED są ustawione jako wyjścia, a piny przełącznika jako wejścia. To jest zaawansowana wersja pinMode(). Jeśli jesteś zainteresowany, wyszukaj „bezpośrednia manipulacja portami”.

Keyboard.begin() po prostu uruchamia połączenie USB jako klawiaturę.

Kolejne 3 przerwania są połączone z pinami przełącznika. Za każdym razem, gdy na bolcu przełącznika zostanie wykryta zmiana, zostanie wykonany mały program. Ten mały program będzie dalej rozwijany.

Pętla

Ta część będzie się stale powtarzać, gdy arduino jest zasilane.

Używam go tylko do zmiany i aktualizacji koloru diod LED.

Przerwania

Tutaj wykonywane są małe programy, które będą wykonywane tylko po wykryciu zmiany na kołkach przełącznika. Są identyczne, z wyjątkiem tego, na który pin reagują.

Najpierw sprawdza, czy przycisk jest wciśnięty, czy zwolniony i wysyła poprawną komendę z klawiatury.

LED (wyjaśnione w innej kolejności)

Jeśli jesteś ciekawy, jak sterowane są diody LED, powinieneś zajrzeć do arkusza danych APA102.

Jeden bit

Jest to ponownie wersja zapisu cyfrowego z bezpośrednią manipulacją portami.

Najpierw sprawdza, czy powinien wysłać 0 czy 1 i odpowiednio ściąga pin danych do niskiego lub wysokiego poziomu. Następnie zapisuje pin zegara bardzo krótko i ponownie zapisuje go w niskim stanie.

Jeden bajt

To powtarza się jedenBit 8 razy z pętlą "for". Odczytuje pierwszy bit w bajcie i przekazuje jego wartość do funkcji oneBit i robi to samo dla następnych 7 bitów.

LedData

To powtarza się 4 razy jeden bajt, aby dostarczyć dane potrzebne dla jednej diody led. Pierwszy bajt zaczyna się od 111xxxxx i 5-bitowej wartości jasności w miejscu xxxxx. Jasność można ustawić od 0 do 31 (2^5 = 32 poziomy).

Kolejne 3 bajty dotyczą wartości niebieskiej, zielonej i czerwonej. Jeden bajt na każdy kolor.

ColorWheelThisLed

Ta funkcja wywołuje ledData, nadaje jej kolory rgb w zależności od kąta w kole kolorów.

16-bitowa wartość jest podzielona na 6 równo rozmieszczonych sekcji po 60 stopni. Spojrzenie na obrazy może pomóc ci lepiej zrozumieć.

(dostarczona jest również wersja 8-bitowa, ale została skomentowana, ponieważ jest zbyt migotliwa)

StartEndRamka

Ramka startowa musi być używana za każdym razem, gdy chcesz wysłać nowe kolory do diod led i chcesz zaktualizować rzeczywisty kolor diod led

Używam tylko ramki początkowej, ponieważ ramka końcowa nie jest potrzebna. Ramka początkowa ma 4 bajty po 0. Ramka końcowa ma 4 bajty po 255 (11111111).

Krok 6: Kod V2 (odbicie oprogramowania z timerami)

Kod V2 (odbicie oprogramowania z timerami)
Kod V2 (odbicie oprogramowania z timerami)

Po pewnym czasie gry zauważyłem problemy z podwójnym stuknięciem w sprzęcie. Można to naprawić za pomocą innych rezystorów wartości lub kondensatorów, ale ponieważ przyciski i pokrywa nie są zdejmowane, pomyślałem, że usuwanie oprogramowania byłoby dobrym rozwiązaniem. Odbicie oprogramowania powinno działać bez względu na to, czy jest zaimplementowane, czy nie. W mojej obecnej konfiguracji nie mogłem zdjąć pokrywy, więc po prostu zostawiłem rezystory i kondensatory na miejscu.

Nie będę wyjaśniał kodu tak obszernie, jak w poprzedniej wersji, ponieważ jest trochę trudniejszy do wytłumaczenia.

Zasadniczo większość kodu działa tak samo, a kod led pozostaje nietknięty. co się zmieniło, to zewnętrzne przerwania nie używają już funkcji arduino. Teraz działa w czystym kodzie C. A teraz dodano przerwanie programowe. W tym celu użyłem timerów AVR, aby odczekać określoną ilość czasu, aż odbijanie się zatrzyma. Ponieważ zegary są oparte na przerwaniach, na czas odbicia nie ma wpływu nic, co dzieje się w pętli.

Jedynym minusem, jaki mogę wymyślić, jest to, że funkcje opóźnienia arduino nie mogą być już używane. Ponieważ funkcje opóźnienia używają Timera 0, a ten program używa Timera 0 do odbicia.

Na obrazku możesz zobaczyć, jak z grubsza działa kod. Bit mem wskazuje, czy timer jest uruchomiony. To, czego nie pokazano, to przypadek, w którym po naciśnięciu przycisku wejście jest niskie. W tym przypadku zostanie wysłane tylko naciśnięcie klawisza, gdy przycisk jest już zwolniony. Co oznacza, że klawisz zostanie przytrzymany, jeśli chodzi o komputer. W przypadku tego rzadkiego wyjątku sprawdzenie zostanie wykonane po upływie czasu. Jeśli pod koniec odliczania przycisk nie zostanie naciśnięty, zostanie wysłana komenda zwolnienia klawisza.

Krok 7: Kod V3 (odbicie oprogramowania z licznikiem pionowym) (zalecane) (bez diody LED)

Kod V3 (odbicie oprogramowania z licznikiem pionowym) (zalecane) (bez diody LED)
Kod V3 (odbicie oprogramowania z licznikiem pionowym) (zalecane) (bez diody LED)

Ten kod RÓWNIEŻ ma wersję, w której nie potrzebujesz rezystorów ściągających. Upewnij się, że podłączasz każdy przycisk do wejścia i MASY! Stosowane jest podciąganie wbudowane

Doświadczyłem też kilku niezarejestrowanych pras w kodzie V2. Myślę, że kod stał się po prostu zbyt złożony z przerwaniem czasowym i zewnętrznym i mogłem przeoczyć kilka wyjątków. Z tego powodu zacząłem od zera wyszukiwanie w Internecie metod debounce oprogramowania.

(Szczerze, co najmniej połowa tego projektu stała się w tym momencie odbijaniem przycisków)

Po kilku poszukiwaniach natknąłem się na ten post:

www.compuphase.com/electronics/debouncing….

Szczerze mówiąc, zajęło mi trochę czasu, aby w pełni zrozumieć, jak to dokładnie działa. Wiąże się to z dość skomplikowanymi manipulacjami bitami, ale postaram się to maksymalnie uprościć. Jednak moje wyjaśnienia będą tylko dodatkiem do postu, więc powinieneś przynajmniej przeczytać "liczniki pionowe", "implementację z adnotacjami" i "zmniejszanie opóźnień".

Moje wyjaśnienie

Diagram czasowy (wykonany w WaveDrom), który dodałem, powinien sprawić, że ta trudna do zrozumienia matematyka bitowa będzie przynajmniej trochę bardziej zrozumiała. Zauważ, że obraz ma 2 bity licznika, ale mój kod ma 3. Oznacza to dłuższy czas odbicia.

Jeden bit na wartość

Dzięki wdrożeniu licznika pionowego możliwe jest równoczesne odbijanie wielu przycisków. Wszystkie wartości są typu Byte(uint8_t) i składają się z 8 bitów. nie interesuje nas, jaką wartość zawiera którykolwiek z tych bajtów, ale raczej interesują nas same bity. Każdy przycisk, który ma zostać usunięty, wykorzystuje tylko jeden bit każdego bajtu. Pierwszy przycisk używa tylko pierwszego bitu każdego bajtu, drugi przycisk używa drugiego bitu itd.

Wszystko w tym samym czasie

Używając matematyki bitowej, możliwe jest równoległe wykonanie tych odbić. I chociaż matematyka bitowa jest dość skomplikowana, jest bardzo wydajna dla procesora.

W przypadku 8-bitowego typu danych można to zrobić dla 8 przycisków. Używanie większych typów danych pozwala na więcej odbić na raz.

Odbicie

Procedura debounce jest wykonywana co 1 milisekundę z przerwaniem czasowym.

kiedy przycisk jest wciśnięty, buttonState, który jest stanem odbicia, stopniowo obniży się, wskazując naciśnięcie przycisku. Aby wykryć zwolnienie, przycisk musi być wystarczająco długo ustawiony wysoko, co oznacza, że nie odbijał się przez pewien czas. Przełącznik służy do wskazania zmiany przycisku. Liczniki są używane do …. licząc od jak dawna nie było odbicia.

Delta wskazuje różnicę między stanem wejściowym a stanem odbicia. Licznik liczy się tylko wtedy, gdy jest różnica. licznik zostanie zresetowany po wykryciu odbicia (delta wynosi 0).

Krok 8: Wynik

Image
Image

Jeśli wszystko poszło dobrze, powinieneś mieć działającą klawiaturę do grania w Osu! na. Osobiście w ogóle nie zauważyłem żadnych opóźnień. Jeśli tak, daj mi znać. Również jeśli są jakieś pytania, możesz o cokolwiek zapytać.

Poprzednie wzmianki o V2 nie są obietnicą, więc nie odkładaj tego projektu, ponieważ chcesz poczekać na V2.

Mam nadzieję, że spodoba Ci się klawiatura!

Osu! imię: Thomazz3

Rozwiązywanie problemów

Jeśli uważasz, że masz problemy z klawiaturą, najpierw otwórz edytor tekstu i naciśnij każdy klawisz raz przez krótki czas.

Czy jeden lub kilka kluczy nie działa?

Możliwe, że zniszczyłeś wewnętrznie przełącznik podczas lutowania. Jeśli masz multimetr, ustaw go na ciągłość/sygnał dźwiękowy, ustaw go równolegle do przełącznika, gdy Arduino nie jest podłączony i naciśnij klawisz. Powinno wydać sygnał dźwiękowy.

Czy znaki, które właśnie wpisałeś, pasują do klawiszy skonfigurowanych w Osu! ?

Zmień znaki w kodzie arduino w pierwszych 3 #Defines (' ' jest konieczne!).

Lub zmień swoje Osu! ustawienia, aby korzystać ze skonfigurowanych klawiszy.

Czy jeden lub kilka klawiszy powtarza się kilka razy?

Obwód debounce prawdopodobnie nie działa z twoimi przełącznikami lub nie jest prawidłowo przylutowany. Sprawdź połączenia lutowane. Jeśli nadal występuje, wypróbuj kondensator o wartości 1uF. To będzie bardzo trudne dla użytkowników PCB.

Jeśli masz problemy z diodami LED

Czy diody LED migoczą?

Połączenie lutowane może być luźne. Jeśli użyjesz PCB potwierdź, że cyna lutownicza naprawdę spłynęła na pad na wydruku.

Czy żadna z diod nie działa lub z pewnej liczby diod przestaje działać?

Sprawdź, czy nie ma zwarć między połączeniami pierwszej diody LED (podążaj za ścieżkami) i sprawdź dobrze podłączoną cynę na wyjściach Arduino i ponownie pierwszą diodę LED. Jeśli potwierdzi się poprawność i nadal występuje usterka, może być konieczna wymiana pierwszej diody LED.

Jeśli to naprawi, w razie potrzeby powtórz dla następnych diod LED.

Zalecana: