Innehållsförteckning:

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

Video: Arduino Base Pick and Place Robot: 8 steg

Video: Arduino Base Pick and Place Robot: 8 steg
Video: robot race. line follower robot with arduino program 2024, November
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

Jag har gjort en superbillig (mindre än 1000 dollar) industriell robotarm för att göra det möjligt för studenter att hacka robotik i större skala och för att göra små lokala produktioner att använda robotar i sina processer utan att bryta banken. Det är lätt att bygga och göra åldersgruppen människor mellan 15 och 50 år.

Steg 1: Krav på komponenter

Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav

1. Arduino + Shield + Pins + Cables

2. Motorstyrenhet: dm860A (Ebay)

3. Stegmotor: 34hs5435c-37b2 (Ebay)

4. M8x45+60+70 bultar och M8 bultar.

5. 12 mm plywood.

6. 5 mm nylon.

7. Blindbrickor 8mm.

8. Träskruvar 4,5x40mm.

9. M3 räknare sjunkit, 10. 12v strömförsörjning

11. servomotor förare arduino

Steg 2: Ladda ner Gui

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

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

Steg 3: Anslutning

Förbindelse
Förbindelse
Förbindelse
Förbindelse
Förbindelse
Förbindelse

Anslut trådarna som ges i bilden är större förståelse för dig.

vi måste ansluta motordrivrutinen till Arduino och andra kontakter som krävs enligt din robot.

Steg 4: Ladda upp firmware och kontrollera koderesultatet i Arduino Dashboard

Installera firmware på Arduino - GRBL:

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

Obs! Du kan få en konflikt när du kompilerar i Arduino. Ta bort alla andra bibliotek från biblioteksmappen (../documents/Arduino/libraries).

Firmware -installation

Ställ aktivera till nyare timeout. Använd en seriell anslutning och skriv:

$1=255

Ställ in hemning:

$22=1

Kom ihåg att ställa in serienummer till baud: 115200

Användbara G-koder

Ange nollpunkt för robot:

G10 L2 Xnnn Ynnn Znnn

Använd nollpunkt:

G54

Typisk initialisering för att centrera roboten:

G10 L2 X1.5 Y1.2 Z1.1

G54

Flytta roboten till position snabbt:

G0 Xnnn Ynnn Znnn

Exempel:

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

Flytta roboten till position med specifik hastighet:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retur)

F bör vara mellan 10 (slooooow) och 600 (snabb)

Standardenheter för X, Y och Z

När du använder standardinställningar för steg/enheter (250 steg/enhet) för GRBL och

stegdrift inställd för 800 steg/varv gäller följande enheter för alla axlar:

+- 32 enheter = +- 180 grader

Exempel på bearbetningskod:

Denna kod kan kommunicera direkt med Arduino GRBL.

github.com/damellis/gctrl

Kom ihåg att ställa in serienummer till baud: 115200

Kod uoload i ardunio

importera java.awt.event. KeyEvent;

importera javax.swing. JOptionPane;

import bearbetning. serie.*;

Seriell port = null;

// välj och ändra lämplig rad för ditt operativsystem

// lämna som null för att använda den interaktiva porten (tryck på 'p' i programmet)

Strängportnamn = null;

// Strängportnamn = Serial.list () [0]; // Mac OS X

// Strängportnamn = "/dev/ttyUSB0"; // Linux

// Strängportnamn = "COM6"; // Windows

boolsk streaming = falskt;

flottörhastighet = 0,001;

Sträng gcode;

int i = 0;

void openSerialPort ()

{

if (portnamn == null) return;

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

port = new Serial (detta, portnamn, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

Strängresultat = (String) JOptionPane.showInputDialog (detta, "Välj den seriella porten som motsvarar ditt Arduino -kort.", "Välj serieport", JOptionPane. PLAIN_MESSAGE, null, Serial.list (), 0);

if (resultat! = null) {

portnamn = resultat;

openSerialPort ();

}

}

void setup ()

{

storlek (500, 250);

openSerialPort ();

}

void draw ()

{

bakgrund (0);

fyllning (255);

int y = 24, dy = 12;

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

text ("p: välj seriell port", 12, y); y += dy;

text ("1: ställ in hastigheten till 0,001 tum (1 mil) per jogg", 12, y); y += dy;

text ("2: ställ in hastigheten till 0,010 tum (10 mil) per jogg", 12, y); y += dy;

text ("3: ställ in hastigheten till 100 mil per jog", 12, y); y += dy;

text ("piltangenter: jogga i x-y-plan", 12, y); y += dy;

text ("sida upp & sida ner: jogga i z -axeln", 12, y); y += dy;

text ("$: display grbl settings", 12, y); y+= dy;

text ("h: gå hem", 12, y); y += dy;

text ("0: zero machine (ställ hem till den aktuella platsen)", 12, y); y += dy;

text ("g: strömma en g-kodfil", 12, y); y += dy;

text ("x: sluta strömma g-kod (detta är INTE omedelbart)", 12, y); y += dy;

y = höjd - dy;

text ("aktuell jogghastighet:" + hastighet + "tum per steg", 12, y); y -= dy;

text ("aktuell serieport:" + portnamn, 12, y); y -= dy;

}

void keyPressed ()

{

om (key == '1') hastighet = 0,001;

om (key == '2') hastighet = 0,01;

om (key == '3') hastighet = 0,1;

om (! streaming) {

if (keyCode == VÄNSTER) port.write ("G91 / nG20 / nG00 X-" + hastighet + "Y0.000 Z0.000 / n");

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

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

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

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

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + hastighet + "\ 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 (key == '0') openSerialPort ();

om (key == 'p') väljSerialPort ();

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

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

}

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

gcode = null; i = 0;

Filfil = null;

println ("Läser in fil …");

selectInput ("Välj en fil att bearbeta:", "fileSelected", fil);

}

if (key == 'x') streaming = false;

}

void fileSelected (File selection) {

if (urval == null) {

println ("Fönstret stängdes eller användartrycket avbryt.");

} annat {

println ("Användare vald" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

streaming = true;

ström();

}

}

void stream ()

{

if (! streaming) return;

medan (sant) {

if (i == gcode.length) {

streaming = falskt;

lämna tillbaka;

}

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

annars bryta;

}

println (gcode );

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

i ++;

}

void serialEvent (Serial p)

{

Sträng s = p.readStringUntil ('\ n');

println (s.trim ());

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

if (s.trim (). startsWith ("error")) stream (); // XXX: verkligen?

}

Steg 5: Designa och skriv ut alla delar i plywoodark

Design och tryck ut alla delar i plywoodark
Design och tryck ut alla delar i plywoodark

Ladda ner robotdelen och designen i AutoCAD och skriv ut den på 12 mm plywoodark och finish och designdel. Om någon behöver cad -fil plz lämna kommentaren i kommentarsfältet så skickar jag dig direkt.

Steg 6: Montering

hopsättning
hopsättning
hopsättning
hopsättning

samla all del och ordna i sekvensen på bilden som ges och följ bilddiagrammet.

Steg 7: Konfigurera GBRL -inställningar

Inställningar som har visat sig fungera på våra robotar.

$ 0 = 10 (stegpuls, usec) $ 1 = 255 (steg inaktiv fördröjning, msek) $ 2 = 7 (stegport inverteringsmask: 00000111) $ 3 = 7 (dir port inverter mask: 00000111) $ 4 = 0 (stegaktivera invertera, bool) $ 5 = 0 (gränspinnar invertera, bool) $ 6 = 1 (sondstift invertera, bool) $ 10 = 3 (statusrapportmask: 00000011) $ 11 = 0,020 (övergångsavvikelse, mm) $ 12 = 0,002 (bågtolerans, mm) $ 13 = 0 (rapportera tum, bool) $ 20 = 0 (mjuka gränser, bool) $ 21 = 0 (hårda gränser, bool) $ 22 = 1 (homingcykel, bool) $ 23 = 0 (homing dir invert mask: 00000000) $ 24 = 100.000 (homing feed, mm/min) $ 25 = 500.000 (homing seek, mm/min) $ 26 = 250 (homing debounce, msek) $ 27 = 1.000 (homing pull-off, mm) $ 100 = 250.000 (x, step/mm) $ 101 = 250.000 (y, steg/mm) $ 102 = 250.000 (z, step/mm) $ 110 = 500.000 (x max hastighet, mm/min) $ 111 = 500.000 (y max rate, mm/min) $ 112 = 500.000 (z max rate, mm/min) $ 120 = 10.000 (x accel, mm/sec^2) $ 121 = 10.000 (y accel, mm/sec^2) $ 122 = 10.000 (z accel, mm/sec^2) $ 130 = 200.000 (x max resa, mm) $ 131 = 200.000 (y max resa, mm) $ 132 = 200.000 (z max resa, mm)

Steg 8: Ladda upp den slutliga koden och kontrollera det virtuella resultatet i Arduino Uno Software Dashboard

// Enheter: CM

float b_höjd = 0;

flyta a1 = 92;

flyta a2 = 86;

float snude_len = 20;

booleskt doZ = falskt;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

flyta med = 60; // = 0;

float bz = 60; // = 25;

flyta x = 60;

flyta y = 60;

flyta z = 60;

flyta q;

flyta c;

flottör V1;

flottör V2;

flottör V3;

flottör V4;

flottör V5;

void setup () {

storlek (700, 700, P3D);

cam = ny PeasyCam (detta, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

void draw () {

// ligninger:

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

x = (musY - höjd/2)*(- 1);

bz = z;

av = y;

bx = x;

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

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;

arm1_angle = q;

V4 = radianer (90,0) - q;

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

arm2_angle = radianer (180,0) - (V5 + V1);

base_angle = grader (atan2 (bx, by));

arm1_angle = grader (arm1_angle);

arm2_angle = grader (arm2_angle);

// println (by, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// interaktiv:

// if (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} annat

// {

// 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);

roteraZ (-1,2);

bakgrund (0);

lampor ();

pushMatrix ();

// BASE

fyllning (150, 150, 150);

box_corner (50, 50, b_höjd, 0);

rotera (radianer (bas_vinkel), 0, 0, 1);

// ARM 1

fyllning (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

fyllning (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

fyllning (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

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

pushMatrix ();

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

fyllning (255, 255, 0);

låda (20);

popMatrix ();

fyllning (255, 255, 255, 50);

box (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

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

{

rotera (radianer (rotera), 1, 0, 0);

translate (0, 0, d/2);

låda (w, h, d);

translate (0, 0, d/2);

}

void keyPressed ()

{

if (key == 'z')

{

doZ =! doZ;

}

if (key == 'h')

{

// sätt alla till noll

arm2_angle = 0;

arm1_angle = 90;

bas_vinkel = 0;

}

om (key == 'g')

{

println (grader (V1));

println (grader (V5));

}

if (keyCode == UP)

{

z ++;

}

if (keyCode == NED)

{

z -;

}

if (key == '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);

}

}

Rekommenderad: