Sadržaj:
- Korak 1: Zahtjevi za komponente
- Korak 2: Preuzmite Gui
- Korak 3: Povezivanje
- Korak 4: Prenesite firmver i provjerite rezultat koda na Arduino nadzornoj ploči
- Korak 5: Dizajnirajte i ispišite sve dijelove na listu šperploče
- Korak 6: Montaža
- Korak 7: Postavite GBRL postavke
- Korak 8: Otpremite konačni kod i provjerite virtualni rezultat na Arduino Uno softverskoj nadzornoj ploči
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
Napravio sam super jeftinu (manje od 1000 dolara) industrijsku robotsku ruku koja će omogućiti studentima da hakuju robotiku većih razmjera i omogućiti malim lokalnim produkcijama da koriste robote u svojim procesima, a da pri tome ne razbiju banku. Njegova Easija izgrađuje i čini starosnu grupu ljudi od 15 do 50 godina.
Korak 1: Zahtjevi za komponente
1. Arduino + Shield + Igle + kablovi
2. Kontroler motora: dm860A (Ebay)
3. Steppermotor: 34hs5435c-37b2 (Ebay)
4. M8x45+60+70 vijci i M8 vijci.
5. 12 mm šperploča.
6. Najlon od 5 mm.
7. Slijepe podloške 8 mm.
8. Vijci za drvo 4,5x40 mm.
9. M3 brojač utonuo, 10. 12v napajanje
11. upravljački program servo motora arduino
Korak 2: Preuzmite Gui
zapmaker.org/projects/grbl-controller-3-0/
github.com/grbl/grbl/wiki/Using-Grbl
Korak 3: Povezivanje
Za bolje razumijevanje spojite žice koje su prikazane na slici.
moramo spojiti upravljački program motora na Arduino i druge konektore koji su potrebni prema vašem robotu.
Korak 4: Prenesite firmver i provjerite rezultat koda na Arduino nadzornoj ploči
Instaliranje firmvera na Arduino - GRBL:
github.com/grbl/grbl/wiki/Compiling-Grbl
Napomena: Prilikom kompajliranja u Arduinu možete doći do sukoba. Uklonite sve ostale biblioteke iz fascikle biblioteke (../documents/Arduino/libraries).
Postavljanje firmvera
Omogući na novije vremensko ograničenje. Upotrijebite serijsku vezu i napišite:
$1=255
Postavite navođenje:
$22=1
Ne zaboravite postaviti serijski broj na baud: 115200
Korisni G-kodovi
Postavite nultu točku za robota:
G10 L2 Xnnn Ynnn Znnn
Koristite nultu tačku:
G54
Tipična inicijalizacija za središnjeg robota:
G10 L2 X1.5 Y1.2 Z1.1
G54
Brzo premjestite robota u položaj:
G0 Xnnn Ynnn Znnn
Primjer:
G0 X10.0 Y3.1 Z4.2 (povratak)
Pomaknite robota u položaj određene brzine:
G1 Xnnn Ynnn Znnn Fnnn
G1 X11 Y3 Z4 F300 (povratak)
F bi trebao biti između 10 (slooooow) i 600 (brzo)
Zadane jedinice za X, Y i Z
Kada koristite zadane postavke koraka/jedinice (250 koraka/jedinica) za GRBL i
koračni pogon postavljen za 800 koraka/okretaj, za sve osi vrijede sljedeće jedinice:
+- 32 jedinice = +- 180 stepeni
Primjer obrade koda:
Ovaj kod može komunicirati izravno s Arduino GRBL.
github.com/damellis/gctrl
Ne zaboravite postaviti serijski broj na baud: 115200
Kod uoload u ardunio
import java.awt.event. KeyEvent;
import javax.swing. JOptionPane;
import processing.serial.*;
Serijski port = null;
// odaberite i izmijenite odgovarajuću liniju za vaš operativni sistem
// ostavite kao null za korištenje interaktivnog porta (pritisnite 'p' u programu)
String portname = null;
// String portname = Serial.list () [0]; // Mac OS X
// String portname = "/dev/ttyUSB0"; // Linux
// String portname = "COM6"; // Windows
boolean streaming = false;
brzina plovka = 0,001;
String gcode;
int i = 0;
void openSerialPort ()
{
if (portname == null) return;
if (port! = null) port.stop ();
port = novi serijski (ovaj, naziv porta, 115200);
port.bufferUntil ('\ n');
}
void selectSerialPort ()
{
String result = (String) JOptionPane.showInputDialog (ovo, "Odaberite serijski port koji odgovara vašoj Arduino ploči.", "Odaberite serijski port", JOptionPane. PLAIN_MESSAGE, null, Serial.list (), 0);
if (rezultat! = null) {
portname = rezultat;
openSerialPort ();
}
}
void setup ()
{
veličina (500, 250);
openSerialPort ();
}
void draw ()
{
pozadina (0);
ispuniti (255);
int y = 24, dy = 12;
text ("UPUTSTVO", 12, y); y += dy;
text ("p: odaberite serijski port", 12, y); y += dy;
text ("1: postavite brzinu na 0,001 inča (1 mil)) po trčanju", 12, y); y += dy;
text ("2: postavite brzinu na 0,010 inča (10 milja) po trčanju", 12, y); y += dy;
text ("3: postavite brzinu na 100 milja po trčanju", 12, y); y += dy;
text ("tipke sa strelicama: trčanje u x-y ravnini", 12, y); y += dy;
text ("stranica gore & stranica dolje: pomak po osi z", 12, y); y += dy;
text ("$: display grbl settings", 12, y); y+= dy;
text ("h: go home", 12, y); y += dy;
text ("0: nulti stroj (postavite dom na trenutnu lokaciju)", 12, y); y += dy;
text ("g: strimovanje datoteke g-koda", 12, y); y += dy;
text ("x: zaustavi strimovanje g-koda (ovo NIJE odmah)", 12, y); y += dy;
y = visina - dy;
tekst ("trenutna brzina trčanja:" + brzina + "inča po koraku", 12, y); y -= dy;
text ("trenutni serijski port:" + naziv porta, 12, y); y -= dy;
}
void keyPressed ()
{
if (ključ == '1') brzina = 0,001;
if (ključ == '2') brzina = 0,01;
if (ključ == '3') brzina = 0,1;
if (! streaming) {
if (keyCode == LIJEVO) port.write ("G91 / nG20 / nG00 X-" + brzina + "Y0.000 Z0.000 / n");
if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + brzina + "Y0.000 Z0.000 / n");
if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + brzina + "Z0.000 / n");
if (keyCode == DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y-" + brzina + "Z0.000 / n");
if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + brzina + "\ n");
if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + brzina + "\ 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;
Datoteka datoteka = null;
println ("Učitavanje datoteke …");
selectInput ("Odaberite datoteku za obradu:", "fileSelected", datoteka);
}
if (key == 'x') streaming = false;
}
void fileSelected (odabir datoteke) {
if (odabir == null) {
println ("Prozor je zatvoren ili je korisnik otkazao.");
} else {
println ("Korisnički odabran" + selection.getAbsolutePath ());
gcode = loadStrings (selection.getAbsolutePath ());
if (gcode == null) return;
streaming = true;
potok();
}
}
void stream ()
{
if (! streaming) return;
while (istina) {
if (i == gcode.length) {
streaming = false;
return;
}
if (gcode .trim (). length () == 0) i ++;
else break;
}
println (gcode );
port.write (gcode + '\ n');
i ++;
}
void serialEvent (serijski p)
{
Niz s = p.readStringUntil ('\ n');
println (s.trim ());
if (s.trim (). startWith ("ok")) stream ();
if (s.trim (). startWith ("greška")) stream (); // XXX: stvarno?
}
Korak 5: Dizajnirajte i ispišite sve dijelove na listu šperploče
Preuzmite robotski dio i dizajn u AutoCAD -u i odštampajte dio od šperploče od 12 mm i završni i dizajnerski dio. Ako nekome treba cad datoteka plz, ostavite komentar u odjeljku za komentare, poslat ću ga direktno.
Korak 6: Montaža
sakupite sve dijelove i rasporedite u slijed na slici koja je data i slijedite dijagram slike.
Korak 7: Postavite GBRL postavke
Postavka koja se pokazala učinkovitom na našim robotima.
$ 0 = 10 (koračni impuls, usec) $ 1 = 255 (odgoda koraka u praznom hodu, ms) 2 $ = 7 (maska obrnutog porta za inverziju: 00000111) $ 3 = 7 (dir port invert mask: 00000111) $ 4 = 0 (step enable invert, bool) $ 5 = 0 (inverzija graničnih pinova, bool) $ 6 = 1 (invertiranje pinova sonde, bool) $ 10 = 3 (maska izvještaja o statusu: 00000011) $ 11 = 0,020 (odstupanje spoja, mm) $ 12 = 0,002 (tolerancija luka, mm) $ 13 = 0 (izvještaji u inčima, bool) 20 USD = 0 (meka ograničenja, bool) 21 USD = 0 (tvrda ograničenja, bool) 22 USD = 1 (ciklus navođenja, bool) 23 USD = 0 (maska za preusmjeravanje u smjeru smjera: 00000000) 24 USD = 100.000 (napon navođenja, mm/min) 25 USD = 500 000 (traženje navođenja, mm/min) 26 USD = 250 (otklanjanje navođenja, ms) 27 USD = 1000 (povlačenje navoja, mm) 100 USD = 250 000 (x, korak/mm) 101 USD = 250.000 (y, korak/mm) $ 102 = 250.000 (z, korak/mm) 110 $ = 500.000 (x maksimalna brzina, mm/min) 111 $ = 500.000 (y maksimalna brzina, mm/min) 112 $ = 500.000 (z max brzina, mm/min) $ 120 = 10.000 (x ubrzanje, mm/sek^2) 121 $ = 10.000 (y ubrzanje, mm/sek^2) $ 122 = 10.000 (z ubrzanje, mm/sek^2) $ 130 = 200.000 (x maksimalan hod), mm) 131 USD = 200.000 (y max hod, mm) 132 $ = 200.000 (z max hod, mm)
Korak 8: Otpremite konačni kod i provjerite virtualni rezultat na Arduino Uno softverskoj nadzornoj ploči
// Jedinice: CM
plovak b_height = 0;
plovak a1 = 92;
plovak a2 = 86;
float snude_len = 20;
boolean doZ = false;
float base_angle; // = 0;
float arm1_angle; // = 0;
float arm2_angle; // = 0;
plovak bx = 60; // = 25;
pluta za = 60; // = 0;
plovak bz = 60; // = 25;
plovak x = 60;
plovak y = 60;
plovak z = 60;
float q;
float c;
plovak V1;
plovak V2;
plovak V3;
plovak V4;
plovak V5;
void setup () {
veličina (700, 700, P3D);
cam = novi PeasyCam (ovaj, 300);
cam.setMinimumDistance (50);
cam.setMaximumDistance (500);
}
void draw () {
// ligninger:
y = (mouseX - širina/2)*(- 1);
x = (mouseY - visina/2)*(- 1);
bz = z;
by = 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 = radijani (90,0) - q;
V5 = radijani (180) - V4 - radijani (90);
arm2_angle = radijani (180.0) - (V5 + V1);
baza_ugao = stepeni (atan2 (bx, po));
arm1_angle = stepeni (arm1_angle);
arm2_angle = stepeni (arm2_angle);
// println (by, bz);
// arm1_angle = 90;
// arm2_angle = 45;
/*
arm2_angle = 23;
arm1_angle = 23;
arm2_angle = 23;
*/
// interaktivno:
// if (doZ)
//
// {
// base_angle = base_angle+ mouseX-pmouseX;
//} else
// {
// 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);
rotateZ (-1,2);
pozadina (0);
svjetla ();
pushMatrix ();
// BASE
ispuniti (150, 150, 150);
box_corner (50, 50, b_height, 0);
rotirati (radijani (osnovni_ugao), 0, 0, 1);
// ARM 1
ispuniti (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;
translate (0, -action_box_size/2, action_box_size/2+b_height);
pushMatrix ();
prevesti (x, action_box_size- y-action_box_size/2, z-action_box_size/2);
fill (255, 255, 0);
kutija (20);
popMatrix ();
ispuniti (255, 255, 255, 50);
okvir (veličina_akcije_akcije, veličina_kutije_akcije, veličina_kutije_akcije);
popMatrix ();
}
void box_corner (float w, float h, float d, float rotate)
{
rotirati (radijani (rotirati), 1, 0, 0);
prevesti (0, 0, d/2);
kutija (w, h, d);
prevesti (0, 0, d/2);
}
void keyPressed ()
{
if (ključ == 'z')
{
doZ =! doZ;
}
if (ključ == 'h')
{
// sve postaviti na nulu
arm2_angle = 0;
arm1_angle = 90;
baza_ugao = 0;
}
if (ključ == 'g')
{
println (stepeni (V1));
println (stepeni (V5));
}
if (keyCode == GORE)
{
z ++;
}
if (keyCode == DOLJE)
{
z -;
}
if (ključ == '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);
}
}