Indholdsfortegnelse:

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

Video: Arduino Base Pick and Place Robot: 8 trin

Video: Arduino Base Pick and Place Robot: 8 trin
Video: Arduino pick and place robot | Pick and Place Robot using Arduino + Android App | Bluetooth Robot 2024, Juli
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

Jeg har lavet en superbillig (mindre end 1000 dollars) industriel robotarm for at give eleverne mulighed for at hacke robotik i større skala og for at gøre det muligt for små lokale produktioner at bruge robotter i deres processer uden at bryde banken. Det er let at bygge og gøre aldersgruppen til mennesker på 15 til 50 år.

Trin 1: Krav til komponenter

Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav
Komponentkrav

1. Arduino + Shield + Pins + Cables

2. Motorcontroller: dm860A (Ebay)

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

4. M8x45+60+70 bolte og M8 bolte.

5. 12 mm Krydsfiner.

6. 5 mm nylon.

7. Blindskiver 8mm.

8. Træskruer 4,5x40mm.

9. M3 Tæller nedsænket, 10. 12v strømforsyning

11. servomotordriver arduino

Trin 2: Download Gui

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

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

Trin 3: Tilslutning

Forbindelse
Forbindelse
Forbindelse
Forbindelse
Forbindelse
Forbindelse

Tilslut ledningerne, der er angivet på billedet, er større forståelse for dig.

vi skal forbinde motordriveren til Arduino og andre stik, som kræves i henhold til din robot.

Trin 4: Upload firmware og tjek koderesultatet i Arduino Dashboard

Installation af firmwaren på Arduino - GRBL:

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

Bemærk: Du kan få en konflikt, når du kompilerer i Arduino. Fjern alle andre biblioteker fra din biblioteksmappe (../documents/Arduino/libraries).

Firmware opsætning

Indstil aktiver til nyere timeout. Brug en seriel forbindelse og skriv:

$1=255

Indstil homing:

$22=1

Husk at indstille serienummer til baud: 115200

Nyttige G-koder

Indstil nulpunkt for robot:

G10 L2 Xnnn Ynnn Znnn

Brug nulpunkt:

G54

Typisk initialisering til centrering af robot:

G10 L2 X1.5 Y1.2 Z1.1

G54

Flyt robotten til position hurtigt:

G0 Xnnn Ynnn Znnn

Eksempel:

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

Flyt robotten til position med en bestemt hastighed:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retur)

F skal være mellem 10 (slooooow) og 600 (hurtig)

Standardenheder for X, Y og Z

Ved brug af standard trin/enheder indstillinger (250 trin/enhed) for GRBL og

stepperdrev, der er indstillet til 800 trin/omdrejninger, gælder følgende enheder for alle akser:

+- 32 enheder = +- 180 grader

Behandlingskodeksempel:

Denne kode kan kommunikere direkte med Arduino GRBL.

github.com/damellis/gctrl

Husk at indstille serienummer til baud: 115200

Kode uoload i ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

import behandling. serie.*;

Seriel port = null;

// vælg og rediger den relevante linje til dit operativsystem

// lad være som null for at bruge den interaktive port (tryk på 'p' i programmet)

String portnavn = null;

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

// Stringportnavn = "/dev/ttyUSB0"; // Linux

// Stringportnavn = "COM6"; // Windows

boolsk streaming = falsk;

flydehastighed = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

hvis (portnavn == null) returnerer;

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

port = ny Seriel (dette, portnavn, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String resultat = (String) JOptionPane.showInputDialog (dette, "Vælg den serielle port, der svarer til dit Arduino -kort.", "Vælg seriel port", JOptionPane. PLAIN_MESSAGE, nul, Serial.list (), 0);

hvis (resultat! = null) {

portnavn = resultat;

openSerialPort ();

}

}

ugyldig opsætning ()

{

størrelse (500, 250);

openSerialPort ();

}

ugyldig trækning ()

{

baggrund (0);

fyld (255);

int y = 24, dy = 12;

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

tekst ("p: vælg seriel port", 12, y); y += dy;

tekst ("1: indstil hastighed til 0,001 tommer (1 mil) pr. løbetur", 12, y); y += dy;

tekst ("2: indstil hastighed til 0,010 tommer (10 mil) pr. løbetur", 12, y); y += dy;

tekst ("3: indstil hastigheden til 0,100 tommer (100 mil) pr. løbetur", 12, y); y += dy;

tekst ("piletaster: jog i x-y-plan", 12, y); y += dy;

tekst ("side op & side ned: jog i z -aksen", 12, y); y += dy;

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

tekst ("h: gå hjem", 12, y); y += dy;

tekst ("0: nulmaskine (sæt hjem til den aktuelle placering)", 12, y); y += dy;

tekst ("g: stream en g-kodefil", 12, y); y += dy;

tekst ("x: stop streaming af g-kode (dette er IKKE øjeblikkeligt)", 12, y); y += dy;

y = højde - dy;

tekst ("nuværende løbshastighed:" + hastighed + "tommer pr. trin", 12, y); y -= dy;

tekst ("nuværende seriel port:" + portnavn, 12, y); y -= dy;

}

void keyPressed ()

{

hvis (nøgle == '1') hastighed = 0,001;

hvis (nøgle == '2') hastighed = 0,01;

hvis (nøgle == '3') hastighed = 0,1;

hvis (! streaming) {

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

hvis (keyCode == HØJRE) port.write ("G91 / nG20 / nG00 X" + hastighed + "Y0.000 Z0.000 / n");

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

hvis (keyCode == NED) port.write ("G91 / nG20 / nG00 X0.000 Y-" + hastighed + "Z0.000 / n");

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

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

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

hvis (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");

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

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

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

hvis (key == '0') openSerialPort ();

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

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

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

}

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

gcode = null; i = 0;

Filfil = null;

println ("Indlæser fil …");

selectInput ("Vælg en fil, der skal behandles:", "fileSelected", fil);

}

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

}

void fileSelected (Filvalg) {

hvis (markering == null) {

println ("Vinduet blev lukket, eller brugeren ramte annuller.");

} andet {

println ("Bruger valgt" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

hvis (gcode == null) returnerer;

streaming = sandt;

strøm();

}

}

ugyldig strøm ()

{

hvis (! streaming) vender tilbage;

mens (sandt) {

hvis (i == gcode.length) {

streaming = falsk;

Vend tilbage;

}

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

ellers pause;

}

println (gcode );

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

i ++;

}

void serialEvent (Serial p)

{

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

println (s.trim ());

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

hvis (s.trim (). startsWith ("fejl")) stream (); // XXX: virkelig?

}

Trin 5: Design og udskriv alle dele i krydsfinerark

Design og udskriv alle dele i krydsfinerark
Design og udskriv alle dele i krydsfinerark

Download robotdelen og designet i AutoCAD, og udskriv på 12 mm krydsfinerpladen og finish og design del. Hvis nogen har brug for cad -fil, skal du forlade kommentaren i kommentarfeltet, jeg sender dig direkte.

Trin 6: Montering

montage
montage
montage
montage

saml hele delen og arranger i rækkefølgen på billedet, der er givet, og følg billeddiagrammet.

Trin 7: Konfigurer GBRL -indstillinger

Indstilling, der har vist sig at fungere på vores robotter.

$ 0 = 10 (trinpuls, usec) $ 1 = 255 (trin inaktiv forsinkelse, msek) $ 2 = 7 (trinport inverter maske: 00000111) $ 3 = 7 (dir port inverter maske: 00000111) $ 4 = 0 (trinaktivering inverter, bool) $ 5 = 0 (grænsestifter inverter, bool) $ 6 = 1 (sondebolt inverter, bool) $ 10 = 3 (statusrapportmaske: 00000011) $ 11 = 0,020 (krydsafvigelse, mm) $ 12 = 0,002 (buetolerance, mm) $ 13 = 0 (rapporter tommer, bool) $ 20 = 0 (bløde grænser, bool) $ 21 = 0 (hårde grænser, bool) $ 22 = 1 (homing cyklus, bool) $ 23 = 0 (homing dir inverter maske: 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, trin/mm) $ 101 = 250.000 (y, trin/mm) $ 102 = 250.000 (z, trin/mm) $ 110 = 500.000 (x max hastighed, 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 maks. rejse, mm) $ 131 = 200.000 (y maks. rejse, mm) $ 132 = 200.000 (z maks. rejse, mm)

Trin 8: Upload den sidste kode, og kontroller det virtuelle resultat i Arduino Uno Software Dashboard

// Enheder: CM

float b_højde = 0;

flyde a1 = 92;

flyde a2 = 86;

float snude_len = 20;

boolsk doZ = falsk;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

flyde med = 60; // = 0;

float bz = 60; // = 25;

flyde x = 60;

flyde y = 60;

float z = 60;

flyde q;

flyde c;

flyde V1;

flyde V2;

flyde V3;

flyde V4;

flyde V5;

ugyldig opsætning () {

størrelse (700, 700, P3D);

cam = ny PeasyCam (denne, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

ugyldig tegning () {

// ligninger:

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

x = (musY - højde/2)*(- 1);

bz = z;

af = 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 (af, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// interaktiv:

// hvis (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} andet

// {

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

rotereZ (-1,2);

baggrund (0);

lys ();

pushMatrix ();

// BASE

fyld (150, 150, 150);

box_corner (50, 50, b_højde, 0);

rotere (radianer (base_angle), 0, 0, 1);

// ARM 1

fyld (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

fyld (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

fyld (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 ();

oversætte (x, action_box_size- y-action_box_size/2, z-action_box_size/2);

fyld (255, 255, 0);

kasse (20);

popMatrix ();

fyld (255, 255, 255, 50);

boks (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

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

{

rotere (radianer (rotere), 1, 0, 0);

translate (0, 0, d/2);

boks (w, h, d);

translate (0, 0, d/2);

}

void keyPressed ()

{

hvis (nøgle == 'z')

{

doZ =! doZ;

}

hvis (nøgle == 'h')

{

// sæt alle til nul

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

hvis (nøgle == 'g')

{

println (grader (V1));

println (grader (V5));

}

hvis (keyCode == UP)

{

z ++;

}

hvis (keyCode == NED)

{

z -;

}

hvis (nøgle == '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);

}

}

Anbefalede: