Innholdsfortegnelse:

Osu! Tastatur: 8 trinn (med bilder)
Osu! Tastatur: 8 trinn (med bilder)

Video: Osu! Tastatur: 8 trinn (med bilder)

Video: Osu! Tastatur: 8 trinn (med bilder)
Video: 8 инструментов в Excel, которыми каждый должен уметь пользоваться 2024, Juli
Anonim
Osu! Tastatur
Osu! Tastatur

Jeg begynte nylig å spille et rytmespill som heter osu! og etter å ha sett en video av et kommersielt mini -tastatur tenkte jeg at det ville være et morsomt prosjekt å designe et selv. Ikke lenge etter bestemte jeg meg for at det ville være en god idé å legge det på instruktører som mitt første prosjekt.

Hvis du vil gjenskape dette prosjektet nøyaktig til den siste instruksjonen, så vær min gjest, men noen av desisjonene jeg gjorde er ikke basert på laveste pris eller beste kvalitet. Noen komponenter er valgt nesten rent fordi jeg hadde dem liggende. Hvis du kan håndtere det, vil jeg oppfordre deg til å tilpasse prosjektet ditt.

Merknad 1: SMD -komponenter (liten elektronikk) brukes, så hvis du replikerer dette prosjektet, er det nødvendig med loddingsevner. kanskje en enkel å lodde versjon vil bli lagt til, men disse lysdiodene kommer ikke i en hullpakke

Merknad 2: Jeg har oppdatert koden flere ganger og er nå opp til versjon 3ish. Jeg lar all koden ligge på nettet, men jeg anbefaler at du bruker den siste versjonen. Den har for øyeblikket ikke ledet funksjonalitet, men den burde være best.

Trinn 1: Materialer og forklaringer

Materialer og forklaringer
Materialer og forklaringer

Avhengig av hvordan du lager prosjektet ditt, kan du trenge forskjellige komponenter, men disse komponentene er de jeg brukte. Hvis du har tid og vil spare penger, bestiller du skjemaet aliexpress og ikke bestiller kretskortet.

1 Arduino pro micro + USB -kabel

3 Kailh BOX røde brytere

3 10k motstand (0805 SMD)

3 100nF kondensator (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 nøkkelhett

1 kretskort (PCB) som følger med i dette prosjektet

1 3D -trykt eske følger med i dette prosjektet

Hvorfor bruker jeg en Arduino pro micro?

De fleste arduino -kort som Uno (Atmega328) har ikke innebygd støtte for USB -kommunikasjon. Ja, du kan enkelt programmere dem over USB, og jeg tror det finnes løsninger, men jeg liker å holde det enkelt når det gjelder USB -kommunikasjon, og jeg vet ikke om løsningene er like responsive. Disse kortene bruker en ekstern brikke for å gjøre USB -kommunikasjon mulig, mens Arduino pro micro (Atmega32U4) har den innebygd.

Bryterne

Det er mange mekaniske brytere du kan bruke. Lineær, taktil eller klikkete fra Kailh eller Cherry MX. Velg det du liker. Jeg brukte Kailh -bryterne fordi de var billige på Ailexpress. Hvis du velger å bruke kretskortet, trenger du Kailh BOX -brytere. Fargen bestemmer følelsen.

De elektroniske komponentene

Ikke mye å forklare om dem i dette kapitlet, men hvis du ikke bruker kretskortet, vil jeg anbefale bare vanlige hullkomponenter for lodding. Dessverre er ikke de brukte ledsene tilgjengelige i hullpakker. Jeg vil heller ikke anbefale å bruke ledninger på SMD -pakker med mindre du er veldig trygg på dine loddeferdigheter. Selv for SMD på en PCB er "avanserte" loddingskunnskaper nødvendig.

Boligen

Jeg skaffer bolig i dette prosjektet, men det er for øyeblikket feil. Modifikasjoner er nødvendig for å montere bolter, åpningene for lysdiodene er ikke optimale, arduinoen er eksponert og en del må kuttes ut for at USB -en skal passe. I fremtiden kan det komme nye boliger. Hvis du har en 3D -skriver, kan du skrive den ut, men ikke gå ut av veien for å skrive ut denne mangelfulle saken hvis du ikke gjør det, og bare bruk en slags prosjektboks.

Trinn 2: Den skjematiske

Den skjematiske
Den skjematiske

Skjematikken for dette prosjektet er ganske enkel, men jeg vil forklare komponentene for de som er interessert og ikke kjenner denne implementeringen.

Bytt tilkobling til Arduino

Bryterne er koblet til Arduino -pinner 0, 2 og 3 fordi disse pinnene kan brukes som eksterne avbrudd. Dette forklares nærmere i kodeseksjonen.

Nedstigningskretsen

På venstre side av skjematikken er en krets som kopieres 3 ganger. Denne kretsen brukes til å avbryte bryteren. For å vite hva debouncing er, må du forstå switch bouncing, og det er ikke vanskelig å forstå.

Se først på denne simuleringen for å male et første bilde (klikk på bryteren raskt og se på signalet nedenfor)

Når du trykker på eller slipper en bryter, spretter den og signalet ditt veksler mellom høyt og lavt et par ganger i noen få millisekunder. En Arduino er veldig rask og leser hvert høyt og lavt på denne korte tiden. Programmet sender et tastetrykk eller slipper hver gang en høy eller lav leses, så for hvert trykk vil datamaskinen motta flere tastetrykk. Ikke ideelt for et rytmespill.

Denne avvisningskretsen vil bremse den fallende kanten av signalet. Signalet til Arduino vil ikke kunne endres så raskt som hoppet skjer, så det vil bli lest med ett trykk. Ikke bekymre deg for at det kommer til å sakte for neste virkelige presse, fordi det vil.

Avansert:

Atmaga32U4 leser et digitalt lavpunkt på 0,2Vcc - 0,1V = 0,9 volt. Spenningen til kondensatoren når som helst i utladningen er Vcc * e^(-t/RC). Hvis du måler en annen avvisningstid på bryteren, kan du beregne motstands- og kondensatorverdiene.

formelform

Lysdiodene

Rgb -lysdiodene er APA102 -lysdioder som kan adresseres individuelt ved hjelp av en klokke og datalinje. Ingen eksterne komponenter er nødvendig for å få dem til å fungere. For mange lysdioder bør du bruke en kondensator parallelt med 5 volt og jordet, men med bare 4 lysdioder trenger du den ikke.

Trinn 3: Styrets design

Styrets design
Styrets design

Kretskortet ble designet i JLCPCB. Jeg er ikke sponset av dem, men for billige prototyper lager de utmerkede PCB -er. For 2 dollar får du 10 av samme brett, men frakt var omtrent 11 dollar for meg. Hvis du ikke nødvendigvis ønsker rgb -belysning og planlegger å lage bare ett, bør du vurdere å lage tastaturet uten PCB.

Utformingen av brettet var ganske rett frem. Jeg trengte bare å legge til en komponent for bryterne, men etter å ha sett noen videoer fikk jeg tak i det. Den eneste feilen jeg innså er plasseringen av hullene er litt for nær bryterne.

For å bestille PCB, gå til https://jlcpcb.com/ og velg alternativet med 2 lag. Den vil be deg om en Gerber -fil. last ned ".zip" -filen og dra den til vinduet. Du trenger ikke å pakke den ut. Innstillingene skal være fine, og du kan fortsette og fullføre bestillingen.

Trinn 4: Case design og monteringstips

Case design og monteringstips
Case design og monteringstips
Case design og monteringstips
Case design og monteringstips
Case design og monteringstips
Case design og monteringstips
Case design og monteringstips
Case design og monteringstips

Design

Som nevnt før, er designet mitt feil, men du kan fortsatt skrive det ut hvis du vil. designet ble laget i Fusion 360. Det er en gratis 3D -modelleringsprogramvare, og med min erfaring fra oppfinner og solidworks var det ganske enkelt å jobbe med. Sirklene på hjørnene på saken skal forhindre avskalling fra utskriftssengen.

Hvis du kommer med din egen sak, er bare én ting virkelig viktig. Bryterne må være godt plassert og ikke kunne bevege seg. Jeg har gitt bilder av de firkantede utskjæringene med dimensjoner, slik at du kan bruke den til ditt eget design forutsatt at du bruker Kailh BOX -brytere.

montering

Nå har du alle komponentene som trengs for å montere. Det er en ordre om å montere denne første versjonen fordi bryterne er loddet.

1. Lodd SMD -komponentene. Dette er motstander, kondensatorer og lysdioder.

2. Lodd Arduino pro micro.

3. Plasser de 3 bryterne i 3D -trykt omslag før du lodder. Dekselplaten kan ikke fjernes etter lodding av bryterne. Det anbefales ikke å lodde bryterne og kan ødelegge dem.

4. Nå loddes bryterne på plass. Gjør dette så raskt som mulig fordi plastbryterne kan smelte og ødelegge dem eller drastisk redusere antallet klikk.

5. Plasser den monterte dekkplaten i 3D -trykt etui, og fest den med tape eller bruk bolter hvis de ikke forstyrrer tastaturlokket.

6. Plasser keyCaps på bryterne, og du er ferdig.

Anbefalinger

Desolder eller masker LED -lampene på arduinoen etter at du har lastet opp koden din. Lysdiodene er fine å ha hvis koden ikke lastes opp, men ikke er hyggelig å se på som et ferdig produkt. Ferdighet og spiss pinsett kreves.

Noen grepføtter på bunnen er også fine for antiskli og lar rgb -lyset skinne igjennom.

Trinn 5: The Code V1 (hardware Debounce)

The Code V1 (hardware Debounce)
The Code V1 (hardware Debounce)
The Code V1 (hardware Debounce)
The Code V1 (hardware Debounce)

Koden for dette prosjektet er ikke nybegynnervennlig, så hvis du bare begynner å programmere i arduino, vil denne koden muligens skremme deg litt. Imidlertid vil jeg prøve å forklare hva som skjer så godt jeg kan. Noen ting blir forklart senere i denne teksten, så hvis du har spørsmål, vennligst les hele saken.

Laster opp koden

Last ned først alle 3 ".ino" -filene og legg dem i en mappe. Hvis du ikke har Arduino IDE, kan du bare laste den ned gratis på det offisielle arduino -nettstedet.

Koble Arduino til PCen og åpne "OSU_Keyboard_code_V1.ino". Velg "Arduino/Genuino Micro" i Tools Board. Velg også riktig COM -port i Verktøy. Dette kan noen ganger endre seg. For å laste opp koden til din Arduino klikker du bare på pilen øverst til venstre på skjermen og venter til den forteller deg at den er fullført nederst til venstre.

OSU_Keyboard_code_V1

Inkludert og definert

Først må du inkludere tastaturbiblioteket. Dette gjør det mulig å bruke Arduino som tastatur.

Deretter definerer jeg noen verdier. Define er akkurat som en variabel, men de kan ikke endres mens programmet kjører. De første 9 er for tastaturtegnet, arduino -pinnummer og portbiter.

Deretter portbiter av LED -data og klokke.

Antall lysdioder er også definert og en variabel for vinkelen på fargehjulet.

Oppsett

Denne delen av koden vil bare bli utført én gang når arduinoen er plugget inn.

Først settes klokken og datapinnene til LED -ene som utganger og bryterpinnene som innganger. Dette er den avanserte versjonen av pinMode (). Hvis du er interessert, søk etter "direkte portmanipulering".

Keyboard.begin () starter ganske enkelt usb -tilkoblingen som tastatur.

De neste 3 avbruddene er knyttet til bryterpinnene. Hver gang det oppdages en endring på bryterpinnen, blir et lite program utført. Dette lille programmet vil bli laget videre.

Løkke

Denne delen vil gjentas kontinuerlig mens arduinoen er på.

Jeg bruker den bare til å endre og oppdatere fargen på lysdiodene.

Avbryter

Her blir de små programmene, som bare vil bli utført når det oppdages en endring på bryterpinnene. De er identiske bortsett fra hvilken pin de reagerer på.

Først sjekker den om knappen trykkes eller slippes og sender den riktige tastaturkommandoen.

LED (forklart i en annen rekkefølge)

Hvis du er nysgjerrig på hvordan lysdiodene kontrolleres, bør du se på databladet APA102.

I det hele tatt

Dette er igjen den direkte portmanipuleringsversjonen av digital skrive.

Først sjekker den om den skal sende en 0 eller 1 og trekker datapinnen henholdsvis lav eller høy. Deretter skriver den klokkepinnen høyt veldig kort og skriver den lavt igjen.

OneByte

Dette gjentar oneBit 8 ganger med en "for" loop. Den leser den første biten i en byte og overfører verdien til oneBit -funksjonen og gjør det samme for de neste 7 bitene.

LedData

Dette gjentas oneByte 4 ganger for å gi dataene som trengs for en LED. Den første byten starter med 111xxxxx og en 5 -bits lysstyrkeverdi på stedet for xxxxx. Lysstyrken kan stilles inn fra 0 til 31 (2^5 = 32 nivåer).

De neste 3 byte er for de blå, grønne og røde verdiene. En byte for hver farge.

ColorWheelThisLed

Denne funksjonen kaller ledData gir den rgb -fargene avhengig av en vinkel i fargehjulet.

16 -bitsverdien er utbytte i seks seksjoner på 60 grader. Å se på bildene kan hjelpe deg å forstå bedre.

(en 8 -biters versjon er også tilgjengelig, men kommentert fordi den er for flimrende)

StartEndFrame

Startrammen må brukes hver gang du vil sende nye farger til lysdiodene og vil oppdatere den faktiske fargen på lysdiodene

Jeg bruker bare startrammen fordi sluttrammen ikke er nødvendig. Startrammen er 4 byte på 0. Sluttrammen er 4 byte på 255 (11111111).

Trinn 6: Koden V2 (programvare Debounce With Timers)

The Code V2 (software Debounce With Timers)
The Code V2 (software Debounce With Timers)

Etter en stund med å spille, la jeg merke til noen dobbelttappingsproblemer med maskinvaredeboundering. Dette kan fikses med noen andre verdimotstander eller kondensatorer, men ettersom knappene og lokket ikke er flyttbare, tenkte jeg at programvaredebunking ville være en fin løsning. Programvaren debounce bør fungere enten hardware debounce er implementert eller ikke. I mitt nåværende oppsett fjerner jeg ikke lokket, så jeg la bare motstandene og kondensatorene på plass.

Jeg vil ikke forklare koden så omfattende som den forrige versjonen fordi den er litt vanskeligere å forklare.

I utgangspunktet fungerer det meste av koden det samme, og led -koden forblir urørt. det som er endret er at de eksterne avbruddene ikke bruker arduino -funksjonene lenger. Nå fungerer det i ren C -kode. Og nå er det som er lagt til programvareavbruddet. For dette brukte jeg AVR -tidtakerne til å vente en viss tid til hoppet har stoppet. Fordi tidtakerne er avbruddsbaserte, er nedbrytningstiden ikke påvirket av at noe skjer i løkken.

Den eneste ulempen jeg kan komme på er at arduino -forsinkelsesfunksjonene ikke kan brukes lenger. Fordi forsinkelsesfunksjoner bruker Timer 0 og dette programmet bruker Timer 0 til å debounce.

På bildet kan du se hvordan koden grovt fungerer. Mem -biten indikerer om en tidtaker kjører. Det som ikke er avbildet er tilfellet at inngangen på slutten av knappen er lav. I dette tilfellet vil bare et tastetrykk bli sendt mens knappen allerede er sluppet. Det betyr at nøkkelen holdes nede når det gjelder datamaskinen. For denne sjeldne unntaket vil en sjekk bli forhåndsformet når en tidtaker utløper. Hvis knappen ikke trykkes på slutten av en tidtaker, sendes en kommando for nøkkelutgivelse.

Trinn 7: Koden V3 (programvare Debounce With Vertical Counter) (anbefalt) (ingen LED)

The Code V3 (software Debounce With Vertical Counter) (anbefalt) (ingen LED)
The Code V3 (software Debounce With Vertical Counter) (anbefalt) (ingen LED)

Denne koden har OGSÅ en versjon der du ikke trenger nedtrekksmotstander. Sørg for å koble hver knapp til inngangen og JORD! Den innebygde pull-up brukes

Jeg opplevde også noen uregistrerte trykk i koden V2. Jeg tror koden bare ble for kompleks med timeren og ekstern avbrudd, og jeg kan ha savnet noen unntak. Av denne grunn styrte jeg fra bunnen av med å søke på internett etter metoder for programvaredekning.

(ærlig talt, minst halvparten av dette prosjektet har blitt knappebrytende på dette tidspunktet)

Etter litt leting kom jeg over dette innlegget:

www.compuphase.com/electronics/debouncing….

For å være ærlig tok det meg ganske lang tid å forstå helt hvordan det fungerer. Det innebærer noen ganske komplekse bitmanipulasjoner, men jeg skal prøve å gjøre det så enkelt som mulig. Imidlertid vil forklaringene mine bare være et tillegg til innlegget, så du bør i det minste lese "vertikale tellere", "en kommentert implementering" og "redusere ventetid".

Min forklaring

Timingsdiagrammet (laget i WaveDrom) jeg la til, burde gjøre dette vanskelig å forstå litt matematikk, i det minste litt mer forståelig. Legg merke til at bildet har 2 tellerbiter, men koden min har 3. Dette betyr en lengre avvisningstid.

En bit per verdi

Med den vertikale tellerimplementeringen er det mulig å debounce flere knapper samtidig, parallelt. Alle verdier er av typen Byte (uint8_t) og består av 8 bits. Vi er ikke bekymret for hvilken verdi noen av disse byte inneholder, men vi er snarere interessert i bitene alene. Hver knapp som skal debounses bruker bare en bit av hver byte. Den første knappen bruker bare den første biten av hver byte, den andre knappen bruker den andre biten osv.

Alt samtidig

Ved å bruke bitmatematikk er det mulig å utføre disse pin -debounces parallelt. Og selv om litt matematikk er ganske komplisert, er det veldig effektivt for prosessoren.

Med en 8 -bits datatype er det dermed mulig å gjøre dette for 8 knapper. Bruk av større datatyper gir mulighet for flere avslag samtidig.

Nedgangen

Avbruddsrutinen utføres hvert 1 millisekund med et tidsavbrudd.

Når du trykker på knappen, vil knappen State, som er avstengt tilstand, gå ned et lavt nivå, noe som indikerer et knappetrykk. For å oppdage en utgivelse må knappen være høy lenge nok, noe som indikerer at den ikke har hoppet på en bestemt tid. Toggle brukes for å indikere en knappendring. Tellerbitene brukes til…. telle hvor lenge det ikke har vært en sprett.

Delta indikerer en forskjell mellom inngangen og avstoppet tilstand. Bare når det er en forskjell teller telleren. telleren blir tilbakestilt når en avvisning oppdages (delta er 0).

Trinn 8: Resultatet

Image
Image

Hvis alt gikk bra, burde du nå ha et fungerende tastatur for å spille Osu! på. Jeg personlig har ikke lagt merke til noen forsinkelse i det hele tatt. Gi meg beskjed hvis du gjør det. Også hvis det er noen spørsmål, kan du stille noe.

De forrige omtaleene om en V2 er ikke ment som et løfte, så ikke utsett dette prosjektet fordi du vil vente på V2.

Jeg håper du liker tastaturet!

Osu! navn: Thomazzz3

Feilsøking

Hvis du tror du har problemer med tastaturet, åpner du først et tekstredigeringsprogram og trykker på hver tast én gang for en kort stund.

Fungerer ikke en eller flere nøkler?

Det er mulig du ødela en bryter internt mens du loddet. Hvis du har et multimeter, sett det på kontinuitet/pip, sett det parallelt med bryteren mens Arduino ikke er tilkoblet og trykk på tasten. Det skal pippe.

Matcher tegnene du nettopp skrev inn tastene du konfigurerte i Osu! ?

Endre tegnene i arduino -koden i de første 3 #Defines ('' er nødvendig!).

Eller bytt Osu! innstillinger for å bruke de konfigurerte tastene.

Gjentas en eller flere taster flere ganger?

Avvisningskretsen fungerer antagelig ikke for bryterne dine eller er ikke loddet riktig. Sjekk loddetilkoblingene. Hvis det fortsatt oppstår, prøv en kondensatorverdi på 1uF. Dette vil være veldig vanskelig for PCB -brukerne.

Hvis du har problemer med lysdiodene dine

Blinker LED -lampene?

En loddetilkobling kan være løs. Hvis du bruker kretskortet, bekrefter du at loddetinnet virkelig strømmet på puten på utskriften.

Fungerer ingen av lysdiodene eller fra et visst antall lysdioder slutter å fungere?

Se etter kortslutninger mellom tilkoblingene til den første LED -en (følg spor) og se etter godt tilkoblet tinn på utgangene til Arduino og igjen den første LED -en. Hvis den er bekreftet korrekt og fremdeles er defekt, må du kanskje bytte den første lysdioden.

Hvis dette løser det, gjenta om nødvendig de neste lysdiodene.

Anbefalt: