Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Monstro em uma caixa

Componentes e suprimentos

Caixa / caixa de madeira
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
Módulo de retransmissão de 4 canais SainSmart
× 1
Motor do limpador de pára-brisa
× 1
Luzes de Natal com LED vermelho (100)
× 1
Smoke Machine
× 1
Amp / alto-falante motorizado
× 1

Sobre este projeto





*** ATUALIZADO para a versão 4 ***


Recentemente, reescrevi o código do Arduino para este projeto. Aqui está um resumo das mudanças:
  • O loop principal agora é implementado como uma máquina de estado
  • Todos os tempos agora com base no tempo do evento em relação às avaliações do tempo atual

- o tempo não depende mais dos frames

- permitida a remoção do atraso () no loop principal

- elimina o problema de 'porta ocupada' ao conectar ao IDE do Arduino
  • Relés agora usando conexões normalmente abertas em vez de conexões normalmente fechadas *** Atualize suas conexões de relés !!! ***
  • LED de detecção de movimento adicionado
  • Adicionado LED Ready to Wake
  • LED pausado adicionado
  • Botão de gatilho de ação removido
  • Adicionada capacidade de adicionar tempo extra ao Red Lights &Smoke

- permite que esses efeitos funcionem um pouco mais do que o segurança da tampa
  • Muitos comentários adicionados

Você encontrará todos os códigos mais recentes aqui no github





Monstro em uma caixa


Eu adoro adereços de Halloween e vi e li sobre alguns ótimos Monstros em uma caixa constrói no ano passado e decidi que deveria construir o meu próprio. A ideia é bem simples:crie a ilusão de que algum tipo de recipiente está segurando um monstro perigoso que está prestes a escapar. A ilusão pode ser criada com qualquer combinação de movimento, som, luz, fumaça e, claro, surpresa.





O que vem na caixa!?!?


Você quer uma caixa que seja grande o suficiente para parecer capaz de conter algo grande e assustador. Também aumenta a ilusão se a caixa parece ser velha, bem usada e apenas forte o suficiente para manter o monstro à distância. No início, eu comprava algo em brechós e on-line, mas nunca algo de que gostasse, então construí o meu próprio. Não foi muito difícil.

Usei 15 estacas de cerca de 6 pés de pinho da Home Depot para fazer uma caixa que media cerca de 3 pés x 2,5 pés x 2,5 pés. Cortei toda a placa no comprimento certo com uma serra de mesa e montei a caixa usando um pregador de pregos pneumático de calibre 18. Isso pareceu funcionar bem, mas depois percebi que os pregos não eram fortes o suficiente para manter a caixa unida devido a todos os golpes e quicando. Para fortalecer a caixa, mais tarde, aparafusei-a com parafusos de dry wall de 1 polegada (de dentro para fora para que não aparecessem).

Depois de construída, envelheci a madeira com um processo que usava chá preto, vinagre e lã de aço. Em seguida, decorei-o com estênceis e etiquetas que encontrei online e / ou criei e imprimi.





Brainzzzzz !!!


A hélice tem 2 estados operacionais "Dormir" e "Despertar". Enquanto dorme, a caixa fica relativamente calma e só emite roncos e roncos leves. O monstro é acordado quando um truque ou travessura aciona um sensor de movimento. Quando o monstro é acordado, ele ruge, respira fumaça, balança a tampa e o interior da caixa fica vermelho.

Usei um Arduino Uno junto com um WaveShield e um Relay Module para orquestrar o comportamento desse prop. O WaveShield é carregado com uma pequena coleção de sons sonoros e rugidos. Um sensor de movimento PIR forneceu entrada para o Arduino para alternar a caixa entre os modos "hibernando" e "acordado". Durante o modo acordado, o Arduino ativa os canais de retransmissão para acionar o motor da tampa, luzes vermelhas e o gerador de fumaça. e reproduza os sons no WaveShield. Um outro recurso que adicionei foi um botão de pausa. Isso me permitiu silenciar temporariamente o monstro quando crianças mais novas apareciam.





É Aliiiiiive!


Um levantador de tampa é um dispositivo que levanta e abaixa rapidamente a tampa para fazê-la bater e quicar como se o monstro estivesse tentando escapar. Existem várias maneiras pelas quais isso pode ser feito, as mais populares parecem ser atuadores pneumáticos e cames rotativos. Embora eu ache que um atuador pneumático controlado eletronicamente teria me permitido fazer os movimentos da tampa muito mais aleatórios, decidi ir com um came rotativo, pois parecia ser a opção mais simples e menos cara.

Comprei um motor de limpador de pára-brisa automotivo usado de um ferro-velho local por $ 15. Foi meio engraçado. Entrei e pedi um motor. O cara atrás do balcão perguntou "qual é a marca e o modelo do carro" quando eu disse "Eu não me importo", sua cabeça inclinou um pouco para o lado e ele me olhou de lado. Depois que eu expliquei o que eu estava fazendo, ele quis construir um :)

Esses motores, independente da marca / modelo, funcionam com 12 volts, giram a uma taxa razoável e têm ótimo torque:perfeito! Observação. Quando você conseguir um, certifique-se de que ele tenha um pouco do chicote de fios antigo, será muito mais fácil emendar o fio nele. certifique-se também de que possui o braço da manivela e o pino de deslocamento. Se a coluna do motor principal for a única conexão física que você tem para trabalhar, sua câmera provavelmente escorregará.

Monte o motor em algum lugar dentro de sua caixa. Coloquei o meu em uma das paredes laterais. Lembre-se de que haverá um grande came giratório conectado a ele e ele precisa ser capaz de girar livre e livre de todos e quaisquer itens, especialmente fios, que você vai colocar na caixa. Existem vários bons tutoriais no YouTube sobre como trabalhar com esses motores.

Cortei um came de 30 cm de diâmetro de um pedaço de madeira de 1/2 camada. primeiro cortei um círculo perfeito. Montei no motor e usei isso para determinar a altura necessária do motor na caixa. Eu só queria que a tampa levantasse cerca de 5 centímetros. Depois de fazer este ajuste, usei uma serra de recorte para cortar aleatoriamente 'dentes' no came, tentando o meu melhor para mantê-los em larguras e profundidades aleatórias.

Por último, montei um rolo na parte de baixo da tampa usando 2 suportes de metal em L, um espaçador de náilon de 1 polegada e um parafuso de carro. O rolete é posicionado logo acima do came, de modo que passeie ao longo dos dentes do came.

Usei o trilho de 12 volts de uma fonte de alimentação ATX para alimentar o motor por meio do relé controlado pelo Arduino. Sim, fazer com que tudo fique alinhado requer um pouco de tentativa e erro. Depois de reposicionar o rolo uma ou duas vezes ... ok três vezes ... tudo se alinhou e a tampa começou a pular conforme planejado!





Bafo de fogo:fumaça e luzes


Usei um gerador de fumaça barato de 400 Watts para os efeitos da fumaça. Fora da caixa, isso era controlado por rádio. Para controlá-lo com o Arduino, abri o receptor e soldei duas linhas de chumbo nas almofadas do botão de disparo. Isso me forneceu linhas que conectei a um canal de retransmissão controlado pelo Arduino. Foi um hack simples que aprendi assistindo alguns vídeos no YouTube. Também adicionei uma velha mangueira de aspirador de pó para direcionar a fumaça para sair como um jato de baixo da tampa. Gostei do efeito visual e ajudou a reduzir a condensação de vapor nos componentes eletrônicos dentro da caixa.

Para as luzes, cortei um cabo de extensão para serviços leves e o conectei por meio de um canal de retransmissão. A sequência de 100 luzes LED vermelhas conectadas a ele pode então ser ligada e desligada pelo Arduino.





Use sua voz externa


O WaveShield possui um conector de fone de ouvido de 1/8 de polegada e saída - bem como 2 pinos de i / o para uma conexão direta. Usei um patch chord de 1/8 de polegada para conectar a um amplificador de contrabaixo de 30 Watts que peguei emprestado de minha sala de prática. Qualquer número de alto-falantes amplificados funcionaria - incluindo alto-falantes de PC. Mas usar algo com graves sólidos é definitivamente uma vantagem.





Acorrente


Eu comprei algumas correntes de plástico em uma loja de Halloween e imprimi em 3D um cadeado. Envolvê-los sobre a caixa aumentou a profundidade e a sensação da ilusão.





Halloween !!!


Coloque a caixa no quintal e esconda o sensor de movimento em um arbusto próximo. Usei um longo fio de alto-falante para conectar o sensor para que pudesse experimentar o posicionamento de forma que o monstro acordasse quando alguém se aproximasse (cerca de 5 pés) da caixa.

À medida que a noite escurecia, percebi que todos os detalhes do lado de fora da caixa estavam ficando difíceis de ver. Eventualmente, eu o iluminei com um holofote estroboscópico e fiquei muito feliz com o efeito.

Conforme caminhavam pela calçada, eles notavam a caixa rosnando:alguns com curiosidade, outros realmente estavam com medo dela. À medida que se aproximavam e o monstro ganhava vida, eles se levantavam e gritavam, alguns até aplaudiam. Foi um enorme sucesso.





Melhorias


Cansei de procurar maneiras de esconder meu Sensor de Movimento nos arbustos, então colei um deles com cola quente na barriga de um rato de plástico que posso posicionar em algum lugar ao longo da calçada ou sob aquele arbusto próximo. Também instalei um conector de fone RJ11 na parte traseira da caixa para que pudesse conectar o sensor de movimento do rato usando um fio de telefone de 50 pés - que é muito melhor do que os dois fios de alto-falante que eu estava usando anteriormente.

Você notará que também adicionei um interruptor e alguns LEDs indicadores a essa nova placa. O switch PAUSA todas as funções da caixa sem desligá-lo. Meu interruptor principal de corte é o filtro de linha interno e é difícil de acessar, além de usar apenas tensão de sinal (5v) neste interruptor externo. Essa opção tem sido ótima para parar o monstro para travessuras ou travessuras mais jovens e outros que pedem uma olhada por dentro na noite de Halloween.

Oh! Eu coloco correntes de plástico sobre a caixa para fazer efeito e elas podem ser difíceis de manejar às vezes. Especialmente se eu precisar entrar na caixa durante a noite. Para tornar isso mais fácil, eu fecho mosquetões de mola preta amarrados nas pontas das correntes. Isso me permite desengatar / enganchar rapidamente as pontas dos ilhós que aparafusei nos cantos inferiores da caixa. Não é de alta tecnologia, mas é muito útil.





O Futuro


Existem algumas coisas que desejo adicionar no futuro. Talvez controle R / C para que eu possa pausar ou acionar o monstro à distância. Também adicionarei algum tipo de feedback ao levantador de tampa para que o Arduino possa 'saber' quando a tampa está aberta ou fechada. Várias vezes o levantador parava em um ponto alto do ciclo, o que tornava as 'entranhas' da caixa visíveis até o próximo ciclo de vigília. Por último, posso conectar a iluminação / estroboscópios externos ao Arduino para permitir que sejam controlados pelo programa e / ou pelo controle remoto R / C.





Repositório GitHub


Você encontrará o código e os diagramas de fiação mais recentes aqui no GitHub

Código

  • Esboço do monstro em uma caixa
  • MonsterSounds.h
  • MonsterSounds.ino
Esboço do monstro em uma caixa C / C ++
 / * Pinos de proteção da onda em uso:2, 3, 4, 5, 10, 11, 12 e 13 pinos 13, 12, 11 são sempre usados ​​pelo cartão SD (são os únicos pinos que têm um SPI de alta velocidade interface). Depois, há 5 outros pinos usados ​​para comunicar-se com o cartão DAC e SD, mas eles podem ser configurados para se conectar a qualquer pino do Arduino. No entanto, por padrão, a biblioteca é configurada para usar os pinos 10 (para cartão SD) e os pinos 2, 3, 4 e 5 para o DAC. Para alterar esses pinos, é necessário modificar a biblioteca - os pinos são referenciados por seus nomes de pinos de 'hardware' (ou seja, PORTD, etc), não por pinos arduino. Isso significa que os pinos 6, 7, 8, 9 e os 6 pinos analógicos (também conhecidos como pinos de i / o digital 14-20) estão disponíveis.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino / faq * / # include "MonsterSounds.h" #define RESERVED_00 0 // Reservado para Serial RX # define RESERVED_01 1 // Reservado para Serial TX # define RESERVED_02 2 // Reservado para Wave Shield # define RESERVED_03 3 // Reservado para Wave Shield # define RESERVED_04 4 // Reservado para Wave Shield # define RESERVED_05 5 // Reservado para Wave Shield # define FOG_MACHINE 6 // Conecte o pino digital no Arduino ao módulo de relé # define RED_LEDS 7 // Conecte o pino digital no Arduino para módulo de relé # define LID_BOUNCER 8 // Conecte o pino digital no Arduino para o módulo de relé # define RESERVED_09 9 // Conecte o pino digital no Arduino para o módulo de relé # defina RESERVED_10 10 // Reservado para Wave Shield # define RESERVED_11 11 // Reservado para Wave Shield # define RESERVED_12 12 // Reservado para Wave Shield # define RESERVED_13 13 // Reservado para Wave Shield # define PIR_SENSOR A 0 // Entrada PIR # define MOTION_LED A1 // LED:acende quando o movimento é detectado (independentemente do estado de pausa / hibernação / despertar) # define PAUSED_LED A2 // LED:acende quando o sistema está pausado # define READY_LED A3 // LED:acende quando o monstro está no estado READY_TO_WAKE # define PAUSE_BUTTON A4 // Pausa a entrada do switch # define DEBUG_BUTTON A5 // Debug Switch Input // Configurações do temporizador de efeitos - em segundos (EDITAR) #define WAKE_DELAY 30 // Quantidade mínima de tempo entre 'despertar' ocorrências em segundos # define WAKE_DELAY_DEBUG 10 // WAKE_DELAY substitui quando a chave DEGUB é ativada # define SLEEP_SOUND_DELAY 1 // Número de segundos a esperar entre a tentativa de disparar o próximo som de 'sono' # define WAKE_MIN 3 // Quantidade mínima de tempo 'acordado' em segundos # define WAKE_MAX 5 // Quantidade máxima de tempo 'acordado' em segundos # define RED_LIGHT_EXTRA_TIME 1 // Permite que as luzes vermelhas funcionem um pouco mais do que o bouncer da tampa, se desejado # define SMOKE_EXTRA_TIME 2 // Permite que a fumaça saia um pouco mais longo do que o bouncer da tampa, se desejado // Efeitos Timers Configurações - em milissegundos (não editar estes) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # define WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # define SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 # define WAKE_MIN_MILLIS WAKE_MIN * 1000 # define WAKE_MAX_MILLIS WAKE_MAX * 1000 # define RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIME * 1000 # definem SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds soa; estático não sinalizado longo timeSinceLastSnore =0; estático não sinalizado longo wakeAllowedTimer =0; estático não sinalizado longo lidBounceTimer =0; estático não sinalizado longo lidBounceDuration =0; estático não sinalizado longo smokeTimer =0; estático não sinalizado longo smokeDuration =0; estático não sinalizado longo lidBounceTimer =0; estático não sinalizado longo lidBounceDuration =0; estático não sinalizado longo smokeTimer =0; estático não sinalizado longo smokeDuration =0; redLightTimer =0; static unsigned long redLightDuration =0; enum States {STATE_INITIALIZE, // Apenas durante a execução de setup () e pela primeira vez em loop () STATE_PAUSED, // Desligue todos os sons e efeitos STATE_SLEEPING, // Sem efeitos, sons adormecidos , não permite que o despertador seja acionado STATE_READY_TO_WAKE, // Não efeitos, sons de sono, permite que o despertador seja acionado STATE_AWAKE}; // Dispara efeitos e sons de ativação do monstro State =STATE_INITIALIZE; void setup () {// inicializa a comunicação serial:Serial.begin (9600); // Configura todos os pinos do relé pinMode (LID_BOUNCER, OUTPUT); pinMode (RED_LEDS, OUTPUT); pinMode (FOG_MACHINE, OUTPUT); pinMode (PAUSED_LED, OUTPUT); pinMode (MOTION_LED, OUTPUT); pinMode (READY_LED, OUTPUT); // Força todos os efeitos para OFF stopAllEffects (); pinMode (PIR_SENSOR, INPUT); pinMode (PAUSE_BUTTON, INPUT_PULLUP); pinMode (DEBUG_BUTTON, INPUT_PULLUP); sounds.initialize (); // Monster Sounds sounds.playSystemReady (); atraso (1000); Serial.println (); Serial.print ("*** Sistema pronto ***"); Serial.println (); } / * * NOTA:Todos os botões usam pullups, portanto LOW significa que o botão está PRESSED * Lembre-se de que o pull-up significa que a lógica do interruptor está invertida. * Fica ALTO quando é aberto e BAIXO quando é pressionado. * * O sensor de movimento PIR NÃO se comporta dessa maneira. * // * * Loop de processamento principal * - Gerencia a máquina de estado do monstro * / void loop () {boolean pauseSwitchClosed =digitalRead (PAUSE_BUTTON) ==LOW; boolean motionDetected =digitalRead (PIR_SENSOR) ==HIGH; digitalWrite (MOTION_LED, digitalRead (PIR_SENSOR)); switch (estado) {case STATE_INITIALIZE:if (pauseSwitchClosed) {goToPause (); } else {goToSleep (); } pausa; case STATE_PAUSED:if (! pauseSwitchClosed) {goToSleep (); digitalWrite (PAUSED_LED, LOW); } else {digitalWrite (PAUSED_LED, HIGH); } pausa; case STATE_SLEEPING:if (pauseSwitchClosed) {goToPause (); } else if (isAllowedToWake ()) {goToReadyToWake (); } else {processSleeping (); } pausa; case STATE_READY_TO_WAKE:if (pauseSwitchClosed) {goToPause (); digitalWrite (READY_LED, LOW); } else if (motionDetected) {goToAwake (); digitalWrite (READY_LED, LOW); } else {processSleeping (); } pausa; case STATE_AWAKE:if (pauseSwitchClosed) {goToPause (); } else if (processAwakeAnimation ()) {goToSleep (); } // processAwakeAnimation () retorna true quando todas as animações estão completas break; padrão:Serial.println ("ESTADO DESCONHECIDO"); pausa; // Nunca devemos chegar aqui}} / * * Transição para o estado de pausa * / inline void goToPause () {Serial.println ("PAUSED"); estado =ESTADO_PAUSADO; stopAllEffects (); sounds.stopAll ();} / * * Transição para o estado de suspensão * / inline void goToSleep () {Serial.println ("GOING TO SLEEP"); estado =STATE_SLEEPING; wakeAllowedTimer =millis ();} / * * Transição para o estado Pronto para acordar * Este é um caso especial do estado de hibernação * / inline void goToReadyToWake () {Serial.println ("READY TO WAKE"); estado =STATE_READY_TO_WAKE; } / * * Transição para o estado desperto * - Desperta o monstro e processa os efeitos e sons * / inline void goToAwake () {Serial.println ("AWAKE"); estado =STATE_AWAKE; wakeMonster ();} / * * processar um ciclo da atividade SLEEP * - Executar sons de sono * - Atualizar cronômetro de sono * / inline void processSleeping () {if ((millis () - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) {sounds.playSnore ( ); timeSinceLastSnore =millis (); }} / * * Determina se o monstro pode acordar neste momento. * - Verifique a chave de depuração, se estiver fechada, usamos um temporizador de permissão para despertar mais curto * - O monstro deve dormir por um período mínimo de tempo predefinido antes de ser acordado * - Acender o LED quando estiver pronto para ser ativado * / inline boolean isAllowedToWake ( ) {boolean isDebug =digitalRead (DEBUG_BUTTON) ==LOW; não assinado longo requiredDelay =WAKE_DELAY_MILLIS; if (isDebug) {requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis () - wakeAllowedTimer)> requiredDelay; if (isAllowed) {digitalWrite (READY_LED, HIGH); } return isAllowed;} / * * Wake Monster * Inicia as animações do Despertar * Reproduz os sons do Despertar * * Chame isso UMA VEZ para iniciar o estado DESPERTO. * / void wakeMonster () {int activityDuration =random (WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // é quanto tempo o monstro ficará ativo Serial.print ("duração da vigília:"); Serial.print (activityDuration); Serial.println ("ms"); bounceLid (activityDuration); flashRedLight (activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activateSmoke (activityDuration + SMOKE_EXTRA_TIME_MILLIS); sounds.playRoar ();} / * * Gerencia o progresso das animações de DESPERTO * Chame isso de CADA CICLO durante o estado de DESPERTO. * Retorna TRUE quando todas as animações são concluídas * / boolean processAwakeAnimation () {printTimersToLog (); booleano feito1 =falso; boolean done2 ​​=false; booleano done3 =false; if (millis () - lidBounceTimer> lidBounceDuration) {bounceLid (0); feito1 =verdadeiro; } if (millis () - redLightTimer> redLightDuration) {flashRedLight (0); feito2 =verdadeiro; } if (millis () - smokeTimer> smokeDuration) {activateSmoke (0); done3 =verdadeiro; } return done1 &&done2 ​​&&done3;} / * * Gerenciar Efeito:Pula a tampa da caixa * - direção é o número de milissegundos que o efeito deve ser executado * - duração de 0 significa que o efeito deve ser interrompido * / inline void bounceLid (sem sinal longa duração) {if (duração <=0) {energizeRelay (LID_BOUNCER); lidBounceDuration =0; } else {// inicia o salto da tampa de_energizeRelay (LID_BOUNCER); lidBounceTimer =millis (); lidBounceDuration =duração; }} / * * Gerenciar Efeito:Luzes Vermelhas * - direção é o número de milissegundos que o efeito deve ser executado * - duração de 0 significa que o efeito deve ser interrompido * / inline void flashRedLight (duração longa sem sinal) {if (duração <=0) {energizeRelay (RED_LEDS); redLightDuration =0; } else {// inicia a luz piscando de_energizeRelay (RED_LEDS); redLightTimer =millis (); redLightDuration =duração; }} / * * Start / Stop Effect:Activate Smoke * - diration é o número de milissegundos que o efeito deve ser executado * - duração de 0 significa que o efeito deve ser interrompido * / inline void activateSmoke (unsigned long duration) {// ' pressione 'o botão de fumaça // a duração deve ser uma quantidade fixa de tempo necessária para a máquina responder à ação // definir um tempo limite para parar após a duração if (duration <=0) {energizeRelay (FOG_MACHINE); fumoDuração =0; } else {// inicia a luz piscando de_energizeRelay (FOG_MACHINE); smokeTimer =millis (); smokeDuration =duração; }} / * * Parar todos os efeitos * - Isso efetivamente desliga o monstro * / inline void stopAllEffects () {bounceLid (0); flashRedLight (0); activateSmoke (0);} / * * Imprime os temporizadores de animação despertada no log uma vez por segundo * / inline void printTimersToLog () {static unsigned long timeofLastTimerLog =0; if (millis () - timeofLastTimerLog> =1000) {Serial.print ("tampa:"); Serial.print ((millis () - lidBounceTimer)> lidBounceDuration? 0:(lidBounceDuration - (millis () - lidBounceTimer))); Serial.print ("luzes:"); Serial.print ((millis () - redLightTimer)> redLightDuration? 0:(redLightDuration - (millis () - redLightTimer))); Serial.print ("fumaça:"); Serial.println ((millis () - smokeTimer)> smokeDuration? 0:(smokeDuration - (millis () - smokeTimer))); timeofLastTimerLog =millis (); }} / * * Energize Relay * Define o terminal Normalmente Aberto (NO) para OPEN * Normalmente Fechado se tornará Fechado * / inline void energizeRelay (canal interno) {digitalWrite (canal, HIGH); } / * * De-Energize Relay * Define o terminal Normalmente Aberto (NO) para FECHADO. * Normalmente fechado se tornará ABERTO * / inline void de_energizeRelay (canal interno) {digitalWrite (canal, BAIXO); } 
MonsterSounds.h C / C ++
Cabeçalho do Arduino para a biblioteca de sons de monstro
 / * NOTA SOBRE OS PINOS ARDUINO * Os pinos 13, 12, 11 são sempre usados ​​pelo cartão SD (eles são os únicos pinos que têm uma interface SPI de alta velocidade). * Existem 5 outros pinos usados ​​para comunicar-se com o cartão DAC e SD, mas eles podem ser configurados para se conectar a qualquer pino do Arduino. * No entanto, por padrão, a biblioteca é configurada para usar os pinos 10 (para cartão SD) e os pinos 2, 3, 4 e 5 para o DAC. * To chanage these pins requires modifying the library - the pins are referenced by their 'hardware' pin names (ie PORTD, etc) not by arduino pins. * That means pins 6, 7, 8, 9 and the 6 analog in pins (also known as digital i/o pins 14-20) are available. * */ #include #include #include #include  static const char roar0[] ="ROAR0000.wav"; static const char roar1[] ="ROAR0001.wav"; static const char roar2[] ="ROAR0002.wav"; static const char * const roarSounds[] ={roar0, roar1, roar2}; static const char sleep0[] ="SNORE000.wav"; static const char sleep1[] ="SNORE001.wav"; static const char sleep2[] ="SNORE002.wav"; static const char * const sleepSounds[] ={sleep0, sleep1, sleep2}; int previousRoarSound =-1; class MonsterSounds { private:SdReader card; // This object holds the information for the card FatVolume vol; // This holds the information for the partition on the card FatReader root; // This holds the information for the volumes root directory FatReader file; // This object represent the WAV file for a phrase WaveHC wave; // A single wave object -- only one sound is played at a time void playfile(char *name); public:void initialize(); void playSystemReady(); void playRoar(); void playSnore(); void stopAll();};
MonsterSounds.inoC/C++
Arduino code for the monster sounds library
/* NOTE ABOUT ARDUINO PINS * Pins 13, 12, 11 are always used by the SD card (they are the only pins that have a high speed SPI interface). * Then there are 5 other pins used to talk to the DAC and SD card, but they can be set to connect to any arduino pin. * However, by default, the library is configured to use pins 10 (for SD card) and pins 2, 3, 4 and 5 for the DAC. * To chanage these pins requires modifying the library - the pins are referenced by their 'hardware' pin names (ie PORTD, etc) not by arduino pins. * That means pins 6, 7, 8, 9 and the 6 analog in pins (also known as digital i/o pins 14-20) are available. * */ void MonsterSounds::initialize(){ Serial.println("Initializing Sounds..."); if(!card.init()) Serial.println(F("Card init. failed!")); if(!vol.init(card)) Serial.println(F("No partition!")); if(!root.openRoot(vol)) Serial.println(F("Couldn't open dir")); Serial.println(F("Files found:")); root.ls(); randomSeed(analogRead(0));}void MonsterSounds::playSystemReady(){ this->playfile("WELCOME0.WAV");}void MonsterSounds::playRoar(){ int index =random(3); // 0, 1, 2 while (index ==previousRoarSound) { index =random(3); } previousRoarSound =index; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // Do not interupt an exising sound with snoring { int index =random(3); // 0, 1, 2 this->playfile(sleepSounds[index]); }}void MonsterSounds::stopAll(){ wave.stop(); // Stop any currently-playing WAV}// -------------------------------------------------------------------// playfile() // Open and start playing a WAV file// -------------------------------------------------------------------void MonsterSounds::playfile(char *name) { PgmPrint("Playing sound:"); Serial.println(name); if (wave.isplaying) {// already playing something, so stop it! wave.stop(); // stop it } if (!file.open(root, name)) { PgmPrintln("File not found "); Retorna; } if (!wave.create(file)) { PgmPrintln("Not a valid WAV"); Retorna; } // ok time to play! wave.play();}

Peças personalizadas e gabinetes

monstersounds_7vLZD3NU4t.zip

Esquemas


Processo de manufatura

  1. Máquina EEG
  2. Caixa de suco
  3. Máquina de venda automática
  4. Alterar máquina
  5. Máquina de Costura
  6. Meia-calça
  7. Faça uma máquina de escrever trabalhos de casa DIY em casa
  8. Giftduino - A caixa de presente perfeita do Arduino
  9. Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
  10. Arduino + ESP Weather Box