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

Giant Animatronics Lego Minfig Operation Game

Komponen dan persediaan

Arduino UNO
× 2
Adafruit Arduino MP3 Shield
× 1
MG90S Gear Micro Servo
× 6
Speaker:3W, 4 ohm
× 2
Bantalan Bola OpenBuilds – 688Z 8x16x5
× 12

Alat dan mesin yang diperlukan

Printer FDM Lulzbot Taz 5
X-Carve CNC

Tentang proyek ini

Proyek ini telah diselesaikan dalam 4 tahap. Saya akan segera membahas 3 tahap pertama (yang tidak berisi elektronik) dan merinci 4 tahap yang mengubah Frank menjadi permainan operasi dan menambahkan audio dan animatronik.

Tahap 1:Membangun Megafigs

Saya mulai dengan membuat tangan. Saya pikir ini akan menjadi bagian tersulit dari pembuatan awal dan ini menentukan skala untuk sisa bagian yang perlu dibuat. Tangan dibuat dari pipa PVC dan resin fiberglass untuk mengisi kekosongan antara tangan bagian dalam dan luar.

Fabrikasi kepala adalah yang berikutnya. Terbuat dari pipa PVC (penyangga pipa besar untuk bagian utama kepala), MDF, dan resin untuk mengisi kekosongan pada nub atas.

Tubuh megafig terbuat dari MDF dan bentuk kotak yang cukup lurus ke depan. Fitting PVC digunakan sebagai sambungan antara pelengkap dan batang tubuh

Kaki terbuat dari MDF dan PVC untuk menentukan lekuk kaki bagian atas.

Lengan (yang akhirnya menjadi bagian tersulit) dikasar dengan pipa PVC untuk lengan bawah, dan MDF untuk lengan atas. Busa bunga digunakan sebagai pengisi ruang. Bondo digunakan untuk membuat bentuk lengan atas, dan berton-ton pengamplasan serta isian membawanya ke bentuk akhirnya.

Lengan dan tangan dicetak dan dilemparkan dengan Smoothcast 300.

Semuanya dicat berdasarkan kit Monster Hunters Lego.

Fase 2:Rambut

Fase ini terdiri dari fabrikasi rambut para Ilmuwan. Busa perkakas dipotong menggunakan gergaji pita menjadi bentuk dasar gumpalan rambut. Berbagai bagian potongan rambut direkatkan dengan epoksi.

Seluruh potongan rambut ditutupi dengan Smoothcast 300 untuk membuat cangkang plastik di atas busa. kemudian diampelas dan diisi.

Patung epoksi digunakan untuk mengisi semua jahitan di antara bagian rambut.

Itu disiapkan dan dicat.

Fase 3:Ranjang Frank

Tahap ketiga adalah pembangunan tempat tidur Frank berdasarkan Ilmuwan Gila dan kit Monster Lego-nya. Ini adalah kotak sederhana yang dibuat dari pipa MDF dan PVC untuk nubs.

Detail sudut dibuat dengan pipa PVC yang mengapit disk MDF.

Semuanya diampelas, dipoles, dan dicat.

Fase 4:Game Operasi dan Gerakan

Bagian terakhir dari proyek ini (sampai saat ini) adalah mengubah Frank menjadi permainan operasi dan menambahkan audio dan gerakan ke Megafigs. Saya akan merinci setiap bagian tubuh bangunan alih-alih mengikuti urutan kronologis tentang bagaimana hal-hal terjadi (semuanya dikerjakan pada waktu yang sama).

Batang tubuh :

Batang tubuh memiliki braket cetak 3D yang ditambahkan ke sambungan yang menahan 2 bantalan sepatu roda. Ini bertindak sebagai titik pivot untuk lengan dan kepala.

Tubuh bagian atas Frank memiliki 2 piring permen yang dicetak 3D, di atasnya dengan bibir aluminium yang digiling, dan ditutup dengan pelat batang tubuh baru. Bibir aluminium bertindak sebagai saklar untuk permainan operasi. Ketika penjepit (yang telah disambungkan ke pelindung MP3) menyentuh aluminium, itu menyelesaikan sirkuit, mengaktifkan program.

Kepala :

Kedua kepala dimodifikasi untuk menggerakkan dan menahan speaker. Pertama, braket cetak 3D ditambahkan ke leher untuk menahan baut 5/16 yang berfungsi sebagai poros.

Logam berlubang digunakan sebagai panduan untuk memetakan lubang untuk panggangan speaker. Saya adalah yang paling gugup tentang proses ini. Kesalahan apa pun akan merusak pekerjaan cat saya di wajah. Lubang-lubang itu dicat agar sesuai dengan warna di sekitarnya.

Braket cetak 3D dibuat untuk menahan speaker di belakang kisi-kisi bicara.

Kaki :

Kaki baru dicetak 3D dalam dua bagian serta piring permen berbentuk tulang. Sebuah pelat aluminium digiling seperti batang tubuh. Kaki direkatkan, diampelas, dihaluskan dengan bondo, dan dicat.

Senjata :

Master asli untuk lengan telah dimodifikasi untuk menerima braket cetak 3D yang memiliki huruf tebal 5/16 untuk sebuah poros. Mereka kemudian dicetak ulang, dicor, dibersihkan, dan dicat.

Servo :

Servo dipasang menggunakan braket cetak 3D dan terhubung ke pelengkap melalui kawat dan tanduk aluminium yang dipasang pada baut 5/16. Pegas ditambahkan kemudian untuk membantu mengangkat senjata.

Elektronik :

Semua elektronik dipasang ke sepotong MDF untuk membuat tempat uji prototipe. Pengaturan ini memungkinkan saya dan Daniel untuk mengetahui pemrograman, hal-hal tweek, dan mengatasi gangguan. Semuanya bekerja dengan baik.

Cara kerja elektronik adalah

1:pelindung MP3 menunggu 1 dari 3 input (penjepit ke salah satu pelat aluminium)

2:Saat pelat aluminium diaktifkan, pelindung MP3 memutar file MP3 yang sesuai dan mengirimkan sinyal ke servo Arduino.

3:Ketika servo arduino mendapat sinyal dari pelindung MP3, ia menjalankan kode yang sesuai untuk servos.

Kedua arduino dipasang di bagian bawah tempat tidur Frank, dan semuanya dipasang kembali.

Siap untuk Trick or Treater :

Semuanya bekerja dengan luar biasa dan bertahan hingga malam penuh pelecehan.

Untuk log build yang lebih detail, kunjungi ... http://www.therpf.com/showthread.php?t=195101. Di sana saya merinci setiap langkah saat saya membuatnya.

Kode

  • Servo
  • Efek Suara
ServoArduino
Kode ini dimuat ke Arduino uno yang mengontrol semua 6 motor servo. Pada dasarnya menunggu untuk menerima salah satu dari 3 sinyal dari perisai MP3. Ketika sinyal diterima, servo Arduino Uno menjalankan gerakan servo yang sesuai.
/*************************** Targus - Operasi - Servos***************************//****** Catatan*******// / Pin Digital 0 dan 1 biasanya digunakan untuk komunikasi serial saat mengunggah dan memantau Arduino dari komputer.// Pin Digital 0 dan 1 dapat digunakan untuk servo jika Arduino tidak terhubung ke komputer.// Jika Pin Digital 0 dan 1 digunakan untuk servos, beri komentar pada baris mana pun yang dimulai dengan 'Serial.' dalam file ini.// Pastikan Arduino ini dihidupkan sebelum Arduino lain karena Arduino ini akan menerima sinyal 5V.// Pastikan kabel GND di Arduino ini terhubung ke GND di Arduino lain./**** ***** Termasuk**********/#include /********** Variabel**********/Servo servo5;Servo servo6;Servo servo7;Servo servo8;Servo servo9;Servo servo10;Servo servo11;int pin2 =2;int pin3 =3;int pin4 =4;/************** Arduino Setup***************/void setup() { Serial.begin(9600); // mengaktifkan komunikasi serial untuk pengembangan dan pemecahan masalah Serial.println("Targus - Operasi - Servos\n"); /***************************************** Hubungkan Servos dan atur posisi awal ** ****************************************/ servo5.attach (5); // pin digital 5 servo5.write(90); // pindah ke 90 derajat servo6.attach(6); // pin digital 6 servo6.write(90); servo7.attach(7); // pin digital 7 servo7.write(90); servo8.attach(8); // pin digital 8 servo8.write(90); servo9.attach (9); // pin digital 9 servo9.write(80); servo10.attach(10); // pin digital 10 servo10.write(90); servo11.attach(11); // pin digital 11 servo11.write(80); /************************* Atur Pin Input Digital ******************** ******/ // Atur pin input sehingga Arduino dengan efek suara dapat memberi tahu kita kapan harus mengaktifkan servos. pinMode(pin2, INPUT_PULLUP); pinMode(pin3, INPUT_PULLUP); pinMode(pin4, INPUT_PULLUP);}/************* Arduino Loop***************/void loop() { if (digitalRead(pin2) ==TINGGI) { zap2(); } else if (digitalRead(pin3) ==HIGH) { zap3(); } else if (digitalRead(pin4) ==HIGH) { zap4(); } delay(300);}/********** Fungsi**********/int moveServo(Servo &servo, int degreeStart, int degreeEnd, unsigned long timeEnd, unsigned long timeStart , float (*easing)(float), unsigned long timeNow) { // fungsi ini akan mengembalikan angka 1 jika masih ada pekerjaan yang harus diselesaikan timeEnd +=timeStart; // tambahkan penundaan apa pun ke waktu akhir if (timeNow  timeEnd) { // fase gerakan servo selesai, tidak ada yang bisa dilakukan kembali 0; } // jika kita sampai sejauh ini, bersiaplah untuk memindahkan servo float persenToMove =float(timeNow - timeStart) / float(timeEnd - timeStart); persenToMove =easing(persenToMove); // rentang derajat peta 0-180 hingga rentang mikrodetik 500-2400 untuk SG-92R http://www.servodatabase.com/servo/towerpro/sg92r degreeStart =map(degreeStart, 0, 180, 500, 2400); degreeEnd =peta(degreeEnd, 0, 180, 500, 2400); float servoTo =0; if (degreeEnd> degreeStart) { // memutar berlawanan arah jarum jam servoTo =((degreeEnd - degreeStart) * persenToMove) + degreeStart; } else { // putar searah jarum jam persenToMove =1 - persenToMove; // invers persen sehingga nilai seperti 0,8 menjadi 0,2 servoTo =((degreeStart - degreeEnd) * persenToMove) + degreeEnd; } servo.writeMicroseconds(servoTo); // Serial.print("Akan dipetakan ke:"); Serial.println(servoTo); // Serial.print("derajatMulai:"); Serial.println(degreeStart); // Serial.print("derajatEnd:"); Serial.println(degreeEnd); // Serial.print("Waktu Selesai:"); Serial.println(waktuEnd); // Serial.print("WaktuMulai:"); Serial.println(waktuMulai); // Serial.print("waktuSekarang:"); Serial.println(waktuSekarang); // Serial.print("percentToMove:"); Serial.println(percentToMove); // Serial.print("servoTo:"); Serial.println(servoTo); // Serial.print("\n"); return 1;}/****************** Fungsi:Easing*******************/// Fungsi Easing dari https://github.com/warrenm/AHEAsing/blob/master/AHEAsing/easing.c diganti namanya agar sesuai dengan http://easings.net/ untuk memudahkan pratinjau.float easeInBack(float pos) { // Dimodelkan setelah overshooting kubik y =x^3-x*sin(x*pi) return pos * pos * pos - pos * sin(pos * M_PI);}float easeOutBack(float pos) { // Dimodelkan setelah overshoot kubik y =1-( (1-x)^3-(1-x)*sin((1-x)*pi)) float f =(1 - pos); return 1 - (f * f * f - f * sin(f * M_PI));}float easeInOutBack(float pos) { // Dimodelkan setelah fungsi kubik overshooting piecewise:// y =(1/2)*(( 2x)^3-(2x)*sin(2*x*pi)); [0, 0.5) // y =(1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1); [0.5, 1] ​​if (pos <0.5) { float f =2 * pos; kembali 0,5 * (f * f * f - f * sin(f * M_PI)); } else { float f =(1 - (2 * pos - 1)); kembali 0,5 * (1 - (f * f * f - f * sin(f * M_PI))) + 0,5; }}float easeInBounce(float pos) { return 1 - easeOutBounce(1 - pos);}float easeOutBounce(float pos) { if (pos <4 / 11.0) { return (121 * pos * pos) / 16.0; } else if (pos <8 / 11.0) { return (363 / 40.0 * pos * pos) - (99 / 10.0 * pos) + 17 / 5.0; } else if (pos <9 / 10.0) { return (4356 / 361.0 * pos * pos) - (35442 / 1805.0 * pos) + 16061 / 1805.0; } else { kembali (54 / 5.0 * pos * pos) - (513 / 25.0 * pos) + 268 / 25.0; }}float easeInOutBounce(float pos) { if (pos <0,5) { return 0,5 * easeInBounce(pos * 2); } else { kembali 0,5 * easeOutBounce(pos * 2 - 1) + 0,5; }}float easeInCirc(float pos) { // Dimodelkan setelah digeser kuadran IV lingkaran satuan return 1 - sqrt(1 - (pos * pos));}float easeOutCirc(float pos) { // Dimodelkan setelah digeser kuadran II unit circle return sqrt((2 - pos) * pos);}float easeInOutCirc(float pos) { // Dimodelkan setelah fungsi sirkular piecewise // y =(1/2)(1 - sqrt(1 - 4x^2)); [0, 0.5) // y =(1/2)(kuadrat(-(2x - 3)*(2x - 1)) + 1); [0.5, 1] ​​if (pos <0.5) { return 0.5 * (1 - sqrt(1 - 4 * (pos * pos))); } else { kembali 0,5 * (persegi(-((2 * pos) - 3) * ((2 * pos) - 1)) + 1); }}float easeInCubic(float pos) { // Dimodelkan setelah kubik y =x^3 return pos * pos * pos;}float easeOutCubic(float pos) { // Dimodelkan setelah kubik y =(x - 1)^3 + 1 float f =(pos - 1); return f * f * f + 1;}float easeInOutCubic(float pos) { // Dimodelkan setelah potongan kubik // y =(1/2)((2x)^3); [0, 0.5) // y =(1/2)((2x-2)^3 + 2); [0.5, 1] ​​if (pos <0.5) { return 4 * pos * pos * pos; } else { float f =((2 * pos) - 2); kembali 0,5 * f * f * f + 1; }}float easeInElastic(float pos) { // Dimodelkan setelah gelombang sinus teredam y =sin(13pi/2*x)*pow(2, 10 * (x - 1)) return sin(13 * M_PI_2 * pos) * pow(2, 10 * (pos - 1));}float easeOutElastic(float pos) { // Dimodelkan setelah gelombang sinus teredam y =sin(-13pi/2*(x + 1))*pow(2, - 10x) + 1 return sin(-13 * M_PI_2 * (pos + 1)) * pow(2, -10 * pos) + 1;}float easeInOutElastic(float pos) { // Dimodelkan setelah gelombang sinus teredam secara eksponensial sepotong demi sepotong :// y =(1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)); [0,0.5) // y =(1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2 ); [0.5, 1] ​​if (pos <0.5) { return 0.5 * sin(13 * M_PI_2 * (2 * pos)) * pow(2, 10 * ((2 * pos) - 1)); } else { return 0.5 * (sin(-13 * M_PI_2 * ((2 * pos - 1) + 1)) * pow(2, -10 * (2 * pos - 1)) + 2); }}float easeInExpo(float pos) { // Dimodelkan setelah fungsi eksponensial y =2^(10(x - 1)) return (pos ==0.0) ? pos :pow(2, 10 * (pos - 1));}float easeOutExpo(float pos) { // Dimodelkan setelah fungsi eksponensial y =-2^(-10x) + 1 return (pos ==1.0) ? pos :1 - pow(2, -10 * pos);}float easeInOutExpo(float pos) { // Dimodelkan setelah eksponensial piecewise // y =(1/2)2^(10(2x - 1)); [0,0.5) // y =-(1/2)*2^(-10(2x - 1))) + 1; [0.5,1] if (pos ==0.0 || pos ==1.0) mengembalikan pos; if (pos <0,5) { kembali 0,5 * pow(2, (20 * pos) - 10); } else { kembali -0,5 * pow(2, (-20 * pos) + 10) + 1; }}float linear(float pos) { return pos;}float easeInQuad(float pos) { // Dimodelkan setelah parabola y =x^2 return pos * pos;}float easeOutQuad(float pos) { // Dimodelkan setelah parabola y =-x^2 + 2x return -(pos * (pos - 2));}float easeInOutQuad(float pos) { // Dimodelkan setelah potongan kuadrat // y =(1/2)((2x)^2 ); [0, 0.5) // y =-(1/2)((2x-1)*(2x-3) - 1); [0.5, 1] ​​if (pos <0.5) { return 2 * pos * pos; } else { kembali (-2 * pos * pos) + (4 * pos) - 1; }}float easeInQuart(float pos) { // Dimodelkan setelah quartic x^4 return pos * pos * pos * pos;}float easeOutQuart(float pos) { // Dimodelkan setelah quartic y =1 - (x - 1) ^4 float f =(pos - 1); return f * f * f * (1 - pos) + 1;}float easeInOutQuart(float pos) { // Dimodelkan setelah quartic piecewise // y =(1/2)((2x)^4); [0, 0.5) // y =-(1/2)((2x-2)^4 - 2); [0.5, 1] ​​if (pos <0.5) { kembali 8 * pos * pos * pos * pos; } else { float f =(pos - 1); kembali -8 * f * f * f * f + 1; }}float easeInQuint(float pos) { // Dimodelkan setelah quintic y =x^5 return pos * pos * pos * pos * pos;}float easeOutQuint(float pos) { // Dimodelkan setelah quintic y =(x - 1)^5 + 1 float f =(pos - 1); return f * f * f * f * f + 1;}float easeInOutQuint(float pos) { // Dimodelkan setelah quintic piecewise // y =(1/2)((2x)^5); [0, 0.5) // y =(1/2)((2x-2)^5 + 2); [0.5, 1] ​​if (pos <0.5) { return 16 * pos * pos * pos * pos * pos; } else { float f =((2 * pos) - 2); kembali 0,5 * f * f * f * f * f + 1; }}float easeInSine(float pos) { // Dimodelkan setelah seperempat siklus gelombang sinus kembali sin((pos - 1) * M_PI_2) + 1;}float easeOutSine(float pos) { // Dimodelkan setelah seperempat siklus sinus wave (fase berbeda) return sin(pos * M_PI_2);}float easeInOutSine(float pos) { // Dimodelkan setelah setengah gelombang sinus return 0.5 * (1 - cos(pos * M_PI));}/****** ********* Fungsi:Zap****************//****** Zap 2*******/void zap2() { Serial.println("ZAP 2 dipanggil!"); //Bone unsigned long timeStart =milis(); int todo; lakukan { unsigned long timeNow =milis() - timeStart; melakukan =0; // M Tendangan Kaki //todo +=moveServo(servo5, 90, 50, 100, 0, easeInOutCubic, timeNow); // memindahkan servo5 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik // melakukan +=moveServo(servo5, 50, 90, 500, 500, easeOutBounce, timeNow); // gerakkan servo5 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik // M Kepala sisi ke sisi untuk melakukan +=moveServo(servo7, 90, 110, 500,0, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo7, 110, 70, 500, 500, easeInOutCubic, timeNow); // pindah servo7 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik untuk melakukan +=moveServo(servo7, 70, 110, 500, 1000, easeInOutCubic, timeNow); todo +=moveServo(servo7, 110, 70, 500, 1500, easeInOutCubic, timeNow); todo +=moveServo(servo7, 70, 110, 500, 2000, easeInOutCubic, timeNow); todo +=moveServo(servo7, 110, 70, 500, 2500, easeInOutCubic, timeNow); todo +=moveServo(servo7, 70, 90, 500, 3000, easeInOutCubic, timeNow); // M lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo8, 90, 170, 1000, 0, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo8, 170, 90, 1000, 4000, easeOutBounce, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // M tangan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo6, 90, 130, 1000, 1500, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo6, 130, 90, 1000, 5000, easeOutBounce, timeNow); // pindah servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik // S Kepala sisi ke sisi untuk melakukan +=moveServo(servo10, 90, 40, 1000, 500, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo10, 40, 105, 1000, 2000, easeInOutCubic, timeNow); // pindah servo7 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik untuk melakukan +=moveServo(servo10, 105, 90, 1000, 6000, easeInOutCubic, timeNow); // S lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo11, 80, 160, 1000, 2000, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo11, 160, 80, 1000, 5000, easeInOutCubic, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // S lengan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo9, 80, 20, 1000, 1000, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo9, 20, 80, 1000, 2000, easeInOutCubic, timeNow); // pindahkan servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan penundaan 1 detik (20); } while (todo> 0);}/****** Zap 3*******/void zap3() { Serial.println("ZAP 3 dipanggil!"); unsigned long timeStart =milis(); int todo; lakukan { unsigned long timeNow =milis() - timeStart; melakukan =0; // M Kepala sisi ke sisi untuk melakukan +=moveServo(servo7, 90, 130, 1000, 0, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo7, 130, 90, 1000, 5000, easeInOutCubic, timeNow); // gerakkan servo7 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // M lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo8, 90, 170, 1000, 0, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo8, 170, 90, 1000, 4000, easeOutBounce, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // M tangan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo6, 90, 130, 1000, 1500, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo6, 130, 90, 1000, 5000, easeOutBounce, timeNow); // pindah servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik // S Kepala sisi ke sisi untuk melakukan +=moveServo(servo10, 90, 40, 1000, 500, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo10, 40, 105, 1000, 2000, easeInOutCubic, timeNow); // pindah servo7 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik untuk melakukan +=moveServo(servo10, 105, 90, 1000, 6000, easeInOutCubic, timeNow); // S lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo11, 80, 160, 1000, 0, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo11, 160, 80, 1000, 5000, easeInOutCubic, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // S lengan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo9, 80, 20, 1000, 1000, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo9, 20, 80, 1000, 6000, easeInOutCubic, timeNow); // pindahkan servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan penundaan 1 detik(10); } while (todo> 0);}/****** Zap 4*******/void zap4() { Serial.println("ZAP 4 dipanggil!"); unsigned long timeStart =milis(); int todo; lakukan { unsigned long timeNow =milis() - timeStart; melakukan =0; // M Kepala sisi ke sisi untuk melakukan +=moveServo(servo7, 90, 130, 1000, 0, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo7, 130, 90, 1000, 5000, easeInOutCubic, timeNow); // gerakkan servo7 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // M lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo8, 90, 170, 1000, 0, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo8, 170, 90, 1000, 4000, easeOutBounce, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // M tangan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo6, 90, 130, 1000, 1500, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo6, 130, 90, 1000, 5000, easeOutBounce, timeNow); // pindah servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik // S Kepala sisi ke sisi untuk melakukan +=moveServo(servo10, 90, 40, 1000, 500, easeInOutCubic, timeNow); // pindah servo7 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo10, 40, 105, 1000, 2000, easeInOutCubic, timeNow); // pindah servo7 dari 180 ke 90 derajat selama 1 detik setelah penundaan 1 detik untuk melakukan +=moveServo(servo10, 105, 90, 1000, 6000, easeInOutCubic, timeNow); // S lengan kiri ke atas dan ke bawah untuk melakukan +=moveServo(servo11, 80, 160, 1000, 2000, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo11, 160, 80, 1000, 5000, easeInOutCubic, timeNow); // gerakkan servo8 dari 180 ke 90 derajat selama 1 detik setelah jeda 1 detik // S lengan kanan ke atas dan ke bawah untuk melakukan +=moveServo(servo9, 80, 20, 1000, 1000, easeInOutCubic, timeNow); // pindah servo8 dari 90 ke 180 derajat selama 1 detik setelah penundaan 0 detik untuk melakukan +=moveServo(servo9, 20, 80, 1000, 2000, easeInOutCubic, timeNow); // pindahkan servo8 dari 180 ke 90 derajat selama 1 detik setelah penundaan penundaan 1 detik(10); } while (melakukan> 0);}
Efek SuaraArduino
Kode ini dimuat ke Arduino Uno dengan pelindung MP3 terpasang padanya. Pada dasarnya ia menerima sinyal dari salah satu dari tiga sakelar, memutar file audio yang sesuai dan mengirim sinyal ke Arduino Uno yang mengendalikan servos. Two buttons can also be mounted to it to control volume.
/*********************************** Targus - Operation - Sound Effects************************************//****** Notes*******/// Digital Pins 0 and 1 are normally used for serial commucation when uploading and monitoring an Arduino from a computer.// Digital Pins 3, 4, 6, 7, 11, 12, and 13 are used by the Adafruit Music Maker Shield.// This Arduino should be powered on after the servos Arduino since this Arduino will be sending 5V signals.// Make sure a GND wire on this Arduino is connected to GND on the other Arduino./********* Includes**********/#include #include #include /********** Variables***********/int relayPin5 =5;int relayPin8 =8;int relayPin9 =9;int pinVolDown =14; // aka Analog In 0int pinVolUp =15; // aka Analog In 1int volume =50; // this is the default volume which can be changed later by the volDown() and volUp() functions/******************************************************************** Adafruit Music Maker Shield - https://www.adafruit.com/product/1788*********************************************************************/// Adafruit Music Maker Shield Pins#define SHIELD_RESET -1 // VS1053 reset pin (unused!)#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin. See http://arduino.cc/en/Reference/attachInterrupt for more info.#define CARDCS 4 // Card chip select pin#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)#define SHIELD_CS 7 // VS1053 chip select pin (output)// the most important thing on the line below is the variable 'musicPlayer' which we will use to play music laterAdafruit_VS1053_FilePlayer musicPlayer =Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);/************** Arduino Setup***************/void setup() { Serial.begin(9600); // enable serial communication for development and troubleshooting Serial.println("Targus - Operation - Sound Effects\n"); if (! musicPlayer.begin()) { // initialise the music player Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); while (1); // loop forever since we could not connect to the Adafruit Music Maker Shield } SD.begin(CARDCS); // initialise the SD card // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int // Specify which GPIO pins to use for input. musicPlayer.GPIO_pinMode(2, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(3, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(4, OUTPUT); // switch for ... // Specify which digital pins we will use for volume control pinMode(pinVolDown, INPUT_PULLUP); pinMode(pinVolUp, INPUT_PULLUP); // Specify which digital pins we will use to communicate with the other Arduino (aka the Arduino with all the servos). pinMode(relayPin5, OUTPUT); pinMode(relayPin8, OUTPUT); pinMode(relayPin9, OUTPUT);}/************* Arduino Loop**************/void loop() { int gpio2 =musicPlayer.GPIO_digitalRead(2); int gpio3 =musicPlayer.GPIO_digitalRead(3); int gpio4 =musicPlayer.GPIO_digitalRead(4); int ioDown =digitalRead(pinVolDown); // volume down int ioUp =digitalRead(pinVolUp); // volume up// Serial.println(ioDown);// Serial.println(ioUp);// Serial.println(gpio2); if (gpio2 ==1) { Serial.println("GPIO 2 triggered.\n"); zap2(); } else if (gpio3 ==1) { Serial.println("GPIO 3 triggered.\n"); zap3(); } else if (gpio4 ==1) { Serial.println("GPIO 4 triggered.\n"); zap4(); } else if (ioDown ==LOW) { Serial.println("Analog 0 triggered.\n"); volDown(); } else if (ioUp ==LOW) { Serial.println("Analog 1 triggered.\n"); volUp(); } delay(2); // this delay may need to be reduced or removed depending on how responsive hitting the tongs to the side of a container feels}/********** Functions***********/void audioPlay(String file) { Serial.println("Playing " + file); musicPlayer.startPlayingFile(file.c_str()); penundaan (500); // wait half a second before returning so the audio can get going}void audioStop(String file) { musicPlayer.stopPlaying(); Serial.println("Done playing " + file);}void activate(int pin) { digitalWrite(pin, HIGH); penundaan (300); // delay as long as needed for the other Arduino to notice an event digitalWrite(pin, LOW);}void volDown() { volume =volume + 1; if (volume> 255) { volume =255; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}void volUp() { volume =volume - 1; if (volume <0) { volume =0; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}/*************** Functions:Zap****************/ /****** Zap 2 *******/ void zap2() { // Audio and Servo(s) triggered by GPIO 2 String file ="02.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin5); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 3 *******/ void zap3() { // Audio and Servo(s) triggered by GPIO 3 String file ="03.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin8); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 4 *******/ void zap4() { // Audio and Servo(s) triggered by GPIO 4 String file ="04.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin9); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } 

Suku cadang dan penutup khusus

3D grown Parts
CAD file on thingiverse.com

Skema

Connect GPIO 2, 3, 4 of the MP3 shield to the aluminum Plates.
Connect 3v of the MP3 shield to the tongs.
Connect pins 5, 8, 9 of the MP3 shiled to pins 2, 3, 4 of the servo Arduino.
Connect pins 6, 7, 8, 9, 10, 11 of the servo Arduino to the servos.
Wire the positive and negative of the servos to a 5v plug.
Wire the graounds of both the servo Arduino and the MP3 shield to the 5v plug.
Wire up both speaker inputs. These are the scaled and dimensioned drawings I used to construct the megafigs.

Proses manufaktur

  1. Membuat Monitor Ambilight Menggunakan Arduino
  2. Game Arduino Pong - Tampilan OLED
  3. Pengontrol Game Arduino
  4. Penembak Lego Otomatis
  5. Game Breakout Arduino Touch
  6. Detektor Frekuensi Audio
  7. Klon Arduino Tamagotchi - Hewan Peliharaan Digital
  8. Manipulator Saklar Lampu Nirkabel
  9. Tech-TicTacToe
  10. Sensor Gerakan Pistol Air