Inhaltsverzeichnis:

Arduino Base Pick-and-Place-Roboter - Gunook
Arduino Base Pick-and-Place-Roboter - Gunook

Video: Arduino Base Pick-and-Place-Roboter - Gunook

Video: Arduino Base Pick-and-Place-Roboter - Gunook
Video: Pick and Place Robot using Arduino | DIY Arduino Project 2024, November
Anonim
Arduino Base Pick-and-Place-Roboter
Arduino Base Pick-and-Place-Roboter
Arduino Base Pick-and-Place-Roboter
Arduino Base Pick-and-Place-Roboter
Arduino Base Pick-and-Place-Roboter
Arduino Base Pick-and-Place-Roboter

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

Komponentenanforderung
Komponentenanforderung
Komponentenanforderung
Komponentenanforderung
Komponentenanforderung
Komponentenanforderung
Komponentenanforderung
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

Verbindung
Verbindung
Verbindung
Verbindung
Verbindung
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

Entwerfen und drucken Sie alle Teile in Sperrholzplatte
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

Montage
Montage
Montage
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);

}

}

Empfohlen: