INHOUDSOPGAWE:
- Stap 1: Vereiste komponente
- Stap 2: Laai Gui af
- Stap 3: verbinding
- Stap 4: Laai firmware op en kyk na die resultaat van die kode in die Arduino -dashboard
- Stap 5: Ontwerp en druk alle dele in laaghoutblad
- Stap 6: Montering
- Stap 7: Stel GBRL -instellings op
- Stap 8: Laai die finale kode op en kyk na die virtuele resultaat in die Arduino Uno Software Dashboard
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
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
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
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
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
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);
}
}