Feliz aniversário Melodia no Arduino Nano com polifonia de 3 vias
Componentes e suprimentos
| × | 1 |
Aplicativos e serviços online
|
Sobre este projeto
Jogue o tema polifônico "Feliz aniversário" no Arduino Nano com três campainhas em uma única placa de ensaio.
Em primeiro lugar - demonstração
Conecte esta coisa a qualquer fonte de alimentação USB (não apenas um computador) e ela tocará a melodia de "Feliz aniversário" indefinidamente ... quase ... até você ficar realmente cansado disso =]
BTW, as luzes estão piscando intactas com cada mudança de nota em um canal / campainha correspondente.
Esquemas
A ideia era fazer um aparelho super compacto com (quase) nenhuma solda.
Por fim, consegui encaixar tudo o que era necessário em uma pequena placa de ensaio como esta:
Os orifícios são interconectados dentro da placa de ensaio desta forma:
O truque aqui é que a placa Arduino Nano se encaixa nessa placa de ensaio, permitindo-nos apenas conectar alguns componentes adicionais em ambos os lados da placa de ensaio.
Desculpe, pessoal ... Estou com preguiça de desenhar diagramas aqui, mas este caso é TÃO simples que tenho certeza que esses close-ups serão mais do que o suficiente para descobrir tudo =]
Como você pode ver, estou usando a placa Arduino Nano v3.0 da Gravitech aqui, mas qualquer analógica serve. As campainhas e os LEDs aqui são MUITO comuns. Eles não precisam corresponder a nenhum parâmetro especial, na verdade.
Os resistores aqui são de 100 Ohm ... embora o "padrão" comum para proteção de sobrecarga de LED seja de 220 Ohm ... mas quem se importa ... ¯ \ _ (ツ) _ / ¯
A única coisa que provavelmente não é tão óbvia aqui nessas fotos é que os pinos da campainha são inseridos na placa de ensaio desta forma:
Observe também que o do centro é maior do que os outros - isso porque este é usado para o canal de música "baixo" ☝🏻
... estou brincando! ^ __ ^ Todos eles guincham como um coro de camundongos maluco, sem nenhuma diferença em suas capacidades sonoras =]
Portanto, você pode usar três campainhas idênticas se desejar sem problemas; no entanto, você terá que colocá-las em posições um pouco diferentes na placa de ensaio e também alterar os números dos pinos de saída no código do programa de acordo com a sua nova localização das campainhas.
Além disso, observe outro pequeno "hack" aqui ... de qualquer maneira, estamos no hack ster aqui ou o quê? =] Estou usando várias E / S do Arduino alfinetes aqui como um solo pinos para campainhas e LEDs 😱😱. Sim está certo. Na verdade, se você definir um estado "LOW" para qualquer pino de E / S do Arduino em seu programa, poderá usar esses pinos da mesma forma que usa os pinos GND padrão nas placas Arduino. Legal certo?;)
Sobre o programa ...
A lista completa do esboço do IDE do Arduino é fornecida abaixo. No entanto, você terá que instalar uma biblioteca "Tone" adicional para poder compilar o esboço, que pode ser baixado aqui:
https://www.dropbox.com/s/q1udxg4yi47emeo/Tone.zip?dl=0
(se houver uma janela pop-up com uma "proposta" de registro, basta fechá-la com o botão "x" no canto)
A maneira mais fácil de instalar esta biblioteca é a seguinte:no menu principal do Arduino IDE, escolha Sketch - Incluir Biblioteca - Adicionar Biblioteca .ZIP ... e, em seguida, selecione o arquivo zip baixado ... еasy ¯ \ _ (ツ) _ / ¯
Esta biblioteca é necessária para realizar a geração simultânea de vários tons em um único controlador (ela usa alguns temporizadores de hardware adicionais e interrupções de hardware "sob o capô" para atingir esse objetivo). Simplificando, é algum tipo de "multitarefa caipira" em um único núcleo de processador sem nenhum sistema operacional =]
Aliás, aqui está o autor da biblioteca (obrigado mano! =]):
http://playground.arduino.cc/Profiles/Bhagman
... e a página GitHub da biblioteca:
https://github.com/bhagman/Tone
AVISO LEGAL 🙂:
Falando francamente, o código do meu programa aqui é bastante volumoso e difícil de ler. Isso se deve principalmente a essa necessidade de "fazer malabarismos" com três threads de melodia "independentes" simultaneamente a partir de apenas um fluxo de comando linear. Eu estava realmente pensando em refatorar o código mais tarde para poder separar as melodias umas das outras e usá-lo no futuro para tocar músicas diferentes ... mas provavelmente não irei =]
Então boa sorte. Qualquer feedback é apreciado.
Obrigado por ler até o fim =]
Código
- Happy_birthday
Happy_birthday Arduino
Não se esqueça de instalar a biblioteca de tons !!#includeTone solo; Tone bass; Tone rythm; const int t =600; // duração da nota quaterconst int tt =t * 2; const int t14 =round (t * 1/4); const int t24 =round (t * 2/4); const int t34 =round (t * 3/4); const int bassLedPin =15; // pino de sinal de baixo led (também conhecido como A1) const int rythmLedPin =17; // pino de sinal de led de ritmo (também conhecido como A3) const int soloLedPin =19; // pino de sinal de led solo (também conhecido como A5) void wait (Tone t) {while (t.isPlaying ()) {}} int bassLedState =LOW; void switchBassLed () {if (bassLedState ==LOW) bassLedState =HIGH; senão bassLedState =LOW; digitalWrite (bassLedPin, bassLedState);} int rythmLedState =LOW; void switchRythmLed () {if (rythmLedState ==LOW) rythmLedState =HIGH; senão rythmLedState =LOW; digitalWrite (rythmLedPin, rythmLedState);} int soloLedState =LOW; void switchSoloLed () {if (soloLedState ==LOW) soloLedState =HIGH; senão soloLedState =LOW; digitalWrite (soloLedPin, soloLedState);} configuração de void (void) {pinMode (14, OUTPUT); // pino de aterramento do led (também conhecido como A0) pinMode (16, OUTPUT); // pino de aterramento do led (também conhecido como A2) pinMode (18, OUTPUT); // pino de aterramento do led (também conhecido como A4) pinMode (bassLedPin, OUTPUT); // pino do sinal led baixo pinMode (rythmLedPin, OUTPUT); // pino de sinal de led de ritmo pinMode (soloLedPin, OUTPUT); // pino de sinal de led solo pinMode (2, OUTPUT); // pino de aterramento da campainha solo pinMode (9, OUTPUT); // pino de aterramento da campainha do ritmo solo.begin (6); // pino de sinal de campainha solo bass.begin (12); // pino do sinal da campainha de graves rythm.begin (0); // pino de sinal da campainha de ritmo solo.play (NOTE_D4, t34); switchSoloLed (); espera (solo); solo.play (NOTE_D4, t14); switchSoloLed (); esperar (solo);} void loop (void) {bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); esperar (ritmo); tocar baixo (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); esperar (ritmo); tocar baixo.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); esperar (ritmo); tocar baixo.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_FS4, tt); switchSoloLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); esperar (ritmo); bass.play (NOTE_FS4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); esperar (ritmo); tocar baixo (NOTE_A4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_D4, t34); switchSoloLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); solo.play (NOTE_D4, t14); switchSoloLed (); esperar (ritmo); tocar baixo.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_FS4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_D4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_A4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_A4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, tt); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); esperar (ritmo); tocar baixo (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D4, t34); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); solo.play (NOTE_D4, t14); switchSoloLed (); aguarde (ritmo); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D5, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_B4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_C4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_FS4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_E5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_G5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_E4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_E5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_G5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_G4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_C5, t34); switchSoloLed (); espera (ritmo); rythm.play (NOTE_E5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_G5, t14); switchRythmLed (); solo.play (NOTE_C5, t14); switchSoloLed (); aguarde (ritmo); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_B4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_D3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_FS3, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_A4, t); switchSoloLed (); espera (ritmo); espera (ritmo); rythm.play (NOTE_FS5, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_A5, t14); switchRythmLed (); espera (ritmo); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, tt); switchSoloLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); esperar (ritmo); tocar baixo (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); espera (ritmo); rythm.play (NOTE_B4, t14); switchRythmLed (); espera (ritmo); rythm.play (NOTE_D5, t14); switchRythmLed (); espera (ritmo); solo.play (NOTE_D4, t34); switchSoloLed (); espera (solo); solo.play (NOTE_D4, t14); switchSoloLed (); esperar (solo);}
Processo de manufatura
- Monitoramento de CO2 com Sensor K30
- Comunicação para surdos-cegos com 1Sheeld / Arduino
- Aceitar moeda de controle com Arduino
- Flores - Arduino Nano, CrazyCircuits, DFRobot
- Arduino com Bluetooth para controlar um LED!
- Sensor capacitivo de impressão digital com um Arduino ou ESP8266
- Brincando com Nextion Display
- Braço robótico controlado por Nunchuk (com Arduino)
- Arduino Nano:Controle 2 motores de passo com joystick
- Contador Geiger portátil com Arduino Nano