Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Komponen dan Perlengkapan

Kotak/Kotak Kayu
× 1
Bangun Monster Kotak Sendiri: Proyek Robotika Arduino
Arduino UNO
× 1
Adafruit Wave Shield
× 1
Modul Relay 4 Saluran SainSmart
× 1
Motor Pemulas Kaca Mobil
× 1
Lampu LED Natal Merah (100)
× 1
Mesin Asap
× 1
Amp/Speaker Aktif
× 1

Tentang Proyek Ini

*** DIPERBARUI ke Ver 4 ***

Saya baru saja menulis ulang kode Arduino untuk proyek ini. Berikut adalah ringkasan perubahan:

- waktu tidak lagi bergantung pada frame

- memungkinkan penghapusan delay() dalam loop utama

- menghilangkan masalah 'port busy' saat menghubungkan ke Arduino IDE

- memungkinkan efek ini berjalan sedikit lebih lama dari pemantul tutup

Anda akan menemukan semua kode terbaru di sini pada github

Monster di Dalam Kotak

Saya suka hiasan Halloween dan telah melihat serta membaca tentang beberapa bangunan Monster di Dalam Kotak hebat tahun ini dan memutuskan untuk membuat milik saya sendiri. Ide-nya cukup sederhana: buat ilusi bahwa beberapa jenis wadah menahan monster berbahaya yang hampir melarikan diri. Ilusi dapat diciptakan dengan kombinasi gerakan, suara, cahaya, asap dan, tentu saja, kejutan.

Apa yang Ada di Dalam Kotak!?!?

Anda ingin kotak yang cukup besar sehingga tampak mampu menahan sesuatu yang besar dan menakutkan. Ilusi juga bertambah jika kotak terlihat tua, aus, dan mungkin cukup kuat untuk menjaga monster tetap terperangkap. Awalnya saya mencoba di toko barang bekas dan online untuk sesuatu tetapi tidak ada yang saya sukai, jadi saya membuatnya sendiri. Ini tidak terlalu sulit.

Saya menggunakan 15 papan pagar pine 6 kaki dari Home Depot untuk membuat kotak yang berukuran sekitar 3 kaki x 2,5 kaki x 2,5 kaki. Saya memotong semua papan menjadi panjang dengan gergaji meja dan merakit kotak menggunakan mesin paku pneumatik 18 gauge. Ini tampaknya berfungsi baik, tetapi kemudian saya menyadari bahwa paku tidak cukup kuat untuk menjaga kotak tetap utuh karena semua benturan dan lonjakan yang akan dilakukan. Untuk memperkuat kotak, saya kemudian menyatunya dengan baut papan dinding 1 inci (dari dalam ke luar sehingga tidak terlihat).

Setelah dibangun, saya memudahkan kayu dengan proses yang menggunakan teh hitam, cuka, dan besi baja. Kemudian saya menghiasnya dengan stensil dan label yang saya temukan online dan/atau buat dan cetak.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Otak-otak!!!

Properti ini memiliki 2 status operasional "Tidur" dan "Bangun". Saat tidur, kotak relatif tenang dan hanya mengeluarkan suara mengorok dan knalangan ringan. Monster terbangun ketika seekor peramalan candy mengaktifkan sensor gerak. Ketika monster terbangun, monster meraung, bernapas asap, memantulkan tutup, dan bagian dalam kotak berkedip merah.

Saya menggunakan Arduino Uno bersama dengan WaveShield dan Modul Relay untuk mengatur perilaku properti ini. WaveShield dimuat dengan koleksi kecil suara tidur dan meraung. Sensor gerak PIR memberikan input ke Arduino untuk mengalihkan kotak antara mode "tidur" dan "bangun". Saat mode bangun, Arduino mengaktifkan saluran relay untuk menjalankan motor tutup, lampu merah, generator asap, dan memutar suara pada WaveShield. Fitur lain yang saya tambahkan adalah Tombol Pause. Ini memungkinkan saya untuk menenangkan monster sementara ketika anak-anak kecil datang.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Hidup!

Pengangkat tutup adalah perangkat yang akan cepat mengangkat dan menurunkan tutup untuk membuatnya dentang dan melompat seolah-olah monster mencoba melarikan diri. Ada beberapa cara ini dapat dilakukan yang paling populer tampaknya adalahaktuator pneumatik dan cam berputar. Meskira saya pikir aktuator pneumatik yang dikontrol elektronik akan memungkinkan saya membuat gerakan tutup jauh lebih acak, saya memutuskan untuk menggunakan cam berputar karena tampaknya opsi yang lebih sederhana dan termurah.

Saya membeli motor pemulas kaca mobil bekas dari pembersih sampah lokal seharga $15. Ini agak lucu. Saya masuk dan meminta motor. Orang di balik meja bertanya "untuk merk dan model mobil apa" ketika saya bilang "saya tidak peduli" kepalanya sedikit miring dan dia menatap saya samping. Setelah saya menjelaskan apa yang saya lakukan, dia ingin membuat satu :)

Motor ini, terlepas dari merk/model, berjalan pada 12 volt, berputar dengan kecepatan yang wajar dan memiliki torsi yang hebat: sempurna! Catatan. Ketika Anda mendapat satu, pastikan itu masih memiliki beberapa kabel penghubung lama itu akan membuatnya jauh lebih mudah bagi Anda untuk menyambungkan kabel Anda ke dalamnya. juga pastikan itu memiliki lengan kerucut dan tiang offset. Jika tiang motor utama adalah satu-satunya koneksi fisik yang Anda miliki untuk bekerja dengan cam Anda akan kemungkinan meluncur.

Pasang motor di suatu tempat di dalam kotak Anda. Saya menempatkannya di salah satu dinding samping. Ingat akan ada cam berputar besar yang terhubung padanya dan itu perlu dapat berputar bebas dan bebas dari semua barang, terutama kabel, yang akan Anda masukkan ke dalam kotak. Ada beberapa tutorial bagus di YouTube tentang bekerja dengan motor ini.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Saya memotong cam berdiameter 12 inci dari sepotong ply wood 1/2 inci. pertama saya memotong lingkaran sempurna. Saya memasangnya pada motor dan menggunakan ini untuk menentukan tinggi motor yang diperlukan di dalam kotak. Saya hanya ingin tutup diangkat sekitar 2 inci. Setelah melakukan pemasangan ini saya menggunakan gergaji gandar untuk memotong 'gigi' secara acak ke dalam cam mencoba terbaik untuk menjaga lebar dan kedalaman yang acak.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Terakhir saya memasang roda di bawah sisi tutup menggunakan 2 braket L logam, spaser nylon 1 inci dan baut kereta. Roda ditempatkan tepat di atas cam sehingga meluncur di sepanjang gigi cam.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Saya menggunakan rel 12 volt dari suplai daya ATX untuk memberi daya pada motor melalui relay yang dikontrol oleh Arduino. Ya, menyelaraskan semuanya memerlukan sedikit coba dan error. Setelah memindahkan roda sekali atau dua kali... ok tiga kali... semuanya selaras dan tutup mulai melompat seperti yang direncanakan!

Nafas Api: Asap dan Cahaya

Saya menggunakan generator asap murah 400 Watt untuk efek asap. Kotak ini dikontrol radio. Untuk mengontrolnya dengan Arduino saya membuka penerima dan memelentur dua garis kabel ke tombol pemicu. Ini memberikan saya garis yang saya hubungkan ke saluran relay yang dikontrol Arduino. Ini adalah hack sederhana yang saya pelajari dengan menonton beberapa video YouTube. Saya juga menambahkan hose vacuum cleaner lama untuk mengarahkan asap keluar sebagai aliran dari tepat di bawah tutup. Saya suka efek visual dan itu membantu mengurangi kondensasi uap pada elektronik di dalam kotak.

Untuk lampu saya cukup memotong kabel extensi beban ringan dan menyambungkannya melalui saluran relay. Rangkaian 100 lampu LED merah yang terhubung ke ini kemudian dapat dihidupkan dan dimatikan oleh Arduino.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino
Bangun Monster Kotak Sendiri: Proyek Robotika Arduino
Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Gunakan Suara Luar

WaveShield memiliki jack headphone 1/8 inci sebagai output - serta 2 pin i/o untuk koneksi langsung. Saya menggunakan kabel patch 1/8 inci untuk terhubung ke penguat gitar bass 30 Watt yang saya pinjam dari ruang latihan saya. Sejumlah besar speaker yang difungsikan akan bekerja - termasuk speaker PC. Tetapi menggunakan sesuatu dengan bass yang kuat tentu merupakan nilai tambah.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Rantai

Saya membeli beberapa rantai plastik dari toko Halloween dan mencetak 3D sebuah gembok. Membungkusnya di atas kotak menambahkan kedalaman dan rasa ilusi.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Halloween!!!

Letakkan kotak di halaman dan sembunyikan sensor gerak di semak dekatnya. Saya menggunakan kabel speaker panjang untuk menghubungkan sensor sehingga saya dapat bereksperimen dengan penempatannya sehingga monster akan terbangun ketika seseorang mendekati (sekitar 5 kaki) kotak.

Seiring malam semakin gelap saya menyadari bahwa semua detail di luar kotak menjadi sulit dilihat. Akhirnya saya menerapkannya dengan lampu kilat dan sangat senang dengan efeknya.

Saat peramalan candy berjalan di depan rumah mereka memperhatikan kotak yang mengorok: beberapa dengan rasa penasaran yang lain sebenarnya takut padanya. Saat mereka mendekati dan monster meraung hidup mereka akan loncat, dan berteriak beberapa bahkan bertepuk tangan. Ini adalah sukses besar.

Peningkatan

Saya bosan mencari cara untuk menyembunyikan Sensor Gerak saya di semak sehingga saya menempelkan satu ke dalam perut tikus plastik yang saya dapatkan di mana saja di sepanjang jalan masuk atau di bawah semak dekatnya. Saya juga memasang jack telepon RJ11 di bagian belakang kotak sehingga saya dapat menghubungkan sensor gerak tikus menggunakan kabel telepon 50 kaki - yang jauh lebih baik daripada dua helai kabel speaker yang sebelumnya saya gunakan.

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino
Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Anda akan melihat bahwa saya juga menambahkan saklar dan beberapa LED indikator pada plate baru itu. Saklar MEMENTAKAN semua fungsi pada kotak tanpa mematikannya. Saklar utama saya adalah strop daya di dalam dan sulit diakses, ditambah ini hanya menggunakan tegangan sinyal (5v) pada saklar eksternal ini. Saklar ini sangat bagus untuk menghentikan monster untuk peramalan candy yang lebih muda dan orang lain yang meminta untuk melihat ke dalam pada malam Halloween.

Oh! Saya membungkus rantai plastik di atas kotak untuk efek dan mereka bisa susah diatur terkadang. Terutama jika saya perlu masuk ke dalam kotak selama malam. Untuk mempermudah hal ini saya menggunakan ikat tali hitam spring carabiner di ujung rantai. Ini memungkinkan saya untuk dengan cepat melepas/mengaitkan ujung ke lubang mata yang saya pasang di sudut bawah kotak. Tidak begitu canggih tapi sangat membantu.

Masa Depan

Ada beberapa hal yang ingin saya tambahkan di masa depan. Mungkin kontrol R/C sehingga saya dapat menjeda atau memicu jarak jauh dari jarak jauh. Saya juga akan menambahkan beberapa jenis umpan balik ke pengangkat tutup sehingga Arduino dapat 'mengetahui' kapan tutup terbuka atau tertutup. Beberapa kali pengangkat berhenti di titik tinggi dalam siklus yang membuat 'insiden' kotak terlihat sampai siklus bangun berikutnya. Terakhir, saya mungkin menghubungkan pencahayaan eksternal/strobo ke Arduino untuk memungkinkan mereka dikontrol oleh program dan/atau kunci R/C.

Repositori GitHub

Anda akan menemukan kode terbaru dan diagram kabeling Di sini pada GitHub

Kode

Sketsa Monster In A BoxC/C++
/* Wave Shield Pins in Use: 2, 3, 4, 5, 10, 11, 12 & 13 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. https://learn.adafruit.com/adafruit-wave-shield-audio-shield-for-arduino/faq */ #include "MonsterSounds.h" #define RESERVED_00 0 // Reserved for Serial RX #define RESERVED_01 1 // Reserved for Serial TX #define RESERVED_02 2 // Reserved for Wave Shield #define RESERVED_03 3 // Reserved for Wave Shield #define RESERVED_04 4 // Reserved for Wave Shield #define RESERVED_05 5 // Reserved for Wave Shield #define FOG_MACHINE 6 // Connect Digital Pin on Arduino to Relay Module #define RED_LEDS 7 // Connect Digital Pin on Arduino to Relay Module #define LID_BOUNCER 8 // Connect Digital Pin on Arduino to Relay Module #define RESERVED_09 9 // Connect Digital Pin on Arduino to Relay Module #define RESERVED_10 10 // Reserved for Wave Shield #define RESERVED_11 11 // Reserved for Wave Shield #define RESERVED_12 12 // Reserved for Wave Shield #define RESERVED_13 13 // Reserved for Wave Shield #define PIR_SENSOR A0 // PIR Input #define MOTION_LED A1 // LED: lights when motion is detected (regardless of pause/sleep/wake state) #define PAUSED_LED A2 // LED: lights when system is paused #define READY_LED A3 // LED: lights when monster is in READY_TO_WAKE state #define PAUSE_BUTTON A4 // Pause Switch Input #define DEBUG_BUTTON A5 // Debug Switch Input // Effects Timer Settings - in Seconds (EDIT THESE) #define WAKE_DELAY 30 // Minimum amount of time between 'awake' occurencs in Seconds #define WAKE_DELAY_DEBUG 10 // WAKE_DELAY override when DEGUB switch is engaged #define SLEEP_SOUND_DELAY 1 // Number of seconds to wait between attempting to fire the next 'sleep' sound #define WAKE_MIN 3 // Minimum amount of 'awake' time in Seconds #define WAKE_MAX 5 // Maximum amount of 'awake' time in Seconds #define RED_LIGHT_EXTRA_TIME 1 // Allows the red lights to run a bit longer than the lid bouncer, if desired #define SMOKE_EXTRA_TIME 2 // Allows the smoke to run a bit longer than the lid bouncer, if desired // Effects Timers Settings - in Milliseconds (DO NOT EDIT THESE) #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 #define SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000 MonsterSounds sounds; static unsigned long timeSinceLastSnore= 0; static unsigned long wakeAllowedTimer = 0; static unsigned long lidBounceTimer = 0; static unsigned long lidBounceDuration = 0; static unsigned long smokeTimer = 0; static unsigned long smokeDuration = 0; static unsigned long redLightTimer = 0; static unsigned long redLightDuration = 0; enum States { STATE_INITIALIZE, // Only while running setup() and first time into loop() STATE_PAUSED, // Turn off all sounds and effects STATE_SLEEPING, // No effects, sleeping sounds, does not allow awake to be triggered STATE_READY_TO_WAKE, // No effects, sleeping sounds, allows awake to be triggered STATE_AWAKE}; // Fires effects and monster awake sounds States state = STATE_INITIALIZE; void setup() { // initialize serial communication: Serial.begin(9600); // Setup all the relay Pins pinMode(LID_BOUNCER, OUTPUT); pinMode(RED_LEDS, OUTPUT); pinMode(FOG_MACHINE, OUTPUT); pinMode(PAUSED_LED, OUTPUT); pinMode(MOTION_LED, OUTPUT); pinMode(READY_LED, OUTPUT); // Force all Effects to OFF stopAllEffects(); pinMode(PIR_SENSOR, INPUT); pinMode(PAUSE_BUTTON, INPUT_PULLUP); pinMode(DEBUG_BUTTON, INPUT_PULLUP); sounds.initialize(); // Monster Sounds sounds.playSystemReady(); delay(1000); Serial.println(); Serial.print("*** System Ready ***"); Serial.println(); } /* * NOTE: All buttons are using pullups, thus LOW means the button is PRESSED * Keep in mind the pull-up means that swiitch logic is inverted. * It goes HIGH when it's open, and LOW when it's pressed. * * The PIR motion sensor does NOT behave this way. */ /* * Main processing loop * - Manages the Monster's State Machine */ void loop() { boolean pauseSwitchClosed = digitalRead(PAUSE_BUTTON) == LOW; boolean motionDetected = digitalRead(PIR_SENSOR) == HIGH; digitalWrite(MOTION_LED, digitalRead(PIR_SENSOR)); switch (state) { case STATE_INITIALIZE: if (pauseSwitchClosed) { goToPause(); } else { goToSleep(); } break; case STATE_PAUSED: if (!pauseSwitchClosed) { goToSleep(); digitalWrite(PAUSED_LED, LOW); } else { digitalWrite(PAUSED_LED, HIGH); } break; case STATE_SLEEPING: if (pauseSwitchClosed) { goToPause(); } else if ( isAllowedToWake() ) { goToReadyToWake(); } else { processSleeping(); } break; case STATE_READY_TO_WAKE: if (pauseSwitchClosed) { goToPause(); digitalWrite(READY_LED, LOW); } else if (motionDetected) { goToAwake(); digitalWrite(READY_LED, LOW); } else { processSleeping(); } break; case STATE_AWAKE: if (pauseSwitchClosed){ goToPause(); } else if ( processAwakeAnimation() ) { goToSleep(); } // processAwakeAnimation() returns true when all animations are complete break; default: Serial.println("UNKNOWN STATE"); break; // We should never get here } } /* * Transition to the Pause State */ inline void goToPause() { Serial.println("PAUSED"); state = STATE_PAUSED; stopAllEffects(); sounds.stopAll(); } /* * Transition to the Sleep State */ inline void goToSleep() { Serial.println("GOING TO SLEEP"); state = STATE_SLEEPING; wakeAllowedTimer = millis(); } /* * Transition to the Ready To Awake State * This is a special case of the sleeping state */ inline void goToReadyToWake() { Serial.println("READY TO WAKE"); state = STATE_READY_TO_WAKE; } /* * Transition to the Awake State * - Wake the monster and process the effects & sounds */ inline void goToAwake() { Serial.println("AWAKE"); state = STATE_AWAKE; wakeMonster(); } /* * process a cycle of the SLEEP activity * - Run Sleep Sounds * - Update sleep timer */ inline void processSleeping() { if ((millis() - timeSinceLastSnore) > SLEEP_SOUND_DELAY_MILLIS) { sounds.playSnore(); timeSinceLastSnore = millis(); } } /* * Determines if monster is allowed to wake up at this time. * - Check debug switch, if its closed we use a shorter Wake Allowed Timer * - Monster must sleep for a predefined minimum amout of time before it may be awoken * - Illuminate LED when it is ready to be awoken */ inline boolean isAllowedToWake() { boolean isDebug = digitalRead(DEBUG_BUTTON) == LOW; unsigned long 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 * Starts the Awake Animations * Plays the Awake Sounds * * Call this ONCE to start the AWAKE state. */ void wakeMonster() { int activityDuration = random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // this is how long the monster will be active Serial.print(" wake duration: "); Serial.print(activityDuration); Serial.println(" ms "); bounceLid(activityDuration); flashRedLight(activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activateSmoke(activityDuration + SMOKE_EXTRA_TIME_MILLIS); sounds.playRoar(); } /* * Manages the progress of the AWAKE animations * Call this EVERY CYCLE during the AWAKE state. * Returns TRUE when all animations are complete */ boolean processAwakeAnimation() { printTimersToLog(); boolean done1 = false; boolean done2 = false; boolean done3 = false; if (millis() - lidBounceTimer > lidBounceDuration) { bounceLid(0); done1 = true; } if (millis() - redLightTimer > redLightDuration ) { flashRedLight(0); done2 = true; } if (millis() - smokeTimer > smokeDuration ) { activateSmoke(0); done3 = true; } return done1 && done2 && done3; } /* * Manage Effect: Bounce the box lid * - diration is the number of milliseconds that the effect should run * - duration of 0 means the effect should be stopped */ inline void bounceLid(unsigned long duration) { if (duration <= 0) { energizeRelay(LID_BOUNCER); lidBounceDuration = 0; } else { // start the lid bouncing de_energizeRelay(LID_BOUNCER); lidBounceTimer = millis(); lidBounceDuration = duration; } } /* * Manage Effect: Flash Red Lights * - diration is the number of milliseconds that the effect should run * - duration of 0 means the effect should be stopped */ inline void flashRedLight(unsigned long duration) { if (duration <= 0) { energizeRelay(RED_LEDS); redLightDuration = 0; } else { // start the light flashing de_energizeRelay(RED_LEDS); redLightTimer = millis(); redLightDuration = duration; } } /* * Start/Stop Effect: Activate Smoke * - diration is the number of milliseconds that the effect should run * - duration of 0 means the effect should be stopped */ inline void activateSmoke(unsigned long duration) { // 'press' the smoke button // duration should be a fixed amount of time needed for the machine to respond to the action // set a timeout to stop after duration if (duration <= 0) { energizeRelay(FOG_MACHINE); smokeDuration = 0; } else { // start the light flashing de_energizeRelay(FOG_MACHINE); smokeTimer = millis(); smokeDuration = duration; } } /* * Stop all of the Effects * - This effectively turns the monster off */ inline void stopAllEffects() { bounceLid(0); flashRedLight(0); activateSmoke(0); } /* * Prints the Awake Animation timers to the log once per second */ inline void printTimersToLog() { static unsigned long timeofLastTimerLog = 0; if (millis() - timeofLastTimerLog >= 1000) { Serial.print(" lid: "); Serial.print( (millis()-lidBounceTimer) > lidBounceDuration ? 0 : (lidBounceDuration -(millis()-lidBounceTimer) ) ); Serial.print(" lights: "); Serial.print( (millis()-redLightTimer) > redLightDuration ? 0 : (redLightDuration -(millis()-redLightTimer) ) ); Serial.print(" smoke: "); Serial.println( (millis()-smokeTimer) > smokeDuration ? 0 : (smokeDuration -(millis()-smokeTimer) ) ); timeofLastTimerLog = millis(); } } /* * Energize Relay * Sets the Normally Open (NO) terminal to OPEN * Normally Closed will become Closed */ inline void energizeRelay(int channel) { digitalWrite(channel, HIGH); } /* * De-Energize Relay * Sets the Normally Open (NO) terminal to CLOSED. * Normally Closed will become OPEN */ inline void de_energizeRelay(int channel) { digitalWrite(channel, LOW); } 
MonsterSounds.hC/C++
Arduino header 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. * */ #include <Arduino.h> #include <Wire.h> #include <WaveHC.h> #include <WaveUtil.h> 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 "); return; } if (!wave.create(file)) { PgmPrintln("Not a valid WAV"); return; } // ok time to play! wave.play(); } 

Bagian dan Kotak Khusus

monstersounds_7vLZD3NU4t.zip

Skematik

Bangun Monster Kotak Sendiri: Proyek Robotika Arduino

Proses manufaktur

  1. Mesin EEG: Desain, Manufaktur, dan Aplikasi Terkini
  2. Revolusi Kotak Jus: Sejarah, Desain, dan Dampak Lingkungan
  3. Mesin Jual Otomatis: Industri Kuasa $36,6 Miliar di AS
  4. Panduan Mesin Pemecah Uang Modern: Desain, Komponen, dan Tren Masa Depan
  5. Evolusi dan Produksi Mesin Jahit: Dari Inovasi Abad 19 hingga Otomasi Modern
  6. Selang Tipis Wanita: Panduan Lengkap Kancing Elegan
  7. Buat Mesin Menulis Tugas DIY Sendiri di Rumah
  8. Giftduino: Set Kado Arduino Ultimat untuk Hobbyis dan Pendidik
  9. Buat Alat Levitasi Ultrasonik dengan Arduino – Panduan Langkah demi Langkah
  10. Stasiun Cuaca Kompak: Arduino Nano & ESP8266 dengan Sensor BMP280 & Tampilan OLED/Nokia LCD