Inhaltsverzeichnis:
- Schritt 1: Komponentenanforderung
- Schritt 2: Gui. herunterladen
- Schritt 3: Verbindung
- Schritt 4: Firmware hochladen und das Codeergebnis im Arduino Dashboard überprüfen
- Schritt 5: Entwerfen und drucken Sie alle Teile in Sperrholzplatte
- Schritt 6: Montage
- Schritt 7: GBRL-Einstellungen einrichten
- Schritt 8: Laden Sie den endgültigen Code hoch und überprüfen Sie das virtuelle Ergebnis im Arduino Uno Software Dashboard
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Ich habe einen supergünstigen (weniger als 1000 Dollar) Industrieroboterarm hergestellt, um es Studenten zu ermöglichen, Roboter in größerem Maßstab zu hacken und um es kleinen lokalen Produktionen zu ermöglichen, Roboter in ihren Prozessen zu verwenden, ohne die Bank zu sprengen. Es ist einfach zu bauen und macht die Altersgruppe Menschen von 15 bis 50 Jahren.
Schritt 1: Komponentenanforderung
1. Arduino + Schild + Pins + Kabel
2. Motorcontroller: dm860A (Ebay)
3. Schrittmotor: 34hs5435c-37b2 (Ebay)
4. M8x45+60+70 Schrauben und M8 Schrauben.
5. 12mm Sperrholz.
6. 5mm Nylon.
7. Blindscheiben 8mm.
8. Holzschrauben 4,5x40mm.
9. M3 Konter versenkt, 10. 12V Netzteil
11. Servomotortreiber arduino
Schritt 2: Gui. herunterladen
zapmaker.org/projects/grbl-controller-3-0/
github.com/grbl/grbl/wiki/Using-Grbl
Schritt 3: Verbindung
Schließen Sie die im Bild angegebenen Drähte an, um das Verständnis für Sie zu verbessern.
Wir müssen den Motortreiber mit Arduino und anderen Anschlüssen verbinden, die für Ihren Roboter erforderlich sind.
Schritt 4: Firmware hochladen und das Codeergebnis im Arduino Dashboard überprüfen
Installieren der Firmware auf Arduino - GRBL:
github.com/grbl/grbl/wiki/Compiling-Grbl
Hinweis: Beim Kompilieren in Arduino kann ein Konflikt auftreten. Entfernen Sie alle anderen Bibliotheken aus Ihrem Bibliotheksordner (../documents/Arduino/libraries).
Firmware-Setup
Setzen Sie enable auf ein neueres Timeout. Verwenden Sie eine serielle Verbindung und schreiben Sie:
$1=255
Referenzfahrt einstellen:
$22=1
Denken Sie daran, seriell auf Baud einzustellen: 115200
Nützliche G-Codes
Nullpunkt für Roboter setzen:
G10 L2 Xnnn Ynnn Znnn
Nullpunkt verwenden:
G54
Typische Initialisierung zum Zentrieren des Roboters:
G10 L2 X1.5 Y1.2 Z1.1
G54
Roboter schnell in Position bringen:
G0 Xnnn Ynnn Znnn
Beispiel:
G0 X10.0 Y3.1 Z4.2 (Rücklauf)
Bewegen Sie den Roboter mit einer bestimmten Geschwindigkeit in eine Position:
G1 Xnnn Ynnn Znnn Fnnn
G1 X11 Y3 Z4 F300 (Rücklauf)
F sollte zwischen 10 (langsam) und 600 (schnell) liegen
Standardeinheiten für X, Y und Z
Bei Verwendung von Standardschritt-/Einheiteneinstellungen (250 Schritte/Einheit) für GRBL und
Schrittantrieb eingestellt auf 800 Schritt/U gelten folgende Einheiten für alle Achsen:
+- 32 Einheiten = +- 180 Grad
Beispiel für Verarbeitungscode:
Dieser Code kann direkt mit dem Arduino GRBL kommunizieren.
github.com/damellis/gctrl
Denken Sie daran, seriell auf Baud einzustellen: 115200
Code uoload in ardunio
import java.awt.event. KeyEvent;
import javax.swing. JOptionPane;
Importabwicklung.seriell.*;
Serielle Schnittstelle = null;
// Wählen und ändern Sie die entsprechende Zeile für Ihr Betriebssystem
// Null belassen, um den interaktiven Port zu verwenden (drücken Sie 'p' im Programm)
String-Portname = null;
// String-Portname = Serial.list () [0]; // Mac OS X
//String portname = "/dev/ttyUSB0"; // Linux
//String portname = "COM6"; // Fenster
boolesches Streaming = false;
Schwimmgeschwindigkeit = 0,001;
String gcode;
int i = 0;
void openSerialPort()
{
if (Portname == null) return;
if (port != null) port.stop();
port = new Serial (dieser, Portname, 115200);
port.bufferUntil('\n');
}
void selectSerialPort()
{
String result = (String) JOptionPane.showInputDialog(this, "Wählen Sie den seriellen Port aus, der Ihrem Arduino-Board entspricht.", "Serielle Schnittstelle auswählen", JOptionPane. PLAIN_MESSAGE, Null, Serial.list(), 0);
if (Ergebnis != null) {
Portname = Ergebnis;
openSerialPort();
}
}
Void-Setup ()
{
Größe (500, 250);
openSerialPort();
}
Leere zeichnen ()
{
Hintergrund(0);
füllen(255);
int y = 24, dy = 12;
text("ANLEITUNG", 12, y); y += dy;
text("p: Seriellen Port auswählen", 12, y); y += dy;
text("1: setze die Geschwindigkeit auf 0,001 Zoll (1 mil) pro Schritt", 12, y); y += dy;
text("2: setze die Geschwindigkeit auf 0,010 Zoll (10 mil) pro Schritt", 12, y); y += dy;
text("3: setze die Geschwindigkeit auf 0,100 Zoll (100 mil) pro Schritt", 12, y); y += dy;
text("Pfeiltasten: Jog in x-y-Ebene", 12, y); y += dy;
text("Bild hoch & Bild runter: Jog in Z-Achse", 12, y); y += dy;
text("$: grbl-Einstellungen anzeigen", 12, y); y+= dy;
text("h: nach Hause gehen", 12, y); y += dy;
text("0: Nullmaschine (auf den aktuellen Standort zurücksetzen)", 12, y); y += dy;
text("g: eine G-Code-Datei streamen", 12, y); y += dy;
text("x: Streaming von G-Code stoppen (dies ist NICHT sofort)", 12, y); y += dy;
y = Höhe - dy;
text("aktuelle Jog-Geschwindigkeit: " + Geschwindigkeit + " Zoll pro Schritt", 12, y); y -= dy;
text("aktueller serieller Port: " + Portname, 12, y); y -= dy;
}
Leere TasteGedrückt()
{
if (Taste == '1') Geschwindigkeit = 0,001;
if (Taste == '2') Geschwindigkeit = 0,01;
if (Taste == '3') Geschwindigkeit = 0,1;
if (!streaming) {
if (keyCode == LEFT) port.write("G91\nG20\nG00 X-" + Geschwindigkeit + " Y0.000 Z0.000\n");
if (keyCode == RIGHT) port.write("G91\nG20\nG00 X" + Geschwindigkeit + " Y0.000 Z0.000\n");
if (keyCode == UP) port.write("G91\nG20\nG00 X0.000 Y" + Geschwindigkeit + "Z0.000\n");
if (keyCode == DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + Geschwindigkeit + "Z0.000\n");
if (keyCode == KeyEvent. VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + Geschwindigkeit + "\n");
if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + Geschwindigkeit + "\n");
//if (Schlüssel == 'h') port.write("G90\nG20\nG00 X0.000 Y0.000 Z0.000\n");
if (Schlüssel == 'v') port.write("$0=75\n$1=74\n$2=75\n");
//if (Schlüssel == '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 (Schlüssel == '0') openSerialPort();
if (Schlüssel == 'p') selectSerialPort();
if (key == '$') port.write("$$\n");
if (key == 'h') port.write("$H\n");
}
if (!streaming && Schlüssel == 'g') {
gcode = null; ich = 0;
Dateidatei = null;
println("Datei wird geladen…");
selectInput("Wählen Sie eine zu verarbeitende Datei aus:", "fileSelected", file);
}
if (key == 'x') streaming = false;
}
void fileSelected(Dateiauswahl) {
if (Auswahl == null) {
println("Fenster wurde geschlossen oder der Benutzer hat auf Abbrechen geklickt.");
} anders {
println("Benutzer ausgewählt" + selection.getAbsolutePath());
gcode = loadStrings(selection.getAbsolutePath());
if (gcode == null) return;
Streaming = wahr;
Strom();
}
}
Leerer Strom ()
{
if (!streaming) zurück;
während (wahr) {
if (i == gcode.length) {
Streaming = falsch;
Rückkehr;
}
if (gcode.trim().length() == 0) i++;
sonst brechen;
}
println(gcode);
port.write(gcode + '\n');
i++;
}
void serialEvent(Serial p)
{
String s = p.readStringUntil('\n');
println(s.trim());
if (s.trim().startsWith("ok")) stream();
if (s.trim().startsWith("Fehler")) stream(); // XXX: Wirklich?
}
Schritt 5: Entwerfen und drucken Sie alle Teile in Sperrholzplatte
Laden Sie das Roboterteil und das Design in AutoCAD herunter und drucken Sie es auf die 12-mm-Sperrholzplatte und den Finish- und Designteil. Wenn jemand eine CAD-Datei benötigt, hinterlassen Sie den Kommentar im Kommentarfeld. Ich werde Sie direkt senden.
Schritt 6: Montage
Sammeln Sie alle Teile und ordnen Sie sie in der angegebenen Reihenfolge auf dem Bild an und folgen Sie dem Bilddiagramm.
Schritt 7: GBRL-Einstellungen einrichten
Eine Einstellung, die sich bei unseren Robotern bewährt hat.
$0=10 (Schrittimpuls, usec) $1=255 (Schritt-Leerlaufverzögerung, ms) $2=7 (Schritt-Port-Invertierungsmaske:00000111) $3=7 (Dir-Port-Invertierungsmaske:00000111) $4=0 (Schrittfreigabe invertieren, bool) $5=0 (Begrenzungsstifte invertieren, bool) $6=1 (Sondenstift invertieren, bool) $10=3 (Statusberichtsmaske:00000011) $11=0,020 (Verbindungsabweichung, mm) $12=0,002 (Lichtbogentoleranz, mm) $13 =0 (Inch melden, bool) $20=0 (weiche Grenzen, bool) $21=0 (harte Grenzen, bool) $22=1 (Referenzzyklus, bool) $23=0 (Referenzfahrt invertieren Maske:00000000) $24=100.000 (Referenzfahrtvorschub, mm/min) $25=500.000 (Referenzfahrt, mm/min) $26=250 (Referenzentprellung, msec) $27=1.000 (Referenzfahrt, mm) $100=250.000 (x, Schritt/mm) $101= 250.000 (y, Schritt/mm) $102=250.000 (z, Schritt/mm) $110=500.000 (x max. Rate, mm/min) $111=500.000 (y max. Rate, mm/min) $112=500.000 (z max. Rate, mm/min) $120=10.000 (x Beschleunigung, mm/sec^2) $121=10.000 (y Beschleunigung, mm/sec^2) $122=10.000 (z Beschleunigung, mm/sec^2) $130=200.000 (x max. Verfahrweg.), mm) $131=200.000 (y max. Verfahrweg, mm) $132=200.000 (z max. Verfahrweg, mm)
Schritt 8: Laden Sie den endgültigen Code hoch und überprüfen Sie das virtuelle Ergebnis im Arduino Uno Software Dashboard
// Einheiten: CM
float b_height = 0;
Schwimmer a1 = 92;
Schwimmer a2 = 86;
float snude_len = 20;
boolesches doZ = false;
float base_angle; // = 0;
Schwimmerarm1_Winkel; // = 0;
Schwimmerarm2_Winkel; //= 0;
Schwimmer bx = 60; // = 25;
schweben um = 60; // = 0;
Schwimmer bz = 60; // = 25;
Schwimmer x = 60;
Schwimmer y = 60;
Schwimmer z = 60;
schweben q;
Schwimmer c;
Schwimmer V1;
Schwimmer V2;
Schwimmer V3;
Schwimmer V4;
Schwimmer V5;
Leere Einrichtung () {
Größe (700, 700, P3D);
cam = neue PeasyCam (dies, 300);
cam.setMinimumDistance(50);
cam.setMaximumDistance(500);
}
Leere zeichnen () {
//Ligninger:
y = (MausX - Breite/2)*(-1);
x = (MausY - Höhe/2)*(-1);
bz = z;
um = 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_winkel = q;
V4 = Radiant (90,0) - q;
V5 = Bogenmaß (180) - V4 - Bogenmaß (90);
arm2_angle = Radiant (180,0) - (V5 + V1);
base_angle = Grad (atan2 (bx, by));
Arm1_Winkel=Grad (Arm1_Winkel);
arm2_angle=Grad (arm2_angle);
//println (von, bz);
// arm1_angle = 90;
// arm2_angle = 45;
/*
arm2_winkel = 23;
arm1_winkel= 23;
arm2_winkel=23;
*/
// interaktiv:
// wenn (doZ)
//
// {
// base_angle = base_angle+ mouseX-pmouseX;
// } anders
// {
// arm1_angle = arm1_angle+ pmouseX-mouseX;
// }
//
// arm2_angle = arm2_angle+ mouseY-pmouseY;
Draw_Robot (Basis_Winkel, -(Arm1_Winkel-90), Arm2_Winkel+90 - (-(Arm1_Winkel-90)));
// println (base_angle + ", " + arm1_angle + ", " + arm2_angle);
}
void draw_robot (float base_angle, float arm1_angle, float arm2_angle)
{
rotierenX(1.2);
rotiereZ(-1.2);
Hintergrund(0);
Beleuchtung();
pushMatrix();
// BASIS
füllen (150, 150, 150);
box_corner(50, 50, b_height, 0);
drehen (Radiant (Basiswinkel), 0, 0, 1);
// ARM 1
füllen (150, 0, 150);
box_corner(10, 10, a1, arm1_angle);
// ARM 2
füllen (255, 0, 0);
box_corner(10, 10, a2, arm2_angle);
// SNUDE
füllen (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);
füllen (255, 255, 0);
Kasten (20);
popMatrix();
füllen (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 rotieren)
{
drehen (Radiant (drehen), 1, 0, 0);
übersetzen (0, 0, d/2);
Kasten (b, h, t);
übersetzen (0, 0, d/2);
}
Leere TasteGedrückt()
{
if (Schlüssel == 'z')
{
doZ = !doZ;
}
if (Taste == 'h')
{
// setze alles auf null
arm2_winkel = 0;
arm1_winkel = 90;
Basiswinkel = 0;
}
if (Schlüssel == 'g')
{
println(Grad(V1));
println(Grad(V5));
}
if (keyCode == UP)
{
z++;
}
if (keyCode == DOWN)
{
z --;
}
if (Schlüssel == 'o')
{
y = 50;
z = 50;
println(q);
println(c, "c");
println(V1, "V1");
println(V2);
println(V3);
println(arm1_winkel);
println(V4);
println(V5);
println(arm2_angle);
}
}