Taula de continguts:

Osu! Teclat: 8 passos (amb imatges)
Osu! Teclat: 8 passos (amb imatges)

Vídeo: Osu! Teclat: 8 passos (amb imatges)

Vídeo: Osu! Teclat: 8 passos (amb imatges)
Vídeo: 8 инструментов в Excel, которыми каждый должен уметь пользоваться 2024, Desembre
Anonim
Osu! Teclat
Osu! Teclat

Fa poc vaig començar a jugar a un joc de ritme anomenat osu! i després de veure un vídeo d'un mini teclat comercial, vaig pensar que seria un projecte divertit dissenyar-ne un. Poc després vaig decidir que seria una bona idea posar-lo en instruccions com a primer projecte.

Si voleu replicar aquest projecte exactament a la darrera instrucció, sigueu el meu convidat, però algunes de les desiccions que he fet no es basen en el preu més baix ni en la millor qualitat. Alguns components es trien gairebé exclusivament perquè els tenia estirats. Si ho aconseguiu, us animaria a personalitzar el vostre projecte.

Nota 1: S'utilitzen components SMD (electrònica petita), de manera que si repliqueu aquest projecte calen habilitats de soldadura. potser s'afegirà una versió fàcil de soldar, però aquests leds no vénen en un paquet de forats

Nota 2: He actualitzat el codi diverses vegades i ara estic a la versió 3ish. Deixaré tot el codi en línia, però us recomano que utilitzeu la darrera versió. Actualment no disposa de funcionalitat de led, però hauria de ser la que tingui el millor rendiment.

Pas 1: materials i explicacions

Materials i explicacions
Materials i explicacions

Depenent de com feu el vostre projecte, és possible que necessiteu components diferents, però aquests components són els que he utilitzat. Si teniu temps i voleu estalviar diners, feu la sol·licitud al AliExpress i no demaneu el PCB.

1 cable micro Arduino pro + USB

3 interruptors vermells Kailh BOX

3 resistències de 10 k (0805 SMD)

3 condensadors de 100 nF (0805 SMD)

4 LED APA102 rgb (5050 SMD)

3 claus

1 Placa de circuits impresos (PCB) proporcionada en aquest projecte

1 estoig imprès en 3D proporcionat en aquest projecte

Per què faig servir un micro Arduino pro?

La majoria de les plaques arduino com l’Uno (Atmega328) no tenen suport natiu per a la comunicació USB. Sí, podeu programar-los per USB molt fàcilment i crec que hi ha solucions alternatives, però m'agrada mantenir-ho senzill quan es tracta de comunicació USB i no sé si les solucions solucionades són tan sensibles. Aquestes plaques utilitzen un xip extern per fer possible la comunicació USB, mentre que l’Arduino pro micro (Atmega32U4) la té integrada.

Els interruptors

Hi ha molts interruptors mecànics que podeu utilitzar. Lineal, tàctil o clicky de Kailh o Cherry MX. Trieu el que vulgueu. Vaig utilitzar els interruptors Kailh perquè eren barats a Ailexpress. Si decidiu utilitzar el PCB, necessitareu interruptors Kailh BOX. El color determina la sensació.

Els components electrònics

No hi ha molt a explicar al respecte en aquest capítol, però si no feu servir el PCB, us recomanaria components normals normals per facilitar la soldadura. Malauradament, els leds utilitzats no estan disponibles en paquets de forats. Tampoc no recomanaria fer servir cables en paquets SMD tret que tingueu molta confiança en les vostres habilitats de soldadura. Fins i tot per a SMD en un PCB es requereixen habilitats de soldadura "avançades".

L'habitatge

Proporciono un habitatge en aquest projecte, però en aquest moment és defectuós. Es necessiten modificacions per ajustar els cargols, les obertures dels leds no són òptimes, l’arduino està exposat i cal retallar una peça perquè l’USB encaixi. En el futur es podrà afegir un nou habitatge. Si teniu una impressora 3D, seguiu imprimint-la, però si us plau, no feu el possible per imprimir aquesta caixa defectuosa si no ho feu i només utilitzeu algun tipus de quadre de projecte.

Pas 2: l’esquema

L’Esquema
L’Esquema

L'esquema d'aquest projecte és bastant senzill, però vull explicar els components per a les persones que estiguin interessades i no coneguin aquesta implementació.

Canvieu les connexions a l'Arduino

Els commutadors estan connectats als pins Arduino 0, 2 i 3 perquè aquests pins es poden utilitzar com a interrupcions externes. Això s’explica més a la secció de codis.

El circuit de debounce

Al costat esquerre de l’esquema hi ha un circuit que es copia 3 vegades. Aquest circuit s’utilitza per rebutjar l’interruptor. Per saber què és el debounment, heu d’entendre el rebot de commutació i no és difícil d’entendre.

Primer mireu aquesta simulació per pintar una primera imatge (feu clic al commutador ràpidament i mireu el senyal següent)

Quan premeu o deixeu anar un commutador, el botó rebota i el senyal alterna entre alt i baix un parell de vegades durant uns quants mil·lisegons. Un Arduino és realment ràpid i llegeix cada mínim en aquest curt temps. El programa enviarà una tecla o llançament cada vegada que es llegeixi una alta o una baixa, de manera que amb cada pulsació, l'ordinador rebrà diverses tecles. No és ideal per a un joc de ritme.

Aquest circuit de desacceleració alentirà la vora descendent del senyal. El senyal a l'Arduino no podrà canviar tan ràpidament com es produeixi el rebot, de manera que es llegirà amb una sola pulsació. No us preocupeu perquè caigui a poc a poc per a la propera premsa real, perquè sí.

Avançat:

L'Atmaga32U4 llegeix un mínim digital a 0,2 Vcc - 0,1 V = 0,9 volts. La tensió del condensador en qualsevol moment de la seva descàrrega és Vcc * e ^ (- t / RC). Si mesureu un temps de rebounce diferent al vostre commutador, podeu calcular els valors de la resistència i del condensador.

formulari de fórmula

Els LED

Els LEDs rgb són leds APA102 que es poden dirigir individualment mitjançant un rellotge i una línia de dades. No calen components externs perquè funcionin. Per a molts LEDs, heu d’utilitzar un condensador paral·lel a 5 volts i a terra, però amb només 4 LED no el necessiteu.

Pas 3: el disseny del tauler

El disseny del tauler
El disseny del tauler

El PCB es va dissenyar en JLCPCB. No em patrocinen, però per a prototips econòmics fan que els PCB siguin excel·lents. Per 2 dòlars obtindreu 10 del mateix tauler, però l'enviament va ser d'uns 11 dòlars per a mi. Si no voleu necessàriament il·luminació rgb i teniu previst fer-ne una, hauríeu de plantejar-vos la possibilitat de fabricar el vostre teclat sense PCB.

El disseny del tauler era força senzill. Només calia afegir un component per als commutadors, però després d’haver vist alguns vídeos en vaig tenir la idea. L'únic defecte que em vaig adonar és que la col·locació dels forats és una mica massa propera als interruptors.

Per demanar el PCB aneu a https://jlcpcb.com/ i trieu l'opció de 2 capes. Us demanarà un fitxer Gerber. descarregueu el fitxer ".zip" i arrossegueu-lo a la finestra. No cal descomprimir-lo. La configuració hauria d’estar bé i podeu continuar la comanda.

Pas 4: consells de disseny i muntatge de caixes

Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes
Consells de disseny i muntatge de caixes

Disseny

Com he esmentat abans, el meu disseny és defectuós, però encara podeu imprimir-lo si voleu. el disseny es va fer a Fusion 360. És un programari de modelatge 3D gratuït i amb la meva experiència d'inventor i solidworks va ser bastant fàcil de treballar. Els cercles de les cantonades de la caixa han de prevenir la peladura del llit.

Si feu el vostre propi cas, una cosa és realment important. Els commutadors han d’estar ben col·locats i no poden moure’s. He proporcionat imatges dels retalls quadrats amb dimensions perquè pugueu utilitzar-les per al vostre propi disseny suposant que utilitzeu commutadors Kailh BOX.

muntatge

Ara teniu tots els components necessaris per muntar. Hi ha una ordre per muntar aquesta primera versió perquè els interruptors estan soldats.

1. Soldeu els components SMD. aquests són els resistors, condensadors i LED.

2. Soldeu el micro Arduino pro.

3. Col·loqueu els 3 interruptors a la placa de coberta impresa en 3D abans de soldar. La placa de coberta no es pot retirar després de soldar els interruptors. No es recomana dessoldar els interruptors i pot destruir-los.

4. Ara soldeu els interruptors al lloc. Feu-ho tan aviat com sigui possible perquè els interruptors de plàstic es poden fondre i arruïnar o disminuir dràsticament el nombre de clics.

5. Col·loqueu la placa de coberta muntada a la caixa impresa en 3D i fixeu-la amb cinta adhesiva o utilitzeu cargols si no interfereixen amb les claus.

6. Col·loqueu els keyCaps als interruptors i ja heu acabat.

Recomanacions

Desoldeu o emmasqueu els LED de l’arduino després de penjar el vostre codi. Els leds són agradables si el vostre codi no es penja, però no és bo veure’l com a producte acabat. Es requereixen pinces habilitades i punxegudes.

També alguns peus d’adherència a la part inferior són agradables per antilliscants i deixen passar la llum RGB.

Pas 5: el Codi V1 (Rebounce de maquinari)

El Codi V1 (Rebounce de maquinari)
El Codi V1 (Rebounce de maquinari)
El Codi V1 (Rebounce de maquinari)
El Codi V1 (Rebounce de maquinari)

El codi d’aquest projecte no és apte per a principiants, de manera que si tot just comenceu a programar en arduino, aquest codi possiblement us espantarà una mica. No obstant això, intentaré explicar el que passa el millor possible. Algunes coses s’expliquen més endavant en aquest text, de manera que si teniu alguna pregunta, llegiu-ne primer.

Carregant el codi

Primer descarregueu els 3 fitxers ".ino" i poseu-los en una carpeta. Si no teniu l’IDE Arduino, descarregueu-lo gratuïtament al lloc oficial d’arduino.

Connecteu el vostre Arduino al vostre PC i obriu "OSU_Keyboard_code_V1.ino". Al tauler d’eines, seleccioneu "Arduino / Genuino Micro". També a Eines, seleccioneu el port COM adequat. De vegades, això pot canviar. Per carregar el codi al vostre Arduino, feu clic a la fletxa que hi ha a la part superior esquerra de la pantalla i espereu fins que us indiqui que heu completat la part inferior esquerra.

OSU_Keyboard_code_V1

Incloent i definint

Primer heu d’incloure la biblioteca del teclat. Això fa possible utilitzar l'Arduino com a teclat.

A continuació, defineixo alguns valors. Definir és com una variable, però no poden canviar mentre s’executa el programa. Els primers 9 corresponen al caràcter del teclat, al número de pin arduino i als bits de port.

A continuació, els bits de port de les dades i el rellotge del LED.

També es defineix el nombre de leds i una variable per a l'angle de la roda de colors.

Configuració

Aquesta part del codi només s’executarà una vegada quan es connecti l’arduino.

En primer lloc, els pins de rellotge i dades dels LED es configuren com a sortides i els pins de commutació com a entrades. Aquesta és la versió avançada de pinMode (). Si esteu interessats, cerqueu "manipulació directa de ports".

Keyboard.begin () simplement inicia la connexió usb com a teclat.

Les següents 3 interrupcions es relacionen amb els pins de commutació. Cada vegada que es detecta un canvi al pin del commutador, s'executarà un petit programa. Aquest petit programa es farà més endavant.

Bucle

Aquesta part es repetirà contínuament mentre l’arduino s’encén.

Només l’utilitzo per canviar i actualitzar el color dels LED.

Interrupcions

Aquí es fan els petits programes, que només s’executaran quan es detecti un canvi als pins de commutació. Són idèntics, excepte a quin pin reaccionen.

Primer es comprova si es prem o es deixa anar el botó i s'envia la comanda correcta del teclat.

LED (s'explica en un ordre diferent)

Si teniu curiositat per controlar els LEDs, consulteu el full de dades APA102.

OneBit

Aquesta és de nou la versió de manipulació directa de ports d’escriptura digital.

Primer es comprova si ha d'enviar un 0 o 1 i, respectivament, estira el pin de dades baix o alt. Després escriu molt ràpidament el pin del rellotge i el torna a escriure baix.

OneByte

Això es repeteix oneBit 8 vegades amb un bucle "for". Llegeix el primer bit en un byte i passa el seu valor a la funció oneBit i fa el mateix per als següents 7 bits.

LedData

Això es repeteix oneByte 4 vegades per proporcionar les dades necessàries per a un led. El primer byte comença amb 111xxxxx i un valor de brillantor de 5 bits al lloc del xxxxx. La brillantor es pot configurar de 0 a 31 (2 ^ 5 = 32 nivells).

Els següents 3 bytes corresponen als valors de blau, verd i vermell. Un byte per cada color.

ColorWheelThisLed

Aquesta funció crida ledData li proporciona els colors RGB segons un angle de la roda de colors.

El valor de 16 bits és dividend en 6 seccions igualment espaiades de 60 graus. Mirar les imatges us pot ajudar a entendre millor.

(també es proporciona una versió de 8 bits però comentada perquè és massa parpellejant)

StartEndFrame

Cal utilitzar el marc inicial cada vegada que vulgueu enviar nous colors als leds i voleu actualitzar el color real dels leds

Només faig servir el marc inicial perquè no és necessari el frame final. El marc inicial és de 4 bytes de 0. El frame final és de 4 bytes de 255 (11111111).

Pas 6: El codi V2 (programari de rebutge amb temporitzadors)

El codi V2 (programari Debounce With Timers)
El codi V2 (programari Debounce With Timers)

Després d'un temps de joc, vaig notar alguns problemes de doble toc amb el debounce del maquinari. Això es podria solucionar amb altres resistències o condensadors de valor, però com que els botons i la tapa no són extraïbles, vaig pensar que la descàrrega de programari seria una bona solució. El debounce de programari hauria de funcionar si el debounce de maquinari està implementat o no. En la meva configuració actual, ja no vaig treure la tapa, de manera que vaig deixar els resistors i els condensadors al seu lloc.

No explicaré el codi tan extensament com la versió anterior perquè és una mica més difícil d’explicar.

Bàsicament, la majoria del codi funciona igual i el codi LED es deixa intacte. el que va canviar és que les interrupcions externes ja no utilitzen les funcions arduino. Ara funciona en codi C pur. I ara el que s’afegeix és la interrupció del programari. Per a això, he utilitzat els temporitzadors AVR per esperar un cert temps fins que s'hagi aturat el rebot. Com que els temporitzadors es basen en interrupcions, el temps de decreció no es veu influït per res que passi al bucle.

L'únic inconvenient que puc arribar és que les funcions de retard d'arduino ja no es poden utilitzar. Com que les funcions de retard utilitzen el temporitzador 0 i aquest programa utilitza el temporitzador 0 per rebutjar.

A la imatge podeu veure com funciona aproximadament el codi. El bit mem indica si s’executa un temporitzador. El que no es representa és que al final del botó premeu l'entrada és baixa. En aquest cas, només s'enviaria una tecla mentre el botó ja estigui alliberat. Això significa que es mantindrà premuda la tecla pel que fa a l'ordinador. Per a aquesta excepció excepcional, es realitzarà una comprovació quan caduqui un temporitzador. Si al final del temporitzador no es prem el botó, s'enviarà una ordre de llançament de tecles.

Pas 7: El codi V3 (programari Debounce With Vertical Counter) (recomanat) (sense LED)

El codi V3 (programari Debounce With Vertical Counter) (recomanat) (sense LED)
El codi V3 (programari Debounce With Vertical Counter) (recomanat) (sense LED)

Aquest codi TAMBÉ té una versió en què no necessiteu resistències de baixada. Assegureu-vos de connectar cada botó a l'entrada i a TERRA. S’utilitza el pull-up incorporat

També vaig experimentar algunes premses no registrades al codi V2. Crec que el codi es va tornar massa complex amb la seva interrupció externa i temporitzadora i potser he perdut algunes excepcions. Per aquest motiu, em vaig esforçar des de zero amb la cerca a Internet de mètodes de rebuda de programari.

(sincerament, com a mínim la meitat d'aquest projecte s'ha convertit en un debouning de botons en aquest moment)

Després d'algunes cerques, em vaig trobar amb aquest post:

www.compuphase.com/electronics/debouncing….

Per ser sincer, he trigat força temps a entendre bé com funciona exactament. Implica algunes manipulacions de bits força complexes, però intentaré fer-ho el més fàcil possible. Tanmateix, les meves explicacions només seran una addició a la publicació, de manera que almenys heu de llegir els "comptadors verticals", "una implementació anotada" i "reduir la latència".

La meva explicació

El diagrama de temps (fet a WaveDrom) que he afegit hauria de fer que les matemàtiques de bits siguin difícils d’entendre almenys una mica més entenedores. Tingueu en compte que la imatge té 2 bits de comptador, però el meu codi en té 3. Això significa un temps de desbarat més llarg.

Un bit per valor

Amb la implementació del comptador vertical és possible rebotar diversos botons al mateix temps, en paral·lel. Tots els valors són de tipus Byte (uint8_t) i consten de 8 bits. no ens preocupa quin valor conté cap d'aquests bytes, sinó que ens interessen els bits per si sols. Tots els botons que es debaten només utilitzen un bit de cada byte. El primer botó utilitza només el primer bit de cada byte, el segon botó fa servir el segon bit, etc.

Tot alhora

Mitjançant l'ús de bit math, és possible executar aquests pin debounces en paral·lel. I, tot i que les matemàtiques de bits són bastant complicades, són molt eficients per al processador.

Amb un tipus de dades de 8 bits, és possible fer-ho per a 8 botons. L’ús de tipus de dades més grans permet obtenir més rebots alhora.

El debounce

La rutina de rebounce s’executa cada 1 mil·lisegon amb una interrupció del temporitzador.

quan es prem el botó, el botóStat, que és l'estat rebutjat, disminuirà immediatament, cosa que indica que es prem un botó. Per detectar un llançament, el botó ha de ser alt durant el temps suficient, cosa que indica que no ha rebotat durant un temps determinat. La commutació s’utilitza per indicar un canvi de botó. Els bits de comptador s'utilitzen per a … comptant quant de temps no hi ha hagut cap rebot.

Delta indica una diferència entre l'estat d'entrada i l'estat rebutjat. Només quan hi hagi una diferència, el comptador comptarà. el comptador es restablirà quan es detecti un rebot (el delta és 0).

Pas 8: el resultat

Image
Image

Si tot anava bé, ara hauríeu de tenir un teclat que funcioni per jugar a Osu. encès. Personalment no he notat cap latència. Si ho feu, si us plau, feu-m'ho saber. A més, si hi ha alguna pregunta, no dubteu a fer res.

Les mencions anteriors sobre un V2 no s’entenen com una promesa, així que no posponeu aquest projecte perquè voleu esperar a V2.

Espero que gaudiu del vostre teclat!

Osu! nom: Thomazzz3

Resolució de problemes

Si creieu que teniu problemes amb el teclat, primer obriu un editor de text i premeu cada tecla una vegada durant poc temps.

Una o diverses tecles no funcionen?

És possible que hàgiu destruït un interruptor internament durant la soldadura. Si teniu un multímetre, poseu-lo en continuïtat / pitit, poseu-lo en paral·lel al commutador mentre l'Arduino no estigui connectat i premeu la tecla. Ha de sonar.

Els personatges que acabeu d'escriure coincideixen amb les tecles que heu configurat a Osu? ?

Canvieu els caràcters del codi arduino als primers 3 #Defines ('' no és necessari!).

O canvieu el vostre Osu! per utilitzar les tecles configurades.

Es repeteixen una o diverses tecles unes quantes vegades?

El circuit de rebounce probablement no funciona per als vostres commutadors o no està soldat correctament. Comproveu les connexions de soldadura. Si encara es produeix, proveu un valor de condensador de 1uF. Això serà molt difícil per als usuaris de PCB.

Si teniu problemes amb els LEDs

Parpellegen els LED?

És possible que la connexió de soldadura estigui solta. Si utilitzeu el PCB, confirmeu que l'estany de soldadura realment va fluir al coixinet de la impressió.

Cap dels leds funciona o d'un determinat nombre de LEDs deixa de funcionar?

Comproveu si hi ha curts entre les connexions del primer LED (seguiu les pistes) i comproveu si hi ha una llauna ben connectada a les sortides de l’Arduino i, de nou, el primer LED. Si es confirma que és correcte i encara està defectuós, potser haureu de substituir el primer LED.

Si això es corregeix, repetiu els següents LEDs si cal.

Recomanat: