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

Turret Penjaga Nerf Otonom

Komponen dan persediaan

OpenBuilds NEMA 17 Motor Stepper
× 1
Motor Stepper DFRobot dengan Gearbox
× 1
Driver Motor Stepper DRobot
× 1
DFRobot Pixy 2 Cam
× 1
Arduino Mega 2560
× 1
Sensor Ultrasonik - HC-SR04 (Generik)
× 1
Nerf Nitron Gun
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
Besi solder (generik)
Router CNC

Aplikasi dan layanan online

Arduino IDE
Autodesk Fusion 360

Tentang proyek ini

Ide

Beberapa tahun yang lalu, saya melihat sebuah proyek yang memamerkan turret semi-otonom yang bisa menembak sendiri sekali diarahkan. Itu memberi saya ide untuk menggunakan kamera Pixy 2 untuk mendapatkan target dan kemudian mengarahkan pistol nerf secara otomatis, yang kemudian bisa mengunci dan menembak dengan sendirinya.

Komponen

Untuk proyek ini, pistol membutuhkan mata, jadi saya memilih untuk menggunakan Pixy 2 karena mudahnya berinteraksi dengan mainboard. Kemudian saya membutuhkan mikrokontroler, jadi saya memilih Arduino Mega 2560 karena jumlah pin yang dimilikinya.

Karena pistol membutuhkan dua sumbu, yaw dan pitch, itu membutuhkan dua motor stepper. Karena itu, DFRobot mengirimi saya papan driver motor DRV8825 ganda mereka.

CAD

Saya mulai dengan memuat Fusion 360 dan memasukkan kanvas pistol nerf yang terpasang. Kemudian saya membuat tubuh yang kokoh dari kanvas itu. Setelah pistol dirancang, saya membuat platform dengan beberapa penyangga berbasis bantalan yang memungkinkan pistol berputar dari kiri ke kanan. Saya menempatkan motor stepper di sebelah platform yang berputar untuk menggerakkannya.

Tapi pertanyaan yang lebih besar adalah bagaimana membuat pistol naik dan turun. Untuk itu, diperlukan sistem penggerak linier dengan satu titik menempel pada blok bergerak dan titik lain di belakang senjata. Sebuah batang akan menghubungkan dua titik, memungkinkan pistol berputar di sepanjang poros tengahnya.

Memproduksi Suku Cadang

Hampir semua bagian dalam desain saya dimaksudkan untuk dicetak 3D, jadi saya menggunakan dua printer saya untuk membuatnya. Kemudian saya membuat platform yang dapat dipindahkan dengan terlebih dahulu menggunakan Fusion 360 untuk menghasilkan jalur alat yang diperlukan untuk router CNC saya, lalu saya memotong disk dari selembar kayu lapis.

Perakitan

Setelah semua bagian dibuat, saatnya untuk merakitnya. Saya mulai dengan menghubungkan penyangga bantalan ke disk yang berputar. Kemudian saya mengumpulkan rakitan pitch linier dengan menjalankan batang aluminium 6mm dan batang berulir melalui potongan.

Terakhir, saya memasang pistol nerf itu sendiri dengan batang baja dan dua tiang yang terbuat dari aluminium ekstrusi.

Pemrograman

Sekarang untuk bagian tersulit dari proyek ini:pemrograman. Mesin penembakan proyektil sangat kompleks, dan matematika di baliknya bisa membingungkan. Saya mulai dengan menulis alur program dan logika selangkah demi selangkah, merinci apa yang akan terjadi pada setiap kondisi mesin. Status yang berbeda adalah sebagai berikut:

  • Dapatkan target
  • Posisikan pistol
  • Kumpulkan motornya
  • Tembakan pistolnya
  • Matikan motor

Memperoleh target melibatkan penyiapan Pixy terlebih dahulu untuk melacak objek neon pink sebagai target. Kemudian pistol bergerak hingga target berada di tengah pandangan Pixy, di mana jaraknya dari laras senapan ke target kemudian diukur. Dengan menggunakan jarak ini, jarak horizontal dan vertikal dapat ditemukan dengan menggunakan beberapa fungsi trigonometri dasar. Kode saya memiliki fungsi yang disebut get_angle() yang menggunakan dua jarak ini untuk menghitung berapa banyak sudut yang diperlukan untuk mencapai target itu.

Pistol kemudian bergerak ke posisi ini dan menyalakan motor melalui MOSFET. Setelah digulung selama lima detik kemudian menggerakkan motor servo untuk menarik pelatuk. MOSFET kemudian mematikan motor dan kemudian nerf gun kembali mencari target.

Bersenang-senang

Saya meletakkan kartu indeks merah muda neon ke dinding untuk menguji akurasi pistol. Itu berhasil dengan baik, karena program saya mengkalibrasi dan menyesuaikan sudut untuk jarak yang diukur. Berikut adalah video yang menunjukkan cara kerja senjata:

Kode

  • Skematis
SkematisC/C++
Unggah ke Arduino Mega
#include #include #include "BasicStepperDriver.h"#include #include //X adalah pitch, Y adalah yawconst int pin[] ={6,7,8,5,4,12}; //MX STEP, DIR, EN, MY STEP, DIR, ENconst int limit_switch =26, laser_pin =11, spool_pin =10, servo_pin =13, distance_trig =29, distance_echo =30;kecepatan ganda =21.336;kecepatan ganda_kuadrat =455.225; float_sudut arus =0,0; jarak_hip mengambang; //jarak dari pistol ke target dalam meter# tentukan X_MID 164# tentukan Y_MID 150# tentukan DEADZONE 15# tentukan G 9.8# tentukan STP_PER_DEG_YAW 3.333 # tentukan STP_PER_DEG_PITCH 184859# tentukan MICROSTEPS 32 # tentukan RPM_STEPS_TORX 120_STEPS_STEPS /17.7777 langkah / degreeBasicStepperDriver pitch_stepper(MOTOR_STEPS_X, pin[1], pins[0]);BasicStepperDriver yaw_stepper(MOTOR_STEPS_X, pins[4], pins[3]);Pemicu servo;Pixy2I2C pixy;enum Serikat { ACQUIRE, POSISI , FIRE, WIND_DOWN, RETURN};Status status =ACQUIRE;pengaturan batal() { Serial.begin(115200); init_pin(); penundaan (1000); //rumah_pitch(); pixy.init(); Serial.println("Siap...");}void loop() { switch(state){ case ACQUIRE:acquire_target(); negara =POSISI; digitalWrite(laser_pin,TINGGI); merusak; POSISI kasus:Serial.println("posisi"); posisi_gun(); negara =SPOOL; merusak; kasus SPOOL:Serial.println("spooling"); digitalWrite(spool_pin,HIGH); penundaan(5000); negara =KEBAKARAN; merusak; kasus KEBAKARAN:fire_gun(); status =WIND_DOWN; merusak; kasus WIND_DOWN:Serial.println("berhenti"); digitalWrite(spool_pin,RENDAH); penundaan(2000); negara =KEMBALI; digitalWrite(laser_pin,RENDAH); negara =ACQUIRE; merusak; }}void fire_gun(){ Serial.println("Menembakkan pistol!"); trigger.write(108); penundaan (400); trigger.write(90); delay(2000);}void position_gun(){ float x, y; jarak_hip =ping(); hyp_distance /=100; while(!hyp_distance){ hyp_distance =ping(); hyp_distance /=100; }Serial.println(hyp_distance); x =cos(sudut_arus) * jarak_hip; y =sin(sudut_arus) * jarak_hip; float target_angle =get_angle(x,y); target_angle /=100; Serial.println(target_angle); move_pitch(sudut_target - sudut_saat ini); current_angle =target_angle;}kosongkan akuisisi_target(){ int x=0, y=0; langkah panjang_diambil=0; kunci bool =salah; while(!lock){ pixy.ccc.getBlocks(); if(pixy.ccc.numBlocks){ x =pixy.ccc.blocks[0].m_x; y =pixy.ccc.blocks[0].m_y; Serial.print("Target terlihat di lokasi X:");Serial.print(x);Serial.print(", Y:");Serial.println(y); if(x <=(X_MID - DEADZONE)){ //Jika terlalu kiri, pindahkan pistol ke kiri move_yaw(1); } else if(x>=(X_MID + DEADZONE)){ move_yaw(-1); } else if(y <=(Y_MID - DEADZONE)){ //terlalu jauh ke atas, pindahkan pistol ke atas pitch_stepper.move(33152); langkah_diambil +=33152; } else if(y>=(Y_MID + DEADZONE)){ pitch_stepper.move(33152); langkah_diambil +=33152; } lain{ kunci =benar; Serial.print("Target terkunci di lokasi X:");Serial.print(x);Serial.print(", Y:");Serial.println(y); Serial.print("Langkah yang diambil:");Serial.println(langkah_diambil); } } } current_angle =langkah_diambil / STP_PER_DEG_PITCH; Serial.print("Sudut saat ini:");Serial.println(current_angle);}void init_pins(){ pinMode(pin[2],OUTPUT); pinMode(pin[5],OUTPUT); pinMode(limit_switch, INPUT_PULLUP); pinMode(laser_pin, OUTPUT); pinMode(spool_pin, OUTPUT); pinMode(jarak_gema, INPUT); pinMode(distance_trig, OUTPUT); digitalWrite(pin[2],RENDAH); digitalWrite(pin[5],RENDAH); digitalWrite(laser_pin,RENDAH); digitalWrite(spool_pin,RENDAH); trigger.attach(servo_pin); pitch_stepper.begin(RPM, MICROSTEPS); yaw_stepper.begin(5, MICROSTEPS); trigger.write(90);}void move_yaw(float derajat){ yaw_stepper.move(degrees*STP_PER_DEG_YAW*32);}void move_pitch(float derajat){ current_angle +=derajat; pitch_stepper.move(derajat*STP_PER_DEG_PITCH);}float get_angle(jarak float, tinggi float){ float i =2 * tinggi * 455.225; float j =G * jarak * jarak; saya +=j; j =9,8 * saya; i =kuadrat(pow(kuadrat_kecepatan,2) - j); return atan((velocity_squared-i) / (G * jarak))*(180/PI);}float ping(){ Serial.println("Mendapatkan jarak..."); durasi panjang; digitalWrite(distance_trig, RENDAH); delayMicroseconds(5); digitalWrite(distance_trig, TINGGI); delayMicroseconds(10); digitalWrite(distance_trig, RENDAH); durasi =pulseIn(jarak_gema, TINGGI); durasi pengembalian / 2 / 29.1; //jarak dalam meter}void home_pitch(){ Serial.println(digitalRead(limit_switch)); if(!digitalRead(limit_switch)){ //Jika sakelar aktif pitch_stepper.rotate(720); } while(digitalRead(limit_switch)){ //Serial.println(digitalRead(limit_switch)); pitch_stepper.move(-32); } pitch_stepper.rotate(2880*2);}

Suku cadang dan penutup khusus

Repositori Thingiverse
File CAD di thingiverse.com

Skema


Proses manufaktur

  1. Motor Stepper
  2. Driver terintegrasi memudahkan desain motor stepper
  3. Prototipe Raspoulette
  4. Robot Pi Sederhana
  5. Perpustakaan Motor Stepper Bipolar
  6. Swiper - Auto Tinder/Bumble Swiper
  7. Robot Asisten Rumah Otonom
  8. Area Abu-abu Antara Motor Servo dan Stepper
  9. Apa itu Motor Linier?
  10. Apa itu Motor Servo?