Talaan ng mga Nilalaman:
- Hakbang 1: Kinakailangan ng Mga Bahagi
- Hakbang 2: I-download ang Gui
- Hakbang 3: Koneksyon
- Hakbang 4: Mag-upload ng Firmware at Suriin ang Resulta ng Code sa Arduino Dashboard
- Hakbang 5: Idisenyo at I-print ang Lahat ng Bahagi sa Plywood Sheet
- Hakbang 6: Assembly
- Hakbang 7: I-set up ang Mga Setting ng GBRL
- Hakbang 8: I-upload ang Final Code at Suriin ang Virtual na Resulta sa Arduino Uno Software Dashboard
2025 May -akda: John Day | [email protected]. Huling binago: 2025-01-13 06:58
Gumawa ako ng napakurang (mas mababa sa 1000 dolyar) na pang-industriya na braso ng robot upang paganahin ang mga mag-aaral na mag-hack ng mas malaking scale na robot at upang paganahin ang maliliit na lokal na produksyon na gumamit ng mga robot sa kanilang mga proseso nang hindi sinisira ang bangko. Napakadaling itayo at gawin ang mga taong pangkat ng edad na 15 hanggang 50 taon.
Hakbang 1: Kinakailangan ng Mga Bahagi
1. Arduino + Shield + Pins + Cables
2. Motorcontroller: dm860A (Ebay)
3. Steppermotor: 34hs5435c-37b2 (Ebay)
4. M8x45 + 60 + 70 bolts at M8 bolts.
5. 12mm Plywood.
6. 5mm Nylon.
7. Mga blind washer na 8mm.
8. Mga Wood Screw na 4.5x40mm.
9. M3 Counter lumubog, 10. 12v power supply
11. servo motor driver arduino
Hakbang 2: I-download ang Gui
zapmaker.org/projects/grbl-controller-3-0/
github.com/grbl/grbl/wiki/Using-Grbl
Hakbang 3: Koneksyon
Ikonekta ang mga wire na ibinibigay sa imahe ay higit na nauunawaan para sa iyo.
kailangan naming ikonekta ang driver ng motor sa Arduino at iba pang mga konektor na kinakailangan ayon sa iyong robot.
Hakbang 4: Mag-upload ng Firmware at Suriin ang Resulta ng Code sa Arduino Dashboard
Pag-install ng firmware sa Arduino - GRBL:
github.com/grbl/grbl/wiki/Compiling-Grbl
Tandaan: Maaari kang makakuha ng isang salungatan kapag nag-iipon ng Arduino. Alisin ang lahat ng iba pang mga aklatan mula sa iyong folder ng library (../documents/Arduino/libraries).
Pag-setup ng firmware
Itakda ang paganahin sa mas bagong pag-timeout. Gumamit ng isang serial connection at isulat:
$1=255
Itakda ang homing:
$22=1
Tandaan na magtakda ng serial sa baud: 115200
Mga kapaki-pakinabang na G-code
Itakda ang zero point para sa robot:
G10 L2 Xnnn Ynnn Znnn
Gumamit ng zero point:
G54
Karaniwang pagpapasimula sa sentro ng robot:
G10 L2 X1.5 Y1.2 Z1.1
G54
Mabilis na ilipat ang robot:
G0 Xnnn Ynnn Znnn
Halimbawa:
G0 X10.0 Y3.1 Z4.2 (bumalik)
Ilipat ang robot sa posisyon sa tukoy na bilis:
G1 Xnnn Ynnn Znnn Fnnn
G1 X11 Y3 Z4 F300 (bumalik)
Ang F ay dapat nasa pagitan ng 10 (slooooow) at 600 (mabilis)
Mga default na yunit para sa X, Y at Z
Kapag gumagamit ng mga setting ng default na hakbang / yunit (250 hakbang / yunit) para sa GRBL at
naka-set up ang stepper drive para sa 800 step / rev ang mga sumusunod na unit na nalalapat para sa lahat ng axis:
+ - 32 yunit = + - 180 degree
Halimbawa ng pagpoproseso ng code:
Ang code na ito ay maaaring direktang makipag-usap sa Arduino GRBL.
github.com/damellis/gctrl
Tandaan na magtakda ng serial sa baud: 115200
Code uoload sa ardunio
import java.awt.event. KeyEvent;
i-import ang javax.swing. JOptionPane;
pagproseso ng pag-import.serial. *;
Serial port = null;
// piliin at baguhin ang naaangkop na linya para sa iyong operating system
// iwan bilang null upang magamit ang interactive port (pindutin ang 'p' sa programa)
String portname = null;
// String portname = Serial.list () [0]; // Mac OS X
// String portname = "/ dev / ttyUSB0"; // Linux
// String portname = "COM6"; // Windows
boolean streaming = false;
bilis ng float = 0.001;
String gcode;
int i = 0;
walang bisa openSerialPort ()
{
kung (portname == null) bumalik;
kung (port! = null) port.stop ();
port = bagong Serial (ito, portname, 115200);
port.bufferUntil ('\ n');
}
walang bisa selectSerialPort ()
{
Resulta ng String = (String) JOptionPane.showInputDialog (ito, "Piliin ang serial port na tumutugma sa iyong Arduino board.", "Piliin ang serial port", JOptionPane. PLAIN_MESSAGE, wala, Serial.list (), 0);
kung (resulta! = null) {
portname = resulta;
openSerialPort ();
}
}
walang bisa ang pag-setup ()
{
laki (500, 250);
openSerialPort ();
}
walang bisa draw ()
{
background (0);
punan (255);
int y = 24, dy = 12;
teksto ("INSTRUCTIONS", 12, y); y + = dy;
teksto ("p: pumili ng serial port", 12, y); y + = dy;
teksto ("1: itakda ang bilis sa 0.001 pulgada (1 mil) bawat pag-jog", 12, y); y + = dy;
teksto ("2: itakda ang bilis sa 0.010 pulgada (10 mil) bawat pag-jog", 12, y); y + = dy;
teksto ("3: itakda ang bilis sa 0.100 pulgada (100 mil) bawat pag-jog", 12, y); y + = dy;
teksto ("mga arrow key: jog sa x-y eroplano", 12, y); y + = dy;
teksto ("pahina pataas at pahina pababa: mag-jog in z axis", 12, y); y + = dy;
teksto ("$: ipakita ang mga setting ng grbl", 12, y); y + = dy;
teksto ("h: umuwi", 12, y); y + = dy;
teksto ("0: zero machine (itakda ang tahanan sa kasalukuyang lokasyon)", 12, y); y + = dy;
teksto ("g: stream ng isang g-code file", 12, y); y + = dy;
teksto ("x: itigil ang streaming g-code (HINDI ito kaagad)", 12, y); y + = dy;
y = taas - dy;
teksto ("kasalukuyang bilis ng jogging:" + bilis + "pulgada bawat hakbang", 12, y); y - = dy;
teksto ("kasalukuyang serial port:" + portname, 12, y); y - = dy;
}
void keyPressed ()
{
kung (key == '1') bilis = 0.001;
kung (key == '2') bilis = 0.01;
kung (key == '3') bilis = 0.1;
kung (! streaming) {
kung (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + bilis + "Y0.000 Z0.000 / n");
kung (keyCode == TAMA) port.write ("G91 / nG20 / nG00 X" + bilis + "Y0.000 Z0.000 / n");
kung (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + bilis + "Z0.000 / n");
kung (keyCode == Down) port.write ("G91 / nG20 / nG00 X0.000 Y-" + bilis + "Z0.000 / n");
kung (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + bilis + "\ n");
kung (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + speed + "\ n");
// if (key == 'h') port.write ("G90 / nG20 / nG00 X0.000 Y0.000 Z0.000 / n");
kung (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");
kung (key == 's') port.write ("$ 3 = 10 / n");
kung (key == 'e') port.write ("$ 16 = 1 / n");
kung (key == 'd') port.write ("$ 16 = 0 / n");
kung (key == '0') openSerialPort ();
kung (key == 'p') selectSerialPort ();
kung (key == '$') port.write ("$$ / n");
kung (key == 'h') port.write ("$ H / n");
}
kung (! streaming && key == 'g') {
gcode = null; i = 0;
File file = null;
println ("Naglo-load ng file …");
selectInput ("Pumili ng isang file upang maproseso:", "fileSelected", file);
}
kung (key == 'x') streaming = false;
}
void fileSelected (Pagpili ng file) {
kung (pagpili == null) {
println ("Ang window ay sarado o ang pag-hit ng user na kinansela.");
} iba pa {
println ("Napili ng gumagamit" + select.getAbsolutePath ());
gcode = loadStrings (select.getAbsolutePath ());
kung (gcode == null) bumalik;
streaming = totoo;
stream ();
}
}
walang bisa stream ()
{
kung (! streaming) bumalik;
habang (totoo) {
kung (i == gcode.length) {
streaming = false;
bumalik;
}
kung (gcode .trim (). haba () == 0) i ++;
kung hindi man masira;
}
println (gcode );
port.write (gcode + '\ n');
ako ++;
}
walang bisa ang serialEvent (Serial p)
{
String s = p.readStringUntil ('\ n');
println (s.trim ());
kung (s.trim (). nagsisimulaWith ("ok")) stream ();
kung (s.trim (). nagsisimulaWith ("error")) stream (); // XXX: talaga
}
Hakbang 5: Idisenyo at I-print ang Lahat ng Bahagi sa Plywood Sheet
I-download ang bahagi ng robot at disenyo sa AutoCAD at i-print ang 12mm na sheet ng playwud at tapusin at bahagi ng disenyo. Kung may nangangailangan ng file ng cad plz iwanan ang puna sa seksyon ng komento na kahon ay 'magpapadala ako nang direkta.
Hakbang 6: Assembly
kolektahin ang lahat ng bahagi at ayusin ang pagkakasunud-sunod sa imahe na ibinigay at sundin ang diagram ng imahe.
Hakbang 7: I-set up ang Mga Setting ng GBRL
Ang setting na napatunayan na gagana sa aming mga robot.
$ 0 = 10 (step pulse, usec) $ 1 = 255 (step idle delay, msec) $ 2 = 7 (step port invert mask: 00000111) $ 3 = 7 (dir port invert mask: 00000111) $ 4 = 0 (step paganahin ang pag-invert, bool) $ 5 = 0 (limitahan ang mga baligtad, bool) $ 6 = 1 (probe pin invert, bool) $ 10 = 3 (status report mask: 00000011) $ 11 = 0.020 (junction deviation, mm) $ 12 = 0.002 (arc tolerance, mm) $ 13 = 0 (ulat pulgada, bool) $ 20 = 0 (malambot na mga limitasyon, bool) $ 21 = 0 (matapang na mga limitasyon, bool) $ 22 = 1 (homing cycle, bool) $ 23 = 0 (homing dir invert mask: 00000000) $ 24 = 100.000 (homing feed, mm / min) $ 25 = 500.000 (homing seek, mm / min) $ 26 = 250 (homing debounce, msec) $ 27 = 1.000 (homing pull-off, mm) $ 100 = 250.000 (x, step / mm) $ 101 = 250.000 (y, step / mm) $ 102 = 250.000 (z, step / 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 accel, mm / sec ^ 2) $ 121 = 10.000 (y accel, mm / sec ^ 2) $ 122 = 10.000 (z accel, mm / sec ^ 2) $ 130 = 200.000 (x max na paglalakbay, mm) $ 131 = 200.000 (y max travel, mm) $ 132 = 200.000 (z max travel, mm)
Hakbang 8: I-upload ang Final Code at Suriin ang Virtual na Resulta sa Arduino Uno Software Dashboard
// Mga Yunit: CM
float b_height = 0;
lumutang a1 = 92;
lumutang 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;
lumutang ng = 60; // = 0;
float bz = 60; // = 25;
lumutang x = 60;
float y = 60;
float z = 60;
lumutang q;
lumutang c;
lumutang V1;
lumutang V2;
lumutang V3;
lumutang V4;
lumutang V5;
walang bisa ang pag-setup () {
laki (700, 700, P3D);
cam = bagong PeasyCam (ito, 300);
cam.setMinimumDistance (50);
cam.setMaximumDistansya (500);
}
walang bisa draw () {
// ligninger:
y = (mouseX - lapad / 2) * (- 1);
x = (mouseY - taas / 2) * (- 1);
bz = z;
ni = 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 = radians (90.0) - q;
V5 = radians (180) - V4 - radians (90);
arm2_angle = radians (180.0) - (V5 + V1);
base_angle = degree (atan2 (bx, by));
arm1_angle = degree (arm1_angle);
arm2_angle = degree (arm2_angle);
// println (ni, bz);
// arm1_angle = 90;
// arm2_angle = 45;
/*
arm2_angle = 23;
arm1_angle = 23;
arm2_angle = 23;
*/
// interactive:
// kung (doZ)
//
// {
// base_angle = base_angle + mouseX-pmouseX;
//} iba pa
// {
// 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);
}
walang bisa draw_robot (float base_angle, float arm1_angle, float arm2_angle)
{
paikutinX (1.2);
paikutinZ (-1.2);
background (0);
ilaw ();
pushMatrix ();
// BASE
punan (150, 150, 150);
box_corner (50, 50, b_height, 0);
paikutin (radian (base_angle), 0, 0, 1);
// ARM 1
punan (150, 0, 150);
box_corner (10, 10, a1, arm1_angle);
// ARM 2
punan (255, 0, 0);
box_corner (10, 10, a2, arm2_angle);
// SNUDE
punan (255, 150, 0);
box_corner (10, 10, snude_len, -arm1_angle-arm2_angle + 90);
popMatrix ();
pushMatrix ();
float action_box_size = 100;
isalin (0, -action_box_size / 2, action_box_size / 2 + b_height);
pushMatrix ();
isalin (x, action_box_size- y-action_box_size / 2, z-action_box_size / 2);
punan (255, 255, 0);
kahon (20);
popMatrix ();
punan (255, 255, 255, 50);
kahon (action_box_size, action_box_size, action_box_size);
popMatrix ();
}
void box_corner (float w, float h, float d, float rotate)
{
paikutin (radian (paikutin), 1, 0, 0);
isalin (0, 0, d / 2);
kahon (w, h, d);
isalin (0, 0, d / 2);
}
void keyPressed ()
{
kung (key == 'z')
{
doZ =! doZ;
}
kung (key == 'h')
{
// itakda ang lahat sa zero
arm2_angle = 0;
arm1_angle = 90;
base_angle = 0;
}
kung (key == 'g')
{
println (degree (V1));
println (degree (V5));
}
kung (keyCode == UP)
{
z ++;
}
kung (keyCode == Pababa)
{
z -;
}
kung (key == '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);
}
}