Sadržaj:

Osu! Tastatura: 8 koraka (sa slikama)
Osu! Tastatura: 8 koraka (sa slikama)

Video: Osu! Tastatura: 8 koraka (sa slikama)

Video: Osu! Tastatura: 8 koraka (sa slikama)
Video: КОНЕЦ МУЧЕНИЯМ. Трава больше не проблема! 2024, Juli
Anonim
Osu! Keyboard
Osu! Keyboard

Nedavno sam počeo igrati ritam igru koja se zove osu! a nakon što sam vidio video zapis komercijalne mini tastature pomislio sam da bi to bio zabavan projekt da je dizajniram sam. Nedugo nakon toga odlučio sam da bi bilo dobro staviti ga na instrukcije kao svoj prvi projekt.

Ako želite ponoviti ovaj projekt točno prema posljednjoj uputi, izvolite, ali neki od mojih odluka nisu zasnovani na najnižoj cijeni ili najboljoj kvaliteti. Neke su komponente odabrane gotovo čisto jer sam ih držao naokolo. Ako možete to riješiti, potaknuo bih vas da prilagodite svoj projekt.

Napomena 1: Koriste se SMD komponente (mala elektronika) pa ako ponovite ovaj projekt potrebne su vještine lemljenja. možda će biti dodana verzija za lako lemljenje, ali ove LED diode ne dolaze u pakiranju s rupama

Napomena 2: Ažurirao sam kôd više puta i sada ih ažuriram na verziju 3ish. Ostaviću sav kôd na mreži, ali preporučujem da koristite posljednju verziju. Trenutno nema LED funkciju, ali bi trebala biti najbolja.

Korak 1: Materijali i objašnjenja

Materijali i objašnjenja
Materijali i objašnjenja

Ovisno o načinu izrade projekta, možda će vam trebati različite komponente, ali ove komponente sam ja koristio. Ako imate vremena i želite uštedjeti novac, naručite obrazac aliexpress i nemojte naručiti PCB.

1 Arduino pro micro + USB kabel

3 prekidača Kailh BOX crvena

3 10k otpornik (0805 SMD)

3 100nF kondenzator (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 tastature

1 Štampana ploča (PCB) obezbeđena u ovom projektu

1 3D štampano kućište dato u ovom projektu

Zašto koristim Arduino pro micro?

Većina arduino ploča poput Uno (Atmega328) nemaju izvornu podršku za USB komunikaciju. Da, možete ih programirati preko USB -a vrlo jednostavno i mislim da postoje zaobilazna rješenja, ali volim pojednostaviti što se tiče USB komunikacije i ne znam jesu li zaobilazna rješenja tako osjetljiva. Ove ploče koriste vanjski čip kako bi omogućile USB komunikaciju, dok je Arduino pro micro (Atmega32U4) ugrađen.

Prekidači

Postoji mnogo mehaničkih prekidača koje možete koristiti. Linearno, taktilno ili kliknuto od Kailh ili Cherry MX. Odaberite šta god želite. Koristio sam prekidače Kailh jer su bili jeftini na Ailexpressu. Ako odlučite koristiti PCB, trebat će vam prekidači Kailh BOX. Boja određuje osjećaj.

Elektronske komponente

U ovom poglavlju nema puno objašnjenja o njima, ali ako ne koristite tiskanu ploču, preporučio bih samo uobičajene komponente kroz rupe radi lakšeg lemljenja. Nažalost, LED diode nisu dostupne u pakiranjima s rupama. Također ne bih preporučio upotrebu žica na SMD paketima osim ako ste vrlo sigurni u svoje sposobnosti lemljenja. Čak i za SMD na PCB -u postoje "napredne" vještine lemljenja.

Kućište

U ovom projektu nudim smještaj, ali on je u ovom trenutku pogrešan. Potrebne su izmjene kako bi se uklopili vijci, otvori za LED diode nisu optimalni, arduino je izložen i dio je potrebno izrezati da bi USB mogao stati. U budućnosti bi se moglo dodati novo stanovanje. Ako imate 3D štampač, odštampajte ga, ali nemojte se potruditi da odštampate ovu manjkavu futrolu ako to ne učinite i samo koristite neku vrstu projektne kutije.

Korak 2: Shema

Shema
Shema

Shema za ovaj projekt je prilično jednostavna, ali želim objasniti komponente za ljude koji su zainteresirani i ne poznaju ovu implementaciju.

Prebacite veze na Arduino

Prekidači su spojeni na Arduino pinove 0, 2 i 3 jer se ti pinovi mogu koristiti kao vanjski prekidi. To je dalje objašnjeno u odjeljku koda.

Krug debounce

Na lijevoj strani sheme nalazi se kolo koje se kopira 3 puta. Ovaj krug se koristi za uklanjanje prekidača. Da biste znali što je odricanje, morate razumjeti odskakanje prekidača i nije teško razumjeti.

Prvo pogledajte ovu simulaciju da biste naslikali prvu sliku (brzo pritisnite prekidač i pogledajte signal ispod)

Kada pritisnete ili otpustite prekidač, on odskoči i vaš signal se nekoliko puta izmjenjuje između visokog i niskog na nekoliko milisekundi. Arduino je jako brz i čita sve visoke i niske vrijednosti u ovom kratkom vremenu. Program će poslati pritisak na tipku ili otpuštanje svaki put kad se pročita visoka ili niska vrijednost, pa će pri svakom pritisku vaš računar više puta pritisnuti tipke. Nije idealno za ritmičku igru.

Ovaj krug debounce će usporiti padajuću ivicu signala. Signal na Arduinu neće se moći promijeniti onoliko brzo koliko se pojavi odbijanje, pa će se čitati jednim pritiskom. Ne brinite da će se usporiti za sljedeću pravu štampu jer hoće.

Napredno:

Atmaga32U4 očitava digitalno nisko na 0,2Vcc - 0,1V = 0,9 volta. Napon kondenzatora u bilo kojem trenutku u njegovom pražnjenju je Vcc * e^(-t/RC). Ako mjerite različito vrijeme debounce na vašem prekidaču, možete izračunati vrijednosti vašeg otpornika i kondenzatora.

obrazac formule

LED diode

RGB LED diode su APA102 LED diode koje se mogu pojedinačno adresirati pomoću sata i podatkovne linije. Nisu potrebne nikakve vanjske komponente da bi funkcionirale. Za mnoge LED diode trebali biste koristiti kondenzator paralelno na 5 V i uzemljenje, ali sa samo 4 LED diode vam to ne treba.

Korak 3: Dizajn ploče

Dizajn ploče
Dizajn ploče

PCB je dizajniran u JLCPCB -u. Ne sponzoriram ih, ali za jeftine prototipe prave izvrsne PCB -e. Za 2 dolara dobijate 10 istih ploča, ali je za mene otpremanje bilo oko 11 dolara. Ako ne želite nužno rgb rasvjetu i planirate napraviti samo jedno, razmislite o tome da svoju tipkovnicu napravite bez PCB -a.

Dizajn ploče bio je prilično jednostavan. Trebalo mi je samo dodati komponentu za prekidače, ali nakon što sam pogledao neke video zapise, shvatio sam to. Jedina mana koju sam shvatio je postavljanje rupa malo preblizu prekidača.

Da biste naručili PCB, idite na https://jlcpcb.com/ i odaberite dvoslojnu opciju. Od vas će se tražiti Gerberov dosje. preuzmite datoteku ".zip" i povucite je do prozora. Ne morate ga raspakirati. Postavke bi trebale biti u redu i možete nastaviti dovršiti narudžbu.

Korak 4: Savjeti za oblikovanje kućišta i montažu

Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu
Savjeti za oblikovanje kućišta i montažu

Dizajn

Kao i ranije, moj dizajn je pogrešan, ali ga i dalje možete ispisati ako želite. dizajn je napravljen u Fusion 360. To je besplatni softver za 3D modeliranje i s mojim iskustvom izumitelja i solidworks -a s njim je bilo prilično lako raditi. Krugovi na uglovima kućišta sprječavaju ljuštenje s tiskane podloge.

Ako sami napravite svoj slučaj, samo je jedna stvar zaista važna. Prekidači moraju biti čvrsto postavljeni i nesposobni za pomicanje. Dao sam slike kvadratnih izreza dimenzija tako da ih možete koristiti za vlastiti dizajn pod pretpostavkom da koristite prekidače Kailh BOX.

Montaža

Sada imate sve komponente potrebne za sastavljanje. Postoji naredba za sastavljanje ove prve verzije jer su prekidači lemljeni.

1. Lemite SMD komponente. to su otpornici, kondenzatori i LED diode.

2. Lemite Arduino pro micro.

3. Pre lemljenja postavite 3 prekidača u 3D štampanu naslovnu ploču. Zaštitna ploča se ne može ukloniti nakon lemljenja prekidača. Otpakivanje prekidača se ne preporučuje i može ih uništiti.

4. Sada lemite prekidače na mestu. Učinite to što je brže moguće jer se plastični prekidači mogu rastopiti i pokvariti ili drastično smanjiti njihov broj klikova.

5. Stavite sklopljenu ploču u 3D štampano kućište i učvrstite je trakom ili upotrijebite vijke ako ne ometaju poklopce tipki.

6. Postavite kapice na prekidače i gotovi ste.

Preporuke

Odlijepite ili maskirajte LED diode na arduinu nakon učitavanja koda. LED diode je lijepo imati ako se vaš kod ne učitava, ali nije lijepo gledati ih kao gotov proizvod. Potrebna je vještina i šiljata pinceta.

Takođe, neke drške na dnu su dobre za sprečavanje klizanja i omogućavaju da svjetlo rgb svijetli.

Korak 5: Kod V1 (hardversko uklanjanje)

Kod V1 (hardversko deblokiranje)
Kod V1 (hardversko deblokiranje)
Kod V1 (hardversko deblokiranje)
Kod V1 (hardversko deblokiranje)

Kôd za ovaj projekt nije prilagođen početnicima pa ako tek počinjete programirati u arduinu, ovaj će vas kôd možda malo uplašiti. Međutim, pokušaću najbolje što mogu objasniti šta se dešava. Neke stvari su kasnije objašnjene u ovom tekstu, pa ako imate pitanja, prvo pročitajte cijelu stvar.

Učitavanje koda

Prvo preuzmite sve 3 ".ino" datoteke i stavite ih u jednu mapu. Ako nemate Arduino IDE, preuzmite ga besplatno na službenoj arduino web stranici.

Povežite svoj Arduino sa računarom i otvorite "OSU_Keyboard_code_V1.ino". Na Alatnoj ploči odaberite "Arduino/Genuino Micro". Također u Alatkama odaberite desni COM port. To se ponekad može promijeniti. Da biste učitali kôd na svoj Arduino, samo kliknite na strelicu u gornjem lijevom kutu zaslona i pričekajte da vam u donjem lijevom kutu kaže da je dovršen.

OSU_Keyboard_code_V1

Uključujući i definirajući

Prvo morate uključiti biblioteku tastature. Ovo omogućava upotrebu Arduina kao tastature.

Zatim definiram neke vrijednosti. Define je poput varijable, ali se ne mogu promijeniti dok je program u toku. Prvih 9 su za karakter tipkovnice, broj pina arduina i bitove porta.

Zatim portovi bita LED podataka i sata.

Također je definiran broj LED dioda i varijabla za kut kotača u boji.

Postaviti

Ovaj dio koda će se izvršiti samo jednom kada je arduino priključen.

Prvo su pinovi sata i podataka LED dioda postavljeni kao izlazi, a iglice prekidača kao ulazi. Ovo je napredna verzija pinMode (). Ako ste zainteresirani potražite "direktna manipulacija portom".

Keyboard.begin () jednostavno pokreće USB vezu kao tastatura.

Sljedeća 3 prekida su povezana sa iglicama prekidača. Svaki put kada se otkrije promjena na iglici prekidača, izvest će se mali program. Ovaj mali program bit će napravljen dalje.

Petlja

Ovaj dio će se neprestano ponavljati dok se arduino napaja.

Koristim ga samo za promjenu i ažuriranje boje LED dioda.

Prekida

Ovdje se rade mali programi, koji će se izvoditi samo kada se na pinovima prekidača otkrije promjena. Identični su, osim na koji pin reagiraju.

Prvo provjerava je li gumb pritisnut ili otpušten i šalje ispravnu naredbu s tipkovnice.

LED (objašnjeno različitim redoslijedom)

Ako vas zanima kako se LED diodama kontrolira, pogledajte tablicu APA102.

OneBit

Ovo je opet verzija digitalnog pisanja za direktnu manipulaciju portom.

Prvo provjerava treba li poslati 0 ili 1 i povlači pin podataka nisko ili visoko. Zatim ispisuje pin sata vrlo kratko i ponovo ga zapisuje nisko.

OneByte

Ovo se ponavlja 8 puta sa peticom "za". On čita prvi bit u bajtu i prenosi njegovu vrijednost funkciji oneBit i čini isto za sljedećih 7 bitova.

LedData

Ovo se ponavlja jedan bajt 4 puta kako bi se dobili podaci potrebni za jedan LED. Prvi bajt počinje sa 111xxxxx i 5 -bitnom svjetlinom na mjestu xxxxx. Svetlina se može podesiti od 0 do 31 (2^5 = 32 nivoa).

Sljedeća 3 bajta su za plave, zelene i crvene vrijednosti. Jedan bajt za svaku boju.

ColorWheelThisLed

Ova funkcija poziva ledData daje joj rgb boje ovisno o kutu u krugu boja.

16 -bitna vrijednost je dividenda u 6 jednako raspoređenih dijelova od 60 stepeni. Gledanje slika moglo bi vam pomoći da bolje razumijete.

(8 -bitna verzija je takođe dostupna, ali je komentarisana jer je previše treperava)

StartEndFrame

Početni okvir potrebno je koristiti svaki put kada želite poslati nove boje LED -ovima i želite ažurirati stvarnu boju LED -a

Koristim samo početni okvir jer krajnji okvir nije potreban. Početni okvir ima 4 bajta od 0. Krajnji okvir je 4 bajta od 255 (11111111).

Korak 6: Kod V2 (softver Debounce With Timers)

Code V2 (softver Debounce With Timers)
Code V2 (softver Debounce With Timers)

Nakon nekog vremena igranja primijetio sam neke probleme sa dvostrukim dodirom u vezi sa hardverskim pojavljivanjem. To bi se moglo popraviti nekim drugim vrijednim otpornicima ili kondenzatorima, ali kako se gumbi i poklopac ne mogu ukloniti, mislio sam da bi odricanje softvera bilo lijepo rješenje. Softverski otkaz trebao bi funkcionirati bez obzira je li hardverski debounce implementiran ili ne. U trenutnoj postavci ne mogu ukloniti poklopac pa sam samo ostavio otpornike i kondenzatore na mjestu.

Neću objašnjavati kôd opširnije kao prethodna verzija jer ga je malo teže objasniti.

U osnovi većina koda radi isto, a LED kôd ostaje netaknut. promijenilo se to što vanjski prekidi više ne koriste arduino funkcije. Sada radi u čistom C kodu. Ono što je dodano je softverski prekid. Za to sam koristio AVR tajmere da sačekam određeno vrijeme dok preskakanje ne prestane. Budući da su mjerači vremena prekinuti, na vrijeme decouncea ne utječe ništa što se događa u petlji.

Jedini nedostatak koji mogu smisliti je to što se funkcije odgode arduina više ne mogu koristiti. Budući da funkcije odgode koriste Timer 0, a ovaj program koristi Timer 0 za debounce.

Na slici možete vidjeti kako kod otprilike funkcionira. Mem bit pokazuje da li je tajmer pokrenut. Ono što nije prikazano je slučaj da je na kraju pritiska tipke ulaz nizak. U ovom slučaju samo će se pritisnuti taster dok je dugme već otpušteno. Što znači da će ključ biti pritisnut što se računara tiče. Za ovo rijetko izuzeće provjera će se izvršiti kada istekne mjerač vremena. Ako se na kraju mjerača vremena ne pritisne tipka, bit će poslana naredba za otpuštanje tipke.

Korak 7: Kod V3 (softver Debounce with Vertical Counter) (preporučeno) (bez LED -a)

Kod V3 (softver Debounce With Vertical Counter) (preporučeno) (bez LED)
Kod V3 (softver Debounce With Vertical Counter) (preporučeno) (bez LED)

Ovaj kod TAKOĐER ima i verziju u kojoj vam ne trebaju otpornici na dolje. Svakako spojite svako dugme na ulaz i ZEMLJU! Koristi se ugrađeni pull-up

Doživio sam i neke neregistrirane preše u kodu V2. Mislim da je kod postao previše složen s vremenskim i vanjskim prekidom i možda sam propustio neke izuzetke. Iz tog razloga krenuo sam od nule tražeći na internetu metode za otkrivanje softvera.

(iskreno, barem je polovica ovog projekta u ovom trenutku postala otkazivanje dugmeta)

Nakon malo pretraživanja naišao sam na ovaj post:

www.compuphase.com/electronics/debouncing….

Da budem iskren, trebalo mi je dosta vremena da u potpunosti shvatim kako to točno funkcionira. To uključuje neke prilično složene manipulacije bitima, ali pokušat ću to učiniti što je moguće lakšim. Međutim, moja objašnjenja bit će samo dodatak postu pa biste trebali barem pročitati "vertikalne brojače", "označenu implementaciju" i "smanjenje kašnjenja".

Moje objašnjenje

Vremenski dijagram (napravljen u WaveDrom -u) koji sam dodao trebao bi otežati razumijevanje bitne matematike barem malo razumljivijim. Imajte na umu da slika ima 2 brojača, ali moj kôd ima 3. To znači duže vrijeme debounce.

Jedan bit po vrednosti

S implementacijom vertikalnog brojača moguće je istodobno otkloniti više tipki. Sve vrijednosti su tipa Byte (uint8_t) i sastoje se od 8 bitova. ne brine nas vrijednost bilo kojeg od ovih bajtova, već nas zanimaju bitovi sami po sebi. Svaki buton koji se uklanja mora koristiti samo jedan bit svakog bajta. Prvo dugme koristi samo prvi bit svakog bajta, drugo dugme koristi drugi bit itd.

Sve u isto vreme

Korištenjem matematike bitova moguće je paralelno izvođenje ovih otklanjanja pinova. Iako je matematika bitova prilično komplicirana, vrlo je efikasna za procesor.

S 8 -bitnim tipom podataka to je moguće učiniti za 8 tipki. Korištenje većih tipova podataka omogućuje više debuncija odjednom.

Otkazivanje

Rutina debounce se izvodi svakih 1 milisekundu s vremenskim prekidom.

kada se dugme pritisne, stanje stanja, koje je debununcirano stanje, će se sniziti, što znači da je pritisnuto dugme. Da bi otkrio otpuštanje, dugme mora biti dovoljno dugo visoko, što znači da nije poskakivalo određeno vrijeme. Toggle se koristi za označavanje promjene dugmeta. Brojači se koriste za…. računajući koliko dugo nije bilo odskoka.

Delta označava razliku između ulaznog i debunciranog stanja. Brojač će se računati samo kada postoji razlika. brojač će se poništiti kada se otkrije odskok (delta je 0).

Korak 8: Rezultat

Image
Image

Ako je sve prošlo dobro, sada biste trebali imati radnu tastaturu za sviranje Osu -a! uključeno. Ja lično nisam primetio nikakvo kašnjenje. Ako jeste, javite mi. Takođe, ako imate pitanja, slobodno pitajte bilo šta.

Prethodna pominjanja V2 nisu obećana pa nemojte odgađati ovaj projekt jer želite pričekati V2.

Nadam se da ćete uživati u tastaturi!

Osu! ime: Thomazzz3

Rješavanje problema

Ako mislite da imate problema s tipkovnicom, prvo otvorite uređivač teksta i pritisnite svaki taster jednom na kratko.

Ne radi jedan ili više ključeva?

Moguće je da ste interno uništili prekidač tokom lemljenja. Ako imate multimetar, uključite ga na kontinuitet/zvučni signal, postavite ga paralelno sa prekidačem dok Arduino nije povezan i pritisnite tipku. Trebao bi zvučni signal.

Da li se likovi koje ste upravo unijeli podudaraju s tipkama koje ste konfigurirali u Osu -u! ??

Promijenite znakove u arduino kodu u prva 3 #Defines ('' je nepotrebno!).

Ili promijenite svoj Osu! postavke za korištenje konfiguriranih ključeva.

Da li se jedan ili više tastera ponavljaju nekoliko puta?

Krug debounce vjerojatno ne radi za vaše prekidače ili nije pravilno lemljen. Provjerite spojeve lemljenja. Ako se i dalje javlja, pokušajte s kondenzatorom od 1uF. Korisnicima PCB -a to će biti jako teško.

Ako imate problema sa LED diodama

Da li LED diode trepere?

Veza za lemljenje može biti labav. Ako koristite PCB, potvrdite da je lim za lemljenje zaista tekao po podlozi na otisku.

Ne radi li niti jedna LED dioda ili iz određenog broja LED dioda prestaje raditi?

Provjerite ima li kratkih spojeva između spojeva prve LED diode (slijedite tragove) i provjerite ima li dobro povezanih limova na izlazima Arduina i opet prve LED. Ako se potvrdi da je ispravan i da je i dalje neispravan, možda ćete morati zamijeniti prvu LED diodu.

Ako se ovo popravi, ponovite za sljedeće LED diode ako je potrebno.

Preporučuje se: