Πίνακας περιεχομένων:

Arduino Base Pick and Place Robot: 8 Βήματα
Arduino Base Pick and Place Robot: 8 Βήματα

Βίντεο: Arduino Base Pick and Place Robot: 8 Βήματα

Βίντεο: Arduino Base Pick and Place Robot: 8 Βήματα
Βίντεο: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Νοέμβριος
Anonim
Ρομπότ Arduino Base Pick and Place
Ρομπότ Arduino Base Pick and Place
Ρομπότ Arduino Base Pick and Place
Ρομπότ Arduino Base Pick and Place
Ρομπότ Arduino Base Pick and Place
Ρομπότ Arduino Base Pick and Place

Έφτιαξα ένα εξαιρετικά φθηνό (λιγότερο από 1000 δολάρια) βιομηχανικό ρομπότ για να επιτρέψω στους μαθητές να χακάρουν ρομπότ μεγαλύτερης κλίμακας και να επιτρέψουν σε μικρές τοπικές παραγωγές να χρησιμοποιούν ρομπότ στις διαδικασίες τους χωρίς να σπάσουν την τράπεζα. Η ευκολία του να δημιουργήσει και να κάνει την ηλικιακή ομάδα άτομα από 15 έως 50 ετών.

Βήμα 1: Απαίτηση εξαρτημάτων

Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων
Απαίτηση εξαρτημάτων

1. Arduino + Shield + Pins + Καλώδια

2. Μηχανοκίνητος ελεγκτής: dm860A (Ebay)

3. Steppermotor: 34hs5435c-37b2 (Ebay)

4. Βίδες M8x45+60+70 και μπουλόνια M8.

5. Κόντρα πλακέ 12mm.

6. Νάιλον 5mm.

7. Τυφλές ροδέλες 8mm.

8. Βίδες ξύλου 4,5x40mm.

9. Μετρητής M3 βυθισμένος, 10. Τροφοδοσία 12v

11. οδηγός σερβοκινητήρα arduino

Βήμα 2: Λήψη του Gui

zapmaker.org/projects/grbl-controller-3-0/

github.com/grbl/grbl/wiki/Using-Grbl

Βήμα 3: Σύνδεση

Σύνδεση
Σύνδεση
Σύνδεση
Σύνδεση
Σύνδεση
Σύνδεση

Συνδέστε τα καλώδια που δίνονται στην εικόνα είναι μεγαλύτερη κατανόηση για εσάς.

πρέπει να συνδέσουμε το πρόγραμμα οδήγησης κινητήρα στο Arduino και σε άλλες υποδοχές που απαιτούνται σύμφωνα με το ρομπότ σας.

Βήμα 4: Ανεβάστε το υλικολογισμικό και ελέγξτε το αποτέλεσμα του κώδικα στον πίνακα ελέγχου Arduino

Εγκατάσταση του υλικολογισμικού στο Arduino - GRBL:

github.com/grbl/grbl/wiki/Compiling-Grbl

Σημείωση: Ενδέχεται να υπάρξει διένεξη κατά τη μεταγλώττιση στο Arduino. Καταργήστε όλες τις άλλες βιβλιοθήκες από το φάκελο της βιβλιοθήκης σας (../documents/Arduino/libraries).

Ρύθμιση υλικολογισμικού

Ορισμός ενεργοποίησης σε νεότερο χρονικό όριο. Χρησιμοποιήστε σειριακή σύνδεση και γράψτε:

$1=255

Ορισμός κατοικίας:

$22=1

Θυμηθείτε να ορίσετε το σειριακό σε baud: 115200

Χρήσιμοι κωδικοί G

Ορίστε μηδενικό σημείο για ρομπότ:

G10 L2 Xnnn Ynnn Znnn

Χρησιμοποιήστε μηδενικό σημείο:

G54

Τυπική προετοιμασία στο κεντρικό ρομπότ:

G10 L2 X1.5 Y1.2 Z1.1

G54

Μετακινήστε το ρομπότ στη θέση του γρήγορα:

G0 Xnnn Ynnn Znnn

Παράδειγμα:

G0 X10.0 Y3.1 Z4.2 (επιστροφή)

Μετακινήστε το ρομπότ στη θέση με συγκεκριμένη ταχύτητα:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (επιστροφή)

Το F πρέπει να είναι μεταξύ 10 (αργά) και 600 (γρήγορα)

Προεπιλεγμένες μονάδες για Χ, Υ και Ζ

Όταν χρησιμοποιείτε τις προεπιλεγμένες ρυθμίσεις βήματος/μονάδων (250 βήματα/μονάδες) για GRBL και

stepper drive που έχει ρυθμιστεί για 800 βήματα/στροφές ισχύουν οι ακόλουθες μονάδες για όλους τους άξονες:

+- 32 μονάδες = +- 180 μοίρες

Παράδειγμα επεξεργασίας κώδικα:

Αυτός ο κωδικός μπορεί να επικοινωνήσει απευθείας με το Arduino GRBL.

github.com/damellis/gctrl

Θυμηθείτε να ορίσετε το σειριακό σε baud: 115200

Κωδικός uoload in ardunio

εισαγωγή java.awt.event. KeyEvent;

εισαγωγή javax.swing. JOptionPane;

επεξεργασία εισαγωγής.σειρά.*;

Σειριακή θύρα = null;

// επιλέξτε και τροποποιήστε την κατάλληλη γραμμή για το λειτουργικό σας σύστημα

// αφήστε ως null για χρήση διαδραστικής θύρας (πατήστε 'p' στο πρόγραμμα)

String portname = null;

// String portname = Serial.list () [0]; // Mac OS X

// String portname = "/dev/ttyUSB0"; // Linux

// String portname = "COM6"; // Windows

boolean streaming = false?

ταχύτητα πλεύσης = 0,001;

Συμβολοσειρά gcode;

int i = 0;

void openSerialPort ()

{

εάν (όνομα θύρας == null) επιστροφή

if (port! = null) port.stop ();

port = new Serial (this, portname, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String result = (String) JOptionPane.showInputDialog (αυτό, "Επιλέξτε τη σειριακή θύρα που αντιστοιχεί στον πίνακα Arduino.", "Επιλογή σειριακής θύρας", JOptionPane. PLAIN_MESSAGE, μηδενικό, Serial.list (), 0);

αν (αποτέλεσμα! = null) {

όνομα θύρας = αποτέλεσμα.

openSerialPort ();

}

}

void setup ()

{

μέγεθος (500, 250).

openSerialPort ();

}

άκυρη κλήρωση ()

{

φόντο (0);

γέμισμα (255);

int y = 24, dy = 12;

κείμενο ("ΟΔΗΓΙΕΣ", 12, y); y += dy;

κείμενο ("p: επιλέξτε σειριακή θύρα", 12, y); y += dy;

κείμενο ("1: ρυθμίστε την ταχύτητα σε 0,001 ίντσες (1 mil) ανά τζόκινγκ", 12, y); y += dy;

κείμενο ("2: ρυθμίστε την ταχύτητα σε 0,010 ίντσες (10 mil) ανά τζόκινγκ", 12, y); y += dy;

κείμενο ("3: ρυθμίστε την ταχύτητα σε 0,100 ίντσες (100 mil) ανά τζόκινγκ", 12, y); y += dy;

κείμενο ("πλήκτρα βέλους: τζόκινγκ στο επίπεδο x-y", 12, y); y += dy;

κείμενο ("σελίδα επάνω & σελίδα κάτω: jog in z axis", 12, y); y += dy;

κείμενο ("$: display grbl settings", 12, y); y+= dy;

κείμενο ("h: go home", 12, y); y += dy;

κείμενο ("0: μηδενικό μηχάνημα (ρυθμίστε το σπίτι στην τρέχουσα τοποθεσία)", 12, y); y += dy;

κείμενο ("g: ροή αρχείου κώδικα g", 12, y); y += dy;

κείμενο ("x: διακοπή ροής g-code (αυτό ΔΕΝ είναι άμεσο)", 12, y); y += dy;

y = ύψος - dy;

κείμενο ("τρέχουσα ταχύτητα τρέξιμο:" + ταχύτητα + "ίντσες ανά βήμα", 12, y); y -= dy;

κείμενο ("τρέχουσα σειριακή θύρα:" + όνομα θύρας, 12, y); y -= dy;

}

void keyPressed ()

{

εάν (κλειδί == '1') ταχύτητα = 0,001;

εάν (κλειδί == '2') ταχύτητα = 0,01;

εάν (κλειδί == '3') ταχύτητα = 0,1.

αν (! ροή) {

if (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + ταχύτητα + "Y0.000 Z0.000 / n");

if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + ταχύτητα + "Y0.000 Z0.000 / n");

if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + ταχύτητα + "Z0.000 / n");

if (keyCode == ΚΑΤΩ) port.write ("G91 / nG20 / nG00 X0.000 Y-" + ταχύτητα + "Z0.000 / n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + ταχύτητα + "\ n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + ταχύτητα + "\ 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 (κλειδί == 'e') port.write ("$ 16 = 1 / n");

if (κλειδί == 'd') port.write ("$ 16 = 0 / n");

εάν (κλειδί == '0') openSerialPort ();

εάν (κλειδί == 'p') επιλέξτεSerialPort ();

if (key == '$') port.write ("$$ / n");

if (κλειδί == 'h') port.write ("$ H / n");

}

εάν (! streaming && key == 'g') {

gcode = null; i = 0;

Αρχείο αρχείου = null;

println ("Φόρτωση αρχείου …");

selectInput ("Επιλογή αρχείου προς επεξεργασία:", "fileSelected", αρχείο);

}

if (key == 'x') streaming = false?

}

void fileSelected (επιλογή αρχείου) {

εάν (επιλογή == null) {

println ("Το παράθυρο έκλεισε ή ο χρήστης χτύπησε την ακύρωση.");

} αλλο {

println ("Επιλεγμένος χρήστης" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return?

streaming = true?

ρεύμα();

}

}

κενό ρεύμα ()

{

αν (! streaming) επιστρέψει?

ενώ (αληθινό) {

εάν (i == gcode.length) {

streaming = false?

ΕΠΙΣΤΡΟΦΗ;

}

εάν (gcode .trim (). μήκος () == 0) i ++;

αλλιώς σπάστε?

}

println (gcode );

port.write (gcode + '\ n');

i ++?

}

void serialEvent (Serial p)

{

String s = p.readStringUntil ('\ n');

println (s.trim ());

εάν (s.trim (). ξεκινάει με ("εντάξει")) ροή ();

εάν (s.trim (). ξεκινάει με ("σφάλμα")) ροή (); // XXX: αλήθεια;

}

Βήμα 5: Σχεδιάστε και εκτυπώστε όλο το μέρος σε φύλλο κόντρα πλακέ

Σχεδιάστε και εκτυπώστε όλα τα μέρη σε φύλλο κόντρα πλακέ
Σχεδιάστε και εκτυπώστε όλα τα μέρη σε φύλλο κόντρα πλακέ

Κατεβάστε το μέρος και το σχέδιο του ρομπότ στο AutoCAD και εκτυπώστε το σε φύλλο κόντρα πλακέ 12mm και τελειώστε και σχεδιάστε το τμήμα. Εάν κάποιος χρειάζεται αρχείο cad plz αφήστε το σχόλιο στο πλαίσιο ενότητας σχολίων που θα σας στείλω απευθείας.

Βήμα 6: Συναρμολόγηση

Συνέλευση
Συνέλευση
Συνέλευση
Συνέλευση

συλλέξτε όλο το μέρος και τακτοποιήστε την ακολουθία στην εικόνα που δίνεται και ακολουθήστε το διάγραμμα εικόνας.

Βήμα 7: Ρυθμίστε τις ρυθμίσεις GBRL

Ρύθμιση που έχει αποδειχθεί ότι λειτουργεί στα ρομπότ μας.

$ 0 = 10 (παλμός βημάτων, usec) $ 1 = 255 (καθυστέρηση στο ρελαντί βήματος, msec) $ 2 = 7 (μάσκα αναστροφής βημάτων βήματος: 00000111) $ 3 = 7 (μάσκα αναστροφής θύρας σκηνής: 00000111) $ 4 = 0 (ενεργοποίηση βήματος αναστροφή, μπουλ) $ 5 = 0 (όρια αναστροφής, bool) $ 6 = 1 (αναστροφή πείρου ανιχνευτή, bool) $ 10 = 3 (μάσκα αναφοράς κατάστασης: 00000011) $ 11 = 0.020 (απόκλιση σύνδεσης, mm) $ 12 = 0.002 (ανοχή τόξου, mm) $ 13 = 0 (αναφορά ίντσες, bool) $ 20 = 0 (απαλά όρια, bool) $ 21 = 0 (σκληρά όρια, bool) $ 22 = 1 (κύκλος επιστροφής, bool) $ 23 = 0 (homing dir invert mask: 00000000) $ 24 = 100.000 (τροφή στο σπίτι, mm/min) $ 25 = 500.000 (αναζήτηση στο σπίτι, mm/min) $ 26 = 250 $ (έξοδος στο σπίτι, msec) $ 27 = 1.000 (pull-off στο σπίτι, mm) $ 100 = 250.000 (x, βήμα/mm) $ 101 = 250.000 (y, βήμα/mm) $ 102 = 250.000 (z, βήμα/mm) $ 110 = 500.000 (x max ρυθμός, 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 μέγιστο ταξίδι, mm) $ 131 = 200.000 (y μέγιστο ταξίδι, mm) $ 132 = 200.000 (z max διαδρομή, mm)

Βήμα 8: Ανεβάστε τον Τελικό Κώδικα και Ελέγξτε το Εικονικό Αποτέλεσμα στον Πίνακα ελέγχου λογισμικού Arduino Uno

// Μονάδες: CM

float b_height = 0;

float a1 = 92;

float a2 = 86;

float snude_len = 20;

boolean doZ = false;

float base_angle; // = 0;

float arm1_angle? // = 0;

float arm2_angle? // = 0;

float bx = 60; // = 25;

επιπλέουν κατά = 60; // = 0;

float bz = 60; // = 25;

float x = 60;

float y = 60;

float z = 60;

float q?

float c?

float V1?

float V2?

float V3?

float V4?

float V5?

void setup () {

μέγεθος (700, 700, P3D).

cam = νέο PeasyCam (αυτό, 300)?

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

άκυρη κλήρωση () {

// ligninger:

y = (mouseX - πλάτος/2)*(- 1);

x = (ποντίκιY - ύψος/2)*(- 1);

bz = z;

κατά = 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 = ακτίνια (90,0) - q;

V5 = ακτίνια (180) - V4 - ακτίνια (90).

arm2_angle = ακτίνια (180.0) - (V5 + V1);

base_angle = μοίρες (atan2 (bx, by));

arm1_angle = μοίρες (arm1_angle)?

arm2_angle = μοίρες (arm2_angle);

// println (by, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// διαδραστικό:

// εάν (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} άλλο

// {

// arm1_angle = arm1_angle+ pmouseX-mouseX;

// }

//

// arm2_angle = arm2_angle+ ποντίκιY-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)

{

περιστροφή X (1.2);

περιστροφή Z (-1.2);

φόντο (0);

φώτα();

pushMatrix ();

// ΒΑΣΗ

γεμίστε (150, 150, 150).

box_corner (50, 50, b_height, 0);

περιστροφή (ακτίνια (βασικό_γώνιο), 0, 0, 1).

// ARM 1

γέμισμα (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

γέμισμα (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

γέμισμα (255, 150, 0);

box_corner (10, 10, snude_len, -arm1_angle -arm2_angle+90);

popMatrix ();

pushMatrix ();

float action_box_size = 100;

μετάφραση (0, -action_box_size/2, action_box_size/2+b_height);

pushMatrix ();

μετάφραση (x, action_box_size- y-action_box_size/2, z-action_box_size/2);

γέμισμα (255, 255, 0);

κουτί (20)?

popMatrix ();

γέμισμα (255, 255, 255, 50).

πλαίσιο (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

void box_corner (float w, float h, float d, float rotate)

{

περιστροφή (ακτίνια (περιστροφή), 1, 0, 0).

μετάφραση (0, 0, d/2).

κουτί (w, h, d)?

μετάφραση (0, 0, d/2).

}

void keyPressed ()

{

εάν (κλειδί == 'z')

{

doZ =! doZ;

}

εάν (κλειδί == 'h')

{

// ορίστε όλα στο μηδέν

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

εάν (κλειδί == 'g')

{

println (μοίρες (V1));

println (μοίρες (V5));

}

εάν (keyCode == ΕΠΑΝΩ)

{

z ++;

}

εάν (keyCode == ΚΑΤΩ)

{

z -;

}

εάν (κλειδί == '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);

}

}

Συνιστάται: