Innehållsförteckning:

Osu! Tangentbord: 8 steg (med bilder)
Osu! Tangentbord: 8 steg (med bilder)

Video: Osu! Tangentbord: 8 steg (med bilder)

Video: Osu! Tangentbord: 8 steg (med bilder)
Video: Дунули 50 bar в двигатель АИ-8 2024, November
Anonim
Osu! Tangentbord
Osu! Tangentbord

Jag började nyligen spela ett rytmspel som heter osu! och efter att ha sett en video av ett kommersiellt mini -tangentbord tyckte jag att det skulle vara ett roligt projekt att designa ett själv. Inte långt efter det bestämde jag mig för att det skulle vara en bra idé att lägga det på instruktörer som mitt första projekt.

Om du vill kopiera detta projekt exakt till den sista instruktionen, var då min gäst, men några av de beslut jag gjorde är inte baserade på lägsta pris eller bästa kvalitet. Vissa komponenter är valda nästan enbart för att jag hade dem liggande. Om du kan hantera det skulle jag uppmuntra dig att anpassa ditt projekt.

Not 1: SMD -komponenter (liten elektronik) används så om du replikerar detta projekt krävs lödningskunskaper. kanske en lättlödd version kommer att läggas till men dessa lysdioder kommer inte i ett hålpaket

Not 2: Jag har uppdaterat koden flera gånger och är upp till version 3ish nu. Jag lämnar all kod online men jag rekommenderar att du använder den senaste versionen. Det har för närvarande ingen LED -funktionalitet men det borde vara den som presterar bäst.

Steg 1: Material och förklaringar

Material och förklaringar
Material och förklaringar

Beroende på hur du gör ditt projekt kan du behöva olika komponenter, men dessa komponenter är de som jag använde. Om du har tid och vill spara pengar, beställ formuläret aliexpress och beställ inte kretskortet.

1 Arduino pro micro + USB -kabel

3 Kailh BOX röda omkopplare

3 10k motstånd (0805 SMD)

3 100nF kondensator (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 nycklar

1 kretskort (PCB) som ingår i detta projekt

1 3D -tryckt fodral tillhandahålls i detta projekt

Varför använder jag en Arduino pro micro?

De flesta arduino -kort som Uno (Atmega328) har inte inbyggt stöd för USB -kommunikation. Ja, du kan enkelt programmera dem över USB och jag tror att det finns lösningar, men jag gillar att hålla det enkelt när det gäller USB -kommunikation och jag vet inte om lösningarna är lika lyhörda. Dessa kort använder ett externt chip för att möjliggöra USB -kommunikation medan Arduino pro micro (Atmega32U4) har den inbyggd.

Brytarna

Det finns många mekaniska omkopplare du kan använda. Linjär, taktil eller klickig från Kailh eller Cherry MX. Välj det du vill. Jag använde Kailh -switcharna eftersom de var billiga på Ailexpress. Om du väljer att använda kretskortet behöver du Kailh BOX -switchar. Färgen bestämmer känslan.

De elektroniska komponenterna

Inte mycket att förklara om dem i det här kapitlet, men om du inte använder kretskortet skulle jag rekommendera bara normala genomgående hålkomponenter för lödning. Tyvärr är de använda lysdioderna inte tillgängliga i hålpaket. Jag skulle inte heller rekommendera att använda ledningar på SMD -paket om du inte är mycket säker på dina lödkunskaper. Även för SMD på ett kretskort krävs "avancerade" lödkunnanden.

Boendet

Jag tillhandahåller en bostad i detta projekt, men det är för närvarande bristfälligt. Modifieringar behövs för att passa bultar, öppningarna för lysdioderna är inte optimala, arduino är exponerad och en del måste klippas ut för att USB -enheten ska passa. I framtiden kan ett nytt bostad tillkomma. Om du har en 3D -skrivare, fortsätt och skriv ut den, men gå inte ur vägen för att skriva ut detta felaktiga fodral om du inte gör det och bara använda någon form av projektlåda.

Steg 2: Schemat

Den schematiska
Den schematiska

Schemat för detta projekt är ganska enkelt, men jag vill förklara komponenterna för de människor som är intresserade och inte känner till detta genomförande.

Byt anslutningar till Arduino

Brytarna är anslutna till Arduino -stift 0, 2 och 3 eftersom dessa stift kan användas som externa avbrott. Detta förklaras ytterligare i kodavsnittet.

Avbrottskretsen

På den vänstra sidan av schemat är en krets som kopieras 3 gånger. Denna krets används för att avbryta omkopplaren. För att veta vad debouncing är måste du förstå switch studs och det är inte svårt att förstå.

Titta först på denna simulering för att måla en första bild (klicka snabbt på strömbrytaren och titta på signalen nedan)

När du trycker på eller släpper en omkopplare studsar den och din signal växlar mellan hög och låg ett par gånger i några millisekunder. En Arduino är riktigt snabb och läser varje högt och lågt på denna korta tid. Programmet kommer att skicka en knapptryckning eller släppa varje gång en hög eller låg läses, så för varje tryckning kommer din dator att få flera tangenttryckningar. Inte perfekt för ett rytmspel.

Denna avstängningskrets bromsar signalens fallande kant. Signalen till Arduino kommer inte att kunna ändras så snabbt som studsningen sker så den kommer att läsas med ett tryck. Oroa dig inte för att det kommer att gå långsamt för nästa riktiga press eftersom det kommer.

Avancerad:

Atmaga32U4 läser en digital låg på 0,2Vcc - 0,1V = 0,9 volt. Kondensatorns spänning när som helst i dess urladdning är Vcc * e^(-t/RC). Om du mäter en annan avstängningstid på din switch kan du beräkna dina motstånds- och kondensatorvärden.

formelformulär

Lysdioderna

Rgb -lysdioderna är APA102 -lysdioder som kan adresseras individuellt med hjälp av en klocka och datalinje. Inga externa komponenter behövs för att få dem att fungera. För många lysdioder bör du använda en kondensator parallell med 5 volt och jordad men med bara 4 lysdioder behöver du inte det.

Steg 3: Styrelsens design

Styrelsens design
Styrelsens design

Kretskortet designades i JLCPCB. Jag är inte sponsrad av dem men för billiga prototyper gör de utmärkta PCB. För 2 dollar får du 10 av samma bräda, men frakten var ungefär 11 dollar för mig. Om du inte nödvändigtvis vill ha rgb -belysning och planerar att göra bara en, bör du överväga att göra ditt tangentbord utan kretskort.

Brädans design var ganska rak framåt. Jag behövde bara lägga till en komponent för switcharna, men efter att ha sett några videor fick jag koll på det. Det enda fel jag insåg är placeringen av hålen lite för nära omkopplarna.

För att beställa kretskortet gå till https://jlcpcb.com/ och välj alternativet 2 lager. Den kommer att be dig om en Gerber -fil. ladda ner ".zip" -filen och dra den till fönstret. Du behöver inte packa upp den. Inställningarna ska vara fina och du kan fortsätta och slutföra beställningen.

Steg 4: Fodraldesign och monteringstips

Design och monteringstips
Design och monteringstips
Design och monteringstips
Design och monteringstips
Design och monteringstips
Design och monteringstips
Design och monteringstips
Design och monteringstips

Design

Som tidigare nämnts är min design bristfällig men du kan fortfarande skriva ut den om du vill. designen gjordes i Fusion 360. Det är en gratis 3D -modelleringsprogramvara och med min erfarenhet från uppfinnare och solidworks var det ganska lätt att arbeta med. Cirklarna på fodralets hörn är för att förhindra skalning från skrivbädden.

Om du gör ditt eget är bara en sak verkligen viktig. Dina växlar måste vara stadigt placerade och inte kunna röra sig. Jag har tillhandahållit bilder på de fyrkantiga utskärningarna med mått så att du kan använda den för din egen design förutsatt att du använder Kailh BOX -switchar.

hopsättning

Nu har du alla komponenter som behövs för att montera. Det finns en order att montera den här första versionen eftersom omkopplarna är lödda.

1. Löd SMD -komponenterna. dessa är motstånd, kondensatorer och lysdioder.

2. Löd Arduino pro micro.

3. Placera de tre omkopplarna i den 3D -tryckta täckplattan före lödning. Täckplattan kan inte tas bort efter att ha omkopplat omkopplarna. Avlödning av omkopplarna rekommenderas inte och kan förstöra dem.

4. Löd nu omkopplarna på plats. Gör detta så snabbt som möjligt eftersom plastbrytarna kan smälta och förstöra dem eller drastiskt minska antalet klick.

5. Lägg den monterade täckplattan i 3D -tryckt hölje och fäst med tejp eller använd bultar om de inte stör knapplocket.

6. Placera keyCaps på omkopplarna och du är klar.

Rekommendationer

Avlöd eller maskera lysdioderna på arduino när du har laddat upp din kod. Lysdioderna är trevliga att ha om din kod inte laddas upp men inte är snygg att se på som en färdig produkt. Färdighet och spetsig pincett krävs.

Några greppfötter på botten är också fina för antislip och låter rgb -ljuset lysa igenom.

Steg 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 för detta projekt är inte nybörjarvänlig, så om du bara börjar programmera i arduino kommer den här koden möjligen att skrämma dig lite. Men jag ska försöka förklara vad som händer så gott jag kan. Vissa saker förklaras senare i texten, så om du har frågor, läs först det hela.

Ladda upp koden

Ladda ner först alla 3 ".ino" -filer och lägg dem i en mapp. Om du inte har Arduino IDE laddar du bara ner den gratis på den officiella arduino -sajten.

Anslut din Arduino till din dator och öppna "OSU_Keyboard_code_V1.ino". Välj "Arduino/Genuino Micro" i verktygskortet. Välj också rätt COM -port i Verktyg. Detta kan ibland ändras. För att ladda upp koden till din Arduino klickar du bara på pilen längst upp till vänster på skärmen och väntar tills den berättar att den är klar längst ner till vänster.

OSU_Keyboard_code_V1

Inklusive och definiera

Först måste du inkludera tangentbordsbiblioteket. Detta gör det möjligt att använda Arduino som ett tangentbord.

Därefter definierar jag några värden. Definiera är precis som en variabel men de kan inte ändras medan programmet körs. De första 9 är för tangentbordstecken, arduino pin -nummer och portbitar.

Därefter portbitar av LED -data och klocka.

Antalet lysdioder är också definierat och en variabel för färghjulets vinkel.

Uppstart

Denna del av koden körs bara en gång när arduino är ansluten.

Först ställs klockan och datastiften på lysdioderna in som utgångar och omkopplarna som ingångar. Detta är den avancerade versionen av pinMode (). Om du är intresserad sök efter "direkt portmanipulation".

Keyboard.begin () startar helt enkelt usb -anslutningen som tangentbord.

Nästa 3 avbrott är kopplade till omkopplarna. Varje gång en förändring detekteras på omkopplingsnålen kommer ett litet program att köras. Detta lilla program kommer att göras längre fram.

Slinga

Den här delen kommer att upprepas kontinuerligt medan arduinoen drivs.

Jag använder den bara för att ändra och uppdatera färgen på lysdioderna.

Avbryter

Här görs de små programmen, som bara kommer att köras när en ändring detekteras på omkopplarna. De är identiska förutom vilken stift de reagerar på.

Först kontrollerar den om knappen trycks in eller släpps och skickar rätt tangentbordskommando.

LED (förklaras i en annan ordning)

Om du är nyfiken på hur lysdioderna styrs bör du titta på databladet APA102.

En bit

Detta är återigen den direkta portmanipuleringsversionen av digital skrivning.

Först kontrollerar den om den ska skicka en 0 eller 1 och drar datanålen lågt eller högt. Sedan skriver den klocknålen hög mycket kort och skriver den låg igen.

OneByte

Detta upprepas oneBit 8 gånger med en "för" -slinga. Den läser den första biten i en byte och överför dess värde till oneBit -funktionen och gör samma sak för de nästa 7 bitarna.

LedData

Detta upprepas oneByte 4 gånger för att tillhandahålla de data som behövs för en LED. Den första byten börjar med 111xxxxx och ett värde på 5 bitars ljusstyrka på platsen för xxxxx. Ljusstyrkan kan ställas in från 0 till 31 (2^5 = 32 nivåer).

Nästa 3 byte är för de blå, gröna och röda värdena. En byte för varje färg.

ColorWheelThisLed

Denna funktion kallar ledData ger den rgb -färger beroende på en vinkel i färghjulet.

16 -bitarsvärdet är utdelning i 6 lika fördelade sektioner på 60 grader. Att titta på bilderna kan hjälpa dig att förstå bättre.

(en 8 -bitarsversion tillhandahålls också men kommenteras eftersom det är för flimmer)

StartEndFrame

Startramen måste användas varje gång du vill skicka nya färger till lysdioderna och vill uppdatera den faktiska färgen på lysdioderna

Jag använder bara startramen eftersom slutramen inte behövs. Startramen är 4 byte om 0. Slutramen är 4 byte om 255 (11111111).

Steg 6: Koden V2 (mjukvara Debounce With Timers)

Koden V2 (mjukvara Debounce With Timers)
Koden V2 (mjukvara Debounce With Timers)

Efter ett tag med spelande märkte jag några dubbla knackningsproblem med hårdvaruavbrottet. Detta kan åtgärdas med några andra värdemotstånd eller kondensatorer, men eftersom knapparna och locket inte är avtagbara tyckte jag att programvaruavbrott skulle vara en bra lösning. Programvarans avstängning ska fungera oavsett om hårdvaruavbrott implementeras eller inte. I min nuvarande installation kunde jag inte ta bort locket så jag lämnade bara motstånden och kondensatorerna på plats.

Jag kommer inte att förklara koden lika omfattande som den tidigare versionen eftersom det är lite svårare att förklara.

I grund och botten fungerar det mesta av koden på samma sätt och ledkoden lämnas orörd. det som förändrats är att de externa avbrotten inte använder arduino -funktionerna längre. Nu fungerar det i ren C -kod. Och nu är det som läggs till programvaruavbrottet. För detta använde jag AVR -timern för att vänta en viss tid tills studsningen har slutat. Eftersom tidtagarna är avbrottsbaserade påverkas inte avkänningstiden av att något händer i slingan.

Den enda nackdelen jag kan komma på är att arduino -fördröjningsfunktionerna inte kan användas längre. Eftersom fördröjningsfunktioner använder Timer 0 och detta program använder Timer 0 för att avstänga.

På bilden kan du se hur koden ungefär fungerar. Membiten indikerar om en timer körs. Det som inte avbildas är så att ingången är låg i slutet av knappen. I detta fall skickas bara en knapptryckning medan knappen redan är släppt. Vilket innebär att nyckeln hålls nere när det gäller datorn. För detta sällsynta undantag kommer en check att förformas när en timer går ut. Om knappen i slutet av en timer inte trycks in skickas ett nyckelkommando.

Steg 7: Koden V3 (mjukvara Debounce With Vertical Counter) (rekommenderas) (ingen LED)

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

Denna kod har också en version där du inte behöver dra ned motstånd. Se till att du ansluter varje knapp till ingången och JORD! Den inbyggda pull-up används

Jag upplevde också några oregistrerade tryckningar i koden V2. Jag tror att koden bara blev för komplex med dess timer- och externa avbrott och jag kan ha missat några undantag. Av den anledningen ansåg jag från grunden med att söka på internet efter metoder för avstängning av programvara.

(ärligt talat har åtminstone hälften av det här projektet blivit knappavvisande vid denna tidpunkt)

Efter lite sökning stötte jag på detta inlägg:

www.compuphase.com/electronics/debouncing….

För att vara ärlig tog det mig ganska lång tid att helt förstå hur det exakt fungerar. Det innebär några ganska komplexa bitmanipulationer, men jag ska försöka göra det så enkelt som möjligt. Men mina förklaringar kommer bara att vara ett tillägg till inlägget så att du åtminstone bör läsa "vertikala räknare", "en kommenterad implementering" och "minska latens".

Min förklaring

Tidsschemat (gjort i WaveDrom) som jag lade till borde göra detta svårt att förstå bitmatematik åtminstone lite mer begripligt. Observera att bilden har 2 motbitar, men min kod har 3. Detta innebär en längre avstängningstid.

En bit per värde

Med implementeringen av den vertikala räknaren är det möjligt att avbryta flera knappar samtidigt, parallellt. Alla värden är av typen Byte (uint8_t) och består av 8 bitar. vi är inte oroliga för vilket värde någon av dessa byte innehåller, utan vi är snarare intresserade av bitarna på egen hand. Varje knapp som ska avvisas använder bara en bit av varje byte. Den första knappen använder bara den första biten i varje byte, den andra knappen använder den andra biten etc.

Alla på samma gång

Genom att använda bitmatematik är det möjligt att utföra dessa stiftavstängningar parallellt. Och även om lite matematik är ganska komplicerat, är det mycket effektivt för processorn.

Med en 8 -bitars datatyp är det således möjligt att göra detta för 8 knappar. Användning av större datatyper möjliggör fler debounces samtidigt.

Nedgången

Avvisningsrutinen utförs var 1: e millisekund med ett timeravbrott.

när knappen trycks in, kommer knappen stat, som är avstängt läge, att gå nedåt, vilket indikerar ett knapptryck. För att upptäcka en release måste knappen vara hög nog länge, vilket indikerar att den inte har studsat på en viss tid. Toggle används för att indikera en knappändring. Räknebitar används för …. räknar hur länge det inte har blivit en studs.

Delta indikerar en skillnad mellan ingång och avstängt tillstånd. Endast när det är skillnad räknas räknaren. räknaren återställs när en studs detekteras (delta är 0).

Steg 8: Resultatet

Image
Image

Om allt gick bra borde du nu ha ett fungerande tangentbord för att spela Osu! på. Jag personligen har inte märkt någon latens alls. Låt mig veta om du gör det. Också om det finns några frågor är du välkommen att fråga vad som helst.

De tidigare nämnandena om en V2 är inte avsedda som ett löfte så skjut inte upp det här projektet eftersom du vill vänta på V2.

Jag hoppas att du gillar ditt tangentbord!

Osu! namn: Thomazzz3

Felsökning

Om du tror att du har problem med ditt tangentbord öppnar du först en textredigerare och trycker på varje knapp en gång en kort stund.

Fungerar inte en eller flera nycklar?

Det är möjligt att du förstörde en switch internt under lödning. Om du har en multimeter sätter den på kontinuitet/pip, sätt den parallellt med omkopplaren medan Arduino inte är ansluten och tryck på knappen. Det ska pipa.

Matchar de tecken du just skrivit med nycklarna du konfigurerade i Osu! ?

Ändra tecknen i arduino -koden i de första 3 #Defines ('' är nödvändigt!).

Eller byt din Osu! inställningar för att använda de konfigurerade knapparna.

Upprepas en eller flera tangenter några gånger?

Avstängningskretsen fungerar antagligen inte för dina switchar eller är inte korrekt lödd. Kontrollera dina lödanslutningar. Om det fortfarande uppstår försök med ett kondensatorvärde på 1uF. Detta kommer att vara mycket svårt för PCB -användare.

Om du har problem med dina lysdioder

Blinkar lysdioderna?

En lödanslutning kan vara lös. Om du använder kretskortet, bekräfta att lödtunnan verkligen flödade på kudden på utskriften.

Fungerar ingen av lysdioderna eller slutar ett visst antal lysdioder att fungera?

Kontrollera om det finns kortslutningar mellan anslutningarna på den första lysdioden (följ spår) och kolla efter väl ansluten tenn på utgångarna på Arduino och igen den första lysdioden. Om den bekräftas korrekt och fortfarande är defekt kan du behöva byta ut den första lysdioden.

Om detta åtgärdas upprepa det för nästa lysdioder om det behövs.

Rekommenderad: