Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Torreta centinela Nerf autónoma

Componentes y suministros

Motor paso a paso OpenBuilds NEMA 17
× 1
Motor paso a paso DFRobot con caja de cambios
× 1
Controlador de motor paso a paso DFRobot
× 1
DFRobot Pixy 2 Cam
× 1
Arduino Mega 2560
× 1
Sensor ultrasónico - HC-SR04 (genérico)
× 1
Pistola Nerf Nitron
× 1

Herramientas y máquinas necesarias

Impresora 3D (genérica)
Soldador (genérico)
Enrutador CNC

Aplicaciones y servicios en línea

Arduino IDE
Autodesk Fusion 360

Acerca de este proyecto

Idea

Hace unos años, vi un proyecto que mostraba una torreta semiautónoma que podía disparar por sí sola una vez apuntada. Eso me dio la idea de usar una cámara Pixy 2 para adquirir objetivos y luego apuntar la pistola nerf automáticamente, que luego podría bloquear y disparar por sí sola.

Los componentes

Para este proyecto, la pistola necesitaría ojos, así que elegí usar Pixy 2 debido a la facilidad con la que puede interactuar con la placa base. Luego necesitaba un microcontrolador, así que elegí un Arduino Mega 2560 debido a la cantidad de pines que tiene.

Dado que la pistola necesita dos ejes, guiñada y cabeceo, requiere dos motores paso a paso. Por eso, DFRobot me envió su placa de controlador de motor dual DRV8825.

CAD

Comencé cargando Fusion 360 e insertando un lienzo adjunto de la pistola nerf. Luego creé un cuerpo sólido a partir de ese lienzo. Después de que se diseñó la pistola, hice una plataforma con algunos soportes basados ​​en cojinetes que permitirían que la pistola girara de izquierda a derecha. Coloqué un motor paso a paso junto a la plataforma giratoria para impulsarlo.

Pero la pregunta más importante es cómo hacer que el arma suba y baje. Para eso, se necesitaba un sistema de transmisión lineal con un punto unido al bloque móvil y otro punto en la parte posterior de la pistola. Una varilla conectaría los dos puntos, permitiendo que el arma pivote a lo largo de su eje central.

Fabricando las piezas

Casi todas las piezas de mi diseño están destinadas a ser impresas en 3D, así que utilicé mis dos impresoras para crearlas. Luego creé la plataforma móvil usando primero Fusion 360 para generar las trayectorias de herramientas necesarias para mi enrutador CNC, luego corté el disco de una hoja de madera contrachapada.

Ensamblaje

Una vez creadas todas las piezas, llegó el momento de montarlas. Comencé conectando los soportes de los rodamientos al disco giratorio. Luego armé el conjunto de paso lineal pasando las varillas de aluminio de 6 mm y la varilla roscada a través de las piezas.

Por último, adjunté la pistola nerf con una varilla de acero y dos postes hechos de extrusiones de aluminio.

Programación

Ahora, la parte más difícil del proyecto:la programación. Una máquina que dispara proyectiles es muy compleja y las matemáticas detrás de ella pueden ser confusas. Comencé escribiendo el flujo del programa y la lógica paso a paso, detallando lo que sucedería en cada estado de la máquina. Los diferentes estados son los siguientes:

  • Adquirir objetivo
  • Coloque el arma
  • Enrolle los motores
  • Dispara el arma
  • Apague los motores

Adquirir el objetivo implica configurar primero el Pixy para rastrear objetos de color rosa neón como objetivos. Luego, el arma se mueve hasta que el objetivo se centra en la vista del Pixy, donde se mide la distancia desde el cañón del arma al objetivo. Al usar esta distancia, las distancias horizontal y vertical se pueden encontrar usando algunas funciones trigonométricas básicas. Mi código tiene una función llamada get_angle () que usa estas dos distancias para calcular cuánto ángulo se necesita para golpear ese objetivo.

Luego, la pistola se mueve a esta posición y enciende los motores a través de un MOSFET. Después de que se ha enrollado durante cinco segundos, mueve el servomotor para apretar el gatillo. El MOSFET luego apaga el motor y luego la pistola nerf vuelve a buscar objetivos.

Divirtiéndose

Puse una ficha de color rosa neón en la pared para probar la precisión del arma. Funcionó bien, ya que mi programa calibra y ajusta el ángulo para la distancia medida. Aquí hay un video que demuestra el funcionamiento del arma:

Código

  • Esquema
Esquema C / C ++
Subir a Arduino Mega
 #include  #include  #include "BasicStepperDriver.h" #include  #include  // X es tono, Y es yawconst int pins [] ={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, distancia_trig =29, distancia_echo =30; doble velocidad =21.336; doble velocidad_cuadrada =455.225; flotar ángulo_corriente =0.0; hip_distancia flotante; // distancia del arma al objetivo en metros # definir X_MID 164 # definir Y_MID 150 # definir DEADZONE 15 # definir G 9.8 # definir STP_PER_DEG_YAW 3.333 # definir STP_PER_DEG_PITCH 184859 # definir MICROSTEPS 32 # definir RPM 120 # definir MOTOR_STEPS_Y 200 # definir MOTOR_1036 / PASOS /17.7777 pasos / gradoBasicStepperDriver pitch_stepper (MOTOR_STEPS_X, pines [1], pines [0]); BasicStepperDriver yaw_stepper (MOTOR_STEPS_X, pines [4], pines [3]); Disparador de servo; Pixy2I2C pixy; enumeración Estados de posición {ACQUIRE, , FUEGO, ABAJO_VIENTO, RETORNO}; Estados state =ADQUIRIR; configuración vacía () {Serial.begin (115200); init_pins (); retraso (1000); // home_pitch (); pixy.init (); Serial.println ("Listo ...");} bucle vacío () {interruptor (estado) {caso ADQUIRIR:adquirir_destino (); estado =POSICIÓN; digitalWrite (láser_pin, ALTO); descanso; POSICIÓN del caso:Serial.println ("posicionamiento"); position_gun (); estado =CARRETE; descanso; case SPOOL:Serial.println ("spooling"); digitalWrite (spool_pin, ALTO); retraso (5000); estado =FUEGO; descanso; caso FUEGO:fire_gun (); state =WIND_DOWN; descanso; case WIND_DOWN:Serial.println ("liquidación"); digitalWrite (spool_pin, BAJO); retraso (2000); estado =RETORNO; digitalWrite (láser_pin, BAJO); estado =ADQUIRIR; descanso; }} void fire_gun () {Serial.println ("¡Disparando arma!"); trigger.write (108); retraso (400); trigger.write (90); delay (2000);} void position_gun () {flotar x, y; hyp_distance =ping (); hyp_distance / =100; while (! hyp_distance) {hyp_distance =ping (); hyp_distance / =100; } Serial.println (hyp_distance); x =cos (ángulo_actual) * hyp_distance; y =sin (ángulo_actual) * hyp_distance; float target_angle =get_angle (x, y); ángulo_objetivo / =100; Serial.println (target_angle); paso_movimiento (ángulo_objetivo - ángulo_actual); ángulo_actual =ángulo_objetivo;} void adquirir_destino () {int x =0, y =0; pasos largos_ tomados =0; bool lock =falso; 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 ("Objetivo visto en la ubicación X:"); Serial.print (x); Serial.print (", Y:"); Serial.println (y); if (x <=(X_MID - DEADZONE)) {// Si está demasiado a la izquierda, mueva el arma a la izquierda move_yaw (1); } más si (x> =(X_MID + DEADZONE)) {move_yaw (-1); } else if (y <=(Y_MID - DEADZONE)) {// demasiado arriba, mueve el arma hacia arriba pitch_stepper.move (33152); pasos_ tomados + =33152; } más si (y> =(Y_MID + DEADZONE)) {paso_paso.move (33152); pasos_ tomados + =33152; } más {bloqueo =verdadero; Serial.print ("Objetivo bloqueado en la ubicación X:"); Serial.print (x); Serial.print (", Y:"); Serial.println (y); Serial.print ("Pasos seguidos:"); Serial.println (pasos_taken); }}} ángulo_actual =pasos_taken / STP_PER_DEG_PITCH; Serial.print ("Ángulo actual:"); Serial.println (ángulo_actual);} void init_pins () {pinMode (pines [2], SALIDA); pinMode (pines [5], SALIDA); pinMode (limit_switch, INPUT_PULLUP); pinMode (laser_pin, SALIDA); pinMode (spool_pin, SALIDA); pinMode (distancia_echo, ENTRADA); pinMode (distancia_trig, SALIDA); digitalWrite (pines [2], BAJO); digitalWrite (pines [5], BAJO); digitalWrite (láser_pin, BAJO); digitalWrite (spool_pin, BAJO); trigger.attach (servo_pin); pitch_stepper.begin (RPM, MICROSTEPS); yaw_stepper.begin (5, MICROPASOS); trigger.write (90);} void move_yaw (grados flotantes) {yaw_stepper.move (grados * STP_PER_DEG_YAW * 32);} void move_pitch (grados flotantes) {ángulo_actual + =grados; pitch_stepper.move (grados * STP_PER_DEG_PITCH);} float get_angle (distancia de flotación, altura de flotación) {flotar i =2 * altura * 455.225; flotar j =G * distancia * distancia; i + =j; j =9,8 * i; i =sqrt (pow (velocidad_cuadrada, 2) - j); return atan ((velocity_squared-i) / (G * distancia)) * (180 / PI);} float ping () {Serial.println ("Obteniendo distancia ..."); Larga duración; digitalWrite (distancia_trig, BAJA); delayMicroseconds (5); digitalWrite (distancia_trig, ALTA); delayMicroseconds (10); digitalWrite (distancia_trig, BAJA); duración =pulsoIn (distancia_echo, ALTO); duración de retorno / 2 / 29.1; // distancia en metros} void home_pitch () {Serial.println (digitalRead (limit_switch)); if (! digitalRead (limit_switch)) {// Si el interruptor está activo pitch_stepper.rotate (720); } while (digitalRead (limit_switch)) {//Serial.println(digitalRead(limit_switch)); pitch_stepper.move (-32); } pitch_stepper.rotate (2880 * 2);} 

Piezas y carcasas personalizadas

Depósito de Thingiverse
Archivo CAD en thingiverse.com

Esquemas


Proceso de manufactura

  1. Motores paso a paso
  2. Los controladores integrados facilitan el diseño del motor paso a paso
  3. Prototipo de Raspoulette
  4. Robot Pi simple
  5. Biblioteca de motores paso a paso bipolares
  6. Swiper - Auto Tinder / Bumble Swiper
  7. Robot asistente doméstico autónomo
  8. SmartWay
  9. La zona gris entre servomotores y motores paso a paso
  10. ¿Qué es un motor lineal?
  11. ¿Qué es un servomotor?