Tabla de contenido:

Arduino Base Pick and Place Robot: 8 pasos
Arduino Base Pick and Place Robot: 8 pasos

Video: Arduino Base Pick and Place Robot: 8 pasos

Video: Arduino Base Pick and Place Robot: 8 pasos
Video: Robotic Arm assembly. 3D printed Robot arm. #engineering #actuators #robot #roboticarm #robotics 2024, Noviembre
Anonim
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot
Arduino Base Pick and Place Robot

Hice un brazo robótico industrial súper barato (menos de 1000 dólares) para permitir a los estudiantes piratear robótica a mayor escala y permitir que pequeñas producciones locales utilicen robots en sus procesos sin romper el banco. Es fácil de construir y hacer que el grupo de edad sea de personas de 15 a 50 años.

Paso 1: Requisitos de los componentes

Requisito de componentes
Requisito de componentes
Requisito de componentes
Requisito de componentes
Requisito de componentes
Requisito de componentes
Requisito de componentes
Requisito de componentes

1. Arduino + Shield + Pines + Cables

2. Controlador de motor: dm860A (Ebay)

3. Motor paso a paso: 34hs5435c-37b2 (Ebay)

4. Pernos M8x45 + 60 + 70 y pernos M8.

5. Madera contrachapada de 12 mm.

6. Nylon de 5 mm.

7. Arandelas ciegas de 8 mm.

8. Tornillos para madera 4.5x40mm.

9. M3 Counter hundido, 10. fuente de alimentación de 12v

11.controlador de servomotor arduino

Paso 2: Descarga Gui

zapmaker.org/projects/grbl-controller-3-0/

github.com/grbl/grbl/wiki/Using-Grbl

Paso 3: Conexión

Conexión
Conexión
Conexión
Conexión
Conexión
Conexión

Conectar los cables que se dan en la imagen es una mayor comprensión para usted.

Necesitamos conectar el controlador del motor a Arduino y otros conectores que requiera su robot.

Paso 4: cargue el firmware y verifique el resultado del código en el tablero de Arduino

Instalación del firmware en Arduino - GRBL:

github.com/grbl/grbl/wiki/Compiling-Grbl

Nota: Puede tener un conflicto al compilar en Arduino. Elimine todas las demás bibliotecas de la carpeta de su biblioteca (../documents/Arduino/libraries).

Configuración de firmware

Establezca la habilitación en un tiempo de espera más reciente. Utilice una conexión en serie y escriba:

$1=255

Establecer inicio:

$22=1

Recuerde configurar el serial en baudios: 115200

Códigos G útiles

Establecer el punto cero para el robot:

G10 L2 Xnnn Ynnn Znnn

Utilice el punto cero:

G54

Inicialización típica para centrar el robot:

G10 L2 X1.5 Y1.2 Z1.1

G54

Mueva el robot a la posición rápidamente:

G0 Xnnn Ynnn Znnn

Ejemplo:

G0 X10.0 Y3.1 Z4.2 (regreso)

Mueva el robot a la posición a una velocidad específica:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (regreso)

F debe estar entre 10 (lento) y 600 (rápido)

Unidades predeterminadas para X, Y y Z

Cuando se utilizan los ajustes predeterminados de pasos / unidades (250 pasos / unidad) para GRBL y

accionamiento paso a paso configurado para 800 pasos / rev, las siguientes unidades se aplican a todos los ejes:

+ - 32 unidades = + - 180 grados

Ejemplo de código de procesamiento:

Este código puede comunicarse directamente con Arduino GRBL.

github.com/damellis/gctrl

Recuerde configurar el serial en baudios: 115200

Codigo uoload en ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

procesamiento de importación.serie. *;

Puerto serie = nulo;

// seleccione y modifique la línea apropiada para su sistema operativo

// dejar como nulo para usar el puerto interactivo (presione 'p' en el programa)

String portname = null;

// String portname = Serial.list () [0]; // Mac OS X

// String portname = "/ dev / ttyUSB0"; // Linux

// String portname = "COM6"; // Ventanas

flujo booleano = falso;

velocidad de flotación = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

if (portname == null) return;

si (puerto! = nulo) puerto.stop ();

puerto = nueva serie (este, nombre de puerto, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

Resultado de cadena = (Cadena) JOptionPane.showInputDialog (esto, "Seleccione el puerto serie que corresponda a su placa Arduino.", "Seleccionar puerto serie", JOptionPane. PLAIN_MESSAGE, nulo, Serial.list (), 0);

if (resultado! = nulo) {

portname = resultado;

openSerialPort ();

}

}

configuración vacía ()

{

tamaño (500, 250);

openSerialPort ();

}

vacío dibujar ()

{

fondo (0);

llenar (255);

int y = 24, dy = 12;

text ("INSTRUCCIONES", 12, y); y + = dy;

text ("p: seleccionar puerto serie", 12, y); y + = dy;

text ("1: establezca la velocidad en 0,001 pulgadas (1 mil) por trote", 12, y); y + = dy;

text ("2: establece la velocidad en 0.010 pulgadas (10 mil) por trote", 12, y); y + = dy;

text ("3: establezca la velocidad en 0,100 pulgadas (100 mil) por trote", 12, y); y + = dy;

text ("teclas de flecha: jog en el plano x-y", 12, y); y + = dy;

texto ("página arriba y página abajo: avance en el eje z", 12, y); y + = dy;

text ("$: mostrar configuración de grbl", 12, y); y + = dy;

text ("h: ir a casa", 12, y); y + = dy;

text ("0: máquina cero (establecer inicio en la ubicación actual)", 12, y); y + = dy;

text ("g: transmitir un archivo de código g", 12, y); y + = dy;

text ("x: detener la transmisión de código g (esto NO es inmediato)", 12, y); y + = dy;

y = altura - dy;

text ("velocidad de jog actual:" + velocidad + "pulgadas por paso", 12, y); y - = dy;

text ("puerto serie actual:" + nombre de puerto, 12, y); y - = dy;

}

anular tecla presionada ()

{

si (clave == '1') velocidad = 0.001;

if (clave == '2') velocidad = 0.01;

if (clave == '3') velocidad = 0.1;

if (! streaming) {

if (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + velocidad + "Y0.000 Z0.000 / n");

if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + velocidad + "Y0.000 Z0.000 / n");

if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + velocidad + "Z0.000 / n");

if (keyCode == DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y-" + velocidad + "Z0.000 / n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + velocidad + "\ n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + velocidad + "\ n");

// if (clave == 'h') port.write ("G90 / nG20 / nG00 X0.000 Y0.000 Z0.000 / n");

if (clave == 'v') port.write ("$ 0 = 75 / n $ 1 = 74 / n $ 2 = 75 / n");

// if (clave == 'v') port.write ("$ 0 = 100 / n $ 1 = 74 / n $ 2 = 75 / n");

if (clave == 's') port.write ("$ 3 = 10 / n");

if (clave == 'e') port.write ("$ 16 = 1 / n");

if (clave == 'd') port.write ("$ 16 = 0 / n");

if (clave == '0') openSerialPort ();

if (clave == 'p') selectSerialPort ();

if (clave == '$') port.write ("$$ / n");

if (clave == 'h') port.write ("$ H / n");

}

if (! streaming && key == 'g') {

gcode = null; i = 0;

Archivo archivo = nulo;

println ("Cargando archivo …");

selectInput ("Seleccionar un archivo para procesar:", "archivoSeleccionado", archivo);

}

if (clave == 'x') transmisión = falso;

}

void fileSelected (selección de archivo) {

si (selección == nulo) {

println ("La ventana se cerró o el usuario presionó cancelar");

} demás {

println ("Usuario seleccionado" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

streaming = verdadero;

Arroyo();

}

}

flujo vacío ()

{

if (! streaming) return;

while (verdadero) {

if (i == gcode.length) {

streaming = falso;

regreso;

}

if (gcode .trim (). length () == 0) i ++;

más romper;

}

println (gcode );

port.write (gcode + '\ n');

i ++;

}

void serialEvent (Serial p)

{

Cadena s = p.readStringUntil ('\ n');

println (s.trim ());

if (s.trim (). startsWith ("ok")) stream ();

if (s.trim (). startsWith ("error")) stream (); // XXX: ¿de verdad?

}

Paso 5: Diseñe e imprima todas las piezas en una hoja de madera contrachapada

Diseñe e imprima todas las piezas en hoja de madera contrachapada
Diseñe e imprima todas las piezas en hoja de madera contrachapada

Descargue la pieza y el diseño del robot en AutoCAD e imprima en la hoja de madera contrachapada de 12 mm y la parte de acabado y diseño. Si alguien necesita un archivo CAD, por favor deje el comentario en el cuadro de la sección de comentarios, lo enviaré directamente.

Paso 6: Montaje

Montaje
Montaje
Montaje
Montaje

Reúna toda la pieza y colóquela en la secuencia de la imagen que se da y siga el diagrama de la imagen.

Paso 7: Configurar los ajustes de GBRL

Configuración que ha demostrado funcionar en nuestros robots.

$ 0 = 10 (pulso de paso, usec) $ 1 = 255 (retardo de inactividad de paso, mseg) $ 2 = 7 (máscara de inversión de puerto de paso: 00000111) $ 3 = 7 (máscara de inversión de puerto de dirección: 00000111) $ 4 = 0 (inversión de habilitación de paso, bool) $ 5 = 0 (pines de límite invertidos, bool) $ 6 = 1 (pines de sonda invertidos, bool) $ 10 = 3 (máscara de informe de estado: 00000011) $ 11 = 0.020 (desviación de unión, mm) $ 12 = 0.002 (tolerancia de arco, mm) $ 13 = 0 (reportar pulgadas, bool) $ 20 = 0 (límites suaves, bool) $ 21 = 0 (límites estrictos, bool) $ 22 = 1 (ciclo de referencia, bool) $ 23 = 0 (máscara invertida de dirección de referencia: 00000000) $ 24 = 100.000 (avance de referencia, mm / min) $ 25 = 500.000 (búsqueda de referencia, mm / min) $ 26 = 250 (antirrebote de referencia, mseg) $ 27 = 1.000 (retirada de referencia, mm) $ 100 = 250.000 (x, paso / mm) $ 101 = 250.000 (y, paso / mm) $ 102 = 250.000 (z, paso / mm) $ 110 = 500.000 (x tasa máxima, mm / min) $ 111 = 500.000 (y tasa máxima, mm / min) $ 112 = 500.000 (z tasa máxima, mm / min) $ 120 = 10.000 (x acel, mm / seg ^ 2) $ 121 = 10.000 (y acel, mm / seg ^ 2) $ 122 = 10.000 (z acel, mm / seg ^ 2) $ 130 = 200.000 (x recorrido máximo, mm) $ 131 = 200.000 (y recorrido máximo, mm) $ 132 = 200.000 (z recorrido máximo, mm)

Paso 8: cargue el código final y verifique el resultado virtual en el panel de control del software Arduino Uno

// Unidades: CM

float b_height = 0;

flotador a1 = 92;

flotador a2 = 86;

flotar snude_len = 20;

booleano doZ = falso;

float base_angle; // = 0;

flotar arm1_angle; // = 0;

flotar arm2_angle; // = 0;

flotar bx = 60; // = 25;

flotar por = 60; // = 0;

flotar bz = 60; // = 25;

flotar x = 60;

flotar y = 60;

flotador z = 60;

flotar q;

flotar c;

flotador V1;

flotar V2;

flotar V3;

flotar V4;

flotar V5;

configuración vacía () {

tamaño (700, 700, P3D);

cam = new PeasyCam (esto, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

vacío dibujar () {

// ligninger:

y = (mouseX - ancho / 2) * (- 1);

x = (mouseY - altura / 2) * (- 1);

bz = z;

por = y;

bx = x;

flotar y3 = sqrt (bx * bx + por * por);

c = raíz cuadrada (y3 * y3 + bz * bz);

V1 = acos ((a2 * a2 + a1 * a1-c * c) / (2 * a2 * a1));

V2 = acos ((c * c + a1 * a1-a2 * a2) / (2 * c * a1));

V3 = acos ((y3 * y3 + c * c-bz * bz) / (2 * y3 * c));

q = V2 + V3;

brazo1_angulo = q;

V4 = radianes (90,0) - q;

V5 = radianes (180) - V4 - radianes (90);

arm2_angle = radianes (180.0) - (V5 + V1);

ángulo_base = grados (atan2 (bx, por));

arm1_angle = grados (arm1_angle);

arm2_angle = grados (arm2_angle);

// println (por, bz);

// ángulo_arma1 = 90;

// brazo2_angulo = 45;

/*

arm2_angle = 23;

brazo1_angulo = 23;

arm2_angle = 23;

*/

// interactivo:

// si (doZ)

//

// {

// ángulo_base = ángulo_base + mouseX-pmouseX;

// } demás

// {

// ángulo_arma1 = ángulo_arma1 + pmouseX-mouseX;

// }

//

// ángulo_arma2 = ángulo_arma2 + mouseY-pmouseY;

dibujar_robot (ángulo_base, - (brazo1_ángulo-90), brazo2_angulo + 90 - (- (brazo1_ángulo-90)));

// println (base_angle + "," + arm1_angle + "," + arm2_angle);

}

void draw_robot (float base_angle, float arm1_angle, float arm2_angle)

{

rotateX (1,2);

rotateZ (-1,2);

fondo (0);

luces();

pushMatrix ();

// BASE

llenar (150, 150, 150);

esquina_caja (50, 50, altura_b, 0);

rotar (radianes (ángulo_base), 0, 0, 1);

// BRAZO 1

llenar (150, 0, 150);

esquina_caja (10, 10, a1, ángulo_arma1);

// BRAZO 2

llenar (255, 0, 0);

esquina_caja (10, 10, a2, ángulo_arma2);

// SNUDE

llenar (255, 150, 0);

esquina_caja (10, 10, snude_len, -arm1_angle-arm2_angle + 90);

popMatrix ();

pushMatrix ();

flotador action_box_size = 100;

traducir (0, -tamaño_caja_acción / 2, tamaño_caja_acción / 2 + altura_b);

pushMatrix ();

traducir (x, action_box_size- y-action_box_size / 2, z-action_box_size / 2);

llenar (255, 255, 0);

caja (20);

popMatrix ();

llenar (255, 255, 255, 50);

box (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

void box_corner (flotar w, flotar h, flotar d, flotar rotar)

{

rotar (radianes (rotar), 1, 0, 0);

traducir (0, 0, d / 2);

caja (w, h, d);

traducir (0, 0, d / 2);

}

anular tecla presionada ()

{

si (clave == 'z')

{

doZ =! doZ;

}

si (clave == 'h')

{

// poner todo a cero

arm2_angle = 0;

arm1_angle = 90;

ángulo_base = 0;

}

si (clave == 'g')

{

println (grados (V1));

println (grados (V5));

}

si (keyCode == ARRIBA)

{

z ++;

}

si (keyCode == DOWN)

{

z -;

}

si (clave == 'o')

{

y = 50;

z = 50;

println (q);

println (c, "c");

println (V1, "V1");

println (V2);

println (V3);

println (brazo1_angulo);

println (V4);

println (V5);

println (brazo2_angulo);

}

}

Recomendado: