Indholdsfortegnelse:

Osu! Tastatur: 8 trin (med billeder)
Osu! Tastatur: 8 trin (med billeder)

Video: Osu! Tastatur: 8 trin (med billeder)

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

Jeg begyndte for nylig at spille et rytmespil kaldet osu! og efter at have set en video af et kommercielt mini -tastatur tænkte jeg, at det ville være et sjovt projekt at designe et selv. Ikke længe efter besluttede jeg, at det ville være en god idé at lægge det på instruktører som mit første projekt.

Hvis du vil gentage dette projekt nøjagtigt til den sidste instruktion, så vær min gæst, men nogle af de beslutninger, jeg lavede, er ikke baseret på laveste pris eller bedste kvalitet. Nogle komponenter er valgt næsten udelukkende fordi jeg havde dem liggende. Hvis du kan klare det, vil jeg opfordre dig til at tilpasse dit projekt.

Note 1: SMD -komponenter (lille elektronik) bruges, så hvis du replikerer dette projekt, er lodningskompetencer påkrævet. måske tilføjes en let at lodde version, men disse lysdioder kommer ikke i en hulpakke

Note 2: Jeg har opdateret koden flere gange og er op til version 3ish nu. Jeg efterlader al koden online, men jeg anbefaler, at du bruger den sidste version. Det har i øjeblikket ikke led -funktionalitet, men det burde være den bedst effektive.

Trin 1: Materialer og forklaringer

Materialer og forklaringer
Materialer og forklaringer

Afhængigt af hvordan du laver dit projekt, har du muligvis brug for forskellige komponenter, men disse komponenter er dem, jeg har brugt. Hvis du har tid og vil spare penge, skal du bestille aliexpress og ikke bestille printkortet.

1 Arduino pro micro + USB -kabel

3 Kailh BOX røde kontakter

3 10k modstand (0805 SMD)

3 100nF kondensator (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 Keycaps

1 Printkort (PCB), der leveres i dette projekt

1 3D -trykt sag leveres i dette projekt

Hvorfor bruger jeg en Arduino pro micro?

De fleste arduino -kort som Uno (Atmega328) har ikke indbygget understøttelse af USB -kommunikation. Ja, du kan meget let programmere dem over USB, og jeg tror, der er løsninger, men jeg kan godt lide at holde det enkelt, når det kommer til USB -kommunikation, og jeg ved ikke, om løsningerne er lige så lydhøre. Disse tavler bruger en ekstern chip til at gøre USB -kommunikation mulig, mens Arduino pro micro (Atmega32U4) har den indbygget.

Skifterne

Der er mange mekaniske kontakter, du kan bruge. Lineær, taktil eller klikket fra Kailh eller Cherry MX. Vælg, hvad du vil. Jeg brugte Kailh switches, fordi de var billige på Ailexpress. Hvis du vælger at bruge printkortet, skal du bruge Kailh BOX -switches. Farven bestemmer følelsen.

De elektroniske komponenter

Ikke meget at forklare om dem i dette kapitel, men hvis du ikke bruger printkortet, vil jeg anbefale normale trughulskomponenter til lodning. Desværre er de anvendte lysdioder ikke tilgængelige i hulpakker. Jeg vil heller ikke anbefale at bruge ledninger på SMD -pakker, medmindre du er meget sikker på dine loddeevner. Selv for SMD på en PCB er "avancerede" loddefærdigheder påkrævet.

Boligen

Jeg leverer en bolig i dette projekt, men det er i øjeblikket mangelfuldt. Modifikationer er nødvendige for at montere bolte, åbningerne til lysdioderne er ikke optimale, arduinoen er udsat, og en del skal skæres ud, for at USB'en kan passe. I fremtiden kan der tilføjes en ny bolig. Hvis du har en 3D -printer, skal du fortsætte med at udskrive den, men du må ikke gå ud af din måde at udskrive denne fejlbehæftede sag, hvis du ikke gør det, og bare bruge en slags projektboks.

Trin 2: Skematisk

Det skematiske
Det skematiske

Skematikken for dette projekt er ret enkel, men jeg vil forklare komponenterne for de mennesker, der er interesserede og ikke kender denne implementering.

Skift forbindelser til Arduino

Kontakterne er forbundet til Arduino -ben 0, 2 og 3, fordi disse ben kan bruges som eksterne afbrydelser. Dette forklares nærmere i kodesektionen.

Nedbrydningskredsløbet

På venstre side af skematikken er et kredsløb, der kopieres 3 gange. Dette kredsløb bruges til at afbryde kontakten. For at vide, hvad debouncing er, skal du forstå switch bouncing, og det er ikke svært at forstå.

Se først på denne simulering for at male et første billede (klik hurtigt på kontakten og se på signalet herunder)

Når du trykker på eller slipper en switch, hopper den, og dit signal veksler mellem høj og lav et par gange i et par millisekunder. En Arduino er virkelig hurtig og læser hvert højt og lavt på denne korte tid. Programmet sender et tastetryk eller slipper, hver gang en høj eller lav læses, så med hvert tryk vil din computer modtage flere tastetryk. Ikke ideel til et rytmespil.

Dette debounce -kredsløb vil bremse den faldende kant af signalet. Signalet til Arduino vil ikke være i stand til at ændre sig så hurtigt som hoppet sker, så det vil blive læst med et tryk. Du skal ikke bekymre dig om, at det falder til langsomt til den næste rigtige presse, fordi det vil.

Fremskreden:

Atmaga32U4 læser et digitalt lavpunkt på 0,2Vcc - 0,1V = 0,9 volt. Kondensatorens spænding til enhver tid i dens afladning er Vcc * e^(-t/RC). Hvis du måler en anden debounce -tid på din switch, kan du beregne dine modstands- og kondensatorværdier.

formelform

Lysdioderne

Rgb -lysdioderne er APA102 -lysdioder, der kan adresseres individuelt ved hjælp af et ur og en datalinje. Ingen eksterne komponenter er nødvendige for at få dem til at fungere. For mange lysdioder skal du bruge en kondensator parallelt med 5 volt og jordet, men med kun 4 lysdioder har du ikke brug for det.

Trin 3: Board Design

Bestyrelsesdesignet
Bestyrelsesdesignet

PCB'et blev designet i JLCPCB. Jeg er ikke sponsoreret af dem, men for billige prototyper laver de fremragende PCB'er. For 2 dollar får du 10 af det samme bord, men forsendelse var omkring 11 dollar for mig. Hvis du ikke nødvendigvis ønsker rgb -belysning og planlægger at lave kun en, bør du overveje at lave dit tastatur uden printkort.

Bordets design var ret ligetil. Jeg behøvede kun at tilføje en komponent til switchene, men efter at have set nogle videoer fik jeg styr på det. Den eneste fejl, jeg indså, er placeringen af hullerne lidt for tæt på kontakterne.

For at bestille printkortet skal du gå til https://jlcpcb.com/ og vælge indstillingen 2 lag. Det vil bede dig om en Gerber -fil. download ".zip" filen og træk den til vinduet. Du behøver ikke at pakke det ud. Indstillingerne skal være fine, og du kan fortsætte og fuldføre ordren.

Trin 4: Case design og monteringstip

Case design og monteringstip
Case design og monteringstip
Case design og monteringstip
Case design og monteringstip
Case design og monteringstip
Case design og monteringstip
Case design og monteringstip
Case design og monteringstip

Design

Som tidligere nævnt er mit design fejlbehæftet, men du kan stadig printe det, hvis du vil. designet blev lavet i Fusion 360. Det er en gratis 3D -modelleringssoftware, og med min erfaring fra opfinder og solidworks var det ret let at arbejde med. Cirklerne på kabinettets hjørner skal forhindre skrælning fra printbedet.

Hvis du fremfører din egen sag, er kun én ting virkelig vigtig. Dine kontakter skal placeres godt og ikke kunne bevæge sig. Jeg har leveret billeder af de firkantede udskæringer med dimensioner, så du kan bruge det til dit eget design, forudsat at du bruger Kailh BOX -switche.

montage

Nu har du alle nødvendige komponenter til at samle. Der er en ordre om at samle denne første version, fordi kontakterne er loddet.

1. Lodde SMD -komponenterne. disse er modstande, kondensatorer og lysdioder.

2. Lodd Arduino pro micro.

3. Placer de 3 kontakter i den 3D -trykte dækplade før lodning. Dækpladen kan ikke fjernes efter lodning af kontakterne. Det anbefales ikke at aflodde kontakterne og kan ødelægge dem.

4. Nu loddes kontakterne på plads. Gør dette så hurtigt som muligt, fordi plastkontakterne kan smelte og ødelægge dem eller drastisk reducere deres antal klik.

5. Læg den samlede dækplade i 3D -trykt kasse og fastgør med tape eller brug bolte, hvis de ikke forstyrrer tastaturlåget.

6. Placer keyCaps på kontakterne, og du er færdig.

Anbefalinger

Aflod eller masker LED'erne på arduinoen efter upload af din kode. Lysdioderne er gode at have, hvis din kode ikke uploades, men ikke er pæne at se på som et færdigt produkt. Færdighed og spids pincet er påkrævet.

Nogle grebsfødder i bunden er også gode til skridsikring og lader rgb -lyset skinne igennem.

Trin 5: Koden V1 (hardware -debounce)

Koden V1 (hardware -debounce)
Koden V1 (hardware -debounce)
Koden V1 (hardware -debounce)
Koden V1 (hardware -debounce)

Koden til dette projekt er ikke begyndervenlig, så hvis du lige er begyndt at programmere i arduino, vil denne kode muligvis skræmme dig lidt. Men jeg vil forsøge at forklare, hvad der foregår så godt som jeg kan. Nogle ting forklares senere i denne tekst, så hvis du har spørgsmål, skal du først læse det hele.

Upload af koden

Download først alle 3 ".ino" filer og læg dem i en mappe. Hvis du ikke har Arduino IDE, skal du bare downloade den gratis på det officielle arduino -websted.

Tilslut din Arduino til din pc, og åbn "OSU_Keyboard_code_V1.ino". Vælg "Arduino/Genuino Micro" i værktøjskortet. Vælg også den rigtige COM -port i Værktøjer. Dette kan nogle gange ændre sig. For at uploade koden til din Arduino skal du blot klikke på pilen øverst til venstre på skærmen og vente, indtil den fortæller dig, at den er udført nederst til venstre.

OSU_Keyboard_code_V1

Inkluderer og definerer

Først skal du inkludere tastaturbiblioteket. Dette gør det muligt at bruge Arduino som tastatur.

Dernæst definerer jeg nogle værdier. Define er ligesom en variabel, men de kan ikke ændre sig, mens programmet kører. De første 9 er til tastaturtegn, arduino pin -nummer og portbits.

Derefter port bits af LED data og ur.

Også antallet af lysdioder er defineret og en variabel for farvehjulets vinkel.

Opsætning

Denne del af koden udføres kun én gang, når arduinoen er tilsluttet.

Først indstilles urets og datastifterne på LED'erne som output og switchstifterne som input. Dette er den avancerede version af pinMode (). Hvis du er interesseret, skal du søge efter "direkte portmanipulation".

Keyboard.begin () starter simpelthen usb -forbindelsen som tastatur.

Næste 3 afbrydelser er knyttet til kontaktstifterne. Hver gang der registreres en ændring på switch pin, udføres et lille program. Dette lille program vil blive lavet videre.

Sløjfe

Denne del gentages løbende, mens arduinoen er tændt.

Jeg bruger den kun til at ændre og opdatere farven på lysdioderne.

Afbryder

Her laves de små programmer, som først vil blive eksekveret, når der registreres en ændring på switchstifterne. De er identiske bortset fra hvilken pin de reagerer på.

Først kontrollerer den, om knappen trykkes eller slippes, og sender den korrekte tastaturkommando.

LED (forklaret i en anden rækkefølge)

Hvis du er nysgerrig efter, hvordan lysdioderne styres, skal du se på databladet APA102.

OneBit

Dette er igen den direkte portmanipulationsversion af digital skrivning.

Først kontrollerer den, om den skal sende en 0 eller 1 og trækker datapinden henholdsvis lav eller høj. Derefter skriver den urpinden højt meget kort og skriver den lav igen.

OneByte

Dette gentages oneBit 8 gange med en "for" loop. Den læser den første bit i en byte og overfører dens værdi til oneBit -funktionen og gør det samme for de næste 7 bits.

LedData

Dette gentages oneByte 4 gange for at levere de data, der er nødvendige for en LED. Den første byte starter med 111xxxxx og en 5 bit lysstyrkeværdi på stedet for xxxxx. Lysstyrken kan indstilles fra 0 til 31 (2^5 = 32 niveauer).

De næste 3 bytes er for de blå, grønne og røde værdier. En byte for hver farve.

ColorWheelThisLed

Denne funktion kalder ledData giver den rgb -farverne afhængigt af en vinkel i farvehjulet.

16 bit -værdien er udbytte i 6 lige store mellemrum på 60 grader. At se på billederne kan hjælpe dig med at forstå bedre.

(en 8 -bit version leveres også, men kommenteres, fordi den er for flimrende)

StartEndFrame

Startrammen skal bruges hver gang, du vil sende nye farver til lysdioderne og ønsker at opdatere den faktiske farve på lysdioderne

Jeg bruger kun startrammen, fordi slutrammen ikke er nødvendig. Startrammen er 4 byte på 0. Slutrammen er 4 bytes på 255 (11111111).

Trin 6: Koden V2 (software Debounce With Timers)

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

Efter et stykke tid med at spille bemærkede jeg nogle dobbelttappeproblemer med hardware debounce. Dette kan rettes med nogle andre værdimodstande eller kondensatorer, men da knapperne og låget ikke er aftageligt, tænkte jeg, at software debouncing ville være en god løsning. Software debounce skal fungere, om hardware debounce er implementeret eller ej. I min nuværende opsætning fjernede jeg ikke låget, så jeg lod bare modstande og kondensatorer være på plads.

Jeg vil ikke forklare koden så omfattende som den tidligere version, fordi den er lidt sværere at forklare.

Grundlæggende fungerer det meste af koden det samme, og led -koden efterlades uberørt. det ændrede er, at de eksterne afbrydelser ikke længere bruger arduino -funktionerne. Nu fungerer det i ren C -kode. Og nu, hvad der er tilføjet, er softwareafbrydelsen. Til dette brugte jeg AVR -timerne til at vente et bestemt stykke tid, indtil hoppet var stoppet. Fordi timerne er interruptbaserede, er decounce -tiden ikke påvirket af noget, der sker i loop.

Den eneste ulempe, jeg kan komme på, er, at arduino -forsinkelsesfunktionerne ikke længere kan bruges. Fordi forsinkelsesfunktioner bruger Timer 0, og dette program bruger Timer 0 til at debounce.

På billedet kan du se, hvordan koden groft fungerer. Mem -bit angiver, om en timer kører. Det, der ikke er afbildet, er tilfældet, at indtastningen er lav ved slutningen af knappen. I dette tilfælde vil der kun blive sendt et tastetryk, mens knappen allerede er frigivet. Hvilket betyder, at nøglen holdes nede, hvad computeren angår. For denne sjældne undtagelse vil der blive foretaget en check på forhånd, når en timer udløber. Hvis der ikke trykkes på knappen ved afslutningen af en timer, sendes en kommando til frigivelse af nøgle.

Trin 7: Koden V3 (software Debounce With Vertical Counter) (anbefales) (ingen LED)

Code V3 (software Debounce With Vertical Counter) (anbefales) (ingen LED)
Code V3 (software Debounce With Vertical Counter) (anbefales) (ingen LED)

Denne kode har OGSÅ en version, hvor du ikke har brug for nedtrapningsmodstande. Sørg for at tilslutte hver knap til input og GROUND! Den indbyggede pull-up bruges

Jeg oplevede også nogle uregistrerede tryk i koden V2. Jeg synes, at koden bare blev for kompleks med sin timer- og eksterne afbrydelse, og jeg kan have savnet nogle undtagelser. Af denne grund gik jeg fra bunden med at søge på internettet efter metoder til software -debounce.

(ærligt talt er mindst halvdelen af dette projekt ved at være ved at deknoppe på dette tidspunkt)

Efter lidt søgning stødte jeg på dette indlæg:

www.compuphase.com/electronics/debouncing….

For at være ærlig tog det mig lang tid at forstå, hvordan det præcist fungerer. Det indebærer nogle ret komplekse bitmanipulationer, men jeg vil forsøge at gøre det så let som muligt. Men mine forklaringer vil kun være en tilføjelse til indlægget, så du bør i det mindste læse "lodrette tællere", "en annoteret implementering" og "reducering af latenstid".

Min forklaring

Timingsdiagrammet (lavet i WaveDrom), jeg tilføjede, skulle gøre dette svært at forstå bitmatematik i det mindste lidt mere forståeligt. Bemærk billedet har 2 tæller bits, men min kode har 3. Dette betyder en længere debounce tid.

En bit pr. Værdi

Med den vertikale tællerimplementering er det muligt at debounce flere knapper samtidigt, parallelt. Alle værdier er af typen Byte (uint8_t) og består af 8 bits. vi er ikke bekymrede over hvilken værdi nogen af disse byte indeholder, men vi er snarere interesserede i bitene alene. Hver knap, der skal debounces, bruger kun en bit af hver byte. Den første knap bruger kun den første bit af hver byte, den anden knap bruger den anden bit osv.

Alt på samme tid

Ved at bruge bitmatematik er det muligt at udføre disse pindebounces parallelt. Og selvom bitmatematik er ret kompliceret, er det meget effektivt for processoren.

Med en 8 bit datatype er det således muligt at gøre dette for 8 knapper. Brug af større datatyper giver mulighed for flere debounces på én gang.

Nedtrapningen

Debounce -rutinen udføres hvert 1 millisekund med en timerafbrydelse.

når der trykkes på knappen, vil buttonState, som er tilstanden, der er frakoblet, gradvist gå ned, hvilket angiver et tryk på knappen. For at opdage en frigivelse skal knappen være høj længe nok, hvilket indikerer, at den ikke har hoppet i et bestemt stykke tid. Toggle bruges til at angive en knapændring. Tællerbitene bruges til…. tæller, hvor længe der ikke har været et studs.

Delta angiver en forskel mellem input og den afblæsede tilstand. Kun når der er en forskel tæller tælleren. tælleren nulstilles, når der registreres et afvisning (delta er 0).

Trin 8: Resultatet

Image
Image

Hvis alt gik godt, skulle du nu have et fungerende tastatur til at spille Osu! på. Jeg har personligt slet ikke bemærket nogen forsinkelse. Lad mig vide det, hvis du gør det. Også hvis der er spørgsmål, er du velkommen til at stille noget.

De tidligere omtaler om en V2 er ikke ment som et løfte, så udskyd ikke dette projekt, fordi du vil vente på V2.

Jeg håber du nyder dit tastatur!

Osu! navn: Thomazzz3

Fejlfinding

Hvis du tror, du har problemer med dit tastatur, skal du først åbne et tekstredigeringsprogram og trykke på hver enkelt tast en gang i kort tid.

Virker en eller flere nøgler ikke?

Det er muligt, at du ødelagde en switch internt under lodning. Hvis du har et multimeter, sæt det på kontinuitet/bip, skal du sætte det parallelt med kontakten, mens Arduino ikke er tilsluttet, og tryk på tasten. Det skal bippe.

Passer de tegn, du lige har skrevet, til de taster, du konfigurerede i Osu! ?

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

Eller skift din Osu! indstillinger for at bruge de konfigurerede taster.

Gentages en eller flere taster et par gange?

Debounce -kredsløbet virker formentlig ikke til dine kontakter eller er ikke loddet korrekt. Kontroller dine loddetilslutninger. Hvis det stadig forekommer, prøv en kondensatorværdi på 1uF. Dette vil være meget svært for PCB -brugerne.

Hvis du har problemer med dine lysdioder

Blinker LED'erne?

En loddetilslutning kan være løs. Hvis du bruger printkortet, skal du bekræfte, at loddeformen virkelig flød på puden på udskriften.

Virker ingen af lysdioderne, eller fra et bestemt antal lysdioder holder op med at fungere?

Kontroller, om der er shorts mellem forbindelserne på den første LED (følg spor), og kontroller, om der er tilsluttet tin på udgangene fra Arduino og igen den første LED. Hvis den bekræftes korrekt og stadig er defekt, skal du muligvis udskifte den første LED.

Hvis dette løser det, gentages det om nødvendigt for de næste lysdioder.

Anbefalede: