Innehållsförteckning:
- Steg 1: Krav på komponenter
- Steg 2: Ladda ner Gui
- Steg 3: Anslutning
- Steg 4: Ladda upp firmware och kontrollera koderesultatet i Arduino Dashboard
- Steg 5: Designa och skriv ut alla delar i plywoodark
- Steg 6: Montering
- Steg 7: Konfigurera GBRL -inställningar
- Steg 8: Ladda upp den slutliga koden och kontrollera det virtuella resultatet i Arduino Uno Software Dashboard
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
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
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
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
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
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);
}
}