Índice:

Osu! Teclado: 8 etapas (com imagens)
Osu! Teclado: 8 etapas (com imagens)

Vídeo: Osu! Teclado: 8 etapas (com imagens)

Vídeo: Osu! Teclado: 8 etapas (com imagens)
Vídeo: Como Colocar Foto no Teclado do WhatsApp 2024, Julho
Anonim
Osu! Teclado
Osu! Teclado

Recentemente, comecei a jogar um jogo de ritmo chamado osu! e depois de ver um vídeo de um miniteclado comercial, pensei que seria um projeto divertido criar um para mim. Não muito depois disso, decidi que seria uma boa ideia colocá-lo no instructables como meu primeiro projeto.

Se você deseja replicar este projeto exatamente até a última instrução, fique à vontade, mas algumas das decisões que fiz não são baseadas no menor preço ou na melhor qualidade. Alguns componentes são escolhidos quase puramente porque eu os tinha por aí. Se você puder lidar com isso, eu o encorajo a customizar seu projeto.

Nota 1: os componentes SMD (pequenos eletrônicos) são usados, portanto, se você replicar este projeto, as habilidades de soldagem são necessárias. talvez uma versão fácil de soldar seja adicionada, mas esses leds não vêm no pacote de buraco de calha

Nota 2: Eu atualizei o código várias vezes e agora estou na versão 3ish. Vou deixar todo o código online, mas recomendo que você use a última versão. Atualmente não tem funcionalidade de led, mas deve ser o de melhor desempenho.

Etapa 1: Materiais e Explicações

Materiais e Explicações
Materiais e Explicações

Dependendo de como você faz seu projeto, você pode precisar de componentes diferentes, mas esses componentes são os mesmos que usei. Se você tiver tempo e quiser economizar dinheiro, peça o formulário aliexpress e não peça o PCB.

1 cabo micro + USB Arduino pro

3 interruptores vermelhos Kailh BOX

3 resistor de 10k (0805 SMD)

3 capacitor 100nF (0805 SMD)

4 LED rgb APA102 (5050 SMD)

3 teclas

1 placa de circuito impresso (PCB) fornecida neste projeto

1 caixa impressa em 3D fornecida neste projeto

Por que uso um Arduino pro micro?

A maioria das placas arduino como a Uno (Atmega328) não tem suporte nativo para comunicação USB. Sim, você pode programá-los por USB com muita facilidade e acho que existem soluções alternativas, mas gosto de mantê-lo simples quando se trata de comunicação USB e não sei se as soluções alternativas são tão responsivas. Essas placas usam um chip externo para possibilitar a comunicação USB, enquanto o Arduino pro micro (Atmega32U4) o tem integrado.

Os interruptores

Existem muitos interruptores mecânicos que você pode usar. Linear, tátil ou clicável de Kailh ou Cherry MX. Escolha o que quiser. Usei os interruptores Kailh porque eram baratos no Ailexpress. Se você optar por usar o PCB, você precisará dos interruptores Kailh BOX. A cor determina o sentimento.

Os componentes eletrônicos

Não há muito o que explicar sobre eles neste capítulo, mas se você não usar a placa de circuito impresso, eu recomendaria apenas componentes normais com orifícios para facilitar a soldagem. Infelizmente, os leds usados não estão disponíveis em pacotes de orifícios de calha. Eu também não recomendaria usar fios em pacotes SMD, a menos que você esteja muito confiante em suas habilidades de soldagem. Mesmo para SMD em um PCB, habilidades de soldagem "avançadas" são necessárias.

O alojamento

Eu forneço uma moradia neste projeto, mas no momento ela está falhando. São necessárias modificações para encaixar os parafusos, as aberturas para os leds não são ideais, o arduino está exposto e uma parte precisa ser cortada para que o USB se encaixe. No futuro, uma nova habitação pode ser adicionada. Se você tem uma impressora 3D, vá em frente e imprima, mas por favor, não saia do seu caminho para imprimir este caso defeituoso se você não tiver e apenas use algum tipo de caixa de projeto.

Etapa 2: o esquema

O Esquemático
O Esquemático

O esquema para este projeto é bastante simples, mas quero explicar os componentes para as pessoas que estão interessadas e não conhecem esta implementação.

Troque as conexões com o Arduino

Os interruptores são conectados aos pinos 0, 2 e 3 do Arduino porque esses pinos podem ser usados como interrupções externas. Isso é explicado com mais detalhes na seção de código.

O circuito de debounce

No lado esquerdo do esquema está um circuito que é copiado 3 vezes. Este circuito é usado para eliminar o switch. Para saber o que é debouncing, você precisa entender o switch bouncing e não é difícil de entender.

Primeiro, olhe para esta simulação para pintar uma primeira imagem (clique no botão rápido e olhe para o sinal abaixo)

Quando você pressiona ou solta um botão, ele salta e seu sinal alterna entre alto e baixo algumas vezes por alguns milissegundos. Um Arduino é muito rápido e lê todos os altos e baixos nesse curto espaço de tempo. O programa enviará um pressionamento ou liberação de tecla toda vez que um alto ou baixo for lido, portanto, a cada pressionamento, seu computador receberá vários pressionamentos de tecla. Não é ideal para um jogo de ritmo.

Este circuito de debounce irá desacelerar a borda descendente do sinal. O sinal para o Arduino não será capaz de mudar tão rápido quanto o salto ocorre, então ele será lido com um toque. Não se preocupe com a desaceleração para a próxima impressão real porque irá.

Avançado:

O Atmaga32U4 lê uma baixa digital em 0,2 Vcc - 0,1 V = 0,9 volt. A tensão do capacitor em qualquer momento de sua descarga é Vcc * e ^ (- t / RC). Se você medir um tempo de debounce diferente em sua chave, poderá calcular os valores do resistor e do capacitor.

formulário de fórmula

Os LEDs

Os LEDs rgb são leds APA102 que podem ser endereçados individualmente usando um relógio e uma linha de dados. Nenhum componente externo é necessário para fazê-los funcionar. Para muitos LEDs você deve usar um capacitor paralelo a 5 volts e aterramento, mas com apenas 4 LEDs você não precisa dele.

Etapa 3: o design da placa

O Design da Placa
O Design da Placa

O PCB foi projetado em JLCPCB. Não sou patrocinado por eles, mas para protótipos baratos eles fazem PCBs excelentes. Por 2 dólares você ganha 10 da mesma placa, mas o frete custou cerca de 11 dólares para mim. Se você não deseja necessariamente uma iluminação rgb e planeja fazer apenas uma, deve considerar fazer seu teclado sem PCB.

O design da placa era bastante simples. Só precisei adicionar um componente para os interruptores, mas depois de assistir a alguns vídeos peguei o jeito. A única falha que percebi é que a colocação dos orifícios é um pouco perto dos interruptores.

Para solicitar o PCB, acesse https://jlcpcb.com/ e escolha a opção de 2 camadas. Ele pedirá um arquivo Gerber. baixe o arquivo ".zip" e arraste-o para a janela. Você não precisa descompactá-lo. As configurações devem estar corretas e você pode prosseguir e concluir o pedido.

Etapa 4: Design da caixa e dicas de montagem

Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa
Dicas de design e montagem da caixa

Projeto

Como mencionei antes, meu design é defeituoso, mas você ainda pode imprimi-lo se quiser. o design foi feito no Fusion 360. É um software de modelagem 3D grátis e com a minha experiência do inventor e da solidworks foi muito fácil de trabalhar. Os círculos nos cantos da caixa são para evitar que se descasque da mesa de impressão.

Se você defende seu próprio caso, apenas uma coisa é realmente importante. Seus interruptores precisam estar firmemente colocados e incapazes de se mover. Eu forneci fotos dos recortes quadrados com as dimensões para que você possa usá-los em seu próprio projeto, supondo que você use interruptores Kailh BOX.

conjunto

Agora você tem todos os componentes necessários para a montagem. Há um pedido de montagem desta primeira versão porque os interruptores são soldados.

1. Solde os componentes SMD. estes são os resistores, capacitores e LEDs.

2. Solde o Arduino pro micro.

3. Coloque as 3 chaves na placa de cobertura impressa em 3D antes de soldar. A placa de cobertura não pode ser removida após soldar os interruptores. Desoldar os interruptores não é aconselhável e pode destruí-los.

4. Agora solde os interruptores no lugar. Faça isso o mais rápido possível porque os interruptores de plástico podem derreter e estragá-los ou diminuir drasticamente o número de cliques.

5. Coloque a placa de cobertura montada na caixa impressa em 3D e prenda com fita adesiva ou use parafusos se eles não interferirem com as tampas das teclas.

6. Coloque os keyCaps nos interruptores e pronto.

Recomendações

Desolder ou mascarar os LEDs no arduino após fazer o upload do seu código. É bom ter os leds se o seu código não for carregado, mas não são bons para ver como um produto acabado. São necessárias pinças de habilidade e pontiagudas.

Além disso, alguns pés de apoio na parte inferior são bons para antiderrapantes e permitem que a luz rgb brilhe.

Etapa 5: O Código V1 (hardware Debounce)

O Código V1 (hardware Debounce)
O Código V1 (hardware Debounce)
O Código V1 (hardware Debounce)
O Código V1 (hardware Debounce)

O código para este projeto não é amigável para iniciantes, portanto, se você está apenas começando a programar em arduino, este código provavelmente irá assustá-lo um pouco. No entanto, tentarei explicar o que está acontecendo da melhor maneira possível. Algumas coisas são explicadas mais tarde neste texto, portanto, se você tiver dúvidas, leia primeiro o texto completo.

Enviando o código

Primeiro baixe todos os 3 arquivos ".ino" e coloque-os em uma pasta. Se você não tiver o IDE do Arduino, basta baixá-lo gratuitamente no site oficial do arduino.

Conecte seu Arduino ao PC e abra "OSU_Keyboard_code_V1.ino". Em Tools Board, selecione "Arduino / Genuino Micro". Também em Ferramentas, selecione a porta COM correta. Isso às vezes pode mudar. Para fazer upload do código para seu Arduino, basta clicar na seta no canto superior esquerdo da tela e esperar até que ela diga que foi concluído no canto inferior esquerdo.

OSU_Keyboard_code_V1

Incluindo e definindo

Primeiro você precisa incluir a biblioteca do teclado. Isso torna possível usar o Arduino como teclado.

Em seguida, defino alguns valores. Definir é como uma variável, mas eles não podem mudar enquanto o programa está sendo executado. Os primeiros 9 são para o caractere do teclado, o número do pino do arduino e os bits da porta.

Em seguida, os bits de porta dos dados e do relógio do LED.

Além disso, o número de leds é definido e uma variável para o ângulo da roda de cores.

Configurar

Esta parte do código só será executada uma vez quando o arduino estiver conectado.

Primeiro, o relógio e os pinos de dados dos LEDs são definidos como saídas e os pinos do switch como entradas. Esta é a versão avançada de pinMode (). Se você estiver interessado, pesquise "manipulação direta de portas".

Keyboard.begin () simplesmente inicia a conexão USB como teclado.

As próximas 3 interrupções são vinculadas aos pinos do switch. Cada vez que uma alteração é detectada no pino do interruptor, um pequeno programa será executado. Esse pequeno programa será feito mais adiante.

Ciclo

Esta parte se repetirá continuamente enquanto o arduino estiver ligado.

Eu só o uso para alterar e atualizar a cor dos LEDs.

Interrupções

Aqui são feitos os pequenos programas, que só serão executados quando for detectada uma alteração nos pinos do switch. Eles são idênticos, exceto pelo pino ao qual reagem.

Primeiro, ele verifica se o botão está pressionado ou solto e envia o comando correto do teclado.

LED (explicado em uma ordem diferente)

Se você está curioso para saber como os LEDs são controlados, consulte a ficha técnica do APA102.

Um pouco

Esta é novamente a versão de manipulação de porta direta da gravação digital.

Primeiro, ele verifica se deve enviar um 0 ou 1 e, respectivamente, puxa o pino de dados para baixo ou para cima. Em seguida, ele grava o pino do clock alto muito curto e grava baixo novamente.

OneByte

Isso se repete umBit 8 vezes com um loop "for". Ele lê o primeiro bit em um byte e passa seu valor para a função oneBit e faz o mesmo para os próximos 7 bits.

LedData

Isso se repete um Byte 4 vezes para fornecer os dados necessários para um led. O primeiro byte começa com 111xxxxx e um valor de brilho de 5 bits no lugar do xxxxx. O brilho pode ser definido de 0 a 31 (2 ^ 5 = 32 níveis).

Os próximos 3 bytes são para os valores de azul, verde e vermelho. Um byte para cada cor.

ColorWheelThisLed

Essa função chama ledData fornece as cores rgb dependendo de um ângulo na roda de cores.

O valor de 16 bits é o dividendo em 6 seções igualmente espaçadas de 60 graus. Olhar as imagens pode ajudá-lo a entender melhor.

(uma versão de 8 bits também é fornecida, mas comentada porque é muito instável)

StartEndFrame

O quadro inicial precisa ser usado toda vez que você deseja enviar novas cores para os leds e deseja atualizar a cor real dos leds

Eu só uso o quadro inicial porque o quadro final não é necessário. O quadro inicial tem 4 bytes de 0. O quadro final tem 4 bytes de 255 (11111111).

Etapa 6: O Código V2 (software Debounce With Timers)

The Code V2 (software Debounce With Timers)
The Code V2 (software Debounce With Timers)

Depois de um tempo de jogo, notei alguns problemas de duplo toque com o debounce do hardware. Isso poderia ser corrigido com alguns outros resistores de valor ou capacitores, mas como os botões e a tampa não são removíveis, pensei que o software de debouncing seria uma boa solução. O debounce do software deve funcionar quer o debounce do hardware esteja implementado ou não. Na minha configuração atual, não consegui remover a tampa, então apenas deixei os resistores e os capacitores no lugar.

Não vou explicar o código tão extensivamente quanto a versão anterior porque é um pouco mais difícil de explicar.

Basicamente, a maior parte do código funciona da mesma forma e o código do led permanece intocado. o que mudou é que as interrupções externas não usam mais as funções do arduino. Agora funciona em código C puro. E agora o que foi adicionado é a interrupção do software. Para isso, usei os temporizadores do AVR para esperar um certo tempo até que o salto parasse. Como os temporizadores são baseados em interrupções, o tempo de decounce não é influenciado por nada que aconteça no loop.

A única desvantagem que posso descobrir é que as funções de atraso do arduino não podem mais ser usadas. Porque as funções de atraso usam o Timer 0 e este programa usa o Timer 0 para depurar.

Na imagem você pode ver como o código funciona aproximadamente. O bit mem indica se um cronômetro está funcionando. O que não está representado é o caso em que ao final do pressionamento do botão a entrada é baixa. Nesse caso, apenas um pressionamento de tecla seria enviado enquanto o botão já estava liberado. O que significa que a tecla será mantida pressionada no que diz respeito ao computador. Para esta exceção rara, uma verificação será executada quando um cronômetro expirar. Se ao final de um cronômetro o botão não for pressionado, um comando de liberação de tecla será enviado.

Etapa 7: O Código V3 (software Debounce With Vertical Counter) (recomendado) (sem LED)

O Código V3 (software Debounce With Vertical Counter) (recomendado) (sem LED)
O Código V3 (software Debounce With Vertical Counter) (recomendado) (sem LED)

Este código TAMBÉM tem uma versão onde você não precisa puxar para baixo resistores. Certifique-se de conectar cada botão à entrada e ao TERRA! O pull-up embutido é usado

Também experimentei algumas impressoras não registradas no código V2. Acho que o código se tornou muito complexo com seu temporizador e interrupção externa e posso ter perdido algumas exceções. Por esse motivo, comecei do zero a pesquisar na internet por métodos de debounce de software.

(honestamente, pelo menos metade deste projeto tornou-se o botão debouncing neste ponto)

Depois de algumas pesquisas, encontrei este post:

www.compuphase.com/electronics/debouncing….

Para ser honesto, demorei um pouco para entender como funciona exatamente. Envolve algumas manipulações de bits bastante complexas, mas tentarei torná-lo o mais fácil possível. Porém minhas explicações serão apenas um complemento ao post, então você deve pelo menos ler os "contadores verticais", "uma implementação anotada" e "reduzindo a latência".

Minha explicação

O diagrama de tempo (feito em WaveDrom) que adicionei deve tornar isso difícil de entender a matemática de bits, pelo menos, um pouco mais compreensível. Observe que a imagem tem 2 bits de contador, mas meu código tem 3. Isso significa um tempo de depuração mais longo.

Um bit por valor

Com a implementação do contador vertical, é possível eliminar vários botões ao mesmo tempo, em paralelo. Todos os valores são do tipo Byte (uint8_t) e consistem em 8 bits. não estamos preocupados com o valor que qualquer um desses bytes contém, mas sim com os bits em si. Cada botão a ser depurado usa apenas um bit de cada byte. O primeiro botão usa apenas o primeiro bit de cada byte, o segundo botão usa o segundo bit etc.

Tudo ao mesmo tempo

Usando a matemática de bits, é possível executar esses debounces de pinos em paralelo. E, embora a matemática de bits seja bastante complicada, é muito eficiente para o processador.

Com um tipo de dados de 8 bits, é possível fazer isso para 8 botões. Usar tipos de dados maiores permite mais debounces de uma vez.

O debounce

A rotina debounce é executada a cada 1 milissegundo com uma interrupção do temporizador.

quando o botão é pressionado, o botãoState, que é o estado debunciado, irá imediatamente para baixo, indicando que o botão foi pressionado. Para detectar uma liberação, o botão deve estar alto por tempo suficiente, indicando que não saltou por um certo tempo. Alternar é usado para indicar uma mudança de botão. Os bits do contador são usados para…. contando quanto tempo não houve um salto.

Delta indica uma diferença entre a entrada e o estado debunciado. Somente quando houver diferença, o contador contará. o contador será zerado quando um salto for detectado (delta é 0).

Etapa 8: O Resultado

Image
Image

Se tudo correu bem, agora você deve ter um teclado funcionando para jogar Osu! sobre. Eu pessoalmente não notei nenhuma latência. Se você fizer, por favor, conte para mim. Além disso, se houver alguma dúvida, fique à vontade para perguntar qualquer coisa.

As menções anteriores sobre a V2 não são uma promessa, então não adie este projeto porque você quer esperar pela V2.

Espero que gostem do seu teclado!

Osu! nome: Thomazzz3

Solução de problemas

Se você acha que está tendo problemas com o teclado, primeiro abra um editor de texto e pressione cada tecla uma vez por um breve período.

Uma ou várias chaves não funcionam?

É possível que você tenha destruído um switch internamente durante a soldagem. Se você tiver um multímetro, coloque-o em continuidade / bipe, coloque-o paralelo à chave enquanto o Arduino não estiver conectado e pressione a tecla. Deve apitar.

Os caracteres que você acabou de digitar correspondem às teclas que você configurou no Osu! ?

Altere os caracteres no código do arduino nos primeiros 3 #Defines ('' é necessário!).

Ou mude seu Osu! configurações para usar as chaves configuradas.

Uma ou várias teclas são repetidas algumas vezes?

O circuito de debounce provavelmente não funciona com seus interruptores ou não está soldado corretamente. Verifique suas conexões de solda. Se ainda ocorrer, tente um valor de capacitor de 1uF. Isso será muito difícil para os usuários de PCB.

Se você está tendo problemas com seus LEDs

Os LEDs piscam?

Uma conexão de solda pode estar solta. Se você usar o PCB, confirme se a lata de solda realmente fluiu na almofada da impressão.

Nenhum dos leds funciona ou a partir de um determinado número de LEDs para de funcionar?

Verifique se há curtos entre as conexões do primeiro LED (siga as trilhas) e verifique se há estanho bem conectado nas saídas do Arduino e novamente no primeiro LED. Se confirmado como correto e ainda com defeito, pode ser necessário substituir o primeiro LED.

Se isso corrigir, repita para os próximos LEDs, se necessário.

Recomendado: