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

Berbicara Portal 2 Senapan Turret

Komponen dan persediaan

Arduino Nano R3
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)

Tentang proyek ini

Ceritanya

Natal ini, saya memutuskan untuk merancang dan membuat senjata menara Portal yang berfungsi dari game Portal 2 . Bagi saya, ini adalah latihan memodelkan seluruh perakitan dengan benar di Fusion 360 terlebih dahulu, sebelum membangun apa pun. Perancangan ini menggunakan Arduino Nano, chip MP3 player, sensor jarak, servos, LED dan komponen cetak 3D.

Tujuannya di sini adalah untuk membuatnya bergerak dalam 3 "sumbu", dengan suara yang diucapkan dari game dan LED untuk mensimulasikan penembakan.

  • Buka "sayap" jika merasakan ada seseorang di depan. Gunakan mekanisme engkol dengan penggeser, hanya karena.
  • Jika orang itu masih di sana setelah dibuka, tembak sampai jatuh. Suara LED dan senapan mesin.
  • Jika orang tersebut sudah tidak ada lagi, jalankan sedikit pemindaian rutin pencarian.
  • Tutup dan tidurlah sampai orang lain datang.
  • Gunakan suara dan suara menara Portal dari game.

Saya mengambil beberapa kebebasan dalam desain, mencoba membuatnya cukup sama dengan yang terlihat dalam permainan, tetapi fungsional dan dapat dicetak. Dengan beberapa sketsa dasar yang ditemukan secara online, saya mulai membuat model dan merencanakan...

Suara disimpan pada kartu microSD, yang dapat diakses dari sisi belakang sehingga suara dapat diperbarui atau diubah nanti. Itu sejajar dengan strip pengisi hitam, sehingga pada dasarnya tidak terlihat setelah dipasang. 18 ekspresi dan suara individu digunakan dalam putaran ini.

Sensor lidar (waktu penerbangan) ada pada chip dengan profil persegi panjang. Sensor ini hampir tidak terlihat dari depan setelah dipasang.

Langkah 1:Pemodelan Fusion 360

Desainnya dimulai dari sketsa yang ditemukan secara online. Menggunakan gambar-gambar ini sebagai kanvas, saya mulai membuat sketsa garis luar dari 3 tampilan. Kemudian itu adalah masalah mengekstrusi mereka menjadi 3D, lalu mengupas bentuk umum dan membuat potongan. Semua elektronik dibangun di Fusion sebagai komponen yang dimasukkan dan ditempatkan di tempat yang menurut saya masuk akal. Parameter mengemudi adalah:

  • Arduino Nano harus memiliki konektor yang dapat diakses untuk memperbarui setelah dirakit sepenuhnya
  • Kartu MicroSD harus dapat diakses dengan cara yang sama, dan idealnya tidak terlihat setelah dipasang
  • Sensor waktu terbang juga harus tidak terlihat
  • Konektor listrik 2,1 mm untuk daya di bagian belakang
  • Bagian yang dicetak harus sebesar mungkin (tidak banyak potongan kecil)
  • Cetak tanpa dukungan

Setelah komponen (Nano, chip lainnya, servos) ditambahkan ke bentuk dasar, komponen tersebut dipindahkan dan diposisikan sesuai kebutuhan, dan struktur pendukung dibangun untuk menopangnya di dalam cangkang.

Mekanisme pembukaan sayap adalah mekanisme engkol dan geser. Mengapa? Karena saya ingin menggunakan mekanisme engkol, itu sebabnya! Ini menambahkan beberapa komplikasi, tetapi juga memiliki manfaat; setelah geometri ditentukan, pengulangan operasional akan dipastikan dan batas minimum dan maksimum cukup terjamin.

Setelah seluruh model dibuat dan saya yakin itu akan berhasil, dan dapat dibuat (dicetak) dan dirakit, saya melanjutkan dan mencetak bagian-bagiannya dan membuat prototipe. Setelah itu berhasil, saya kembali ke model dan membuat beberapa penyesuaian untuk meningkatkan penampilan dan kemampuan merakit (apakah itu sebuah kata?). Model inilah yang muncul dari perubahan tersebut.

Ini cukup melelahkan, karena sebenarnya tidak banyak bentuk kotak dalam benda ini, dan menutup cukup rapat, tanpa akses nyata untuk mengutak-atik setelah disatukan. Saya belajar sedikit tentang proyek ini, seperti menggunakan komponen yang disematkan di dalam komponen lain. Ini membuat manipulasi dan menjaga sub-rakitan terhubung untuk akses cepat. Pada akhirnya, itu sepadan dengan usaha!

Langkah 2:Bagian Cetakan 3D

Portal turret v4.zip diperbarui dan harus berisi semua bagian tercetak yang diperlukan untuk membuat turret terbaru.

--- "Kaki uji belakang" baru. Tidak sesuai aslinya, tetapi ada di bagian belakang, dan memungkinkan seseorang untuk menggunakan konektor mini-USB lurus ke atas. ---

Ini dicetak pada Prusa Mk2, menggunakan PLA untuk semua bagian. Orientasi cetak harus cukup jelas. Tubuh dicetak dalam posisi vertikal, tanpa penyangga. Ada celah besar di sisi yang harus dijembatani, tapi saya benar-benar tidak punya masalah besar dengan pengaturan standar yang cantik, selain benjolan. Benjolan di bagian depan dan belakang hampir dapat dihilangkan dengan filamen yang baik dan beberapa pengaturan cetak yang baik. Saya menemukan bahwa 0.2mm bekerja dengan baik di alat pengiris dan menghasilkan hasil yang layak. Setiap lubang yang lebih besar dan terbuka mulai muncul di badan dekat strip pengisi.

Desain saluran dan tonjolan dibuat dengan chamfer 45 derajat, sehingga elemen "menggantung di ruang" akan minimal.

Saya memiliki sedikit pembersihan yang harus dilakukan untuk menyatukan perakitan. Strip pengisi yang meluncur ke saluran sekarang cukup mudah, dengan lebar yang dikurangi dan ketebalan yang konsisten. Saya pikir seseorang dapat menggunakan bahan hitam tipis yang dipotong menjadi potongan-potongan daripada menggunakan potongan-potongan yang dicetak ini (dicetak di tepinya).

Satu-satunya area yang membutuhkan kemahiran adalah pin penggeser di bingkai nada. Pin lurus (paku) di lubang bor yang dikejar dengan mata bor 1/8" dan beberapa pelumas akan pergi jauh.

Lensa%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Sayap%2BRH%2Bbottom%2Bv4.stl Sayap%2BRH%2Btop%2Bv4.stl Sayap%2BLH%2Bbottom%2Bv4.stl Sayap%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Kaki%2B-%2BREAR%2Bv4.stl Isi%2Bstrips%2Bv3.stl Kaki%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl sayap%2Bv6.zip Arduino%2BBase%2Bw%2BRRadio.stl Portal%2BTurret%2Bv4.zip

Langkah 3:Komponen

V4 (Turret merah) memiliki jembatan yang lebih kecil, membutuhkan sayap v4 dan bingkai Pitch.

Yang v6 sayap adalah sebuah opsi itu mengizinkan berbeda mewarnai"senjata". Saya belum pernah membuat yang seperti ini secara pribadi, tetapi seharusnya berfungsi dengan baik.

Setelah model selesai, dan saya senang dengan prototipe saya, saya mencetak rev 2 dengan komponen plastik seperti yang ditunjukkan. Semuanya di sini adalah PLA, dengan Hitam dan warna desain (Biru dalam hal ini), dan sedikit PLA tembus cahaya untuk "Lensa" atau mata laser pusat.

Foto ini menangkap komponen dengan cukup baik, kecuali kabelnya.

Langkah 4:Elektronik

Build menggunakan komponen berikut:

  • Arduino Nano (1)
  • Pemutar MP3 Mini DFPlayer (atau MP3-TF-16P) (1)
  • Sensor Jarak Waktu Penerbangan VL53L0X (1)
  • Servo mikro SG90 generik (3)
  • LED merah 5mm (5)
  • Resistor 220 Ohm untuk LED (5)
  • Resistor 1kOhm (1)
  • Speaker 4cm, 4Ohm, 3 Watt (1)
  • Konektor daya 2.1mm (1)
  • kuku bingkai panjang 3" (4)
  • M2 x 6 sekrup (8)
  • M2.5 x 8 sekrup (2)
  • Sekrup M3 x 8 (4)
  • M3 x 12 sekrup (4)
  • Sekrup M3 x 16 (2)
  • mengecilkan pembungkus
  • bungkus dasi kecil

Semua komponen sudah tersedia dari Arduino, Amazon atau Banggood dan sumber lainnya.

Sekrup bersumber dari kit bermacam-macam. Sangat sulit untuk mendapatkannya jika tidak...

Langkah 5:Perakitan Mekanik

Sebagian besar perakitan mekanis masuk akal. Bagian yang dicetak dicetak dengan lubang yang lebih besar disadap jika diperlukan, jadi pengejaran cepat dengan sekrup sebelum perakitan akhir akan membantu dan membuat perakitan komponen yang disekrup cukup mudah.

Arduino dan chip MP3 masuk ke dalam dudukan tanpa perangkat keras. VL53LOX akan masuk ke cangkang depan tanpa pengencang. Uji coba dulu, lalu lepas dan pasang setelah tersambung.

Rakitan penggeser menggunakan 4 paku pembingkaian sebagai rel penggeser. Diameternya sekitar 1/8", dengan kepala terpotong. Paku ini diambil dari strip paku pembingkaian DeWalt yang digunakan dengan pembingkaian kuku listriknya. Tak perlu dikatakan, kuku yang halus adalah suatu keharusan.

Servo dipasang seperti yang ditunjukkan. Orientasi itu penting. Pitch dan servo pivot "terpusat" saat memasang ke bagiannya. Engkol dipasang sedemikian rupa sehingga ketika dalam posisi terbuka akan menutup dengan memutar berlawanan arah jarum jam, jika dilihat dari depan. Posisi terbuka adalah batang dan engkol lurus sejajar, dengan putaran 10 derajat lagi hingga terkunci.

Perakitan kaki adalah bagian yang paling mudah. Sekrup berukuran 2-2,5 mm, dengan penutup kaki terpasang pada siku setiap kaki. Gunakan pengencang daripada tidak menonjol di atas bagian atas pelat kaki. Dengan begitu, badan yang berputar tidak akan mengikat jika Anda mengubah rentang rotasi.

Semua koneksi servo ke bagian yang dicetak dibuat menggunakan engkol putih pendek yang disertakan dengan servos. Engkol ini hanya menekan ke bagian yang dicetak. Saya mencoba mencetak lubang splined di bagian yang terhubung ke setiap servo, tetapi memiliki keberhasilan yang terbatas dan berulang. Jauh lebih mudah menggunakan engkol yang disertakan dengan servos.

Rakitan engkol menggunakan sekrup 2,5 mm yang lebih panjang. Batang engkol tidak boleh terjepit di antara bagian engkol. Bahkan, Anda dapat mencoba menggunakan sekrup yang lebih pendek tanpa bagian Crank2. Itu akan bekerja dengan baik (semoga tidak ada torsi yang cukup besar di sini jika sayapnya meluncur bebas).

Speaker ditangkap oleh servo mount (2 buah) yang menangkap speaker. Speaker di antara "kaki" ini, dan ditahan di posisinya dengan mengamankannya ke servo pitch. Servo ini kemudian dihubungkan ke rakitan pitch (slider), diikuti oleh rakitan engkol dengan batang. Semua ini dirakit sebelum dipasang di bodi LHS dengan 4 sekrup kecil.

Setelah nyali utama dipasang, dengan Arduino dan pemutar MP3 berada sementara, maka kesenangan dimulai - pemasangan kabel!

Langkah 6:Pengkabelan

V5 - Opsi radio (Foto menara merah). Ini termasuk chip radio nRF24L01. Benar-benar mengubah kabel pin Arduino untuk mengakomodasi semua koneksi. Detail menyusul...

Kemasan akhir ketat, jadi menghabiskan waktu di sini untuk mencari tahu panjang kawat sangat berharga. Kebanyakan kabel interkoneksi yang saya dapatkan adalah antara 3" - 4".

LED dihubungkan dengan resistor 220 Ohm secara langsung, diikuti dengan beberapa pembungkus menyusut, dan beberapa lilitan kabel, kemudian disisihkan, setelah diuji. Saya menggunakan kabel pengukur cahaya di sini karena ada beberapa yang tergeletak di sekitar (kabel komunikasi tipe CAT5) dan tidak ingin kabel yang terlihat menonjol.

Potongan mekanisnya pas di cangkang, lalu perutean kabel ditentukan, lalu pemotongan dan persiapan kabel adalah langkah berikutnya.

Saya membangun konektor servo sehingga saya dapat memasang dan mengganti servo jika saya mengacaukan sesuatu dan melepaskan persneling. Ini benar-benar membantu setelah mengacaukan prototipe pertama saya.

Setelah puas dengan sebagian besar kabel, LED disolder di ujungnya. Maka saatnya untuk memasukkan rakitan kabel dengan hati-hati ke dalam setengah cangkang. Langkah terakhir adalah menyolder konektor daya ke kabel daya setelah semuanya terpasang di dalamnya.

-- Catatan penting:Pastikan kabel di belakang Nano tidak menekan tombol reset!! Ini jelas akan menyebabkan masalah dan mencegah unit beroperasi dengan benar. --

Pada titik ini, semua pengkabelan dilakukan, tetapi sebelum perakitan akhir, penting untuk mengunggah kode ke Nano dan menyalakannya untuk memastikan LED, servos, dan pemutar MP3 berfungsi seperti yang dirancang. Setelah itu, saatnya menyatukan bagian mekanis lainnya.

Langkah 7:Kode Arduino

Kode yang diperbarui! Membersihkannya dan membuat beberapa penyesuaian.

File terlampir adalah apa yang saya buat untuk menggerakkan unit seperti yang ditunjukkan dalam video. Saya akan terus mengutak-atik untuk mengubah karakter Turret dan cara kerjanya. Banyak pilihan di sini.

Saya menyusun kode menggunakan subrutin yang saya panggil sesuai kebutuhan. Itu membuat bodi utama tetap bersih dan cukup membantu ketika saya bermain-main dengan karakteristik yang berbeda. Ini membantu saya memanipulasi kode untuk perilaku yang berbeda.

Saya juga menggunakan banyak variabel di depan yang membantu saya mengubah dan menyesuaikan posisi parkir dan rentang minimum dan maksimum, misalnya.

Saya menggunakan perpustakaan DFMiniMP3 dalam kode saya. Saya mencoba perpustakaan lain, seperti DFRobot, tetapi mengalami masalah, jadi kembali ke yang ini. Itu berarti saya harus menjaga bagian 'statis void' agar tetap berfungsi. Ini tidak diperlukan untuk operasi, tapi hei, saya bukan master coder. Saya ingin mendengar perpustakaan lain yang sama sederhana dan rapinya dengan perpustakaan VL53LOX. Beri tahu saya jika Anda menemukan cara yang lebih baik untuk melakukannya!

Sedangkan untuk suara, implementasinya dilakukan dengan cara yang sederhana, dengan memiliki folder bernama "mp3" di kartu SD, dengan nama file 0001.mp3, 0002.mp3, dll. Empat digit pertama harus dalam format ini, tetapi Anda dapat menambahkan sufiks apa pun setelah itu untuk membantu mengidentifikasi suara tertentu. Lihat https://www.dfrobot.com/blog-277.html untuk contoh. Saya telah menyertakan foto nama file saya seperti yang digunakan pada folder. Angka-angka tersebut sesuai dengan keterangan dalam kode.

File suara yang saya tarik dari halaman Wikipedia di Portal Turret terdengar. Kode tersebut mengambil file suara acak (1 dari 2, atau 3 suara) agar tidak menjadi basi.

Langkah 8:Majelis Badan Terakhir

Bagian ini agak rumit karena strip pengisi berwarna hitam. Skala perakitan akhir cukup kecil sehingga strip dan alur penerima kecil. Ini mengharuskan pengejaran saluran dengan penunjuk atau alat pengikis kecil lainnya untuk memastikan strip akan pas dengan sedikit hambatan sebelum mencoba memasang sisi lainnya.

Mengikat kabel dengan rapi dan mengikatnya sesuai kebutuhan akan membuat ini jauh lebih mudah.

Saya telah menyatukan beberapa ini sekarang dan merasa lebih mudah untuk menyatukan kedua bagiannya terlebih dahulu, lalu masukkan strip pengisi. Masukkan satu sisi ke dalam setengah dengan "rak" yang mencegah strip pengisi jatuh ke dalam, lalu buka perlahan dan tekan perlahan. Tidak terlalu buruk sekarang.

Ini adalah salah satu bagian yang lebih sulit. Mungkin suatu hari, saya akan memikirkan kembali perakitan ini, tetapi saya menyukai tampilannya saat selesai, dan itu cukup kuat.

Langkah 9:Rakitan Sayap

Sekarang setelah bodi menyatu, dengan LED sayap menonjol, sekarang saatnya menyiapkan sayap dan merakit.

Lubang penggeser harus dikejar dengan mata bor 1/8", lalu dibersihkan. Gunting kepala paku menggunakan pemotong baut, penjepit catok, gergaji besi, atau alat pemotong kuku favorit. Pin penggeser (paku terpotong ) dipasang ke sayap dengan menekan pas ke masing-masing bagian sayap. Paku yang lurus, tidak berduri, dan dihaluskan adalah kunci untuk membuat pekerjaan ini. Penggeser dan lubang sayap harus dilumasi dan diuji sebelum menghubungkan batang engkol dan berjalan. Keringkan grafit, atau pelumas lain yang sesuai PLA disarankan. Saya menemukan bahwa tabung kecil pelumas pribadi bekerja dengan sangat baik, dan murah. Ini sangat licin. Ini juga membutuhkan beberapa 'pelumas' ketika pasangan atau orang tua Anda masuk dan bertanya apa sebenarnya kamu membutuhkannya di meja kerja!!

Mulailah dengan mencari tahu bagian sayap mana yang mengarah ke mana, dan coba geser bagian itu terlebih dahulu. Kemudian paskan bagian atas dan bawah bersama-sama setelah pin dipasang, oleskan beberapa pelumas (ujung-q bekerja dengan baik untuk ini) dan pastikan sayap meluncur dengan baik. Ini bisa rumit, tetapi tanpa memastikan sayap meluncur dengan mudah, tanpa mengikat, Anda akan berada dalam waktu yang membuat frustrasi. Percayalah...

Setelah sayap siap digunakan, tinggal menggesernya ke tempatnya, menempatkan batang penghubung di atas lubang di sayap dan merakitnya dengan satu sekrup. Kemudian, LED dimasukkan ke dalam lubang senjata, kabel diselipkan ke sayap dan Anda siap untuk pergi! Anda juga dapat menggunakan lem panas untuk menguncinya pada tempatnya setelah semuanya diuji.

Langkah 10:Menakut-nakuti dan Mengejutkan Teman Anda!!

Peringatan kecil terakhir pada desain ini adalah bahwa steker miring adalah ide bagus, karena tidak mengganggu kaki belakang saat berputar. Kaki belakang yang direvisi (v3) telah diregangkan untuk memberikan sedikit lebih banyak ruang.

Setelah dibangun dan dicolokkan (5V atau cocok untuk Nano), ia akan diam sampai seseorang terdeteksi dalam jarak yang diprogram, kemudian hidup dan membunuh siapa saja yang memasuki domainnya!!

Beri tahu saya jika Anda membuat satu (atau lebih) dan jika Anda menemukan fitur atau konsep baru!

Kode

  • Menara portal dengan Radio (MERAH)
Turret portal dengan Radio (MERAH)C/C++
Kode yang digunakan untuk menara. Ini termasuk kode yang akan mengaktifkan kontrol oleh Master Turret Control, yang ditampilkan di halaman lain.
Rasa yang berbeda membutuhkan penyesuaian.
///* Portal Turret - Opsi Dengan Radio!! * Chris Nowak - Feb 2019 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * Ini kode mencakup semua fitur yang diperlukan untuk menjalankan Cara Mia Opera, * Waktu Obrolan dan mode Manual, yang dikendalikan oleh Kontrol Turret Maseter (MTC). * MTC adalah pengontrol terpisah yang ditampilkan di build lain. Turret * akan beroperasi secara mandiri menggunakan kode ini tanpa MTC. * * Kode dibuat untuk bekerja dengan tiga menara, tetapi masing-masing akan beroperasi secara independen. * Banyak kode debug yang tersisa. Gunakan atau bersihkan sesuai keinginan. Sebagian besar di-debug, * tetapi tidak sempurna. Mengingat harga yang Anda bayar, saya pikir tidak apa-apa!;) * =================MERAH ===================*/#include  #include #include "Arduino.h"#include #include #include #include #include # include class Mp3Notify{public:static void OnError(uint8_t errorCode) { // lihat DfMp3_Error untuk arti kode Serial.println(); Serial.print("Kesalahan Kom "); Serial.println(Kode kesalahan); } static void OnPlayFinished(uint8_t globalTrack) { Serial.println(); Serial.print("Pemutaran selesai untuk #"); Serial.println(globalTrack); } static void OnCardOnline(kode uint8_t) { Serial.println(); Serial.print("Kartu online"); Serial.println(kode); } static void OnCardInserted(kode uint8_t) { Serial.println(); Serial.print("Kartu dimasukkan "); Serial.println(kode); } static void OnCardRemoved(kode uint8_t) { Serial.println(); Serial.print("Kartu dihapus"); Serial.println(kode); }}; Servo servo_pivot;Servo servo_wings;Servo servo_pitch;VL53L0X sensor;// Setup untuk soundcardSoftwareSerial secondarySerial(4, 2); // RX, TXDFMiniMp3 mp3(secondarySerial);// Setup untuk radio radioRF24(10, 9); // nRF24L01 (CE,CSN)RF24Jaringan jaringan (radio); // Sertakan radio di networkconst uint64_t this_node =01; // Menara ini - Merah - dalam format Oktal ( 04.031, dll)const uint64_t WHT =02; // Turret 02 - Whiteconst uint64_t BLU =03; // Turret 03 - Blueconst uint64_t MTC =00; // Master Turret Controlunsigned long beforeMillis1 =0;unsigned long beforeMillis2 =0;unsigned long beforeMillis3 =0;byte LED_LH_up =A1;byte LED_LH_down =A2;byte LED_CENTRE =A3;byte LED_RH_up =7;byte LED_RH_down =8;byte PIVOT =6; //whitebyte SAYAP =3; //bit kuning PITCH =5; //bluebyte parkPIVOT =96; //Jumlah yang lebih kecil memutar CW seperti yang dilihat dari topbyte posPIVOT =96;byte maxPIVOT =116;byte minPIVOT =76;byte WINGclose =165;byte WINGopen =10;byte WINGpos =160;byte parkPITCH =86;byte posPITCH =86; byte maxPITCH =96;byte minPITCH =75;byte pos =90;byte pulsa =20;byte pitchCW =1;byte pivotCW =1;byte randomWake;byte randomOpen;byte randomFalse;byte randomStart;byte randomDisengage;int triggerDistance =300; byte buttonStatus;byte busyRed =1;byte restModeWhite;byte goState;int x;int y;byte pb1State; // Firebyte pb2State; // say random commentbyte pb3State;byte randomPic;// Payload dari Master Turret Control (MTC)// int payload [] ={0, 1, 2 , 3 , 4 , 5 };// int payload [] ={x , y, pb1State, pb2State, pb3State, goState};int payload [6];/* Ini adalah peta "percakapan" untuk "Waktu Obrolan". * 0-99 =Ucapan Turret Merah * 100-199 =Ucapan Turret Putih * 200-299 =Ucapan Turret Biru * File di semua kartu SD disimpan sebagai 0-100. * Tambahkan 100 ke nomor file di sini untuk Putih, 200 untuk Biru. * File 204 akan menjadi menara BIRU, nomor file 0004. */ int chatSayings [] ={ 0, // Mulai jeda pada i =0, diikuti dengan "putaran"... 204, 164, 25, // 1 205, 127, 76, // 2 208, 162, 65, // 3 143, 230, 23, // 4 130, 41, 225, // 5 153, 31, 133, // 6 234, 49, 155, / / 7 229, 175, 74, // 8 231, 58, 226, // 9 161, 223, 59, // 10 227, 68, 236, // 11 136, 50, 224, // 12 34, 160 , 78, // 13 222, 42 // End};/* Ini adalah peta waktu turret MERAH dan PUTIH. Mereka berbagi ucapan. * Pengaturan waktu ini sesuai dengan waktu yang dibutuhkan * untuk memainkan ucapan individu, dalam milidetik. * Ubah ucapan di atas sesuai keinginan, tetapi jangan ubah pengaturan waktu ini. * Misalnya, i =2 akan memakan waktu 0,8 detik (NormalTimings[2]) * untuk memutar file chatSayings[2]. */int NormalTimings [] ={1000, // Mulai jeda pada i =0, diikuti oleh "putaran"...2600, 800, 2800, 900, 1700, 1600, 1300, 2500, 1400, 1900, // 1 - 101600, 2300, 800, 3000, 300, 100, 200, 0, 0, 300, // 11 - 20298000, 1300, 2600, 1300, 1400, 2100, 1900, 1600, 800, 1700, // 21 - 301100 , 1000, 1000, 2100, 1500, 1300, 1100, 800, 1200, 1000, // 31 - 402200, 1700, 1300, 1400, 1500, 1000, 2000, 500, 2700, 9000, // 41 - 501100, 1200 , 900, 2400, 1200, 1100, 2100, 2000, 2500, 1700, // 51 - 601100, 1000, 1100, 500, 1900, 0, 1300, 2100, 1700, 900, // 61 - 701100, 800, 1100 , 1700, 1100, 1100, 1500, 1500, 500, 900, // 71 - 802100 // 81};/* Ini adalah peta waktu turret BIRU. * Pengaturan waktu ini sesuai dengan waktu yang dibutuhkan * untuk memainkan ucapan individu, dalam hitungan detik. * Misalnya, i =2 akan memakan waktu 0,9 detik (DefectiveTimings [2]) * untuk memutar file chatSayings [2]. */int DefectiveTimings [] ={1000, // Mulai jeda pada i =0, diikuti oleh "putaran"...1700, 900, 2000, 600, 1100, 1800, 1900, 3000, 1500, 800, // 1 - 102100, 800, 1900, 900, 3200, 2700, 0, 0, 0, 2000, // 11 - 204400, 800, 3200, 900, 1400, 2000, 2100, 1200, 1300, 1000, // 21 - 301100 , 1400, 2100, 1000, 1600, 1000, 1200 // 31 - 40};///////////////////////////// ////////////////////////////////// //=======================PENGATURAN =================================///// ////////////////////////////////////////////////////////////////// //////////////pengaturan batal(){ secondarySerial.begin(9600);// Serial.begin(9600);// mp3.begin(); mp3.setVolume(22); Kawat.mulai(); SPI.mulai(); // Penyiapan radio radio.begin(); radio.setPALevel(RF24_PA_LOW); // setel radio ke daya rendah. Semua saling berdekatan radio.setDataRate(RF24_2MBPS); // Saya rasa ini bekerja paling baik dengan beberapa radio network.begin(70, this_node); //(saluran, alamat simpul) sensor_read(); pinMode(LED_LH_up, OUTPUT); pinMode(LED_LH_down, OUTPUT); pinMode(LED_CENTRE, OUTPUT); pinMode(LED_RH_up, OUTPUT); pinMode(LED_RH_down, OUTPUT); digitalWrite(LED_CENTRE, TINGGI); aktifkan_servos(); servo_wings.write(WINGopen); // buka sayap servo_pivot.write(parkPIVOT); // parkir pivot servo_pitch.write(parkPITCH); // park pitch randomWake =random(1, 3); mp3.playMp3FolderTrack(1); // mainkan penundaan komentar bangun(2000); servo_wings.write(WINGclose); // tutup sayap delay(1500); digitalWrite(LED_CENTRE, RENDAH); turn_off_servos(); busyRed =0;}//////////////////////////////////////////////////////////// ///////////////////////======================LOOP UTAMA =============================//////////////////////////// /////////////////////////////////////////////void loop( ){ while (sensor.readRangeSingleMillimeters()>triggerDistance) { //tidak ada di depan sensor, tidak melakukan apa-apa ReadNet(); WriteNet(); keluaran_sensor(); if (payload[5] ==1) { // Kondisi yang digunakan dengan MTC. Turret akan bekerja secara otomatis tanpa penundaan MTC (500); WriteNet(); Cara_Mia(); // Waktu opera!! } else if (payload[5] ==2) { delay(500); WriteNet(); Chatty_time(); // Waktu mengobrol!!} ReadNet(); } else if (payload[5] ==3) { delay(500); WriteNet(); Kontrol manual (); // Kontrol Manual } } if (sensor.readRangeSingleMillimeters()triggerDistance){ // membuka dan orang menjadi falseActivate(); // katakan "kemana kamu pergi?" komentar dan penundaan penutupan (2000); scanArea(); //melakukan pemindaian area } else { // pasti ada seseorang di sana - tembak!! melibatkan(); penundaan (2400); for (int j=0; j <=2; j++){ if (sensor.readRangeSingleMillimeters()=maxPIVOT) pivotCW =0; jika (posPIVOT <=minPIVOT) pivotCW =1; if (posPITCH>=maxPITCH) pitchCW =0; if (posPITCH <=minPITCH) pitchCW =1;}///////////////////////////////////////////////////// //////////////////////////////========================AKTIFKAN ==============================////////////// ////////////////////////////////////////////////////////////////// ////void activ(){ // buka sayap dan katakan sesuatu busyRed =1; BacaNet(); WriteNet(); keluaran_sensor(); digitalWrite(LED_CENTRE, TINGGI); //mata LED pada randomOpen =random(3, 6);// pilih komentar pembuka acak mp3.playMp3FolderTrack(randomOpen); // mainkan acak "Aku melihatmu" komentar servo_wings.write(WINGopen); // buka sayap output_sensor(); penundaan (3400);}///////////////////////////////////////////////////////////// ////////////////////////====================AKTIF SALAH ============================/////////////////////////////////// //////////////////////////////////////////void falseActivate(){ / / sibukMerah =1; BacaNet(); WriteNet(); keluaran_sensor(); randomFalse =random(6, 9);// pilih komentar pembuka acak mp3.playMp3FolderTrack(randomFalse); // mainkan acak "kemana kamu pergi?" comment delay (1800);}/////////////////////////////////////////////////////////////////////=======================SCAN AREA =============================/////////////////////////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int i =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage(); kembali; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println(); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print (" "); previousMillis3 =millis(); saya++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); unsigned long currentMillis =milis(); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

Suku cadang dan penutup khusus

Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

Skema

Schematic that I made for building the turret.

Proses manufaktur

  1. Kuning
  2. Guillotine
  3. Nisan
  4. Baju renang
  5. Silikon
  6. Vodka
  7. Korsel
  8. Sofa
  9. Besi
  10. Waktu Siklus Pemotongan Turret Endworking