Talaan ng mga Nilalaman:

Arduino Base Pick and Place Robot: 8 Hakbang
Arduino Base Pick and Place Robot: 8 Hakbang

Video: Arduino Base Pick and Place Robot: 8 Hakbang

Video: Arduino Base Pick and Place Robot: 8 Hakbang
Video: SCARA Robot | How To Build Your Own Arduino Based Robot 2024, Nobyembre
Anonim
Arduino Base Pick at Place Robot
Arduino Base Pick at Place Robot
Arduino Base Pick at Place Robot
Arduino Base Pick at Place Robot
Arduino Base Pick at Place Robot
Arduino Base Pick at Place Robot

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

Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa Mga Bahagi
Mga Kinakailangan sa 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

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

Disenyo at I-print ang Lahat ng Bahagi sa Plywood Sheet
Disenyo 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

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

}

}

Inirerekumendang: