Cuprins:

Osu! Tastatură: 8 pași (cu imagini)
Osu! Tastatură: 8 pași (cu imagini)

Video: Osu! Tastatură: 8 pași (cu imagini)

Video: Osu! Tastatură: 8 pași (cu imagini)
Video: osu! how to spin 2024, Iulie
Anonim
Osu! Tastatură
Osu! Tastatură

De curând am început să joc un joc de ritm numit osu! și după ce am văzut un videoclip cu o mini tastatură comercială, m-am gândit că ar fi un proiect amuzant să-l proiectez singur. Nu după mult timp am decis că ar fi o idee bună să-l pun pe instructabile ca primul meu proiect.

Dacă doriți să reproduceți acest proiect exact până la ultima instrucțiune, atunci fiți invitatul meu, dar unele dintre dorințele pe care le-am făcut nu se bazează pe cel mai mic preț sau pe cea mai bună calitate. Unele componente sunt alese aproape pur și simplu pentru că le aveam întinse. Dacă vă descurcați, v-aș încuraja să vă personalizați proiectul.

Notă 1: Componentele SMD (electronice mici) sunt utilizate, deci dacă reproduceți acest proiect sunt necesare abilități de lipire. poate se va adăuga o versiune ușor de lipit, dar aceste led-uri nu vin în pachetul de găuri

Notă 2: Am actualizat codul de mai multe ori și sunt până la versiunea 3ish acum. Voi lăsa toate codurile online, dar vă recomand să utilizați ultima versiune. În prezent, nu are funcționalitate LED, dar ar trebui să fie cea mai performantă.

Pasul 1: Materiale și explicații

Materiale și explicații
Materiale și explicații

În funcție de modul în care vă faceți proiectul, este posibil să aveți nevoie de componente diferite, dar aceste componente sunt cele pe care le-am folosit. Dacă aveți timp și doriți să economisiți bani, comandați formularul aliexpress și nu comandați PCB-ul.

1 cablu Arduino pro micro + USB

3 comutatoare roșii Kailh BOX

3 rezistor de 10k (0805 SMD)

3 condensator 100nF (0805 SMD)

4 LED APA102 rgb (5050 SMD)

3 Tastiere

1 Placă de circuit imprimat (PCB) furnizată în acest proiect

1 carcasă tipărită 3D furnizată în acest proiect

De ce folosesc un Arduino pro micro?

Majoritatea plăcilor arduino precum Uno (Atmega328) nu au suport nativ pentru comunicații USB. Da, le puteți programa foarte ușor pe USB și cred că există soluții, dar îmi place să o simplific când vine vorba de comunicarea USB și nu știu dacă soluțiile sunt la fel de receptive. Aceste plăci utilizează un cip extern pentru a face posibilă comunicarea USB, în timp ce Arduino pro micro (Atmega32U4) îl are încorporat.

Comutatoarele

Există multe întrerupătoare mecanice pe care le puteți utiliza. Liniar, tactil sau clicky de la Kailh sau Cherry MX. Alegeți ce vă place. Am folosit comutatoarele Kailh pentru că erau ieftine pe Ailexpress. Dacă alegeți să utilizați PCB, veți avea nevoie de comutatoare Kailh BOX. Culoarea determină senzația.

Componentele electronice

Nu sunt multe de explicat despre ele în acest capitol, dar dacă nu utilizați PCB-ul, aș recomanda doar componentele normale ale orificiului pentru ușurarea lipirii. Din păcate, led-urile utilizate nu sunt disponibile în pachete cu găuri. De asemenea, nu aș recomanda utilizarea firelor pe pachetele SMD, cu excepția cazului în care sunteți foarte încrezători în abilitățile dvs. de lipire. Chiar și pentru SMD pe un PCB se impun abilități de lipit „avansate”.

Locuinta

Ofer o locuință în acest proiect, dar în acest moment este defectuos. Sunt necesare modificări pentru a se potrivi șuruburile, deschiderile pentru leduri nu sunt optime, arduino este expus și trebuie decupată o piesă pentru ca USB-ul să se potrivească. În viitor, se poate adăuga o nouă locuință. Dacă aveți o imprimantă 3D, continuați-o și imprimați-o, dar vă rugăm să nu faceți tot posibilul să imprimați această carcasă defectă dacă nu aveți și folosiți doar un fel de cutie de proiect.

Pasul 2: Schema

Schema
Schema

Schema acestui proiect este destul de simplă, dar vreau să explic componentele pentru cei interesați și care nu cunosc această implementare.

Comutați conexiunile la Arduino

Comutatoarele sunt conectate la pinii Arduino 0, 2 și 3 deoarece acei pin pot fi folosiți ca întreruperi externe. Acest lucru este explicat în continuare în secțiunea de cod.

Circuitul debounce

În partea stângă a schemei este un circuit care este copiat de 3 ori. Acest circuit este folosit pentru a dezabona comutatorul. Pentru a ști ce este debouncing, trebuie să înțelegeți bouncing-ul de comutare și nu este greu de înțeles.

Mai întâi uitați-vă la această simulare pentru a picta o primă imagine (faceți clic pe comutator rapid și uitați-vă la semnalul de mai jos)

Când apăsați sau eliberați un comutator, acesta ricoșează și semnalul dvs. alternează între mare și mic de câteva ori pentru câteva milisecunde. Un Arduino este cu adevărat rapid și citește în toate momentele în acest timp scurt. Programul va trimite o apăsare sau eliberare a tastei de fiecare dată când este citit un nivel mare sau scăzut, astfel încât la fiecare apăsare computerul dvs. va primi mai multe apăsări de taste. Nu este ideal pentru un joc ritmic.

Acest circuit de retragere va încetini marginea de cădere a semnalului. Semnalul către Arduino nu va putea să se schimbe la fel de repede pe măsură ce apare saltul, astfel încât va fi citit cu o singură apăsare. Nu vă faceți griji că va scădea lent pentru următoarea presă reală, pentru că așa va fi.

Avansat:

Atmaga32U4 citește un nivel digital scăzut la 0,2Vcc - 0,1V = 0,9 volt. Tensiunea condensatorului în orice moment al descărcării sale este Vcc * e ^ (- t / RC). Dacă măsurați un timp diferit de debounce pe comutator, puteți calcula valorile rezistorului și condensatorului.

formular de formulă

LED-urile

LED-urile rgb sunt led-uri APA102 care pot fi adresate individual folosind un ceas și o linie de date. Nu sunt necesare componente externe pentru a le face să funcționeze. Pentru multe LED-uri ar trebui să utilizați un condensator paralel cu 5 volți și masă, dar cu doar 4 LED-uri nu aveți nevoie de el.

Pasul 3: Proiectarea plăcii

Proiectarea consiliului
Proiectarea consiliului

PCB-ul a fost proiectat în JLCPCB. Nu sunt sponsorizat de ei, dar pentru prototipuri ieftine fac PCB-uri excelente. Pentru 2 dolari primiți 10 din același tablou, dar transportul a fost de aproximativ 11 dolari pentru mine. Dacă nu doriți neapărat iluminarea RGB și intenționați să faceți doar una, ar trebui să vă gândiți să vă creați tastatura fără PCB.

Designul plăcii a fost destul de simplu. Trebuia să adaug doar o componentă pentru comutatoare, dar după ce am vizionat câteva videoclipuri, am prins-o. Singurul defect pe care l-am realizat este că amplasarea găurilor este puțin prea aproape de întrerupătoare.

Pentru a comanda PCB accesați https://jlcpcb.com/ și alegeți opțiunea cu 2 straturi. Vă va cere un fișier Gerber. descărcați fișierul „.zip” și trageți-l în fereastră. Nu trebuie să-l dezarhivați. Setările ar trebui să fie bune și puteți continua și finaliza comanda.

Pasul 4: Sfaturi privind proiectarea carcasei și asamblarea

Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea
Sfaturi pentru proiectarea carcasei și asamblarea

Proiecta

După cum am menționat anterior, designul meu este defect, dar îl puteți imprima în continuare dacă doriți. designul a fost realizat în Fusion 360. Este un software de modelare 3D gratuit și cu experiența mea de la inventator și solidworks a fost destul de ușor de lucrat. Cercurile de pe colțurile carcasei trebuie să prevină descuamarea de pe patul de imprimare.

Dacă îți faci propriul caz, un singur lucru este cu adevărat important. Comutatoarele dvs. trebuie să fie bine plasate și să nu se poată mișca. Am oferit imagini ale decupajelor pătrate cu dimensiuni, astfel încât să le puteți utiliza pentru propriul design, presupunând că utilizați comutatoare Kailh BOX.

Asamblare

Acum aveți toate componentele necesare pentru asamblare. Există o comandă pentru asamblarea acestei prime versiuni, deoarece întrerupătoarele sunt lipite.

1. Lipiți componentele SMD. acestea sunt rezistențele, condensatoarele și LED-urile.

2. Lipiți Arduino pro micro.

3. Așezați cele 3 comutatoare în placa de imprimare imprimată 3D înainte de lipire. Placa de acoperire nu poate fi îndepărtată după lipirea comutatoarelor. Desoldarea comutatoarelor nu este recomandată și le poate distruge.

4. Acum lipiți întrerupătoarele la locul lor. Faceți acest lucru cât mai repede posibil, deoarece întrerupătoarele din plastic le pot topi și distruge sau le pot reduce drastic numărul de clicuri.

5. Așezați placa de acoperire asamblată în carcasa imprimată 3D și fixați-o cu bandă sau folosiți șuruburi dacă acestea nu interferează cu capacele.

6. Așezați keyCaps pe comutatoare și ați terminat.

Recomandări

Desoldați sau mascați LED-urile de pe arduino după încărcarea codului. Ledurile sunt plăcute dacă codul dvs. nu se încarcă, dar nu sunt plăcute să le priviți ca pe un produs finit. Sunt necesare abilități și pensete ascuțite.

De asemenea, unele picioare de prindere pe partea de jos sunt frumoase pentru antiderapant și lasă lumina RGB să strălucească.

Pasul 5: Codul V1 (scăderea hardware-ului)

Codul V1 (hardware Debounce)
Codul V1 (hardware Debounce)
Codul V1 (hardware Debounce)
Codul V1 (hardware Debounce)

Codul pentru acest proiect nu este prietenos cu începătorii, deci dacă abia ați început să programați în arduino, atunci acest cod vă va speria puțin. Cu toate acestea, voi încerca să explic cât se poate de bine ce se întâmplă. Unele lucruri sunt explicate mai târziu în acest text, așa că, dacă aveți întrebări, vă rugăm să citiți mai întâi totul.

Încărcarea codului

Mai întâi descărcați toate cele 3 fișiere „.ino” și puneți-le într-un singur folder. Dacă nu aveți IDE-ul Arduino, descărcați-l gratuit pe site-ul oficial arduino.

Conectați-vă Arduino la computer și deschideți „OSU_Keyboard_code_V1.ino”. În Instrumente, selectați „Arduino / Genuino Micro”. De asemenea, în Instrumente selectați portul COM potrivit. Pentru a încărca codul pe Arduino, faceți clic pe săgeata din partea stângă sus a ecranului și așteptați până când vă spune că a fost finalizat în partea stângă jos.

OSU_Keyboard_code_V1

Inclusiv și definitoriu

Mai întâi trebuie să includeți biblioteca tastaturii. Acest lucru face posibilă utilizarea Arduino ca tastatură.

În continuare definesc câteva valori. Definirea este la fel ca o variabilă, dar nu se pot modifica în timp ce programul rulează. Primele 9 sunt pentru caracterul tastaturii, numărul pinului arduino și biții de port.

Apoi biții de port ai datelor și ceasului LED.

De asemenea, numărul de leduri este definit și o variabilă pentru unghiul roții de culoare.

Înființat

Această parte a codului va fi executată o singură dată când arduino-ul este conectat.

Mai întâi ceasul și pinii de date ai LED-urilor sunt setați ca ieșiri și pinii comutatorilor ca intrări. Aceasta este versiunea avansată a pinMode (). Dacă sunteți interesat, căutați „manipularea directă a portului”.

Keyboard.begin () pur și simplu pornește conexiunea USB ca tastatură.

Următoarele 3 întreruperi sunt legate de pinii comutatorului. De fiecare dată când este detectată o modificare pe pinul comutatorului, se va executa un mic program. Acest mic program va fi făcut mai departe.

Buclă

Această parte se va repeta continuu în timp ce arduino-ul este alimentat.

Îl folosesc doar pentru a schimba și actualiza culoarea LED-urilor.

Întrerupe

Aici sunt făcute micile programe, care vor fi executate numai atunci când se detectează o modificare pe pinii comutatorului. Ele sunt identice, cu excepția la care pin acționează.

Mai întâi verifică dacă butonul este apăsat sau eliberat și trimite comanda corectă de la tastatură.

LED (explicat într-o altă ordine)

Dacă sunteți curios cum sunt controlate LED-urile, ar trebui să vă uitați la fișa tehnică APA102.

OneBit

Aceasta este din nou versiunea de manipulare directă a portului de scriere digitală.

Mai întâi verifică dacă ar trebui să trimită un 0 sau 1 și, respectiv, trage pinul de date jos sau înalt. Apoi scrie pinul ceasului foarte înalt și îl scrie din nou scăzut.

OneByte

Aceasta se repetă de un bit de 8 ori cu o buclă „for”. Citește primul bit într-un octet și își transmite valoarea funcției oneBit și face același lucru pentru următorii 7 biți.

LedData

Aceasta repetă oneByte de 4 ori pentru a furniza datele necesare pentru un led. Primul octet începe cu 111xxxxx și o valoare a luminozității de 5 biți în locul xxxxx. Luminozitatea poate fi setată de la 0 la 31 (2 ^ 5 = 32 de niveluri).

Următorii 3 octeți sunt pentru valorile albastru, verde și roșu. Un octet pentru fiecare culoare.

ColorWheelThisLed

Această funcție apelează ledData îi oferă culorile rgb în funcție de unghiul din roata de culori.

Valoarea de 16 biți este dividendă în 6 secțiuni distanțate egal de 60 de grade. Privirea la imagini vă poate ajuta să înțelegeți mai bine.

(este furnizată și o versiune pe 8 biți, dar a fost comentată pentru că este prea sclipitoare)

StartEndFrame

Cadrul de pornire trebuie utilizat de fiecare dată când doriți să trimiteți culori noi la leduri și doriți să actualizați culoarea reală a ledurilor

Folosesc cadrul de start doar pentru că nu este nevoie de cadrul final. Cadrul de început este de 4 octeți de 0. Cadrul de final este de 4 octeți de 255 (11111111).

Pasul 6: Codul V2 (software Debounce With Timers)

Codul V2 (software Debounce With Timers)
Codul V2 (software Debounce With Timers)

După o vreme de joc am observat câteva probleme de atingere dublă cu debounce-ul hardware. Acest lucru ar putea fi reparat cu alte rezistențe de valoare sau condensatori, dar, deoarece butoanele și capacul nu sunt detașabile, am crezut că software-ul va fi o soluție plăcută. Dezactivarea software-ului ar trebui să funcționeze dacă dezactivarea hardware este implementată sau nu. În configurarea mea actuală, nu am scos capacul, așa că am lăsat rezistoarele și condensatoarele la locul lor.

Nu voi explica codul la fel de extensiv ca versiunea anterioară, deoarece este puțin mai greu de explicat.

Practic, majoritatea codului funcționează la fel și codul led este lăsat neatins. ceea ce s-a schimbat este că întreruperile externe nu mai folosesc funcțiile arduino. Acum funcționează în cod pur C. Și acum ceea ce se adaugă este întreruperea software-ului. Pentru aceasta, am folosit cronometrele AVR pentru a aștepta o anumită perioadă de timp până la oprirea saltului. Deoarece temporizatoarele sunt bazate pe întreruperi, timpul de deces nu este influențat de nimic care se întâmplă în buclă.

Singurul dezavantaj pe care îl pot veni este că funcțiile de întârziere arduino nu mai pot fi folosite. Deoarece funcțiile de întârziere folosesc Temporizatorul 0, iar acest program folosește Temporizatorul 0 pentru a renunța.

În imagine puteți vedea cum funcționează aproximativ codul. Bitul mem indică dacă rulează un cronometru. Ceea ce nu este descris este cazul în care la sfârșitul butonului apăsați intrarea este scăzută. În acest caz, doar o apăsare a tastei va fi trimisă în timp ce butonul este deja eliberat. Ceea ce înseamnă că tasta va fi menținută apăsată în ceea ce privește computerul. Pentru această excepție rară, o verificare va fi preformată la expirarea unui cronometru. Dacă la sfârșitul unui cronometru butonul nu este apăsat, va fi trimisă o comandă de eliberare a tastelor.

Pasul 7: Codul V3 (software Debounce With Vertical Counter) (recomandat) (fără LED)

Codul V3 (software Debounce With Vertical Counter) (recomandat) (fără LED)
Codul V3 (software Debounce With Vertical Counter) (recomandat) (fără LED)

Acest cod are, de asemenea, o versiune în care nu aveți nevoie de rezistențe de tragere. Asigurați-vă că conectați fiecare buton la intrare și la Pământ! Este utilizat pull-up-ul integrat

Am experimentat și câteva prese neînregistrate în codul V2. Cred că codul a devenit prea complex cu temporizatorul și întreruperea externă și poate că am ratat câteva excepții. Din acest motiv m-am îndreptat de la zero cu căutarea pe internet a metodelor de debounce software.

(sincer, cel puțin jumătate din acest proiect a devenit un buton de dezbatere în acest moment)

După câteva căutări, am dat peste această postare:

www.compuphase.com/electronics/debouncing….

Pentru a fi sincer, mi-a luat destul timp să înțeleg pe deplin cum funcționează exact. Implică unele manipulări de biți destul de complexe, dar voi încerca să o fac cât mai ușoară posibil. Cu toate acestea, explicațiile mele vor fi doar o adăugire la postare, deci ar trebui să citiți cel puțin „contoare verticale”, „o implementare adnotată” și „reducerea latenței”.

Explicația mea

Diagrama de sincronizare (realizată în WaveDrom) pe care am adăugat-o ar trebui să facă acest lucru greu de înțeles matematica de biți, cel puțin puțin mai ușor de înțeles. Rețineți că imaginea are 2 biți de contorizare, dar codul meu are 3. Acest lucru înseamnă un timp mai lung de debounce.

Un bit pe valoare

Cu implementarea contorului vertical, este posibil să eliminați mai multe butoane în același timp, în paralel. Toate valorile sunt de tip Byte (uint8_t) și sunt formate din 8 biți. nu ne preocupă ce valoare conține oricare dintre acești octeți, ci mai degrabă suntem interesați de biții pe cont propriu. Fiecare buton care trebuie dezbătut folosește doar un bit din fiecare octet. Primul buton folosește doar primul bit al fiecărui octet, al doilea buton folosește al doilea bit etc.

Totul in acelasi timp

Prin utilizarea matematicii de biți este posibilă executarea acestor debounces pin în paralel. Și, deși matematica bitului este destul de complicată, este foarte eficientă pentru procesor.

Cu un tip de date pe 8 biți, este posibil să faceți acest lucru pentru 8 butoane. Utilizarea tipurilor de date mai mari permite mai multe retrageri simultan.

Declinul

Rutina de debounce este executată la fiecare 1 milisecundă cu o întrerupere a temporizatorului.

atunci când butonul este apăsat, butonul State, care este starea redusă, va scădea imediat, indicând apăsarea unui buton. Pentru a detecta o eliberare, butonul trebuie să fie ridicat suficient de mult timp, indicând că nu a mai sărit de o anumită perioadă de timp. Comutare este utilizată pentru a indica o modificare a butonului. Biții contorului sunt folosiți pentru … numărând cât timp nu a existat nici un salt.

Delta indică o diferență între starea de intrare și starea de respingere. Numai atunci când există o diferență, contorul va conta. contorul va fi resetat atunci când este detectat un salt (delta este 0).

Pasul 8: Rezultatul

Image
Image

Dacă totul a mers bine, ar trebui să aveți acum o tastatură funcțională pentru a juca Osu! pe. Personal, nu am observat deloc nicio latență. Dacă o faci, te rog, anunță-mă. De asemenea, dacă există întrebări, nu ezitați să întrebați orice.

Mențiunile anterioare despre un V2 nu sunt menite ca o promisiune, așa că nu amânați acest proiect, deoarece doriți să așteptați V2.

Sper să vă bucurați de tastatură!

Osu! nume: Thomazzz3

Depanare

Dacă credeți că aveți probleme cu tastatura, deschideți mai întâi un editor de text și apăsați fiecare tastă o dată pentru o perioadă scurtă de timp.

Una sau mai multe taste nu funcționează?

Este posibil să fi distrus un comutator intern în timpul lipirii. Dacă aveți un multimetru puneți-l pe continuitate / semnal sonor, puneți-l paralel cu comutatorul în timp ce Arduino nu este conectat și apăsați tasta. Ar trebui să emită un semnal sonor.

Caracterele pe care tocmai le-ați tastat se potrivesc cu tastele pe care le-ați configurat în Osu! ?

Schimbați caracterele din codul arduino din primele 3 #Define („nu este niciun caz!).

Sau schimbă-ți Osu-ul! setări pentru a utiliza tastele configurate.

Se repetă una sau mai multe taste de câteva ori?

Circuitul de retragere nu funcționează în mod probabil pentru comutatoarele dvs. sau nu este lipit corect. Verificați conexiunile de lipire. Dacă tot apare, încercați o valoare a condensatorului de 1uF. Acest lucru va fi foarte greu pentru utilizatorii PCB.

Dacă aveți probleme cu LED-urile dvs.

LED-urile pâlpâie?

O conexiune de lipire poate fi slăbită. Dacă utilizați PCB-ul, confirmați că staniul de lipit a curgut cu adevărat pe tamponul de pe imprimare.

Niciunul dintre leduri nu funcționează sau dintr-un anumit număr de LED-uri nu mai funcționează?

Verificați dacă există scurte între conexiunile primului LED (urmăriți pistele) și verificați dacă există o conexiune de tablă bine conectată la ieșirile Arduino și din nou primul LED. Dacă este confirmat corect și este încă defect, poate fi necesar să înlocuiți primul LED.

Dacă se remediază acest lucru, repetați pentru următoarele LED-uri, dacă este necesar.

Recomandat: