Taula de continguts:

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

Vídeo: Arduino Base Pick and Place Robot: 8 passos

Vídeo: Arduino Base Pick and Place Robot: 8 passos
Vídeo: Arduino pick and place robot | Pick and Place Robot using Arduino + Android App | Bluetooth Robot 2024, Juliol
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

He fabricat un braç de robot industrial molt barat (menys de 1.000 dòlars) per permetre als estudiants piratejar robòtica a gran escala i permetre que petites produccions locals puguin utilitzar robots en els seus processos sense trencar el banc. És fàcil crear i convertir el grup d’edat en persones de 15 a 50 anys.

Pas 1: requisit de components

Requisit de components
Requisit de components
Requisit de components
Requisit de components
Requisit de components
Requisit de components
Requisit de components
Requisit de components

1. Arduino + Shield + Pins + Cables

2. Motorcontroller: dm860A (Ebay)

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

4. Cargols M8x45 + 60 + 70 i cargols M8.

5. Fusta contraxapada de 12 mm.

6. Niló de 5 mm.

7. Rentadores cegues de 8 mm.

8. Cargols de fusta 4,5x40mm.

9. Comptador M3 enfonsat, 10. Font d'alimentació de 12v

11. servomotor controlador arduino

Pas 2: descarregueu Gui

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

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

Pas 3: connexió

Connexió
Connexió
Connexió
Connexió
Connexió
Connexió

Connectar els cables que es donen a la imatge és una millor comprensió per a vostè.

hem de connectar el controlador del motor a Arduino i altres connectors necessaris segons el vostre robot.

Pas 4: pengeu el microprogramari i comproveu el resultat del codi al tauler d'Arduino

Instal·lació del firmware a Arduino - GRBL:

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

Nota: és possible que tingueu un conflicte quan compileu a Arduino. Elimineu la resta de biblioteques de la carpeta de la biblioteca (../documents/Arduino/libraries).

Configuració del firmware

Estableix l'activació com a temps d'espera més recent. Utilitzeu una connexió en sèrie i escriviu:

$1=255

Estableix el registre inicial:

$22=1

Recordeu que heu d’establir la sèrie en baud: 115200

Codis G útils

Estableix el punt zero per al robot:

G10 L2 Xnnn Ynnn Znnn

Utilitzeu el punt zero:

G54

Inicialització típica per centrar el robot:

G10 L2 X1.5 Y1.2 Z1.1

G54

Mou el robot a la posició ràpida:

G0 Xnnn Ynnn Znnn

Exemple:

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

Mou el robot a la seva posició a una velocitat específica:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retorn)

F ha de ser entre 10 (slooooow) i 600 (ràpid)

Unitats predeterminades per a X, Y i Z

Quan s'utilitzen els paràmetres predeterminats de pas / unitats (250 passos / unitat) per a GRBL i

Unitat pas a pas configurada per 800 passos / rev. s'apliquen les següents unitats a tots els eixos:

+ - 32 unitats = + - 180 graus

Exemple de codi de processament:

Aquest codi es pot comunicar directament amb l'Arduino GRBL.

github.com/damellis/gctrl

Recordeu que heu d’establir la sèrie en baud: 115200

Codi uoload en ardunio

importació java.awt.event. KeyEvent;

importació javax.swing. JOptionPane;

processament de la importació. sèrie. *;

Port sèrie = nul;

// seleccioneu i modifiqueu la línia adequada per al vostre sistema operatiu

// deixar com a nul per utilitzar el port interactiu (premeu 'p' al programa)

Nom de port de la cadena = nul;

// Nom del port de la cadena = Serial.list () [0]; // Mac OS X

// Nom del port de la cadena = "/ dev / ttyUSB0"; // Linux

// String portname = "COM6"; // Windows

streaming booleà = fals;

velocitat de flotació = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

if (portname == null) retorna;

if (port! = nul) port.stop ();

port = new Serial (this, nom del port, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

Resultat de cadena = (Cadena) JOptionPane.showInputDialog (això, "Seleccioneu el port sèrie que correspon a la vostra placa Arduino.", "Selecciona el port sèrie", JOptionPane. PLAIN_MESSAGE, nul, Serial.list (), 0);

si (resultat! = nul) {

portname = resultat;

openSerialPort ();

}

}

configuració nul·la ()

{

mida (500, 250);

openSerialPort ();

}

sorteig buit ()

{

fons (0);

farcit (255);

int y = 24, dy = 12;

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

text ("p: seleccioneu el port sèrie", 12, y); y + = dy;

text ("1: estableix la velocitat a 0,001 polzades (1 mil) per tracció", 12, y); y + = dy;

text ("2: estableix la velocitat a 0,010 polzades (10 mil) per tracció", 12, y); y + = dy;

text ("3: estableix la velocitat a 0,100 polzades (100 mil) per tracció", 12, y); y + = dy;

text ("tecles de fletxa: desplaçament en pla x-y", 12, y); y + = dy;

text ("pàgina amunt i pàgina avall: desplaçament a l'eix z", 12, y); y + = dy;

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

text ("h: vés a casa", 12, y); y + = dy;

text ("màquina 0: zero (estableix la ubicació actual a la ubicació actual)", 12, y); y + = dy;

text ("g: transmet un fitxer de codi g", 12, y); y + = dy;

text ("x: deixar de transmetre codi g (això NO és immediat)", 12, y); y + = dy;

y = alçada - dy;

text ("velocitat de desplaçament actual:" + velocitat + "polzades per pas", 12, y); y - = dy;

text ("port sèrie actual:" + nom del port, 12, y); y - = dy;

}

tecla buida Premeu ()

{

if (clau == '1') velocitat = 0,001;

if (clau == '2') velocitat = 0,01;

if (clau == '3') velocitat = 0,1;

si (! streaming) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

gcode = nul; i = 0;

Fitxer file = nul;

println ("S'està carregant el fitxer …");

selectInput ("Seleccioneu un fitxer a processar:", "fileSelected", fitxer);

}

if (clau == 'x') streaming = fals;

}

void fileSelected (Selecció de fitxer) {

if (selecció == nul·la) {

println ("La finestra s'ha tancat o l'usuari ha cancel·lat.");

} més {

println ("Usuari seleccionat" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) retorna;

streaming = cert;

corrent();

}

}

corrent nul ()

{

si (! streaming) torna;

mentre que (cert) {

if (i == gcode.length) {

streaming = fals;

tornar;

}

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

sinó trencar;

}

println (gcode );

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

i ++;

}

void serialEvent (sèrie p)

{

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

println (s.trim ());

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

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

}

Pas 5: Dissenyeu i imprimiu tota la peça en full de fusta contraxapada

Dissenyar i imprimir tota la peça en full contraxapat
Dissenyar i imprimir tota la peça en full contraxapat

Descarregueu la peça i el disseny del robot a AutoCAD i imprimiu-la al full de fusta contraxapada de 12 mm i la part d’acabat i disseny. Si algú necessita un fitxer cad, si us plau, deixeu el comentari al quadre de la secció de comentaris que us enviaré directament.

Pas 6: Muntatge

muntatge
muntatge
muntatge
muntatge

recopileu tota la part i organitzeu-la en la seqüència de la imatge que es dóna i seguiu el diagrama de la imatge.

Pas 7: configureu la configuració de GBRL

Configuració que ha demostrat que funciona amb els nostres robots.

$ 0 = 10 (pols de pas, usec) $ 1 = 255 (retard de pas inactiu, msec) $ 2 = 7 (màscara d'inversió de port de pas: 00000111) $ 3 = 7 (màscara d'inversió de port de dir: 00000111) $ 4 = 0 (invertir habilitació de pas, bool) $ 5 = 0 (límit d'invertir els pins, bool) $ 6 = 1 (invertir el pin de sonda, bool) 10 $ = 3 (màscara d'informe d'estat: 00000011) 11 $ = 0,020 (desviació de la unió, mm) 12 $ = 0,002 (tolerància a l'arc, mm) 13 $ = 0 (polzades d'informe, bool) 20 $ = 0 (límits suaus, bool) 21 $ = 0 (límits durs, bool) 22 $ = 1 (cicle de referència, bool) 23 $ = 0 (màscara d'invertir dir de referència: 00000000) 24 $ = 100.000 (alimentació de referència, mm / min) $ 25 = 500.000 (cerca de referència, mm / min) $ 26 = 250 (rebot de referència, msec) $ 27 = 1.000 (extracció de referència, mm) $ 100 = 250.000 (x, pas / mm) $ 101 = 250.000 (y, pas / mm) 102 $ = 250.000 (z, pas / mm) 110 $ = 500.000 (x taxa màxima, mm / min) 111 $ = 500.000 (taxa màxima y, mm / min) 112 $ = 500.000 (taxa màxima z, mm / min) 120 $ = 10.000 (x accel, mm / seg ^ 2) 121 $ = 10.000 (y accel, mm / seg ^ 2) 122 $ = 10.000 (z accel, mm / seg ^ 2) 130 $ = 200.000 (x recorregut màxim, mm) 131 $ = 200.000 (recorregut màxim, mm) 132 $ = 200.000 (recorregut màxim z, mm)

Pas 8: pengeu el codi final i comproveu el resultat virtual al tauler de control del programari Arduino Uno

// Unitats: CM

float b_height = 0;

flotador a1 = 92;

flotador a2 = 86;

flotador snude_len = 20;

booleà doZ = fals;

float base_angle; // = 0;

flotador braç_angle; // = 0;

flotador arm2_angle; // = 0;

flotador bx = 60; // = 25;

flota per = 60; // = 0;

flotador bz = 60; // = 25;

flotador x = 60;

flotador y = 60;

flotador z = 60;

flotar q;

flotador c;

flotador V1;

flotació V2;

flotador V3;

flotador V4;

flotador V5;

configuració nul·la () {

mida (700, 700, P3D);

cam = new PeasyCam (this, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

sorteig buit () {

// ligninger:

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

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

bz = z;

per = y;

bx = x;

float y3 = sqrt (bx * bx + per * per);

c = sqrt (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;

braç_angle = q;

V4 = radians (90,0) - q;

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

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

angle_ base = graus (atan2 (bx, by));

braç_angle = graus (braç_angle);

arm2_angle = graus (arm2_angle);

// println (per, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

braç_angle = 23;

arm2_angle = 23;

*/

// interactiu:

// if (doZ)

//

// {

// base_angle = base_angle + mouseX-pmouseX;

//} més

// {

// arm1_angle = arm1_angle + pmouseX-mouseX;

// }

//

// arm2_angle = arm2_angle + mouseY-pmouseY;

draw_robot (base_angle, - (arm1_angle-90), arm2_angle + 90 - (- (arm1_angle-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);

fons (0);

llums ();

pushMatrix ();

// BASE

farcit (150, 150, 150);

box_corner (50, 50, b_height, 0);

girar (radians (angle_ base), 0, 0, 1);

// ARM 1

farcit (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

omplir (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

farcit (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

traduir (0, -action_box_size / 2, action_box_size / 2 + b_height);

pushMatrix ();

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

omplir (255, 255, 0);

caixa (20);

popMatrix ();

farciment (255, 255, 255, 50);

quadre (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

void box_corner (float w, float h, float d, float rotate)

{

rotar (radians (rotar), 1, 0, 0);

traduir (0, 0, d / 2);

caixa (w, h, d);

traduir (0, 0, d / 2);

}

tecla buida Premeu ()

{

if (clau == 'z')

{

doZ =! doZ;

}

if (clau == 'h')

{

// posa tot a zero

arm2_angle = 0;

braç_angle = 90;

angle_ base = 0;

}

if (clau == 'g')

{

println (graus (V1));

println (graus (V5));

}

if (keyCode == AMUNT)

{

z ++;

}

if (keyCode == ABAIX)

{

z -;

}

if (clau == 'o')

{

y = 50;

z = 50;

println (q);

println (c, "c");

println (V1, "V1");

println (V2);

println (V3);

println (arm1_angle);

println (V4);

println (V5);

println (arm2_angle);

}

}

Recomanat: