Innholdsfortegnelse:

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

Video: Arduino Base Pick and Place Robot: 8 trinn

Video: Arduino Base Pick and Place Robot: 8 trinn
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 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 laget en superbillig (mindre enn 1000 dollar) industriell robotarm for å gjøre det mulig for studenter å hacke robotik i større skala og for å gjøre små lokale produksjoner i stand til å bruke roboter i sine prosesser uten å bryte banken. Det er enkelt å bygge og gjøre aldersgruppen til mennesker på 15 til 50 år.

Trinn 1: Krav til komponenter

Krav til komponenter
Krav til komponenter
Krav til komponenter
Krav til komponenter
Krav til komponenter
Krav til komponenter
Krav til komponenter
Krav til komponenter

1. Arduino + Shield + Pins + Cables

2. Motorkontroller: dm860A (Ebay)

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

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

5. 12 mm kryssfiner.

6. 5 mm nylon.

7. Blindskiver 8mm.

8. Treskruer 4,5x40mm.

9. M3 teller senket, 10. 12v strømforsyning

11. servomotordriver arduino

Trinn 2: Last ned Gui

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

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

Trinn 3: Tilkobling

Forbindelse
Forbindelse
Forbindelse
Forbindelse
Forbindelse
Forbindelse

Koble ledningene som er gitt i bildet er større forståelse for deg.

vi må koble motordriveren til Arduino og andre kontakter som kreves i henhold til roboten din.

Trinn 4: Last opp fastvare og sjekk koderesultatet i Arduino Dashboard

Installere fastvaren på Arduino - GRBL:

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

Merk: Du kan få en konflikt når du kompilerer i Arduino. Fjern alle andre biblioteker fra bibliotekmappen (../documents/Arduino/libraries).

Fastvareoppsett

Angi aktivering til nyere tidsavbrudd. Bruk en seriell tilkobling og skriv:

$1=255

Angi homing:

$22=1

Husk å sette serienummer til baud: 115200

Nyttige G-koder

Sett nullpunkt for robot:

G10 L2 Xnnn Ynnn Znnn

Bruk nullpunkt:

G54

Typisk initialisering for å sentrere roboten:

G10 L2 X1.5 Y1.2 Z1.1

G54

Flytt roboten til posisjonen raskt:

G0 Xnnn Ynnn Znnn

Eksempel:

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

Flytt roboten til posisjon med bestemt hastighet:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retur)

F bør være mellom 10 (slooooow) og 600 (rask)

Standardenheter for X, Y og Z

Når du bruker standard trinn/enheter -innstillinger (250 trinn/enhet) for GRBL og

stepper drive konfigurert for 800 trinn/turtall gjelder følgende enheter for alle akser:

+- 32 enheter = +- 180 grader

Eksempel på behandling av kode:

Denne koden kan kommunisere direkte med Arduino GRBL.

github.com/damellis/gctrl

Husk å sette serienummer til baud: 115200

Kode uoload i ardunio

import java.awt.event. KeyEvent;

importer javax.swing. JOptionPane;

import behandling. serie.*;

Seriell port = null;

// velg og endre den riktige linjen for operativsystemet

// la stå som null for å bruke den interaktive porten (trykk 'p' i programmet)

Stringportnavn = null;

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

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

// Stringportnavn = "COM6"; // Windows

boolsk streaming = false;

flytehastighet = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

if (portnavn == null) retur;

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

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

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String resultat = (String) JOptionPane.showInputDialog (dette, "Velg den serielle porten som tilsvarer Arduino -kortet.", "Velg seriell port", JOptionPane. PLAIN_MESSAGE, null, Serial.list (), 0);

hvis (resultat! = null) {

portnavn = resultat;

openSerialPort ();

}

}

ugyldig oppsett ()

{

størrelse (500, 250);

openSerialPort ();

}

ugyldig trekning ()

{

bakgrunn (0);

fyll (255);

int y = 24, dy = 12;

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

tekst ("p: velg seriell port", 12, y); y += dy;

tekst ("1: sett hastigheten til 0,001 tommer (1 mil) per jogging", 12, y); y += dy;

tekst ("2: sett hastigheten til 0,010 tommer (10 mil) per jogging", 12, y); y += dy;

tekst ("3: sett hastigheten til 100 mil per jog", 12, y); y += dy;

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

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

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

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

tekst ("0: null maskin (sett hjem til gjeldende plassering)", 12, y); y += dy;

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

text ("x: stopp streaming av g-kode (dette er IKKE umiddelbart)", 12, y); y += dy;

y = høyde - dy;

tekst ("nåværende joggehastighet:" + hastighet + "tommer per trinn", 12, y); y -= dy;

tekst ("nåværende seriell port:" + portnavn, 12, y); y -= dy;

}

void keyPressed ()

{

hvis (nøkkel == '1') hastighet = 0,001;

hvis (nøkkel == '2') hastighet = 0,01;

hvis (nøkkel == '3') hastighet = 0,1;

hvis (! streaming) {

if (keyCode == LEFT) 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");

hvis (keyCode == NED) 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 ();

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

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

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

}

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

gcode = null; i = 0;

Filfil = null;

println ("Laster inn fil …");

selectInput ("Velg en fil som skal behandles:", "fileSelected", fil);

}

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

}

void fileSelected (Filvalg) {

hvis (utvalg == null) {

println ("Vinduet ble lukket eller brukeren treffer avbryt.");

} annet {

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

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

streaming = true;

strøm();

}

}

ugyldig strøm ()

{

hvis (! streaming) returnerer;

mens (sant) {

hvis (i == gcode.length) {

streaming = false;

komme tilbake;

}

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

annet pause;

}

println (gcode );

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

i ++;

}

void serialEvent (Serial p)

{

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

println (s.trim ());

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

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

}

Trinn 5: Design og skriv ut alle deler i kryssfinerark

Design og skriv ut alle deler i kryssfinerark
Design og skriv ut alle deler i kryssfinerark

Last ned robotdelen og designet i AutoCAD og skriv ut på 12 mm kryssfinerark og finish og designdel. Hvis noen trenger cad -fil plz legg igjen kommentaren i kommentarfeltet, jeg sender deg direkte.

Trinn 6: Montering

montering
montering
montering
montering

samle hele delen og ordne i rekkefølgen på bildet som er gitt, og følg bildediagrammet.

Trinn 7: Konfigurer GBRL -innstillinger

Innstillinger som har vist seg å fungere på våre roboter.

$ 0 = 10 (trinnpuls, usek) $ 1 = 255 (trinn inaktiv forsinkelse, msek) $ 2 = 7 (trinnport inverter maske: 00000111) $ 3 = 7 (dir port inverter maske: 00000111) $ 4 = 0 (trinnaktivering inverter, bool) $ 5 = 0 (grensepinner inverter, bool) $ 6 = 1 (sondepinne inverter, bool) $ 10 = 3 (statusrapportmaske: 00000011) $ 11 = 0.020 (kryssavvik, mm) $ 12 = 0.002 (buetoleranse, mm) $ 13 = 0 (rapporter tommer, bool) $ 20 = 0 (myke grenser, bool) $ 21 = 0 (harde grenser, bool) $ 22 = 1 (homing syklus, 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, trinn/mm) $ 101 = 250.000 (y, trinn/mm) $ 102 = 250.000 (z, trinn/mm) $ 110 = 500.000 (x maks hastighet, mm/min) $ 111 = 500.000 (y maks hastighet, mm/min) $ 112 = 500.000 (z maks 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 reise, mm) $ 131 = 200.000 (y maksimal reise, mm) $ 132 = 200.000 (z maksimal reise, mm)

Trinn 8: Last opp den endelige koden og sjekk det virtuelle resultatet i Arduino Uno Software Dashboard

// Enheter: CM

flyte b_høyde = 0;

flyte a1 = 92;

flyte a2 = 86;

float snude_len = 20;

boolsk doZ = false;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

flyte med = 60; // = 0;

float bz = 60; // = 25;

flyte x = 60;

flyte y = 60;

flyte z = 60;

flyte q;

flyte c;

flyte V1;

flyte V2;

flyte V3;

flyte V4;

flyte V5;

ugyldig oppsett () {

størrelse (700, 700, P3D);

cam = ny PeasyCam (denne, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

ugyldig trekning () {

// ligninger:

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

x = (mus Y - høyde/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 (av, 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;

//} annet

// {

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

bakgrunn (0);

lys ();

pushMatrix ();

// UTGANGSPUNKT

fyll (150, 150, 150);

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

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

// ARM 1

fyll (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

fyll (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

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

fyll (255, 255, 0);

eske (20);

popMatrix ();

fyll (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økkel == 'z')

{

doZ =! doZ;

}

hvis (nøkkel == 'h')

{

// sett alt til null

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

hvis (nøkkel == 'g')

{

println (grader (V1));

println (grader (V5));

}

hvis (keyCode == UP)

{

z ++;

}

hvis (keyCode == NED)

{

z -;

}

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

}

}

Anbefalt: