Tabla de contenido:
- Paso 1: Requisitos de los componentes
- Paso 2: Descarga Gui
- Paso 3: Conexión
- Paso 4: cargue el firmware y verifique el resultado del código en el tablero de Arduino
- Paso 5: Diseñe e imprima todas las piezas en una hoja de madera contrachapada
- Paso 6: Montaje
- Paso 7: Configurar los ajustes de GBRL
- Paso 8: cargue el código final y verifique el resultado virtual en el panel de control del software Arduino Uno
Video: Arduino Base Pick and Place Robot: 8 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:41
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
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
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
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
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:
Robot Pick and Place basado en RFID: 4 pasos
Robot Pick and Place basado en RFID: Desde hace muchos años, las personas intentan reemplazar el trabajo humano con máquinas. Las máquinas llamadas robots son más rápidas y efectivas que las personas. El término robótica se define prácticamente como el estudio, diseño y uso de sistemas robóticos para la fabricación. Los robots son g
UCL - Embedded - Pick and Place: 4 pasos
UCL - Embedded - Pick and Place: este instructivo explicará cómo se hace una unidad de pick and place 2D y cómo codificarla
El Pick-and-Place basado en la visión con UArm: 6 pasos
El Pick-and-Place basado en la visión con UArm: Recientemente, la mayoría de las consultas que escuchamos de usted son sobre las aplicaciones basadas en la visión de uArm, como el reconocimiento de objetos, la correlación cámara-uArm, etc. período de tiempo. Hemos llevado a cabo una simple visión basada en p
Hacer una base para iPod Nano con una base para iPod: 5 pasos
Hacer una base para iPod Nano con una base para iPod: explica cómo convertir fácilmente una base antigua para un iPod mini para usar con un iPod nano (tanto de primera como de segunda generación). ¿Por qué? mini y le sobró la base, y ahora compré un iPod nano y, francamente, delgado
Base / base para Macbook (knex): 4 pasos
Base / base para Macbook (knex): se trata de una base o base para macbook simple hecha de K'nex