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

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Komponen dan perlengkapan

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
OpenBuilds NEMA 17 Stepper Motor
× 1
DFRobot Stepper Motor with Gearbox
× 1
DFRobot Stepper Motor Driver
× 1
DFRobot Pixy 2 Cam
× 1
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Arduino Mega 2560
× 1
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Ultrasonic Sensor - HC-SR04 (Generic)
× 1
Nerf Nitron Gun
× 1

Alat dan mesin yang diperlukan

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
3D Printer (generic)
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Soldering iron (generic)
CNC Router

Aplikasi dan layanan online

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Arduino IDE
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Autodesk Fusion 360

Tentang proyek ini

Ide

Beberapa tahun lalu, saya melihat proyek yang menampilkan menara semi-otonom yang dapat menembak sendiri setelah diarahkan. Itu memberikan ide kepada saya untuk menggunakan kamera Pixy 2 untuk mendapatkan target dan kemudian mengarahkan senapan nerf secara otomatis, yang kemudian bisa mengunci dan menembak semua sendiri.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Komponen

Untuk proyek ini, senapan akan perlu mata, jadi saya memilih untuk menggunakan Pixy 2 karena cara mudahnya berinterface dengan papan utama. Kemudian saya membutuhkan mikrokontroler, jadi saya memilih Arduino Mega 2560 karena banyak pin yang dimilikinya.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Karena senapan membutuhkan dua sumbu, yaw dan pitch, ia membutuhkan dua motor stepper. Karena itu, DFRobot mengirimkan papan pengemudi motor dual DRV8825 kepada saya.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

CAD

Saya memulai dengan memuat Fusion 360 dan memasukkan kanvas terlampir dari senapan nerf. Kemudian saya membuat tubuh padat dari kanvas tersebut. Setelah senapan dirancang, saya membuat platform dengan beberapa penopang berbearing yang akan memungkinkan senapan berputar kiri ke kanan. Saya menempatkan motor stepper di samping platform berputar untuk mendorongnya.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Namun pertanyaan yang lebih besar adalah bagaimana membuat senapan membesar dan mengecil. Untuk itu, sistem drive linear dengan satu titik yang terlekat pada blok yang dapat dipindahkan dan titik lain di belakang senapan diperlukan. Sebuah batang akan menghubungkan kedua titik, memungkinkan senapan berputar di sekitar sumbu pusatnya.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Pembuatan Bagian

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 pertama menggunakan Fusion 360 untuk menghasilkan jalur perkakas yang diperlukan untuk router CNC saya, kemudian saya memotong cakram dari lembar plywood.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Rangkaian

Setelah semua bagian telah dibuat, saatnya untuk merakitnya. Saya memulai dengan menghubungkan penopang bearing ke cakram berputar. Kemudian saya merakit rangkaian pitch linear dengan menjalankan batang aluminium 6mm dan batang berserut melalui potongan.

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino
Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

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

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Pemrograman

Sekarang untuk bagian paling sulit dari proyek: pemrograman. Mesin peluncuran proyektil sangat kompleks, dan matematika di baliknya dapat membingungkan. Saya memulai dengan menulis alur dan logika program langkah demi langkah, rinci apa yang akan terjadi pada setiap status mesin. Status yang berbeda adalah sebagai berikut:

  • Acquire target
  • Position the gun
  • Spool up the motors
  • Fire the gun
  • Wind down the motors

Mendapatkan target melibatkan pertama mengatur Pixy untuk melacak objek neon pink sebagai target. Kemudian senapan bergerak hingga target berada di tengah pandangan Pixy, di mana jarak dari selang 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 seberapa besar sudut yang diperlukan untuk memangsa target itu.

Kemudian senapan bergerak ke posisi ini dan menyala motor melalui MOSFET. Setelah motor berputar selama lima detik, ia kemudian menggerakkan servo motor untuk menarik pemicu. MOSFET kemudian mematikan motor dan kemudian senapan nerf kembali mencari target.

Bersenang-senang

Saya melempar kertas indeks neon pink ke dinding untuk menguji akurasi senapan. Ini berhasil, karena program saya mengkalibrasi dan menyesuaikan sudut untuk jarak yang diukur. Berikut adalah video yang menunjukkan senapan bekerja:

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Kode

  • Schematic
SchematicC/C++
#include <math.h> #include <Arduino.h> #include "BasicStepperDriver.h" #include <Servo.h> #include <Pixy2I2C.h> //X adalah pitch, Y adalah yaw const int pins[] = {6,7,8,5,4,12}; //MX STEP, DIR, EN, MY STEP, DIR, EN const int limit_switch = 26, laser_pin = 11, spool_pin = 10, servo_pin = 13, distance_trig = 29, distance_echo = 30; double velocity = 21.336; double velocity_squared = 455.225; float current_angle = 0.0; float hyp_distance; //jarak dari senapan ke target dalam meter #define X_MID 164 #define Y_MID 150 #define DEADZONE 15 #define G 9.8 #define STP_PER_DEG_YAW 3.333 #define STP_PER_DEG_PITCH 184859 #define MICROSTEPS 32 #define RPM 120 #define MOTOR_STEPS_Y 200 #define MOTOR_STEPS_X 1036 //17.7777 steps / degree BasicStepperDriver pitch_stepper(MOTOR_STEPS_X, pins[1], pins[0]); BasicStepperDriver yaw_stepper(MOTOR_STEPS_X, pins[4], pins[3]); Servo trigger; Pixy2I2C pixy; enum States { ACQUIRE, POSITION, SPOOL, FIRE, WIND_DOWN, RETURN }; States state = ACQUIRE; void setup() { Serial.begin(115200); init_pins(); delay(1000); pixy.init(); Serial.println("Ready..."); } void loop() { switch(state){ case ACQUIRE: acquire_target(); state = POSITION; digitalWrite(laser_pin,HIGH); break; case POSITION: Serial.println("positioning"); position_gun(); state = SPOOL; break; case SPOOL: Serial.println("spooling"); digitalWrite(spool_pin,HIGH); delay(5000); state = FIRE; break; case FIRE: fire_gun(); state = WIND_DOWN; break; case WIND_DOWN: Serial.println("winding down"); digitalWrite(spool_pin,LOW); delay(2000); state = RETURN; digitalWrite(laser_pin,LOW); state = ACQUIRE; break; } } void fire_gun(){ Serial.println("Firing gun!"); trigger.write(108); delay(400); trigger.write(90); delay(2000); } void position_gun(){ float x, y; hyp_distance = ping(); hyp_distance /= 100; while(!hyp_distance){ hyp_distance = ping(); hyp_distance /= 100; }Serial.println(hyp_distance); x = cos(current_angle) * hyp_distance; y = sin(current_angle) * hyp_distance; float target_angle = get_angle(x,y); target_angle /= 100; Serial.println(target_angle); move_pitch(target_angle - current_angle); current_angle = target_angle; } void acquire_target(){ int x=0, y=0; long steps_taken=0; bool lock = false; 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 seen at location X: ");Serial.print(x);Serial.print(", Y: ");Serial.println(y); if(x <= (X_MID - DEADZONE)){ move_yaw(1); } else if(x >= (X_MID + DEADZONE)){ move_yaw(-1); } else if(y <= (Y_MID - DEADZONE)){ pitch_stepper.move(33152); steps_taken += 33152; } else if(y >= (Y_MID + DEADZONE)){ pitch_stepper.move(33152); steps_taken += 33152; } else{ lock = true; Serial.print("Target locked at location X: ");Serial.print(x);Serial.print(", Y: ");Serial.println(y); Serial.print("Steps taken: ");Serial.println(steps_taken); } } } current_angle = steps_taken / STP_PER_DEG_PITCH; Serial.print("Current angle: ");Serial.println(current_angle); } void init_pins(){ pinMode(pins[2],OUTPUT); pinMode(pins[5],OUTPUT); pinMode(limit_switch, INPUT_PULLUP); pinMode(laser_pin, OUTPUT); pinMode(spool_pin, OUTPUT); pinMode(distance_echo, INPUT); pinMode(distance_trig, OUTPUT); digitalWrite(pins[2],LOW); digitalWrite(pins[5],LOW); digitalWrite(laser_pin,LOW); digitalWrite(spool_pin,LOW); trigger.attach(servo_pin); pitch_stepper.begin(RPM, MICROSTEPS); yaw_stepper.begin(5, MICROSTEPS); trigger.write(90); } void move_yaw(float degrees){ yaw_stepper.move(degrees*STP_PER_DEG_YAW*32); } void move_pitch(float degrees){ current_angle += degrees; pitch_stepper.move(degrees*STP_PER_DEG_PITCH); } float get_angle(float distance, float height){ float i = 2 * height * 455.225; float j = G * distance * distance; i += j; j = 9.8 * i; i = sqrt(pow(velocity_squared,2) - j); return atan((velocity_squared-i) / (G * distance))*(180/PI); } float ping(){ Serial.println("Getting distance..."); long duration; digitalWrite(distance_trig, LOW); delayMicroseconds(5); digitalWrite(distance_trig, HIGH); delayMicroseconds(10); digitalWrite(distance_trig, LOW); duration = pulseIn(distance_echo, HIGH); return duration / 2 / 29.1; //jarak dalam meter } void home_pitch(){ Serial.println(digitalRead(limit_switch)); if(!digitalRead(limit_switch)){ pitch_stepper.rotate(720); } while(digitalRead(limit_switch)){ pitch_stepper.move(-32); } pitch_stepper.rotate(2880*2); } 

Bagian kustom dan penutup

Thingiverse Repository

CAD file on thingiverse.com

Skematik

Bendera Nerf Otonom DIY – Bangun Senapan Nerf Cerdas dengan Motor Stepper, Kamera, dan Arduino

Proses manufaktur

  1. Motor Stepper: Jenis, Karakteristik, dan Aplikasi Praktis
  2. Driver Terintegrasi Sederhanakan Desain Stepper Motor Daya Tinggi
  3. Raspoulette: Prototipe Sistem Pintu Kandang Otonom Berdaya Surya
  4. Simple Pi Robot – Membangun Rover Otonom 2‑WD dengan Raspberry Pi
  5. Library Lengkap Motor Stepper Bipolar untuk Arduino
  6. Swiper Otomatis Tinder & Bumble Menggunakan Arduino UNO dan Stepper Motor
  7. Bangun Robot Asisten Rumah Otonom: Daftar Lengkap Komponen & Panduan Pengaturan
  8. Servo vs Motor Stepper: Menerangkan Zona Abu-Abu Modern
  9. Memahami Motor Linier: Dari Energi Listrik hingga Gerak Linier Presisi
  10. Motor Servo: Cara Kerja dan Mengapa Penting