Cuprins:

Robot Arduino Base Pick and Place: 8 pași
Robot Arduino Base Pick and Place: 8 pași

Video: Robot Arduino Base Pick and Place: 8 pași

Video: Robot Arduino Base Pick and Place: 8 pași
Video: How To Make A DIY Arduino Line Follower Car At Home 2024, Iulie
Anonim
Robot Arduino Base Pick and Place
Robot Arduino Base Pick and Place
Robot Arduino Base Pick and Place
Robot Arduino Base Pick and Place
Robot Arduino Base Pick and Place
Robot Arduino Base Pick and Place

Am creat un braț industrial foarte ieftin (mai puțin de 1000 de dolari) pentru a le permite studenților să pirateze robotica la scară mai mare și pentru a permite producțiilor locale mici să folosească roboți în procesele lor fără a rupe banca. Este ușor să construiască și să facă din grupul de vârstă oameni cu vârste cuprinse între 15 și 50 de ani.

Pasul 1: Cerințe privind componentele

Cerința componentelor
Cerința componentelor
Cerința componentelor
Cerința componentelor
Cerința componentelor
Cerința componentelor
Cerința componentelor
Cerința componentelor

1. Arduino + Scut + Pin + Cabluri

2. Motorcontroller: dm860A (Ebay)

3. Motor pas cu pas: 34hs5435c-37b2 (Ebay)

4. Șuruburi M8x45 + 60 + 70 și șuruburi M8.

5. Placaj de 12 mm.

6. Nylon de 5 mm.

7. Șaibe de 8 mm.

8. Șuruburi pentru lemn 4,5x40mm.

9. Contor M3 scufundat, 10. Alimentare 12v

11. servomotor driver arduino

Pasul 2: Descărcați Gui

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

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

Pasul 3: Conexiune

Conexiune
Conexiune
Conexiune
Conexiune
Conexiune
Conexiune

Conectați firele care sunt date în imagine este o mai bună înțelegere pentru dvs.

trebuie să conectăm driverul motorului la Arduino și la alți conectori necesari conform robotului dvs.

Pasul 4: Încărcați firmware-ul și verificați rezultatul codului în tabloul de bord Arduino

Instalarea firmware-ului pe Arduino - GRBL:

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

Notă: este posibil să aveți un conflict atunci când compilați în Arduino. Eliminați toate celelalte biblioteci din folderul bibliotecii (../documents/Arduino/libraries).

Configurarea firmware-ului

Setați activarea la expirare mai nouă. Utilizați o conexiune serială și scrieți:

$1=255

Setați homing:

$22=1

Nu uitați să setați seria la baud: 115200

Coduri G utile

Setați punctul zero pentru robot:

G10 L2 Xnnn Ynnn Znnn

Folosiți punctul zero:

G54

Inițializare tipică pentru centrarea robotului:

G10 L2 X1.5 Y1.2 Z1.1

G54

Mutați robotul în poziție rapidă:

G0 Xnnn Ynnn Znnn

Exemplu:

G0 X10.0 Y3.1 Z4.2 (retur)

Mutați robotul în poziție la o viteză specifică:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (retur)

F ar trebui să fie între 10 (slooooow) și 600 (rapid)

Unități implicite pentru X, Y și Z

Atunci când utilizați setările implicite de pași / unități (250 pași / unitate) pentru GRBL și

unitatea pas cu pas configurată pentru 800 de trepte / tur, următoarele unități se aplică pentru toate axele:

+ - 32 unități = + - 180 grade

Exemplu de cod de procesare:

Acest cod poate comunica direct cu Arduino GRBL.

github.com/damellis/gctrl

Nu uitați să setați seria la baud: 115200

Cod uoload în ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

procesare import.serial. *;

Port serial = nul;

// selectați și modificați linia potrivită pentru sistemul dvs. de operare

// lăsați ca nul pentru a utiliza portul interactiv (apăsați „p” în program)

String portname = nul;

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

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

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

streaming boolean = fals;

viteza de plutire = 0,001;

String gcode;

int i = 0;

void openSerialPort ()

{

if (portname == null) return;

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

port = serial nou (acesta, numele portului, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

String result = (String) JOptionPane.showInputDialog (aceasta, "Selectați portul serial care corespunde plăcii dvs. Arduino.", „Selectați portul serial”, JOptionPane. PLAIN_MESSAGE, nul, Serial.list (), 0);

if (rezultat! = nul) {

portname = rezultat;

openSerialPort ();

}

}

configurare nulă ()

{

dimensiune (500, 250);

openSerialPort ();

}

draw nul ()

{

fundal (0);

umplutură (255);

int y = 24, dy = 12;

text („INSTRUCȚIUNI”, 12, y); y + = dy;

text ("p: selectați portul serial", 12, y); y + = dy;

text („1: setați viteza la 1 mil) per jog”, 12, y); y + = dy;

text („2: setați viteza la 0,010 țoli (10 mil) per jog”, 12, y); y + = dy;

text („3: setați viteza la 100 mil) per jog”, 12, y); y + = dy;

text („săgeți: jog în plan x-y”, 12, y); y + = dy;

text („pagina în sus și pagina în jos: jog în axa z”, 12, y); y + = dy;

text („$: afișează setările grbl”, 12, y); y + = dy;

text („h: du-te acasă”, 12, y); y + = dy;

text („0: mașină zero (setează acasă la locația curentă)”, 12, y); y + = dy;

text („g: transmite un fișier cod g”, 12, y); y + = dy;

text („x: opriți transmiterea codului g (NU este imediat)”, 12, y); y + = dy;

y = înălțime - dy;

text ("viteza de jogging curentă:" + viteză + "inci pe pas", 12, y); y - = dy;

text ("portul serial curent:" + numele portului, 12, y); y - = dy;

}

tasta nulă Apăsat ()

{

if (cheie == '1') viteză = 0,001;

if (cheie == '2') viteză = 0,01;

if (cheie == '3') viteză = 0,1;

if (! streaming) {

if (keyCode == STÂNGA) port.write ("G91 / nG20 / nG00 X-" + viteză + "Y0.000 Z0.000 / n");

if (keyCode == RIGHT) port.write ("G91 / nG20 / nG00 X" + viteză + "Y0.000 Z0.000 / n");

if (keyCode == UP) port.write ("G91 / nG20 / nG00 X0.000 Y" + viteză + "Z0.000 / n");

if (keyCode == DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y-" + viteză + "Z0.000 / n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z" + viteză + "\ n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + viteză + "\ n");

// if (key == 'h') port.write ("G90 / nG20 / nG00 X0.000 Y0.000 Z0.000 / n");

if (cheie == '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 (cheie == 'e') port.write ("$ 16 = 1 / n");

if (cheie == 'd') port.write ("$ 16 = 0 / n");

if (cheie == '0') openSerialPort ();

if (key == 'p') selectSerialPort ();

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

if (cheie == 'h') port.write ("$ H / n");

}

if (! streaming && key == 'g') {

gcode = nul; i = 0;

Fișier fișier = nul;

println („Se încarcă fișierul …”);

selectInput ("Selectați un fișier de procesat", "fileSelected", fișier);

}

if (cheie == 'x') streaming = false;

}

void fileSelected (Selectare fișier) {

if (selecție == nulă) {

println ("Fereastra a fost închisă sau utilizatorul a apăsat anulare.");

} altceva {

println ("Selectat de utilizator" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

streaming = adevărat;

curent();

}

}

flux nul ()

{

dacă (! streaming) revine;

while (adevărat) {

if (i == gcode.length) {

streaming = fals;

întoarcere;

}

if (gcode .trim (). length () == 0) i ++;

altfel pauză;

}

println (gcode );

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

i ++;

}

void serialEvent (Serial p)

{

Șir s = p.readStringUntil ('\ n');

println (s.trim ());

if (s.trim (). startsWith ("ok")) stream ();

if (s.trim (). startsWith ("error")) stream (); // XXX: într-adevăr?

}

Pasul 5: Proiectați și imprimați toată partea în foaie de placaj

Proiectați și imprimați toate piesele în foaie de placaj
Proiectați și imprimați toate piesele în foaie de placaj

Descărcați piesa și proiectarea robotului în AutoCAD și imprimați pe foaia de placaj de 12 mm și porțiunea de finisare și proiectare. Dacă cineva are nevoie de fișier cad, vă rugăm să lăsați comentariul în secțiunea de comentarii, vă voi trimite direct.

Pasul 6: Asamblare

Asamblare
Asamblare
Asamblare
Asamblare

colectați toată partea și aranjați în secvența de pe imagine care este dată și urmați diagrama imaginii.

Pasul 7: Configurați setările GBRL

Setarea care sa dovedit a funcționa pe roboții noștri.

$ 0 = 10 (impuls pas, usec) $ 1 = 255 (întârziere pas inactiv, msec) $ 2 = 7 (mască inversă port pas: 00000111) $ 3 = 7 (mască inversă port dir: 00000111) 4 $ = 0 (inversare pas activ, bool) $ 5 = 0 (limitarea pinilor inversați, bool) $ 6 = 1 (sonda pin inversată, bool) $ 10 = 3 (masca raport de stare: 00000011) $ 11 = 0,020 (deviația joncțiunii, mm) $ 12 = 0,002 (toleranță arc, mm) $ 13 = 0 (raportează inci, bool) 20 $ = 0 (limite moi, bool) 21 $ = 0 (limite dure, bool) 22 $ = 1 (ciclu de reglare, bool) 23 $ = 0 (mască de inversare dir: 000000) 24 $ = 100.000 (alimentare homing, mm / min) 25 $ = 500.000 (căutare homing, mm / min) 26 $ = 250 (retragere homing, msec) 27 $ = 1.000 (extragere homing, mm) 100 $ = 250.000 (x, pas / mm) 101 $ = 250.000 (y, step / mm) 102 $ = 250.000 (z, step / mm) 110 $ = 500.000 (x rata maximă, mm / min) 111 $ = 500.000 (y rata maximă, mm / min) 112 $ = 500.000 (z rata maximă, 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 cursă maximă, mm) 131 $ = 200.000 (y cursă maximă, mm) 132 $ = 200.000 (z cursă maximă, mm)

Pasul 8: Încărcați codul final și verificați rezultatul virtual în tabloul de bord al software-ului Arduino Uno

// Unități: CM

float b_height = 0;

plutitor a1 = 92;

plutitor a2 = 86;

float snude_len = 20;

boolean doZ = fals;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

plutește cu = 60; // = 0;

plutitor bz = 60; // = 25;

plutitor x = 60;

plutitor y = 60;

plutitor z = 60;

plutitor q;

plutitor c;

plutitor V1;

plutitor V2;

plutitor V3;

plutitor V4;

plutitor V5;

configurare nulă () {

dimensiune (700, 700, P3D);

cam = nou PeasyCam (acesta, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

draw nul () {

// ligninger:

y = (mouseX - lățime / 2) * (- 1);

x = (mouseY - înălțime / 2) * (- 1);

bz = z;

de = 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 = radiani (90,0) - q;

V5 = radiani (180) - V4 - radiani (90);

arm2_angle = radiani (180.0) - (V5 + V1);

unghi_bază = grade (atan2 (bx, by));

arm1_angle = grade (arm1_angle);

arm2_angle = grade (arm2_angle);

// println (de, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// interactiv:

// if (doZ)

//

// {

// baza_angle = baza_angle + mouseX-pmouseX;

//} altfel

// {

// 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 (baza_angle + "," + arm1_angle + "," + arm2_angle);

}

void draw_robot (float base_angle, float arm1_angle, float arm2_angle)

{

rotireX (1.2);

rotireZ (-1,2);

fundal (0);

lumini();

pushMatrix ();

// BAZĂ

umplutură (150, 150, 150);

box_corner (50, 50, b_height, 0);

rotire (radiani (unghi_bază), 0, 0, 1);

// ARM 1

umplutură (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

umplere (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// SNUDE

umplutură (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

traduce (0, -action_box_size / 2, action_box_size / 2 + b_height);

pushMatrix ();

traduce (x, action_box_size- y-action_box_size / 2, z-action_box_size / 2);

umplere (255, 255, 0);

cutie (20);

popMatrix ();

umplutură (255, 255, 255, 50);

casetă (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

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

{

rotire (radiani (rotire), 1, 0, 0);

traducere (0, 0, d / 2);

cutie (w, h, d);

traducere (0, 0, d / 2);

}

tasta nulă Apăsat ()

{

if (cheie == 'z')

{

doZ =! doZ;

}

if (cheie == 'h')

{

// setează totul la zero

arm2_angle = 0;

arm1_angle = 90;

unghi_baza = 0;

}

if (cheie == 'g')

{

println (grade (V1));

println (grade (V5));

}

if (keyCode == UP)

{

z ++;

}

if (keyCode == JOS)

{

z -;

}

if (cheie == '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);

}

}

Recomandat: