Inhoudsopgave:

Osu! Toetsenbord: 8 stappen (met afbeeldingen)
Osu! Toetsenbord: 8 stappen (met afbeeldingen)

Video: Osu! Toetsenbord: 8 stappen (met afbeeldingen)

Video: Osu! Toetsenbord: 8 stappen (met afbeeldingen)
Video: Dit ging niet zoals ik had verwacht..😳 2024, Juli-
Anonim
Osu! Toetsenbord
Osu! Toetsenbord

Ik ben onlangs begonnen met het spelen van een ritmespel genaamd osu! en na het zien van een video van een commercieel mini-toetsenbord dacht ik dat het een leuk project zou zijn om er zelf een te ontwerpen. Niet lang daarna besloot ik dat het een goed idee zou zijn om het als mijn eerste project op instructables te zetten.

Als je dit project precies wilt repliceren tot de laatste instructie, be my guest, maar sommige van de beslissingen die ik heb gemaakt zijn niet gebaseerd op de laagste prijs of de beste kwaliteit. Sommige componenten zijn bijna puur gekozen omdat ik ze had liggen. Als je het aankan, zou ik je aanmoedigen om je project aan te passen.

Opmerking 1: SMD-componenten (kleine elektronica) worden gebruikt, dus als u dit project repliceert, zijn soldeervaardigheden vereist. misschien wordt er een eenvoudig te solderen versie toegevoegd, maar deze leds worden niet geleverd in een trog-pakket

Opmerking 2: ik heb de code meerdere keren bijgewerkt en ben nu tot versie 3ish. Ik laat alle code online, maar ik raad je aan de laatste versie te gebruiken. Het heeft momenteel geen led-functionaliteit, maar het zou de best presterende moeten zijn.

Stap 1: Materialen en uitleg

Materialen en uitleg
Materialen en uitleg

Afhankelijk van hoe je je project maakt, heb je misschien verschillende componenten nodig, maar dit zijn de componenten die ik heb gebruikt. Als je de tijd hebt en geld wilt besparen, bestel dan aliexpress en bestel de PCB niet.

1 Arduino pro micro + USB-kabel

3 Kailh BOX rode schakelaars

3 10k weerstand (0805 SMD)

3 100nF condensator (0805 SMD)

4 APA102 rgb-leds (5050 SMD)

3 toetsen

1 Printplaat (PCB) meegeleverd in dit project

1 3D-geprinte behuizing in dit project

Waarom gebruik ik een Arduino pro micro?

De meeste Arduino-boards zoals de Uno (Atmega328) hebben geen native ondersteuning voor USB-communicatie. Ja, je kunt ze heel gemakkelijk via USB programmeren en ik denk dat er oplossingen zijn, maar ik hou het graag simpel als het gaat om USB-communicatie en ik weet niet of de oplossingen even responsief zijn. Die borden gebruiken een externe chip om USB-communicatie mogelijk te maken, terwijl de Arduino pro micro (Atmega32U4) dit heeft ingebouwd.

de schakelaars

Er zijn veel mechanische schakelaars die u kunt gebruiken. Lineair, tactiel of clicky van Kailh of Cherry MX. Kies wat je leuk vindt. Ik gebruikte de Kailh-switches omdat ze goedkoop waren op Ailexpress. Als je ervoor kiest om de PCB te gebruiken, heb je Kailh BOX-schakelaars nodig. De kleur bepaalt het gevoel.

De elektronische componenten

In dit hoofdstuk valt er niet veel over uit te leggen, maar als je de PCB niet gebruikt, zou ik voor het solderen alleen normale componenten met doorvoergaten aanbevelen. Helaas zijn de gebruikte leds niet verkrijgbaar in trogverpakkingen. Ik zou ook niet aanraden om draden op SMD-pakketten te gebruiken, tenzij je veel vertrouwen hebt in je soldeervaardigheden. Zelfs voor SMD op een PCB zijn "geavanceerde" soldeervaardigheden vereist.

De huisvesting

Ik bied wel een huisvesting in dit project, maar het is op dit moment gebrekkig. Er zijn aanpassingen nodig om bouten te passen, de openingen voor de leds zijn niet optimaal, de arduino is zichtbaar en er moet een onderdeel worden uitgesneden om de USB te laten passen. In de toekomst kan een nieuwe woning worden toegevoegd. Als je een 3D-printer hebt, ga je gang en print hem, maar ga alsjeblieft niet uit de weg om deze gebrekkige behuizing af te drukken als je dat niet doet en gebruik gewoon een soort projectdoos.

Stap 2: Het schema

het schema
het schema

Het schema voor dit project is vrij eenvoudig, maar ik wil de componenten uitleggen voor de mensen die geïnteresseerd zijn en deze implementatie niet kennen.

Schakel verbindingen naar de Arduino

De schakelaars zijn verbonden met Arduino-pinnen 0, 2 en 3 omdat die pinnen kunnen worden gebruikt als externe interrupts. Dit wordt verder uitgelegd in het codegedeelte.

Het debounce-circuit

Aan de linkerkant van het schema staat een circuit dat 3 keer wordt gekopieerd. Dit circuit wordt gebruikt om de schakelaar te debouncen. Om te weten wat debouncing is, moet je switchbouncing begrijpen en het is niet moeilijk te begrijpen.

Bekijk eerst deze simulatie om een eerste beeld te schetsen (klik snel op de schakelaar en kijk naar het signaal hieronder)

Wanneer u een schakelaar indrukt of loslaat, stuitert deze en uw signaal wisselt een paar milliseconden een paar keer tussen hoog en laag. Een Arduino is echt snel en leest in deze korte tijd elk hoog en laag uit. Het programma stuurt een toetsdruk of laat los elke keer dat een hoge of lage waarde wordt gelezen, dus bij elke druk ontvangt uw computer meerdere toetsaanslagen. Niet ideaal voor een ritmespel.

Dit debounce-circuit vertraagt de dalende flank van het signaal. Het signaal naar de Arduino kan niet zo snel veranderen als het stuiteren, dus het wordt gelezen als één keer drukken. Maak je geen zorgen dat het te langzaam wordt voor de volgende echte pers, want dat zal wel gebeuren.

Geavanceerd:

De Atmaga32U4 leest een digitale low op 0.2Vcc - 0.1V = 0.9 volt. De spanning van de condensator op elk moment tijdens zijn ontlading is Vcc * e^(-t/RC). Als u een andere debouncetijd op uw schakelaar meet, kunt u uw weerstands- en condensatorwaarden berekenen.

formuleformulier

De LED's

De rgb leds zijn APA102 leds die individueel adresseerbaar zijn via een klok en datalijn. Er zijn geen externe componenten nodig om ze te laten werken. Voor veel LED's moet je een condensator parallel aan 5 volt en aarde gebruiken, maar met slechts 4 LED's heb je deze niet nodig.

Stap 3: Het bordontwerp

Het bordontwerp
Het bordontwerp

De printplaat is ontworpen in JLCPCB. Ik word niet door hen gesponsord maar voor goedkope prototypes maken ze uitstekende PCB's. Voor 2 dollar krijg je 10 van hetzelfde bord, maar verzendkosten waren voor mij ongeveer 11 dollar. Als je niet per se RGB-verlichting wilt en van plan bent er maar één te maken, kun je overwegen om je toetsenbord zonder PCB te maken.

Het ontwerp van het bord was vrij rechttoe rechtaan. Ik hoefde alleen een component voor de schakelaars toe te voegen, maar na het bekijken van enkele video's had ik het onder de knie. Het enige minpunt dat ik me realiseerde, is dat de plaatsing van de gaten een beetje te dicht bij de schakelaars is.

Om de PCB te bestellen ga je naar https://jlcpcb.com/ en kies je de optie 2 lagen. Het zal u om een Gerber-bestand vragen. download het ".zip"-bestand en sleep het naar het venster. Je hoeft het niet uit te pakken. De instellingen zouden in orde moeten zijn en u kunt doorgaan en de bestelling voltooien.

Stap 4: Case-ontwerp en montagetips

Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips
Hoesontwerp en montagetips

Ontwerp

Zoals eerder vermeld, is mijn ontwerp gebrekkig, maar je kunt het nog steeds afdrukken als je wilt. het ontwerp is gemaakt in Fusion 360. Het is gratis 3D-modelleringssoftware en met mijn ervaring van uitvinder en solidworks was het vrij eenvoudig om mee te werken. De cirkels op de hoeken van de behuizing zijn bedoeld om het loskomen van het printbed te voorkomen.

Als je je eigen zaak maakt, is er maar één ding echt belangrijk. Uw schakelaars moeten stevig worden geplaatst en niet kunnen bewegen. Ik heb afbeeldingen van de vierkante uitsparingen voorzien van afmetingen, zodat u deze voor uw eigen ontwerp kunt gebruiken, ervan uitgaande dat u Kailh BOX-schakelaars gebruikt.

samenkomst

Nu heb je alle componenten die nodig zijn om te monteren. Er is een opdracht om deze eerste versie te monteren omdat de schakelaars zijn gesoldeerd.

1. Soldeer de SMD-componenten. dit zijn de weerstanden, condensatoren en LED's.

2. Soldeer de Arduino pro micro.

3. Plaats de 3 schakelaars in de 3D-geprinte afdekplaat voordat u gaat solderen. De afdekplaat kan niet worden verwijderd na het solderen van de schakelaars. Desolderen van de schakelaars wordt afgeraden en kan ze vernietigen.

4. Soldeer nu de schakelaars op hun plaats. Doe dit zo snel mogelijk, want de plastic schakelaars kunnen smelten en ze verpesten of hun aantal klikken drastisch verminderen.

5. Plaats de gemonteerde afdekplaat in de 3D-geprinte behuizing en zet deze vast met tape of gebruik bouten als ze de toetsen niet in de weg zitten.

6. Plaats de keyCaps op de schakelaars en je bent klaar.

Aanbevelingen

Desolder of maskeer de LED's op de Arduino na het uploaden van je code. De leds zijn leuk om te hebben als je code niet wordt geüpload, maar zijn niet leuk om naar te kijken als een afgewerkt product. Behendigheid en puntig pincet zijn vereist.

Ook enkele gripvoetjes aan de onderkant zijn fijn voor antislip en laten het rgb licht door.

Stap 5: De code V1 (hardware debounce)

De code V1 (hardware debounce)
De code V1 (hardware debounce)
De code V1 (hardware debounce)
De code V1 (hardware debounce)

De code voor dit project is niet beginnersvriendelijk, dus als je net begint met programmeren in Arduino, zal deze code je mogelijk een beetje bang maken. Maar ik zal proberen zo goed mogelijk uit te leggen wat er aan de hand is. Sommige dingen worden verderop in deze tekst uitgelegd, dus als je vragen hebt, lees dan eerst het hele ding.

De code uploaden

Download eerst alle 3 ".ino"-bestanden en plaats ze in één map. Als je de Arduino IDE niet hebt, download hem dan gewoon gratis op de officiële Arduino-site.

Sluit uw Arduino aan op uw pc en open "OSU_Keyboard_code_V1.ino". Selecteer in Tools Board "Arduino/Genuino Micro". Selecteer ook in Tools de juiste COM-poort. Dit kan soms veranderen. Om de code naar uw Arduino te uploaden, klikt u op de pijl linksboven in het scherm en wacht u totdat deze linksonder aangeeft dat deze is voltooid.

OSU_Keyboard_code_V1

Inclusief en definiërend

Eerst moet u de toetsenbordbibliotheek opnemen. Hierdoor is het mogelijk om de Arduino als toetsenbord te gebruiken.

Vervolgens definieer ik enkele waarden. Define is net als een variabele, maar ze kunnen niet veranderen terwijl het programma draait. De eerste 9 zijn voor het toetsenbordkarakter, arduino-pinnummer en poortbits.

Dan de poortbits van de LED data en klok.

Ook het aantal leds is gedefinieerd en een variabele voor de hoek van het kleurenwiel.

Opstelling

Dit deel van de code wordt slechts één keer uitgevoerd wanneer de arduino is aangesloten.

Eerst worden de klok- en datapinnen van de LED's ingesteld als uitgangen en de schakelpinnen als ingangen. Dit is de geavanceerde versie van pinMode(). Als je geïnteresseerd bent, zoek dan naar "directe poortmanipulatie".

Keyboard.begin() start gewoon de usb-verbinding als toetsenbord.

Vervolgens zijn er 3 interrupts gekoppeld aan de schakelpinnen. Elke keer dat er een wijziging wordt gedetecteerd op de schakelpin, wordt een klein programma uitgevoerd. Dit kleine programma wordt verderop gemaakt.

Lus

Dit deel wordt continu herhaald terwijl de arduino wordt aangedreven.

Ik gebruik het alleen om de kleur van de LED's te wijzigen en bij te werken.

Onderbrekingen

Hier worden de kleine programma's gemaakt, die alleen worden uitgevoerd als er een wijziging wordt gedetecteerd op de schakelpinnen. Ze zijn identiek, behalve op welke pin ze reageren.

Eerst controleert het of de knop wordt ingedrukt of losgelaten en verzendt het de juiste toetsenbordopdracht.

LED (in een andere volgorde uitgelegd)

Als je benieuwd bent hoe de LED's worden aangestuurd, kijk dan eens naar de APA102 datasheet.

Een beetje

Dit is opnieuw de directe poortmanipulatieversie van digitaal schrijven.

Eerst controleert het of het een 0 of 1 moet verzenden en trekt respectievelijk de datapin laag of hoog. Dan schrijft het de klokpen zeer kort hoog en schrijft het weer laag.

OneByte

Dit herhaalt oneBit 8 keer met een "for"-lus. Het leest het eerste bit in een byte en geeft zijn waarde door aan de oneBit-functie en doet hetzelfde voor de volgende 7 bits.

LedData

Dit herhaalt oneByte 4 keer om de gegevens te leveren die nodig zijn voor één led. De eerste byte begint met 111xxxxx en een 5 bit helderheidswaarde op de plaats van de xxxxx. De helderheid kan worden ingesteld van 0 tot 31 (2^5 = 32 niveaus).

De volgende 3 bytes zijn voor de blauwe, groene en rode waarden. Een byte voor elke kleur.

ColorWheelThisLed

Deze functie roept ledData aan en geeft het de RGB-kleuren, afhankelijk van een hoek in het kleurenwiel.

De 16-bits waarde is dividend in 6 gelijk verdeelde secties van 60 graden. Als je naar de afbeeldingen kijkt, kun je het misschien beter begrijpen.

(er is ook een 8-bits versie beschikbaar, maar deze is becommentarieerd omdat deze te flikkerend is)

StartEindeFrame

Het startframe moet elke keer worden gebruikt als u nieuwe kleuren naar de leds wilt sturen en de werkelijke kleur van de leds wilt bijwerken

Ik gebruik alleen het startframe omdat het eindframe niet nodig is. Het startframe is 4 bytes van 0. Het eindframe is 4 bytes van 255 (11111111).

Stap 6: De Code V2 (software Debounce met timers)

De Code V2 (software Debounce met timers)
De Code V2 (software Debounce met timers)

Na een tijdje spelen merkte ik wat problemen met dubbeltikken met de hardware-debounce. Dit zou kunnen worden opgelost met een aantal andere waardeweerstanden of condensatoren, maar omdat de knoppen en het deksel niet verwijderbaar zijn, dacht ik dat software-debouncing een mooie oplossing zou zijn. De software-debounce zou moeten werken, of hardware-debounce nu is geïmplementeerd of niet. In mijn huidige opstelling kon ik het deksel niet verwijderen, dus liet ik de weerstanden en condensatoren gewoon op hun plaats.

Ik zal de code niet zo uitgebreid uitleggen als de vorige versie omdat het iets moeilijker uit te leggen is.

In principe werkt de meeste code hetzelfde en de led-code blijft onaangeroerd. wat is veranderd, is dat de externe interrupts de arduino-functies niet meer gebruiken. Nu werkt het in pure C-code. En wat nu is toegevoegd, is de software-interrupt. Hiervoor heb ik de AVR-timers gebruikt om een bepaalde tijd te wachten totdat het stuiteren is gestopt. Omdat de timers op interrupts zijn gebaseerd, wordt de decounce-tijd niet beïnvloed door iets dat in de lus gebeurt.

Het enige nadeel dat ik kan bedenken is dat de arduino delay functies niet meer gebruikt kunnen worden. Omdat vertragingsfuncties Timer 0 gebruiken en dit programma Timer 0 gebruikt om te debouncen.

In de afbeelding kun je zien hoe de code ongeveer werkt. De mem-bit geeft aan of er een timer loopt. Wat niet is afgebeeld is het geval dat aan het einde van de druk op de knop de ingang laag is. In dit geval zou alleen een toetsaanslag worden verzonden terwijl de knop al is losgelaten. Wat betekent dat de toets wordt ingedrukt voor zover het de computer betreft. Voor deze zeldzame uitzondering wordt er een controle uitgevoerd wanneer een timer afloopt. Als aan het einde van een timer de knop niet wordt ingedrukt, wordt een toetsontgrendelingscommando verzonden.

Stap 7: De code V3 (software Debounce met verticale teller) (aanbevolen) (geen LED)

The Code V3 (software Debounce met verticale teller) (aanbevolen) (geen LED)
The Code V3 (software Debounce met verticale teller) (aanbevolen) (geen LED)

Deze code heeft OOK een versie waarbij je geen pull-down weerstanden nodig hebt. Zorg ervoor dat u elke knop verbindt met de ingang en GROUND! Er wordt gebruik gemaakt van de ingebouwde pull-up

Ik heb ook enkele niet-geregistreerde persen ervaren in de code V2. Ik denk dat de code gewoon te complex is geworden met zijn timer- en externe interrupt en ik heb misschien enkele uitzonderingen gemist. Om deze reden ben ik helemaal opnieuw begonnen met zoeken op internet naar methoden voor het debouncen van software.

(eerlijk gezegd, ten minste de helft van dit project is op dit moment debouncing geworden)

Na wat zoeken kwam ik dit bericht tegen:

www.compuphase.com/electronics/debouncing….

Eerlijk gezegd kostte het me behoorlijk wat tijd om volledig te begrijpen hoe het precies werkt. Het omvat een aantal nogal complexe bitmanipulaties, maar ik zal proberen het zo gemakkelijk mogelijk te maken. Mijn uitleg is echter alleen een aanvulling op het bericht, dus je moet op zijn minst de "verticale tellers", "een geannoteerde implementatie" en "latentie verminderen" lezen.

Mijn uitleg

Het timingdiagram (gemaakt in WaveDrom) dat ik heb toegevoegd, zou dit moeilijk te begrijpen beetje wiskunde op zijn minst een beetje begrijpelijker moeten maken. Merk op dat de afbeelding 2 tellerbits heeft, maar mijn code heeft er 3. Dit betekent een langere debouncetijd.

Eén bit per waarde

Met de verticale teller implementatie is het mogelijk om meerdere knoppen tegelijkertijd parallel te debouncen. Alle waarden zijn van het type Byte(uint8_t) en bestaan uit 8 bits. het maakt ons niet uit welke waarde een van deze bytes bevat, maar we zijn eerder geïnteresseerd in de bits op zich. Elke te debouncen buton gebruikt slechts één bit van elke byte. De eerste knop gebruikt alleen het eerste bit van elke byte, de tweede knop gebruikt het tweede bit enz.

Alles tegelijkertijd

Door bit wiskunde te gebruiken is het mogelijk om deze pin debounces parallel uit te voeren. En hoewel bitwiskunde behoorlijk ingewikkeld is, is het zeer efficiënt voor de processor.

Bij een 8 bit datatype is het dus mogelijk om dit voor 8 knoppen te doen. Het gebruik van grotere datatypes zorgt voor meer debounces tegelijk.

het debounce

De debounce-routine wordt elke milliseconde uitgevoerd met een timer-interrupt.

wanneer de knop wordt ingedrukt, zal de buttonState, wat de debounced-status is, onmiddellijk laag worden, wat aangeeft dat er op een knop wordt gedrukt. Om een release te detecteren, moet de knop lang genoeg hoog staan, wat aangeeft dat hij een bepaalde tijd niet heeft gestuiterd. Toggle wordt gebruikt om een knopwijziging aan te geven. De tellerbits worden gebruikt voor …. tellen hoe lang er geen bounce is geweest.

Delta geeft een verschil aan tussen de invoer- en de debounced-status. Pas als er een verschil is, telt de teller. de teller wordt gereset wanneer een bounce wordt gedetecteerd (delta is 0).

Stap 8: Het resultaat

Image
Image

Als alles goed is gegaan, zou je nu een werkend toetsenbord moeten hebben om Osu te spelen! Aan. Persoonlijk heb ik helemaal geen latency opgemerkt. Als je dat doet, laat het me dan weten. Ook als er vragen zijn, stel ze gerust.

De eerdere vermeldingen over een V2 zijn niet bedoeld als een belofte, dus stel dit project niet uit omdat u wilt wachten op V2.

Ik wens je veel plezier met je toetsenbord!

os! naam: Thomazz3

Probleemoplossen

Als je denkt problemen te hebben met je toetsenbord, open dan eerst een teksteditor en druk één keer kort op elke toets.

Werken een of meerdere toetsen niet?

Het kan zijn dat je tijdens het solderen een schakelaar inwendig hebt vernield. Als je een multimeter hebt, zet deze dan op continuïteit/piepen, zet hem parallel aan de schakelaar terwijl de Arduino niet is aangesloten en druk op de toets. Het zou moeten piepen.

Komen de tekens die u zojuist hebt getypt overeen met de toetsen die u in Osu! ?

Verander de karakters in de Arduino code in de eerste 3 #Defines (' ' is noodzakelijk!).

Of verander je Osu! instellingen om de geconfigureerde toetsen te gebruiken.

Worden een of meerdere toetsen een paar keer herhaald?

Het debounce-circuit werkt waarschijnlijk niet voor uw schakelaars of is niet correct gesoldeerd. Controleer je soldeerverbindingen. Als het nog steeds optreedt, probeer dan een condensatorwaarde van 1uF. Dit zal erg moeilijk zijn voor de PCB-gebruikers.

Als u problemen ondervindt met uw LED's

Knipperen de LED's?

Mogelijk zit er een soldeerverbinding los. Als je de printplaat gebruikt, bevestig dan dat het soldeerblik echt stroomde op de pad op de print.

Werkt geen van de leds of stopt een bepaald aantal leds met werken?

Controleer op kortsluiting tussen de aansluitingen van de eerste LED (volg sporen) en controleer op goed aangesloten tin op de uitgangen van de Arduino en opnieuw de eerste LED. Indien correct bevestigd en nog steeds defect, moet u mogelijk de eerste LED vervangen.

Als dit het probleem oplost, herhaalt u dit indien nodig voor de volgende LED's.

Aanbevolen: