Πίνακας περιεχομένων:
- Βήμα 1: Απαίτηση εξαρτημάτων
- Βήμα 2: Λήψη του Gui
- Βήμα 3: Σύνδεση
- Βήμα 4: Ανεβάστε το υλικολογισμικό και ελέγξτε το αποτέλεσμα του κώδικα στον πίνακα ελέγχου Arduino
- Βήμα 5: Σχεδιάστε και εκτυπώστε όλο το μέρος σε φύλλο κόντρα πλακέ
- Βήμα 6: Συναρμολόγηση
- Βήμα 7: Ρυθμίστε τις ρυθμίσεις GBRL
- Βήμα 8: Ανεβάστε τον Τελικό Κώδικα και Ελέγξτε το Εικονικό Αποτέλεσμα στον Πίνακα ελέγχου λογισμικού Arduino Uno
Βίντεο: Arduino Base Pick and Place Robot: 8 Βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Έφτιαξα ένα εξαιρετικά φθηνό (λιγότερο από 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);
}
}
Συνιστάται:
Arduino Control DC Speed and Direction Speed and Direction Using Potentiometer, OLED Display & Buttons: 6 βήματα
Arduino Control DC Motor Speed and Direction Speed and Direction Using Potentiometer, OLED Display & Buttons: Σε αυτό το σεμινάριο θα μάθουμε πώς να χρησιμοποιούμε πρόγραμμα οδήγησης L298N DC MOTOR CONTROL και ποτενσιόμετρο για τον έλεγχο της ταχύτητας και της κατεύθυνσης του κινητήρα DC με δύο κουμπιά και εμφάνιση της τιμής του ποτενσιόμετρου στην οθόνη OLED. Παρακολουθήστε ένα βίντεο επίδειξης
Folow-UP: Advanced Media Center With Odroid N2 and Kodi (4k and HEVC Support): 3 βήματα
Folow-UP: Advanced Media Center With Odroid N2 and Kodi (4k and HEVC Support): Αυτό το άρθρο αποτελεί συνέχεια του προηγούμενου, αρκετά επιτυχημένου άρθρου μου σχετικά με τη δημιουργία ενός ευέλικτου κέντρου πολυμέσων, βασισμένο στην αρχή στο πολύ δημοφιλές Raspberry PI αλλά αργότερα, λόγω της έλλειψης εξόδου συμβατών με HEVC, H.265 και HDMI 2.2, άλλαξε
Blinds Control With ESP8266, Google Home and Openhab Integration and Webcontrol: 5 βήματα (με εικόνες)
Blinds Control Με ESP8266, Google Home και Openhab Integration και Webcontrol: Σε αυτό το Instructable σας δείχνω πώς πρόσθεσα την αυτοματοποίηση στις περσίδες μου. Wantedθελα να μπορώ να προσθέσω και να αφαιρέσω τον αυτοματισμό, οπότε όλη η εγκατάσταση είναι συνδεδεμένη. Τα κύρια μέρη είναι: Βηματικό μοτέρ Stepper control bij bij ESP-01 Gear and mounting
Hardware and Software Hack Smart Devices, Tuya and Broadlink LEDbulb, Sonoff, BSD33 Smart Plug: 7 Βήματα
Hardware and Software Hack Smart Devices, Tuya and Broadlink LEDbulb, Sonoff, BSD33 Smart Plug: Σε αυτό το Instructable σας δείχνω πώς έλαμψα αρκετές έξυπνες συσκευές με το δικό μου υλικολογισμικό, ώστε να μπορώ να τις ελέγχω με MQTT μέσω της ρύθμισης Openhab. Θα προσθέσω νέες συσκευές όταν τις χάκαρα. Φυσικά υπάρχουν και άλλες μέθοδοι που βασίζονται σε λογισμικό για να αναβοσβήνει η προσαρμοσμένη
Επεξεργασία ενός BGA χρησιμοποιώντας ένα Stencil Stay in Place: 7 Βήματα
Επανασχεδιασμός ενός BGA Χρήση Stencil Stay in Place: Το BENA stencil επαναλειτουργίας με δυνατότητα παραμονής στη θέση του για απλοποίηση της διαδικασίας και επιδιόρθωση κατεστραμμένης μάσκας συγκόλλησης. Βελτιώνει τις αποδόσεις του πρώτου περάσματος και επιδιορθώνει τη μάσκα συγκόλλησης που μπορεί να έχει υποστεί ζημιά από τη συσκευή. Δείτε περισσότερες πληροφορίες σχετικά με το BGA rework στο ba