Faça um jogo fio buzz com um arduino
Neste projeto divertido, vamos aprender como fazer um jogo fio buzz com o Arduino. Muitas das peças necessários podem ser encontrados em um kit inicial (o que está em um starter kit
Conteúdo
Confira o resultado final - ele ainda toca música:
O que você precisa
Aqui estão as peças do núcleo que você precisa para concluir este projeto:
Video: Jogo Genius no Arduino e programa para download!
- 1 x Arduino UNO ou semelhante.
- 1 x metal cabide.
- 2 x 220 ohm resistores.
- 1 x tábua de pão.
- 1 x Piezo campainha.
- 2 x grampos de crocodilo.
- tubagem de retracção térmica variados.
- Macho-macho Fios de montagem.
Aqui estão algumas peças opcionais para melhorar a compilação:
- 1 x vibrador piezo adicionais.
- Uma haste x passador.
- 1 x Quad sete exibição segmento.
- 1 x 220 ohm.
- 1 x botão momentâneo.
- Macho-fêmea Fios de montagem.
- prancha de madeira (por caso).
- parafusos de madeira Diversos.
Quase todo o Arduino vai funcionar, desde que tenha o suficiente dos pinos. Dê uma olhada este guia de compra se você não tem certeza de que você precisa.Guia Arduino compra: Qual conselho você deve começar?Guia Arduino compra: Qual conselho você deve começar?Há tantos tipos diferentes de placas Arduino lá fora, você seria perdoado por ter sido confundido. Que você deve comprar para o seu projeto? Vamos ajudar, com este guia de compra do Arduino!consulte Mais informação
O Plano Desenvolver
Embora isto possa parecer complexo, é realmente um projeto muito simples. Vou começar com o jogo básico e, em seguida, adicionar componentes adicionais para aumentar a complexidade. Você pode “escolher” como você gosta dependendo dos componentes que você tem disponível.
O mecânico núcleo é constituído por uma forma de arame e um circuito num cabo. O jogador tem que guiar o laço em torno do curso sem os dois tocando. Se o dois toques, o circuito é completado e o alarme soa. É claro que é possível construir este circuito sem usar microcontrolador, mas onde está a diversão em que (e como mais você chegar para ouvir música tema do Monty Python “Flying Circus”)?
O curso
Esta é a forma que o jogador terá que guiar seu ciclo round. É a base de todo o jogo, para torná-lo bom! Eu escolhi ter uma pequena gota, seguido por uma grande subida. Dobrar um cabide de metal em forma que você precisa. fio de latão ou de tubo de cobre funcionará igualmente bem, apesar de um cabide pode ser o mais barato.
Pode ser necessário usar luvas e usar alicates ou um martelo para fazer as coisas perfeitas. Cortar o excesso com um alicate. Deixar duas verticais viradas para cima para empurrar através da base. Você maneira quer arquivar as extremidades cortadas para a segurança. Finalmente, cortar duas peças de tubagem de retracção por calor e o local por cima das extremidades da seguinte forma:
Video: Projeto Carrinho de Controle Remoto com Arduino + Drive de DVD + guarda-chuva + Controle PS2
Isto vai isolar o circuito a partir do curso, fornecendo uma zona de início / fim ou segurança. Alternativamente, fita ou mesmo uma palha vai fazer se você não tem qualquer psiquiatra tubulação de calor.
Agora anexar um cabo para um fim do curso. Você tem duas opções aqui: você pode solda ou usar um clipe de crocodilo. Um clipe de crocodilo é a opção mais fácil, mas de solda é uma opção mais confiável e de longo prazo. Certifique-se de “rough-se” a superfície do cabide primeiro com lixa, e usar a abundância de fluxo. (Nunca soldadas antes? Saiba como aqui.)Aprenda a solda, com estas dicas simples e ProjetosAprenda a solda, com estas dicas simples e ProjetosVocê está um pouco intimidado pelo pensamento de um ferro quente e metal fundido? Se você quer começar a trabalhar com eletrônica, você vai precisar aprender a solda. Vamos ajudar.consulte Mais informação
Dependendo do tamanho do buraco que você perfurar na base sobre o próximo passo, você pode precisar para alimentar o cabo pelo furo de montagem em primeiro lugar. Usando dois fios torcidos juntos vai aumentar a durabilidade:
Usando uma broca para fazer isso ajuda muito:
A base
É hora de criar a base. Isto serve para manter o curso em uma posição vertical, bem como proporcionar um lugar para ancorar o sistema eletrônico para. Eu usei algumas sobras de pinheiros, embora você poderia usar o que você tem em casa - até mesmo uma caixa de papelão.
Corte três peças para formar uma forma de “n”. Simplesmente parafuso (ou colagem) destas três peças em conjunto. Lembre-se de fazer um furo piloto nas partes laterais primeiro a impedi-los de divisão. Você pode querer rebaixe os parafusos (especialmente se você vai estar enchendo e, em seguida, pintura), e eu recomendo uma broca escareador. Se você não tem uma ferramenta de rebaixamento ou broca furo, uma broca de maior diâmetro irá fazer o truque.
Faça dois furos longe o suficiente para as extremidades do curso para se sentar em. Rebaixe o pronto inferior para colar.
A maçaneta
Agora é hora de fazer o loop / controlador. Torcer uma pequena peça do gancho de revestimento em uma extremidade para criar um laço com uma pequena metal alça. Certifique-se de apresentar a borda do corte, e depois cobri-lo com fita / espuma, se necessário.
Isto irá formar a outra metade do circuito - quando esse loop toca o curso que vai completar o circuito (exatamente como um switch). Soldar (ou usar um clipe de crocodilo) um outro fio ao fundo da questão, exatamente o mesmo que você fez anteriormente para o curso.
Corte um pequeno comprimento de bucha para a pega real. Este anel de metal vai inserir-se este identificador. Se você não tem qualquer passador, você pode terminar um pedaço de madeira macia quadrado usando um cinto ou disco de lixadeira (você também pode usar uma lixa, mas levaria muito tempo).
Faça um furo através deste cabo. Isto precisa de ser suficientemente grande para se ajustar o anel de metal e o arame através de:
Isto é possível fazer em uma broca pilar, embora seja complicado. Um torno vai fazer o trabalho perfeitamente:
Sim, eu estou bem ciente este é um torno de metal (para qualquer pessoa interessada, é uma relojoaria Torno Boley de 1930. Eu acho que é um 3C, mas eu adoraria ouvir de você se você sabe mais sobre isso).
Você também pode usar uma caneta esferográfica com o centro retirado.
Finalmente, a utilização de cola quente para prender o cabo e o circuito para o identificador. cola quente irá fornecer um dispositivo elétrico forte (mas não permanente), por isso é perfeito para isso.
acabamento Off
Inserir o curso do fio nos furos da base. Não se esqueça de adicionar o loop / controlador em primeiro lugar. Use cola quente de novo para proteger o curso para a base, preenchendo os orifícios escareados no lado inferior da base da seguinte forma:
O circuito
Aqui está o circuito completo. Você não tem que fazer o seu tão complexo como este - leia sobre como nós quebrar cada parte.
Primeiro, conecte os dois elementos piezo para pinos digitais 10 e 11. A polaridade não importa:
Você não tem que usar dois piezos - a única razão que eu fiz até é ter um som zumbido muito mais alto quando os fios tocar. Conecte um lado para o pino digital, eo outro para a terra.
Agora ligue o curso em metal e pega:
Mais uma vez, não importa o caminho que ronda os dois estão ligados. Esta parte do circuito é exatamente como um botão ou switch - o jogador completa o circuito quando o loop toca o curso. Certifique-se de incluir tanto os resistores.
Um laços resistor do circuito de terra (chamado de um resistor pull-down), garantindo que não é “flutuante” (isso permite que o Arduino para detectar o circuito mudando). O outro resistor protege o Arduino. Quando as duas partes tocar, + 5V vai para o pino digital. Se este resistor não estava presente lá seria um morto curto - o computador iria desligar a tomada USB para desenhar muito atual se você tiver sorte.
Ligar o terminal de sinal (roxo, no diagrama) ao pino digital 9.
Em seguida, conecte um botão ao pino digital 2:
Finalmente, ligue o display LED de sete segmentos:
Este modelo em particular é de Seeed. Este utiliza um TM1637 para conduzir quatro monitores - isso significa apenas dois pinos digitais são necessários. Conectar GND ao Arduino chão e VCC para Arduino + 5V. Conectar D10 ao Arduino pino digital 13 e CLK ao pino digital 12.
O código
Para tornar este projecto funcionar, você vai precisar de dois arquivos adicionais. O primeiro é chamado pitches.h
. Este arquivo simplesmente mapeia nomes da nota para o seu valor piezo. Isso torna muito mais fácil escrever uma música, como você pode simplesmente dizer “NOTE_C3” em vez de “31”, por exemplo. Esta é do domínio público, e está disponível no site do Arduino aqui. Siga as instruções para criar um novo arquivo chamado pitches.h
(Alternativamente, cole o código em seu script existente).
Em seguida, você precisa de um método para jogar realmente notas / melodias na piezo. Esta essência por Anthony DiGirolamo no Github contém o código que você precisa. Copie tudo entre “buzz vazio” e “}}” e colá-lo em seu arquivo principal. Para referência, aqui está:
vazio zumbido(int targetPin, longo freqüência, longo comprimento) {/ * Função exemplo campainha por Rob Faludihttp: //faludi.comhttps: //gist.github.com/AnthonyDiGirolamo/1405180*/longo delayValue = 1000000/freqüência/2- // calcula o valor de atraso entre as transiçõespena //// 1 do segundo de microssegundos, dividida pela frequência, em seguida, dividir ao meio uma vez//// existem duas fases de cada ciclolongo numCycles = freqüência * comprimento/ 1000- // calcular o número de ciclos de tempo adequado//// frequência se multiplicam, que é realmente ciclos por segundo, pelo número de segundos para//// obter o número total de ciclos para produzirpara (longo Eu=0- Eu lt; numCycles- Eu++){ // para o comprimento calculado de tempo ...digitalWrite(targetPin,ALTO)- // escreve o pino buzzer alta para empurrar o diafragmadelayMicroseconds(delayValue)- // espera para o valor de atraso calculadodigitalWrite(targetPin,BAIXO)- // escreve a baixa buzzer pin para puxar o diafragmadelayMicroseconds(delayValue)- // esperar novamente para o valor de atraso calculado}}
A última biblioteca que você precisa é controlar o display de sete segmentos - você pode pular esta etapa se você não estiver usando uma. Esta biblioteca é chamado TM1637 e foi criado por Seeed, a mesma empresa que criou o conselho motorista.
No Arduino IDE, vá para “Gerenciar Bibliotecas” (Esboço gt; incluem Biblioteca gt; Gerenciar Bibliotecas). Isso fará com que o gerenciador de biblioteca. Permitir que ele alguns segundos para atualizar e, em seguida, procurar no topo da caixa de pesquisa à direita “TM1637”. Duas bibliotecas será encontrado - você quer “TM1637” e não “TM1637Display”. Selecione e clique em “install”.
Uma última tarefa com esta biblioteca - não é completa! Tal como está, a biblioteca só pode exibir números 0-9 e letras de A-F. Se este abrange tudo que você gostaria de mostrar, então você pode pular esta etapa. Se não, você precisará modificar o código. Relaxar! Isto não é tão difícil quanto parece, e se você pode escrever código usando o Arduino IDE, você pode fazer isso.
Primeiro, abra sua pasta de biblioteca. Este será em sua pasta Arduino. No Mac OS X, isto é, em / Users / Joe / Documentos / Arduino / Bibliotecas
. Abra a pasta chamada TM1637. Você precisará editar o arquivo chamado TM1637.cpp
- você pode ignorar o outro arquivo com a extensão .h
. Abra este arquivo no seu editor de texto favorito (para mim, isso é Sublime Texto 3), bloco de notas, ou o Arduino IDE.
Modificar a terceira linha de código a partir desta:
estático int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71}-// 0 ~ 9, a, b, C, d, E, F
Para isso:
estático int8_t TubeTab[] = {/ * Padrões * /0x3f, // 0 0x06, // 10x5b, // 20x4F, // 3 0x66, // 40x6D, // 50x7D, // 60x07, // 7 0x7f, // 8 0x6F, // 90x77, // A - 100x7c, // b - 110x39, // C - 120x5e, // d - 130x79, // E - 140x71, // F - 15/* adicional */0x174, // h - 160x176, // H - 170x138, // L - 180x15, // M - 190x137, // n - 200x73, // P - 210x67, // q - 220x131, // r - 230x78, // t - 240x240 // - 25}-
Agora você pode salvar e fechar o arquivo. Depois de cada elemento, o comentário descreve o personagem é. A próxima parte do comentário é o índice do elemento.
É hora do código real. Em primeiro lugar, incluir as duas bibliotecas mencionado anteriormente:
#incluir #incluir
Agora crie o objeto de exibição:
TM1637 *_exibição = Novo TM1637(12, 13)-
Não se preocupe se você não entender a sintaxe - esta linha diz ao Arduino que os pinos 12 e 13 estão ligados a um display de sete segmentos, e configurá-lo adequadamente.
A canção é armazenado em melodia
e tempo
. Estes contêm todas as notas e a duração da nota para a música. Se você gostaria de mudar a música, modificar essas matrizes (embora, não é tão simples como colar nos valores das notas, o calendário é uma parte muito importante da música). o songState
variável simplesmente armazena a posição da última nota tocada. Isso garante a melodia é jogado do início ao fim, em vez de saltar em torno de forma inconsistente:
int songState = 0-int melodia[] = {NOTE_F4,...}int tempo[] = {8,...}
Note que eu tenha removido o conteúdo das matrizes, veja abaixo o código completo.
Este código não é de bloqueio - isto significa que o Arduino pode executar várias tarefas simultaneamente. Dê uma olhada esta explicação Para maiores informações. Isto é como os temporizadores são configurados:Arduino Delay Função, e por que você não deve usá-loArduino Delay Função, e por que você não deve usá-loEnquanto delay () é útil para demonstrações básicas de como Arduino funciona, você realmente não deve usá-lo no mundo real. Aqui está o porquê, e que você deve usar em seu lugar.consulte Mais informação
não assinado longo previousMillis1 = 0-const longo interval1 = 1500-
a variável previousMillis1
será actualizado numa fase posterior para armazenar o tempo atual. o interval1
variável armazena o tempo de espera entre a execução de código - neste caso, 1,5 segundos. É definida como const
, o que significa que é constante e nunca vai mudar - isso permite que o Arduino para otimizar ainda mais o código.
Dentro de configuração()
função há algumas coisas acontecendo. Em primeiro lugar, as entradas e saídas são configurados. Isto tem que ser feito, de modo que o Arduino sabe o que está ligado a cada um de seus pinos:
pinMode(9, ENTRADA)- circuito de configuração //pinMode(10, SAÍDA)- // buzzer configuração 1pinMode(11, SAÍDA)- // buzzer configuração 2pinMode(2, ENTRADA)- // botão de configuração
Agora a exibição precisa configurar:
_exibição-gt;conjunto(5)- // brilho set_exibição-gt;ponto(falso)- // remover cólon_exibição-gt;nisso()- // iniciar a apresentação
os métodos conjunto
, ponto
, e nisso
estão todos contidos dentro do _exibição
objeto. Em vez de um ponto, um ponteiro ( “-gt;”) é usado para acessar estes. Novamente, não se preocupe com a sintaxe (embora, se você gostaria de aprender mais, procure C ++ ponteiros).
O loop principal tem dois modos de jogo: desafio e folga. livre jogo permite ao jogador jogar um número ilimitado de vezes. Modo Desafio define um temporizador para 20 segundos usando o showCountdown
método. Ele usa o botão para iniciar e parar o temporizador. Atualmente, a única maneira de mudar modos de jogo é editar manualmente a variável chamada modo
. Veja se você pode adicionar outro botão para fazer isso e modificar o código apropriadamente.
o zumbido
método reproduz as notas dadas a ele. Este é utilizado em conjunto com cantar
. O método sing passa por cada nota e joga-lo. Este método é chamado com regularidade, embora ele só vai jogar a próxima nota, quando houve tempo suficiente desde a última de jogo. Uma vez que a canção chegou ao fim, ele redefine a música ao versículo 1 (songState = 14
). Você poderia definir isso para zero a iniciar a música no início, no entanto, a razão para isso é pular a introdução. A introdução é reproduzida uma vez após o Arduino foi ligado, e então não é jogado novamente.
o showFree
e showPlay
métodos simplesmente escrever as palavras “livre” e “PLAY” para a exibição. Observe como o “r” em livre é minúscula, quando todos os outros personagens são maiúsculas. Esta é uma das limitações de sete exposições de segmento. Eles não podem mostrar cada letra do alfabeto, e alguns dos personagens que eles podem mostrar que estar em letras maiúsculas e minúsculas.
o toggleFreePlay
método pisca a indicação entre “livre” e “PLAY”. Novamente, ele faz isso de uma maneira non-blocking.
Outro método útil é showNumber
. Este escreve um número para o meio dois personagens da tela como esta:
O visor não é inteligente o suficiente para saber como mostrar grandes números, tem que ser explicitamente dito o que fazer. Este método usa uma lógica simples para mostrar o número apropriado em cada personagem.
O último método utilizado é chamado showCountdown
. Isso inicia um contador em 20, e diminui-lo por um a cada segundo. Se isso chega a zero, ela vibra três vezes, para indicar que o tempo se esgotou.
Aqui é tudo que o código juntos:
#incluir // incluem biblioteca de apresentação#incluir // incluem arremessosTM1637 *_exibição = Novo TM1637(12, 13)- // criar visor objeto, 12 = CLK (relógio), 13 = D10 (dados)// músicaint songState = 0-int melodia[] = {NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4,NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3,NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3,NOTE_G3, NOTE_C4, 0,NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4,NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3,NOTE_AS3, NOTE_C4, NOTE_D4, 0,NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3,NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4,NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3,NOTE_A3, NOTE_AS3, NOTE_C4, 0,NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4,NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4,NOTE_G4, NOTE_G4, NOTE_G4, 0,NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4,NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4,NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4,NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0}-int tempo[] = {8, 16, 8, 16,8, 16, 8, 16,16, 16, 16, 8,16, 8, 3,12, 16, 16, 16,8, 16, 8, 16,8, 16, 8, 16,8, 16, 4, 12,12, 16, 16, 16,8, 16, 8, 16,8, 16, 8, 16,8, 16, 4, 12,12, 16, 16, 16,8, 16, 8, 16,8, 16, 8, 16,8, 16, 4, 16,12, 17, 17, 17,8, 12, 17, 17,17, 8, 16, 8,16, 8, 16, 8, 1}-// configuração não bloqueio// jogo grátisnão assinado longo previousMillis1 = 0- // palavras tempo modificado pela última vezconst longo interval1 = 1500- // intervalo entre mudando// músicanão assinado longo previousMillis2 = 0- // tempo modificado pela última vezconst longo interval2 = 100- // intervalo entre notasint DisplayStatus = 0- // acompanhar o que é exibidoint modo = 0- // manter o controle de modo de jogo - mude para 0 ou 1 para os modos diferentescontagem regressiva bool = falso-não assinado longo previousMillis3 = 0- // tempo modificado pela última vezconst longo interval3 = 1000- // intervalo entre contagem regressivaint contagem = 20- // temporizador modo de desafiovazio configuração() {// colocar o seu código de configuração aqui, para executar uma vez:pinMode(9, ENTRADA)- circuito de configuração //pinMode(10, SAÍDA)- // buzzer configuração 1pinMode(11, SAÍDA)- // buzzer configuração 2pinMode(2, ENTRADA)- // botão de configuração_exibição-gt;conjunto(5)- // brilho set_exibição-gt;ponto(falso)- // remover cólon_exibição-gt;nisso()- // iniciar a apresentação}vazio laço() {// coloque o código principal aqui, para executar repetidamente:E se(modo == 0) {// modo desafioE se(digitalRead(2) == ALTO) {demora(25)-E se(digitalRead(2) == ALTO) {contagem regressiva = verdade- // parar a contagem decrescente}outro {contagem regressiva = falso- // parar a contagem decrescente}}E se(contagem regressiva) {showCountdown()- // contagem regressiva antecedência}}outro {// jogo grátistoggleFreePlay()-}E se(digitalRead(10) == ALTO) {demora(25)-E se(digitalRead(10) == ALTO) {enquanto(digitalRead(10) == ALTO) {zumbido(11, NOTE_B0, 1000/24)-}}}outrocantar()-}vazio showCountdown() {// contagem regressiva do tempo restantenão assinado longo currentMillis = millis()- // hora atualE se (currentMillis - previousMillis3 gt; = interval3) {previousMillis3 = currentMillis---contagem-showNumber(contagem)-E se(contagem == 0) {// fim de jogocontagem regressiva = falso-contagem = 20-// restabelecer a contagem decrescente// zumbido 3 vezeszumbido(11, NOTE_B0, 1000/24)-demora(100)-zumbido(11, NOTE_B0, 1000/24)-demora(100)-zumbido(11, NOTE_B0, 1000/24)-}}}vazio showNumber(int número) {// mostrar números (máximo 99) no visor_exibição-gt;exibição(0