Tabla de contenido:

Osu! Teclado: 8 pasos (con imágenes)
Osu! Teclado: 8 pasos (con imágenes)

Video: Osu! Teclado: 8 pasos (con imágenes)

Video: Osu! Teclado: 8 pasos (con imágenes)
Video: Que curiosa es la mente 2024, Mes de julio
Anonim
¡Osu! Teclado
¡Osu! Teclado

¡Recientemente comencé a jugar un juego de ritmo llamado osu! y después de ver un video de un mini teclado comercial pensé que sería un proyecto divertido diseñar uno yo mismo. No mucho después de eso, decidí que sería una buena idea ponerlo en instructables como mi primer proyecto.

Si desea replicar este proyecto exactamente hasta la última instrucción, entonces sea mi invitado, pero algunas de las decisiones que hice no se basan en el precio más bajo o la mejor calidad. Algunos componentes se eligen casi exclusivamente porque los tenía por ahí. Si puede manejarlo, lo animo a personalizar su proyecto.

Nota 1: Se utilizan componentes SMD (electrónica pequeña), por lo que si replica este proyecto, se requieren habilidades de soldadura. tal vez se agregue una versión fácil de soldar, pero estos leds no vienen en un paquete de orificios de canal

Nota 2: He actualizado el código varias veces y ahora estoy a la versión 3ish. Dejaré todo el código en línea, pero te recomiendo que uses la última versión. Actualmente no tiene funcionalidad LED, pero debería ser la de mejor rendimiento.

Paso 1: Materiales y explicaciones

Materiales y explicaciones
Materiales y explicaciones

Dependiendo de cómo hagas tu proyecto, es posible que necesites diferentes componentes, pero estos componentes son los que yo utilicé. Si tiene tiempo y desea ahorrar dinero, solicite desde aliexpress y no solicite la PCB.

1 cable Arduino pro micro + USB

3 interruptores rojos Kailh BOX

3 resistencia de 10k (0805 SMD)

3 condensador de 100nF (0805 SMD)

4 LED RGB APA102 (5050 SMD)

3 teclas

1 placa de circuito impreso (PCB) proporcionada en este proyecto

1 estuche impreso en 3D proporcionado en este proyecto

¿Por qué utilizo un Arduino pro micro?

La mayoría de las placas arduino como la Uno (Atmega328) no tienen soporte nativo para la comunicación USB. Sí, puede programarlos a través de USB muy fácilmente y creo que hay soluciones alternativas, pero me gusta mantenerlo simple cuando se trata de comunicación USB y no sé si las soluciones son tan receptivas. Esas placas usan un chip externo para hacer posible la comunicación USB, mientras que el Arduino pro micro (Atmega32U4) lo tiene incorporado.

Los interruptores

Hay muchos interruptores mecánicos que puede utilizar. Lineal, táctil o clicky de Kailh o Cherry MX. Elige cualquiera que te guste. Usé los interruptores Kailh porque eran baratos en Ailexpress. Si elige usar la PCB, necesitará interruptores Kailh BOX. El color determina el sentimiento.

Los componentes electronicos

No hay mucho que explicar sobre ellos en este capítulo, pero si no usa la PCB, le recomendaría solo los componentes normales del orificio del canal para facilitar la soldadura. Lamentablemente, los leds utilizados no están disponibles en paquetes de orificios de paso. Tampoco recomendaría usar cables en paquetes SMD a menos que tenga mucha confianza en sus habilidades de soldadura. Incluso para SMD en una PCB se requieren habilidades de soldadura "avanzadas".

La vivienda

Proporciono una vivienda en este proyecto, pero en este momento tiene fallas. Se necesitan modificaciones para colocar los pernos, las aberturas para los leds no son óptimas, el arduino está expuesto y es necesario cortar una parte para que encaje el USB. En el futuro se puede agregar una nueva vivienda. Si tiene una impresora 3D, imprímala, pero no se desvíe de su camino para imprimir esta funda defectuosa si no la tiene y solo use algún tipo de caja de proyecto.

Paso 2: el esquema

El esquema
El esquema

El esquema de este proyecto es bastante simple, pero quiero explicar los componentes para las personas que estén interesadas y no conozcan esta implementación.

Cambiar conexiones al Arduino

Los interruptores están conectados a los pines 0, 2 y 3 de Arduino porque esos pines se pueden usar como interrupciones externas. Esto se explica con más detalle en la sección de códigos.

El circuito antirrebote

En el lado izquierdo del esquema hay un circuito que se copia 3 veces. Este circuito se utiliza para eliminar el rebote del interruptor. Para saber qué es la eliminación de rebotes, debe comprender el rebote del interruptor y no es difícil de entender.

Primero mire esta simulación para pintar una primera imagen (haga clic en el interruptor rápido y mire la señal a continuación)

Cuando presiona o suelta un interruptor, este rebota y su señal alterna entre alta y baja un par de veces durante unos milisegundos. Un Arduino es realmente rápido y lee todos los altibajos en este corto tiempo. El programa enviará una pulsación o liberación de una tecla cada vez que se lea un valor alto o bajo, por lo que con cada pulsación su computadora recibirá varias pulsaciones de tecla. No es ideal para un juego de ritmo.

Este circuito antirrebote ralentizará el flanco descendente de la señal. La señal al Arduino no podrá cambiar tan rápido como ocurre el rebote, por lo que se leerá con una sola pulsación. No se preocupe de que se reduzca la velocidad para la próxima pulsación real porque lo hará.

Avanzado:

El Atmaga32U4 lee un bajo digital a 0.2Vcc - 0.1V = 0.9 voltios. El voltaje del capacitor en cualquier momento de su descarga es Vcc * e ^ (- t / RC). Si mide un tiempo de eliminación de rebotes diferente en su interruptor, puede calcular los valores de su resistencia y condensador.

formulario de fórmula

Los LED

Los LED RGB son LED APA102 que se pueden direccionar individualmente mediante un reloj y una línea de datos. No se necesitan componentes externos para que funcionen. Para muchos LED, debe usar un condensador paralelo a 5 voltios y tierra, pero con solo 4 LED no lo necesita.

Paso 3: el diseño de la placa

El diseño de la placa
El diseño de la placa

El PCB fue diseñado en JLCPCB. No estoy patrocinado por ellos, pero para prototipos baratos hacen excelentes PCB. Por 2 dólares obtienes 10 de la misma tabla, pero el envío fue de aproximadamente 11 dólares para mí. Si no desea necesariamente iluminación RGB y planea hacer solo una, debería considerar hacer su teclado sin PCB.

El diseño del tablero fue bastante sencillo. Solo necesitaba agregar un componente para los interruptores, pero después de ver algunos videos lo entendí. El único defecto del que me di cuenta es que la ubicación de los orificios está demasiado cerca de los interruptores.

Para pedir la PCB, vaya a https://jlcpcb.com/ y elija la opción de 2 capas. Le pedirá un archivo Gerber. descargue el archivo ".zip" y arrástrelo a la ventana. No es necesario descomprimirlo. La configuración debería estar bien y puede continuar y completar el pedido.

Paso 4: Diseño de la carcasa y consejos de montaje

Consejos para el montaje y el diseño de la carcasa
Consejos para el montaje y el diseño de la carcasa
Consejos para el montaje y el diseño de la carcasa
Consejos para el montaje y el diseño de la carcasa
Consejos de montaje y diseño de la carcasa
Consejos de montaje y diseño de la carcasa
Consejos para el montaje y el diseño de la carcasa
Consejos para el montaje y el diseño de la carcasa

Diseño

Como se mencionó anteriormente, mi diseño es defectuoso, pero aún puede imprimirlo si lo desea. el diseño se hizo en Fusion 360. Es un software de modelado 3D gratuito y con mi experiencia de inventor y solidworks fue bastante fácil trabajar con él. Los círculos en las esquinas de la caja son para evitar que se despegue de la plataforma de impresión.

Si presenta su propio caso, solo una cosa es realmente importante. Sus interruptores deben estar colocados firmemente y no pueden moverse. Proporcioné imágenes de los recortes cuadrados con dimensiones para que pueda usarlos para su propio diseño, asumiendo que usa interruptores Kailh BOX.

Montaje

Ahora tiene todos los componentes necesarios para ensamblar. Hay una orden para ensamblar esta primera versión porque los interruptores están soldados.

1. Suelde los componentes SMD. estos son las resistencias, los condensadores y los LED.

2. Suelde el Arduino pro micro.

3. Coloque los 3 interruptores en la placa de cubierta impresa en 3D antes de soldar. La placa de cubierta no se puede quitar después de soldar los interruptores. No se recomienda desoldar los interruptores y puede destruirlos.

4. Ahora suelde los interruptores en su lugar. Haga esto lo más rápido posible porque los interruptores de plástico pueden derretirlos y arruinarlos o disminuir drásticamente su número de clics.

5. Coloque la placa de cubierta ensamblada en la caja impresa en 3D y asegúrela con cinta adhesiva o use pernos si no interfieren con las teclas.

6. Coloque los keyCaps en los interruptores y listo.

Recomendaciones

Desoldar o enmascarar los LED en el arduino después de cargar su código. Es bueno tener los leds si su código no se carga, pero no es agradable verlos como un producto terminado. Se requiere habilidad y pinzas puntiagudas.

Además, algunos pies de agarre en la parte inferior son buenos para antideslizamiento y dejan que la luz rgb brille.

Paso 5: el código V1 (rebote de hardware)

El código V1 (rebote de hardware)
El código V1 (rebote de hardware)
El código V1 (rebote de hardware)
El código V1 (rebote de hardware)

El código para este proyecto no es amigable para principiantes, por lo que si recién está comenzando a programar en arduino, este código posiblemente lo asuste un poco. Sin embargo, intentaré explicar lo que está pasando lo mejor que pueda. Algunas cosas se explican más adelante en este texto, así que si tiene preguntas, primero lea todo.

Subiendo el código

Primero descargue los 3 archivos ".ino" y colóquelos en una carpeta. Si no tiene el IDE de Arduino, simplemente descárguelo gratis en el sitio oficial de arduino.

Conecte su Arduino a su PC y abra "OSU_Keyboard_code_V1.ino". En el panel de herramientas, seleccione "Arduino / Genuino Micro". También en Herramientas seleccione el puerto COM correcto. Esto a veces puede cambiar. Para cargar el código en su Arduino, simplemente haga clic en la flecha en la parte superior izquierda de la pantalla y espere hasta que le indique que se completó en la parte inferior izquierda.

OSU_Keyboard_code_V1

Incluyendo y definiendo

Primero debe incluir la biblioteca de teclados. Esto hace posible utilizar Arduino como teclado.

A continuación defino algunos valores. Definir es como una variable, pero no puede cambiar mientras el programa se está ejecutando. Los primeros 9 son para el carácter del teclado, el número de pin arduino y los bits del puerto.

Luego, los bits de puerto de los datos LED y el reloj.

También se define el número de leds y una variable para el ángulo de la rueda de colores.

Configuración

Esta parte del código solo se ejecutará una vez cuando el arduino esté conectado.

Primero, los pines de reloj y datos de los LED se configuran como salidas y los pines del interruptor como entradas. Esta es la versión avanzada de pinMode (). Si está interesado, busque "manipulación directa de puertos".

Keyboard.begin () simplemente inicia la conexión USB como teclado.

Las siguientes 3 interrupciones están vinculadas a los pines del interruptor. Cada vez que se detecta un cambio en el pin del interruptor, se ejecutará un pequeño programa. Este pequeño programa se desarrollará más adelante.

Círculo

Esta parte se repetirá continuamente mientras el arduino esté encendido.

Solo lo uso para cambiar y actualizar el color de los LED.

Interrupciones

Aquí se realizan los pequeños programas, que solo se ejecutarán cuando se detecte un cambio en los pines del interruptor. Son idénticos excepto por el pin al que reaccionan.

Primero verifica si el botón está presionado o suelto y envía el comando de teclado correcto.

LED (explicado en un orden diferente)

Si tiene curiosidad sobre cómo se controlan los LED, debe consultar la hoja de datos APA102.

Un bit

Esta es de nuevo la versión de escritura digital de manipulación directa de puertos.

Primero verifica si debe enviar un 0 o 1 y, respectivamente, tira del pin de datos hacia abajo o hacia arriba. Luego escribe el pin del reloj alto muy corto y lo escribe bajo de nuevo.

OneByte

Esto repite oneBit 8 veces con un bucle "for". Lee el primer bit de un byte y pasa su valor a la función oneBit y hace lo mismo con los siguientes 7 bits.

LedData

Esto se repite oneByte 4 veces para proporcionar los datos necesarios para un led. El primer byte comienza con 111xxxxx y un valor de brillo de 5 bits en el lugar de xxxxx. El brillo se puede configurar de 0 a 31 (2 ^ 5 = 32 niveles).

Los siguientes 3 bytes son para los valores azul, verde y rojo. Un byte para cada color.

ColorWheelThisLed

Esta función llama a ledData y le da los colores rgb dependiendo de un ángulo en la rueda de colores.

El valor de 16 bits se divide en 6 secciones igualmente espaciadas de 60 grados. Mirar las imágenes puede ayudarlo a comprender mejor.

(También se proporciona una versión de 8 bits, pero comentada porque es demasiado parpadeante)

StartEndFrame

El marco de inicio debe usarse cada vez que desee enviar nuevos colores a los leds y desee actualizar el color real de los leds.

Solo uso el marco inicial porque no se necesita el marco final. La trama inicial tiene 4 bytes de 0. La trama final tiene 4 bytes de 255 (11111111).

Paso 6: el código V2 (software antirrebote con temporizadores)

El código V2 (software antirrebote con temporizadores)
El código V2 (software antirrebote con temporizadores)

Después de un rato de jugar, noté algunos problemas de doble pulsación con el rebote del hardware. Esto podría solucionarse con resistencias o condensadores de otros valores, pero como los botones y la tapa no son extraíbles, pensé que la eliminación de rebotes por software sería una buena solución. El antirrebote del software debería funcionar si se implementa o no el antirrebote del hardware. En mi configuración actual, no pude quitar la tapa, así que simplemente dejé las resistencias y los condensadores en su lugar.

No explicaré el código tan extensamente como la versión anterior porque es un poco más difícil de explicar.

Básicamente, la mayor parte del código funciona igual y el código LED se deja intacto. lo que cambió es que las interrupciones externas ya no usan las funciones de arduino. Ahora funciona en código C puro. Y ahora lo que se agrega es la interrupción del software. Para esto, utilicé los temporizadores AVR para esperar una cierta cantidad de tiempo hasta que se detuviera el rebote. Debido a que los temporizadores se basan en interrupciones, el tiempo de decounce no se ve influenciado por nada que suceda en el bucle.

El único inconveniente que se me ocurre es que las funciones de retardo de arduino ya no se pueden usar. Porque las funciones de retardo usan el temporizador 0 y este programa usa el temporizador 0 para eliminar el rebote.

En la imagen se puede ver cómo funciona aproximadamente el código. El bit de memoria indica si se está ejecutando un temporizador. Lo que no se muestra es el caso de que al final de la pulsación del botón la entrada sea baja. En este caso, solo se enviaría una pulsación de tecla mientras el botón ya está suelto. Lo que significa que la tecla se mantendrá presionada en lo que respecta a la computadora. Por esta rara excepción, se realizará una verificación cuando expire un temporizador. Si al final de un temporizador no se presiona el botón, se enviará un comando de liberación de tecla.

Paso 7: El código V3 (software antirrebote con contador vertical) (recomendado) (sin LED)

El código V3 (software antirrebote con contador vertical) (recomendado) (sin LED)
El código V3 (software antirrebote con contador vertical) (recomendado) (sin LED)

Este código TAMBIÉN tiene una versión en la que no necesita resistencias desplegables. ¡Asegúrese de conectar cada botón a la entrada y a TIERRA! Se utiliza el pull-up incorporado

También experimenté algunas prensas no registradas en el código V2. Creo que el código se volvió demasiado complejo con su temporizador y su interrupción externa y es posible que me haya perdido algunas excepciones. Por esta razón, comencé desde cero con la búsqueda en Internet de métodos de eliminación de rebotes de software.

(Honestamente, al menos la mitad de este proyecto se ha convertido en un botón de eliminación de rebotes en este punto)

Después de buscar, encontré esta publicación:

www.compuphase.com/electronics/debouncing….

Para ser honesto, me tomó bastante tiempo comprender completamente cómo funciona exactamente. Implica algunas manipulaciones de bits bastante complejas, pero intentaré hacerlo lo más fácil posible. Sin embargo, mis explicaciones solo serán una adición a la publicación, por lo que al menos debería leer los "contadores verticales", "una implementación anotada" y "reducción de la latencia".

Mi explicacion

El diagrama de tiempo (hecho en WaveDrom) que agregué debería hacer que esto sea difícil de entender, al menos un poco más comprensible. Tenga en cuenta que la imagen tiene 2 bits de contador, pero mi código tiene 3. Esto significa un tiempo de eliminación de rebotes más largo.

Un bit por valor

Con la implementación del contador vertical es posible eliminar el rebote de varios botones al mismo tiempo, en paralelo. Todos los valores son de tipo Byte (uint8_t) y constan de 8 bits. no nos preocupa qué valor contiene cualquiera de estos bytes, sino que nos interesan los bits por sí mismos. Cada botón que debe eliminarse solo utiliza un bit de cada byte. El primer botón usa solo el primer bit de cada byte, el segundo botón usa el segundo bit, etc.

Todo al mismo tiempo

Mediante el uso de matemáticas de bits, es posible ejecutar estos rebotes de pines en paralelo. Y, aunque la matemática de bits es bastante complicada, es muy eficiente para el procesador.

Con un tipo de datos de 8 bits, es posible hacer esto para 8 botones. El uso de tipos de datos más grandes permite más rebotes a la vez.

El rebote

La rutina antirrebote se ejecuta cada 1 milisegundo con una interrupción del temporizador.

cuando se presiona el botón, el buttonState, que es el estado antirrebote, bajará gradualmente, lo que indica que se presiona un botón. Para detectar una liberación, el botón debe estar alto durante el tiempo suficiente, lo que indica que no ha rebotado durante un tiempo determinado. Alternar se usa para indicar un cambio de botón. Los bits de contador se utilizan para…. contando cuánto tiempo no ha habido un rebote.

Delta indica una diferencia entre la entrada y el estado antirrebote. Solo cuando haya una diferencia, el contador contará. el contador se reiniciará cuando se detecte un rebote (delta es 0).

Paso 8: el resultado

Image
Image

Si todo salió bien, ¡ahora debería tener un teclado que funcione para tocar Osu! sobre. Personalmente, no he notado ninguna latencia. Si lo haces, por favor, házmelo saber. Además, si tiene alguna pregunta, no dude en preguntar cualquier cosa.

Las menciones anteriores sobre una V2 no pretenden ser una promesa, así que no pospongas este proyecto porque quieras esperar a la V2.

¡Espero que disfrutes tu teclado!

Osu! nombre: Thomazzz3

Solución de problemas

Si cree que tiene problemas con el teclado, primero abra un editor de texto y presione cada tecla una vez durante un período breve.

¿Una o varias teclas no funcionan?

Es posible que haya destruido un interruptor internamente mientras soldaba. Si tiene un multímetro, póngalo en continuidad / pitido, colóquelo en paralelo al interruptor mientras el Arduino no está conectado y presione la tecla. Debería emitir un pitido.

¿Los caracteres que acaba de escribir coinciden con las teclas que configuró en Osu? ?

Cambie los caracteres en el código arduino en los primeros 3 #Defines ('' es nessecary!).

¡O cambia tu Osu! ajustes para utilizar las claves configuradas.

¿Se repiten una o varias teclas varias veces?

El circuito antirrebote probablemente no funciona para sus interruptores o no está soldado correctamente. Verifique sus conexiones de soldadura. Si todavía ocurre, pruebe con un valor de condensador de 1uF. Esto será muy difícil para los usuarios de PCB.

Si tiene problemas con sus LED

¿Los LED parpadean?

Es posible que haya una conexión de soldadura suelta. Si usa la PCB, confirme que el estaño de soldadura realmente fluyó en la almohadilla de la impresión.

¿Ninguno de los leds funciona o de un cierto número de leds deja de funcionar?

Verifique si hay cortocircuitos entre las conexiones del primer LED (siga las pistas) y verifique si hay estaño bien conectado en las salidas del Arduino y nuevamente en el primer LED. Si se confirma que es correcto y aún presenta defectos, es posible que deba reemplazar el primer LED.

Si esto lo soluciona, repita para los siguientes LED si es necesario.

Recomendado: