INHOUDSOPGAWE:

Arduino Base Pick and Place -robot: 8 stappe
Arduino Base Pick and Place -robot: 8 stappe

Video: Arduino Base Pick and Place -robot: 8 stappe

Video: Arduino Base Pick and Place -robot: 8 stappe
Video: HOW TO APPLY FALSE LASHES! (for Beginner!) 🔥 2024, Julie
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

Ek het 'n baie goedkoop (minder as 1000 dollar) industriële robotarm gemaak om studente in staat te stel om robotika op groot skaal te hack en klein plaaslike produksies in staat te stel om robotte in hul prosesse te gebruik sonder om die bank te breek. Dit is maklik om die ouderdomsgroep van 15 tot 50 jaar te bou en te maak.

Stap 1: Vereiste komponente

Vereiste komponente
Vereiste komponente
Vereiste komponente
Vereiste komponente
Vereiste komponente
Vereiste komponente
Vereiste komponente
Vereiste komponente

1. Arduino + skild + penne + kabels

2. Motorbeheerder: dm860A (Ebay)

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

4. M8x45+60+70 boute en M8 boute.

5. 12mm laaghout.

6. 5 mm nylon.

7. Blindwassers 8mm.

8. Houtskroewe 4,5x40mm.

9. M3 toonbank gesink, 10. 12v kragtoevoer

11. servomotorbestuurder arduino

Stap 2: Laai Gui af

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

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

Stap 3: verbinding

Verbinding
Verbinding
Verbinding
Verbinding
Verbinding
Verbinding

Verbind die drade wat in die prentjie gegee word, vir u 'n groter begrip.

ons moet die motorbestuurder koppel aan Arduino en ander verbindings wat volgens u robot benodig word.

Stap 4: Laai firmware op en kyk na die resultaat van die kode in die Arduino -dashboard

Die installering van die firmware op Arduino - GRBL:

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

Opmerking: u kan 'n konflik ondervind tydens die opstel in Arduino. Verwyder alle ander biblioteke uit u biblioteekmap (../documents/Arduino/libraries).

Opstelling van firmware

Stel aktiveer in op nuwer tydsduur. Gebruik 'n seriële verbinding en skryf:

$1=255

Stel huisvesting:

$22=1

Onthou om die reeks op baud in te stel: 115200

Nuttige G-kodes

Stel nulpunt vir robot:

G10 L2 Xnnn Ynnn Znnn

Gebruik nulpunt:

G54

Tipiese inisialisering om robot te sentreer:

G10 L2 X1.5 Y1.2 Z1.1

G54

Beweeg robot vinnig na posisie:

G0 Xnnn Ynnn Znnn

Voorbeeld:

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

Beweeg die robot na 'n spesifieke posisie:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (terug)

F moet tussen 10 (slooooow) en 600 (vinnig) wees

Standaard eenhede vir X, Y en Z

By die gebruik van standaard stap/eenhede -instellings (250 stap/eenheid) vir GRBL en

stepper drive ingestel vir 800 step/rev die volgende eenhede geld vir alle as:

+- 32 eenhede = +- 180 grade

Verwerkingskode voorbeeld:

Hierdie kode kan direk met die Arduino GRBL kommunikeer.

github.com/damellis/gctrl

Onthou om die reeks op baud in te stel: 115200

Kode uoload in ardunio

invoer java.awt.event. KeyEvent;

voer javax.swing. JOptionPane in;

invoerverwerking.reeks.*;

Seriële poort = nul;

// kies en pas die toepaslike reël vir u bedryfstelsel aan

// laat dit as null om die interaktiewe poort te gebruik (druk 'p' in die program)

Stringpoortnaam = nul;

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

// Stringpoortnaam = "/dev/ttyUSB0"; // Linux

// Stringpoortnaam = "COM6"; // Windows

boolese streaming = vals;

vlot spoed = 0.001;

String gcode;

int i = 0;

leegte openSerialPort ()

{

as (poortnaam == nul) terugkeer;

as (poort! = nul) poort.stop ();

poort = nuwe reeks (hierdie, poortnaam, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String resultaat = (String) JOptionPane.showInputDialog (hierdie, "Kies die seriële poort wat ooreenstem met u Arduino -bord.", "Kies seriële poort", JOptionPane. PLAIN_MESSAGE, nul, Serial.list (), 0);

as (resultaat! = nul) {

poortnaam = resultaat;

openSerialPort ();

}

}

leemte opstelling ()

{

grootte (500, 250);

openSerialPort ();

}

leemte trek ()

{

agtergrond (0);

vul (255);

int y = 24, dy = 12;

teks ("INSTRUKSIES", 12, y); y += dy;

teks ("p: kies seriële poort", 12, y); y += dy;

teks ("1: stel die spoed in op 0,001 duim (1 mil) per draf", 12, y); y += dy;

teks ("2: stel die spoed in op 1010 duim per draf", 12, y); y += dy;

teks ("3: stel die spoed in op 10000 mm per draf", 12, y); y += dy;

teks ("pyltjie sleutels: draf in x-y vlak", 12, y); y += dy;

teks ("bladsy op en bladsy af: draf in z -as", 12, y); y += dy;

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

teks ("h: gaan huis toe", 12, y); y += dy;

text ("0: zero -masjien (stel die huidige ligging tuis)", 12, y); y += dy;

text ("g: stroom 'n g-kode lêer", 12, y); y += dy;

teks ("x: stop streaming g-kode (dit is NIE onmiddellik nie)", 12, y); y += dy;

y = hoogte - dy;

teks ("huidige draaisnelheid:" + spoed + "duim per stap", 12, y); y -= dy;

teks ("huidige seriële poort:" + poortnaam, 12, y); y -= dy;

}

void keyPressed ()

{

as (sleutel == '1') spoed = 0.001;

as (sleutel == '2') spoed = 0,01;

as (sleutel == '3') spoed = 0,1;

as (! streaming) {

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

as (sleutelKode == REGS) port.write ("G91 / nG20 / nG00 X" + spoed + "Y0.000 Z0.000 / n");

as (sleutelKode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + spoed + "Z0.000 / n");

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

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

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

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

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

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

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

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

as (sleutel == 'd') port.write ("$ 16 = 0 / n");

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

as (sleutel == 'p') selectSerialPort ();

as (sleutel == '$') port.write ("$$ / n");

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

}

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

gcode = nul; ek = 0;

Lêer lêer = null;

println ("Laai lêer…");

selectInput ("Kies 'n lêer om te verwerk:", "fileSelected", lêer);

}

as (sleutel == 'x') streaming = vals;

}

void fileSelected (File selection) {

if (selection == null) {

println ("Venster is gesluit of die gebruiker druk op kanselleer.");

} anders {

println ("Gebruiker gekies" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

as (gcode == null) terugkeer;

streaming = waar;

stroom ();

}

}

leemte stroom ()

{

as (! streaming) terugkeer;

terwyl (waar) {

as (i == gcode.length) {

streaming = vals;

terugkeer;

}

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

anders breek;

}

println (gcode );

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

ek ++;

}

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: regtig?

}

Stap 5: Ontwerp en druk alle dele in laaghoutblad

Ontwerp en druk alle dele in laaghoutblad
Ontwerp en druk alle dele in laaghoutblad

Laai die robotdeel en ontwerp af in AutoCAD en druk die op die 12 mm laaghoutblad af en maak die gedeelte af en ontwerp. As iemand 'n cad -lêer nodig het, laat die kommentaar in die kommentaarblokkie, ek stuur dit direk.

Stap 6: Montering

Vergadering
Vergadering
Vergadering
Vergadering

versamel al die dele en rangskik in die volgorde op die prentjie wat gegee word en volg die beelddiagram.

Stap 7: Stel GBRL -instellings op

Omgewing wat bewys het dat dit op ons robotte werk.

$ 0 = 10 (stappuls, usec) $ 1 = 255 (vertraagde stap, msek) $ 2 = 7 (stap -poort -omkeringsmasker: 00000111) $ 3 = 7 (masker omdraai na poort omkeer: 00000111) $ 4 = 0 (stap aktiveer omkeer, bool) $ 5 = 0 (grenspenne omkeer, bool) $ 6 = 1 (sondepen omkeer, bool) $ 10 = 3 (statusverslagmasker: 00000011) $ 11 = 0.020 (kruisafwyking, mm) $ 12 = 0.002 (boogtoleransie, mm) $ 13 = 0 (rapporteer duim, bool) $ 20 = 0 (sagte perke, bool) $ 21 = 0 (harde perke, bool) $ 22 = 1 (homing cycle, bool) $ 23 = 0 (homing dir invert mask: 00000000) $ 24 = 100.000 (huisvoeding, mm/min) $ 25 = 500.000 (soek vir huise, mm/min) $ 26 = 250 (homing debounce, msec) $ 27 = 1.000 (homing pull-off, mm) $ 100 = 250.000 (x, stap/mm) $ 101 = 250.000 (y, stap/mm) $ 102 = 250.000 (z, stap/mm) $ 110 = 500.000 (x maksimum koers, mm/min) $ 111 = 500.000 (y maksimum koers, mm/min) $ 112 = 500.000 (z maksimum koers, 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 maksimum reis, mm) $ 131 = 200.000 (y maksimum reis, mm) $ 132 = 200.000 (z maksimum reis, mm)

Stap 8: Laai die finale kode op en kyk na die virtuele resultaat in die Arduino Uno Software Dashboard

// Eenhede: CM

float b_hoogte = 0;

dryf a1 = 92;

dryf a2 = 86;

float snude_len = 20;

booleaanse doZ = vals;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

dryf deur = 60; // = 0;

float bz = 60; // = 25;

dryf x = 60;

dryf y = 60;

vlot z = 60;

dryf q;

dryf c;

vlot V1;

vlot V2;

vlot V3;

vlot V4;

vlot V5;

ongeldige opstelling () {

grootte (700, 700, P3D);

cam = nuwe PeasyCam (hierdie, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

nietige trekking () {

// ligninger:

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

x = (muis Y - hoogte/2)*(- 1);

bz = z;

deur = 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_hoek = q;

V4 = radiale (90.0) - q;

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

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

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

arm1_hoek = grade (arm1_hoek);

arm2_hoek = grade (arm2_hoek);

// println (deur, bz);

// arm1_hoek = 90;

// arm2_hoek = 45;

/*

arm2_hoek = 23;

arm1_hoek = 23;

arm2_hoek = 23;

*/

// interaktief:

// as (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} anders

// {

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

draai Z (-1,2);

agtergrond (0);

ligte ();

pushMatrix ();

// BASIS

vul (150, 150, 150);

box_corner (50, 50, b_hoogte, 0);

draai (radiale (basis_hoek), 0, 0, 1);

// ARM 1

vul (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

fill (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

fill (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

vertaal (0, -action_box_size/2, action_box_size/2+b_hoogte);

pushMatrix ();

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

fill (255, 255, 0);

boks (20);

popMatrix ();

vul (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)

{

draai (radiale (draai), 1, 0, 0);

vertaal (0, 0, d/2);

boks (w, h, d);

vertaal (0, 0, d/2);

}

void keyPressed ()

{

as (sleutel == 'z')

{

doZ =! doZ;

}

as (sleutel == 'h')

{

// stel alles op nul

arm2_hoek = 0;

arm1_hoek = 90;

basishoek = 0;

}

as (sleutel == 'g')

{

println (grade (V1));

println (grade (V5));

}

as (sleutelKode == UP)

{

z ++;

}

as (keyCode == DOWN)

{

Z --;

}

as (sleutel == '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);

}

}

Aanbeveel: