Inhoudsopgave:

Arduino Base Pick and Place Robot - Ajarnpa
Arduino Base Pick and Place Robot - Ajarnpa

Video: Arduino Base Pick and Place Robot - Ajarnpa

Video: Arduino Base Pick and Place Robot - Ajarnpa
Video: Dealing With Difficult People | Ajahn Brahm | 28 Nov 2008 2024, November
Anonim
Arduino Basis Pick and Place Robot
Arduino Basis Pick and Place Robot
Arduino Basis Pick and Place Robot
Arduino Basis Pick and Place Robot
Arduino Basis Pick and Place Robot
Arduino Basis Pick and Place Robot

Ik heb een supergoedkope (minder dan 1000 dollar) industriële robotarm gemaakt om studenten in staat te stellen grootschaligere robotica te hacken en om kleine lokale producties in staat te stellen robots in hun processen te gebruiken zonder de bank te breken. Het is gemakkelijk te bouwen en de leeftijdsgroep mensen van 15 tot 50 jaar te maken.

Stap 1: Componentenvereiste:

Componentenvereiste
Componentenvereiste
Componentenvereiste
Componentenvereiste
Componentenvereiste
Componentenvereiste
Componentenvereiste
Componentenvereiste

1. Arduino+ schild + pinnen + kabels

2. Motorcontroller: dm860A (Ebay)

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

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

5. 12 mm multiplex.

6. 5 mm nylon.

7. Blindringen 8mm.

8. Houtschroeven 4.5x40mm.

9. M3 Verzonken, 10. 12v voeding

11. servomotorbestuurder arduino

Stap 2: Download Gui

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

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

Stap 3: Aansluiting

Verbinding
Verbinding
Verbinding
Verbinding
Verbinding
Verbinding

Sluit de draden aan die in de afbeelding worden gegeven, is meer begrip voor u.

we moeten de motordriver aansluiten op Arduino en andere connectoren die vereist zijn volgens uw robot.

Stap 4: Firmware uploaden en het coderesultaat controleren in Arduino Dashboard

De firmware installeren op Arduino - GRBL:

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

Opmerking: u kunt een conflict krijgen bij het compileren in Arduino. Verwijder alle andere bibliotheken uit uw bibliotheekmap (../documents/Arduino/libraries).

Firmware instellen

Stel inschakelen in op nieuwere time-out. Gebruik een seriële verbinding en schrijf:

$1=255

homing instellen:

$22=1

Vergeet niet om serieel in te stellen op baud: 115200

Handige G-codes

Stel nulpunt in voor robot:

G10 L2 Xnnn Ynnn Znnn

Gebruik nulpunt:

G54

Typische initialisatie om de robot te centreren:

G10 L2 X1.5 Y1.2 Z1.1

G54

Beweeg robot snel naar positie:

G0 Xnnn Ynnn Znnn

Voorbeeld:

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

Beweeg de robot met een bepaalde snelheid naar de positie:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retour)

F moet tussen 10 (slooooow) en 600 (snel) zijn

Standaardeenheden voor X, Y en Z

Bij gebruik van standaard stappen/eenheden (250 stappen/eenheid) voor GRBL en

stepper drive ingesteld voor 800 step/rev de volgende eenheden gelden voor alle assen:

+- 32 eenheden = +- 180 graden

Voorbeeld van verwerkingscode:

Deze code kan direct communiceren met de Arduino GRBL.

github.com/damellis/gctrl

Vergeet niet om serieel in te stellen op baud: 115200

Code uoload in ardunio

import java.awt.event. KeyEvent;

javax.swing. JOptionPane importeren;

importverwerking.serienummer.*;

Seriële poort = null;

// selecteer en wijzig de juiste regel voor uw besturingssysteem

// laat staan als null om interactieve poort te gebruiken (druk op 'p' in het programma)

String poortnaam = null;

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

//String poortnaam = "/dev/ttyUSB0"; // Linux

//String poortnaam = "COM6"; // Ramen

booleaanse streaming = false;

vlottersnelheid = 0,001;

String gcode;

int ik = 0;

ongeldig openSerialPort()

{

if (poortnaam == null) return;

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

poort = nieuw serieel (dit, poortnaam, 115200);

poort.bufferTot('\n');

}

ongeldig selectSerialPort()

{

String resultaat = (String) JOptionPane.showInputDialog(this, "Selecteer de seriële poort die overeenkomt met uw Arduino-bord.", "Selecteer seriële poort", JOptionPane. PLAIN_MESSAGE, nul, Seriële.lijst(), 0);

if (resultaat != null) {

poortnaam = resultaat;

openSerialPort();

}

}

ongeldige setup()

{

maat (500, 250);

openSerialPort();

}

nietig tekenen()

{

achtergrond(0);

vullen (255);

int y = 24, dy = 12;

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

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

text("1: zet snelheid op 0,001 inch (1 mil) per jog", 12, y); y += dy;

text("2: zet snelheid op 0,010 inch (10 mil) per jog", 12, y); y += dy;

text("3: zet snelheid op 0,100 inch (100 mil) per jog", 12, y); y += dy;

text("pijltjestoetsen: jog in xy-vlak", 12, y); y += dy;

text("pagina omhoog & pagina omlaag: jog in z-as", 12, y); y += dy;

text("$: grbl-instellingen weergeven", 12, y); y+= dy;

text("h: ga naar huis", 12, y); y += dy;

text("0: zero machine (zet thuis op de huidige locatie)", 12, y); y += dy;

text("g: stream een g-code bestand", 12, y); y += dy;

text("x: stop met streamen van g-code (dit is NIET onmiddellijk)", 12, y); y += dy;

y = hoogte - dy;

text("huidige jogsnelheid: " + snelheid + " inches per stap", 12, y); y -= dy;

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

}

void-toets ingedrukt()

{

if (toets == '1') snelheid = 0,001;

if (toets == '2') snelheid = 0,01;

if (toets == '3') snelheid = 0,1;

if (!streaming) {

if (keyCode == LEFT) port.write("G91\nG20\nG00 X-" + snelheid + " Y0.000 Z0.000\n");

if (keyCode == RECHTS) port.write("G91\nG20\nG00 X" + snelheid + " Y0.000 Z0.000\n");

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

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

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

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

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

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

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

}

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

gcode = nul; ik = 0;

Bestandsbestand = null;

println("Bestand wordt geladen…");

selectInput("Selecteer een bestand om te verwerken:", "fileSelected", bestand);

}

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

}

void fileSelected (Bestandsselectie) {

if (selectie == null) {

println("Venster is gesloten of de gebruiker heeft op annuleren gedrukt.");

} anders {

println("Geselecteerde gebruiker" + selection.getAbsolutePath());

gcode = loadStrings(selection.getAbsolutePath());

if (gcode == null) terugkeer;

streamen = waar;

stroom();

}

}

ongeldige stroom()

{

als (!streaming) terugkeer;

terwijl (waar) {

if (i == gcode.length) {

streamen = onwaar;

opbrengst;

}

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

anders breken;

}

println(gcode);

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

i++;

}

void serialEvent (Seriële p)

{

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

println(s.trim());

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

if (s.trim().startsWith("fout")) stream(); // XXX: echt?

}

Stap 5: Ontwerp en print alle onderdelen in multiplexplaat

Ontwerp en print alle onderdelen in multiplexplaat
Ontwerp en print alle onderdelen in multiplexplaat

Download het robotgedeelte en ontwerp in AutoCAD en print het op de 12 mm multiplexplaat en het afwerkings- en ontwerpgedeelte. Als iemand een CAD-bestand nodig heeft, laat dan de opmerking achter in het opmerkingenveld, ik zal je direct verzenden.

Stap 6: Montage

samenkomst
samenkomst
samenkomst
samenkomst

verzamel alle onderdelen en rangschik ze in de volgorde op de afbeelding die wordt gegeven en volg het afbeeldingsdiagram.

Stap 7: GBRL-instellingen instellen

Instelling die bewezen heeft te werken op onze robots.

$0=10 (step pulse, usec) $1=255 (step idle delay, msec) $2=7 (step port invert mask:000000111) $3=7 (dir port invert mask:000000111) $4=0 (step enable invert, bool) $5=0 (limiet pinnen invert, bool) $6=1 (probe pin invert, bool) $10=3 (statusrapport masker:00000011) $11=0,020 (junctie afwijking, mm) $12=0,002 (boogtolerantie, mm) $13 =0 (rapport inches, bool) $20=0 (zachte limieten, bool) $21=0 (harde limieten, bool) $22=1 (homing cycle, 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, 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 max snelheid, mm/min) $111=500.000 (y max snelheid, mm/min) $112=500.000 (z max snelheid, mm/min) $120=10.000 (x versnelling, mm/sec^2) $121=10.000 (y versnelling, mm/sec^2) $122=10.000 (z versnelling, mm/sec^2) $130=200.000 (x max. verplaatsing, mm) $131=200.000 (y max. slag, mm) $132=200.000 (z max. slag, mm)

Stap 8: Upload de definitieve code en controleer het virtuele resultaat in Arduino Uno Software Dashboard

// Eenheden: CM

zweven b_height = 0;

vlotter a1 = 92;

vlotter a2 = 86;

float snude_len = 20;

booleaans doZ = onwaar;

float base_angle;// = 0;

vlotterarm1_hoek; // = 0;

vlotterarm2_hoek; //= 0;

vlotter bx = 60;// = 25;

zweven met = 60;// = 0;

zweven bz = 60;// = 25;

zweven x = 60;

zweven y = 60;

zweven z = 60;

vlotter q;

zweven c;

vlotter V1;

vlotter V2;

vlotter V3;

vlotter V4;

vlotter V5;

ongeldige setup() {

grootte (700, 700, P3D);

cam = nieuwe PeasyCam (dit, 300);

cam.setMinimumDistance(50);

nok.setMaximumAfstand(500);

}

nietig tekenen() {

//ligger:

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

x = (muisY - hoogte/2)*(-1);

bz = z;

door = 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 = radialen (90.0) - q;

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

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

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

arm1_hoek=graden(arm1_hoek);

arm2_angle=graden(arm2_angle);

//println(door, bz);

//arm1_hoek = 90;

//arm2_hoek = 45;

/*

arm2_hoek = 23;

arm1_hoek = 23;

arm2_hoek=23;

*/

// interactief:

// als (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)

{

roterenX(1.2);

roterenZ(-1.2);

achtergrond(0);

lichten();

pushMatrix();

// BASIS

vullen (150, 150, 150);

box_corner(50, 50, b_height, 0);

roteren (radialen (basishoek), 0, 0, 1);

// ARM 1

vullen (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

vullen (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

vul (255, 150, 0);

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

popMatrix();

pushMatrix();

float action_box_size=100;

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

pushMatrix();

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

vullen (255, 255, 0);

doos(20);

popMatrix();

vullen (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 roteren)

{

roteren (radialen (roteren), 1, 0, 0);

vertalen (0, 0, d/2);

doos (b, h, d);

vertalen (0, 0, d/2);

}

void-toets ingedrukt()

{

if (toets == 'z')

{

doZ = !doZ;

}

if (toets == 'h')

{

// zet alles op nul

arm2_hoek = 0;

arm1_hoek = 90;

basishoek = 0;

}

if (toets == 'g')

{

println(graden(V1));

println(graden(V5));

}

if (keyCode == OMHOOG)

{

z++;

}

if (keyCode == OMLAAG)

{

z --;

}

if (toets == 'o')

{

y = 50;

z = 50;

println(q);

println(c, "c");

println(V1, "V1");

println(V2);

println(V3);

println(arm1_hoek);

println(V4);

println(V5);

println(arm2_hoek);

}

}

Aanbevolen: