Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Autonome Nerf Sentry-toren

Componenten en benodigdheden

OpenBuilds NEMA 17 stappenmotor
× 1
DFRobot stappenmotor met versnellingsbak
× 1
DFRobot stappenmotorstuurprogramma
× 1
DFRobot Pixy 2-camera
× 1
Arduino Mega 2560
× 1
Ultrasone sensor - HC-SR04 (algemeen)
× 1
Nerf Nitron Gun
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)
CNC-router

Apps en online services

Arduino IDE
Autodesk Fusion 360

Over dit project

Idee

Een paar jaar geleden zag ik een project waarin een semi-autonome geschutskoepel werd getoond die alleen kon schieten als hij eenmaal was gericht. Dat bracht me op het idee om een ​​Pixy 2-camera te gebruiken om doelen te verwerven en vervolgens het nerf-pistool automatisch te richten, dat vervolgens kon vergrendelen en helemaal alleen kon vuren.

De componenten

Voor dit project zou het pistool ogen nodig hebben, dus ik koos ervoor om de Pixy 2 te gebruiken vanwege de gemakkelijke interface met het moederbord. Toen had ik een microcontroller nodig, dus koos ik voor een Arduino Mega 2560 vanwege het aantal pinnen.

Omdat het pistool twee assen nodig heeft, gieren en stampen, heeft het twee stappenmotoren nodig. Daarom stuurde DFRobot me hun dubbele DRV8825-motorbesturingskaart.

CAD

Ik begon met het laden van Fusion 360 en het invoegen van een bijgevoegd canvas van het nerf-pistool. Toen heb ik van dat canvas een solide lichaam gemaakt. Nadat het pistool was ontworpen, maakte ik een platform met een paar op lagers gebaseerde steunen waarmee het pistool van links naar rechts kon draaien. Ik plaatste een stappenmotor naast het roterende platform om het aan te drijven.

Maar de grotere vraag is hoe je het pistool op en neer kunt laten gaan. Daarvoor was een lineair aandrijfsysteem nodig met één punt bevestigd aan het beweegbare blok en een ander punt aan de achterkant van het pistool. Een staaf zou de twee punten met elkaar verbinden, waardoor het pistool langs zijn centrale as kan draaien.

De onderdelen vervaardigen

Bijna alle onderdelen in mijn ontwerp zijn bedoeld om in 3D te worden afgedrukt, dus ik heb mijn twee printers gebruikt om ze te maken. Vervolgens heb ik het verplaatsbare platform gemaakt door eerst Fusion 360 te gebruiken om de benodigde gereedschapspaden voor mijn CNC-router te genereren, en vervolgens heb ik de schijf uit een stuk triplex gesneden.

Montage

Nadat alle onderdelen waren gemaakt, was het tijd om ze in elkaar te zetten. Ik begon met het verbinden van de lagersteunen met de roterende schijf. Vervolgens heb ik de lineaire pitch-assemblage samengesteld door de aluminium staven van 6 mm en de draadstang door de stukken te leiden.

Ten slotte heb ik het nerf-pistool zelf bevestigd met een stalen staaf en twee palen gemaakt van aluminium extrusies.

Programmeren

Nu het moeilijkste deel van het project:programmeren. Een machine voor het afvuren van projectielen is erg complex en de wiskunde erachter kan verwarrend zijn. Ik begon met het stap voor stap uitschrijven van het programmaverloop en de logica, met details over wat er zou gebeuren bij elke machinestatus. De verschillende toestanden gaan als volgt:

  • Doel verwerven
  • Plaats het pistool
  • Spoel de motoren op
  • Vuur met het pistool
  • Maak de motoren af

Om het doelwit te krijgen, moet je eerst de Pixy instellen om neonroze objecten als doelwit te volgen. Vervolgens beweegt het pistool totdat het doelwit in het midden van de Pixy staat, waar vervolgens de afstand van de geweerloop tot het doelwit wordt gemeten. Door deze afstand te gebruiken, kunnen de horizontale en verticale afstanden worden gevonden met behulp van enkele trigonometrische basisfuncties. Mijn code heeft een functie genaamd get_angle() die deze twee afstanden gebruikt om te berekenen hoeveel hoek er nodig is om dat doel te raken.

Het pistool beweegt dan naar deze positie en zet de motoren aan via een MOSFET. Nadat het vijf seconden heeft gespoeld, beweegt het vervolgens de servomotor om de trekker over te halen. De MOSFET schakelt dan de motor uit en dan gaat het nerf-kanon terug naar het zoeken naar doelen.

Plezier maken

Ik heb een neonroze indexkaart aan de muur gehangen om de nauwkeurigheid van het pistool te testen. Het deed het goed, omdat mijn programma de hoek voor de gemeten afstand kalibreert en aanpast. Hier is een video die laat zien hoe het pistool werkt:

Code

  • Schema
SchemaC/C++
Upload naar Arduino Mega
#include #include #include "BasicStepperDriver.h"#include #include //X is pitch, Y is yawconst int-pinnen [] ={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; dubbele snelheid =21.336; dubbele snelheid_kwadraat =455.225; float current_angle =0.0;float hyp_distance; //afstand van pistool tot doel in meters#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 200STE#_DEfine MOTORS_10 /17.7777 stappen / degreeBasicStepperDriver pitch_stepper(MOTOR_STEPS_X, pins[1], pins[0]);BasicStepperDriver yaw_stepper(MOTOR_STEPS_X, pins[4], pins[3]);Servo trigger;Pixy2I2C pixy;enum Status {ACQUIRE,OOL , FIRE, WIND_DOWN, RETURN};States state =ACQUIRE;void setup() {Serial.begin(115200); init_pins(); vertraging (1000); //home_pitch(); pixy.init(); Serial.println("Klaar...");}void loop() { switch(state){ case ACQUIRE:acquire_target(); staat =POSITIE; digitalWrite (laser_pin, HOOG); pauze; case POSITIE:Serial.println("positionering"); position_gun(); staat =SPOEL; pauze; case SPOOL:Serial.println ("spooling"); digitalWrite (spoel_pin, HOOG); vertraging (5000); staat =BRAND; pauze; geval BRAND:fire_gun(); staat =WIND_DOWN; pauze; case WIND_DOWN:Serial.println ("afbouwen"); digitalWrite(spool_pin,LOW); vertraging (2000); staat =RETOUR; digitalWrite (laser_pin, LAAG); staat =VERKRIJGEN; pauze; }}void fire_gun(){ Serial.println("Firing gun!"); trigger.write(108); vertraging (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; }Seriële.println(hyp_distance); x =cos (huidige_hoek) * hyp_distance; y =sin (huidige_hoek) * hyp_distance; float target_angle =get_angle(x,y); doelhoek /=100; Serial.println(target_angle); move_pitch (target_angle - huidige_angle); current_angle =target_angle;}void acquire_target(){ int x=0, y=0; lange stappen_taken=0; bool lock =onwaar; 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("Doel gezien op locatie X:");Serial.print(x);Serial.print(", Y:");Serial.println(y); if(x <=(X_MID - DEADZONE)){ //Als het te ver naar links is, beweeg het pistool dan naar links move_yaw(1); } else if(x>=(X_MID + DEADZONE)){ move_yaw(-1); } else if(y <=(Y_MID - DEADZONE)){ //te ver omhoog, verplaats het pistool naar boven pitch_stepper.move(33152); stappen_taken +=33152; } else if(y>=(Y_MID + DEADZONE)){ pitch_stepper.move(33152); stappen_taken +=33152; } anders{ slot =waar; Serial.print("Target vergrendeld op locatie X:");Serial.print(x);Serial.print(", Y:");Serial.println(y); Serial.print("Genomen stappen:");Serial.println(steps_taken); } } } current_angle =stappen_genomen / STP_PER_DEG_PITCH; Serial.print("Huidige hoek:");Serial.println(huidige_hoek);}void init_pins(){ pinMode(pins[2],OUTPUT); pinMode (pinnen [5], UITGANG); pinMode (limit_switch, INPUT_PULLUP); pinMode (laser_pin, UITGANG); pinMode(spool_pin, OUTPUT); pinMode(distance_echo, INPUT); pinMode (distance_trig, OUTPUT); digitalWrite (pinnen [2], LAAG); digitalWrite (pinnen [5], LAAG); digitalWrite (laser_pin, LAAG); 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 graden){ yaw_stepper.move(degrees*STP_PER_DEG_YAW*32);}void move_pitch(float graden){ current_angle +=graden; pitch_stepper.move(graden*STP_PER_DEG_PITCH);}float get_angle(float afstand, float hoogte){ float i =2 * hoogte * 455.225; float j =G * afstand * afstand; ik +=j; j =9,8 * ik; i =sqrt(pow(velocity_squared,2) - j); return atan((velocity_squared-i) / (G * distance))*(180/PI);}float ping(){ Serial.println("Getting distance..."); lange duur; digitalWrite(distance_trig, LOW); vertraging Microseconden (5); digitalWrite(distance_trig, HIGH); vertraging Microseconden (10); digitalWrite(distance_trig, LOW); duur =pulseIn(distance_echo, HIGH); retourduur / 2 / 29,1; //afstand in meters}void home_pitch(){Serial.println(digitalRead(limit_switch)); if(!digitalRead(limit_switch)){ //If switch is actief pitch_stepper.rotate(720); } while(digitalRead(limit_switch)){ //Serial.println(digitalRead(limit_switch)); pitch_stepper.move(-32); } pitch_stepper.rotate(2880*2);}

Aangepaste onderdelen en behuizingen

Thingiverse-opslagplaats
CAD-bestand op thingiverse.com

Schema's


Productieproces

  1. Stappenmotoren
  2. Geïntegreerde drivers vereenvoudigen het ontwerp van de stappenmotor
  3. Raspoulette-prototype
  4. Simple Pi Robot
  5. Bipolaire stappenmotorbibliotheek
  6. Swiper - Auto Tinder/Bumble Swiper
  7. Autonome Home Assistant-robot
  8. SmartWay
  9. Het grijze gebied tussen servo- en stappenmotoren
  10. Wat is een lineaire motor?
  11. Wat is een servomotor?