Sisällysluettelo:

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

Video: Arduino Base Pick and Place Robot: 8 vaihetta

Video: Arduino Base Pick and Place Robot: 8 vaihetta
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Marraskuu
Anonim
Arduino Base Pick ja Place Robot
Arduino Base Pick ja Place Robot
Arduino Base Pick ja Place Robot
Arduino Base Pick ja Place Robot
Arduino Base Pick ja Place Robot
Arduino Base Pick ja Place Robot

Olen tehnyt erittäin halvan (alle 1000 dollarin) teollisen robottivarren, jonka avulla opiskelijat voivat hakkeroida suurempaa robotiikkaa ja jotta pienet paikalliset tuotannot voivat käyttää robotteja prosesseissaan rikkomatta pankkia. Sen Eassy on rakentaa ja tehdä ikäryhmistä 15-50 -vuotiaita ihmisiä.

Vaihe 1: Komponenttivaatimus

Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus
Komponentit Vaatimus

1. Arduino + kilpi + nastat + kaapelit

2. moottorinohjain: dm860A (Ebay)

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

4. M8x45+60+70 pultit ja M8 pultit.

5. 12mm vaneri.

6. 5 mm nailonia.

7. Sokeat aluslevyt 8 mm.

8. Puuruuvit 4,5x40mm.

9. M3 -laskuri upotettu, 10. 12V virtalähde

11. servomoottorin kuljettaja arduino

Vaihe 2: Lataa Gui

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

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

Vaihe 3: Yhteys

Yhteys
Yhteys
Yhteys
Yhteys
Yhteys
Yhteys

Yhdistä kuvassa annetut johdot, jotta ymmärrät paremmin.

meidän on kytkettävä moottorin ohjain Arduinoon ja muihin liittimiin, joita vaaditaan robotin mukaan.

Vaihe 4: Lataa laiteohjelmisto ja tarkista kooditulos Arduino Dashboardista

Laiteohjelmiston asentaminen Arduinoon - GRBL:

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

Huomaa: Saatat saada ristiriidan, kun käännät Arduinossa. Poista kaikki muut kirjastot kirjastokansiostasi (../documents/Arduino/libraries).

Laiteohjelmiston asennus

Aseta käyttöönotto uudempaan aikakatkaisuun. Käytä sarjayhteyttä ja kirjoita:

$1=255

Aseta kotiutus:

$22=1

Muista asettaa sarjaksi baud: 115200

Hyödyllisiä G-koodeja

Aseta nollapiste robotille:

G10 L2 Xnnn Ynnn Znnn

Käytä nollapistettä:

G54

Tyypillinen alustaminen keskirobotille:

G10 L2 X1.5 Y1.2 Z1.1

G54

Siirrä robotti nopeasti paikalleen:

G0 Xnnn Ynnn Znnn

Esimerkki:

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

Siirrä robotti tiettyyn nopeuteen:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (paluu)

F: n tulisi olla välillä 10 (slooooow) ja 600 (nopea)

Oletusyksiköt X: lle, Y: lle ja Z: lle

Käytettäessä askel/yksiköt oletusasetuksia (250 askelta/yksikkö) GRBL: lle ja

askelmoottori 800 askelta/kierrosta varten seuraavat yksiköt koskevat kaikkia akseleita:

+- 32 yksikköä = +- 180 astetta

Esimerkki käsittelykoodista:

Tämä koodi voi kommunikoida suoraan Arduino GRBL: n kanssa.

github.com/damellis/gctrl

Muista asettaa sarjaksi baud: 115200

Koodin lataaminen arduniossa

tuo java.awt.event. KeyEvent;

tuo javax.swing. JOptionPane;

tuonti käsittely. sarja.*;

Sarjaportti = null;

// valitse ja muokkaa käyttöjärjestelmääsi sopiva rivi

// jätä tyhjäksi käyttääksesi interaktiivista porttia (paina 'p' ohjelmassa)

Merkkijonon portin nimi = null;

// Merkkijonon portin nimi = Sarja.lista () [0]; // Mac-käyttöjärjestelmän kymmenes versio

// Merkkijonon portin nimi = "/dev/ttyUSB0"; // Linux

// Merkkijonon portin nimi = "COM6"; // Windows

boolen suoratoisto = false;

uimurin nopeus = 0,001;

Jono gcode;

int i = 0;

tyhjä openSerialPort ()

{

if (portin nimi == null) return;

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

portti = uusi sarja (tämä, portin nimi, 115200);

port.bufferUntil ('\ n');

}

void selectSerialPort ()

{

Merkkijonon tulos = (merkkijono) JOptionPane.showInputDialog (tämä, "Valitse sarjaportti, joka vastaa Arduino -korttiasi.", "Valitse sarjaportti", JOptionPane. PLAIN_MESSAGE, tyhjä, Serial.list (), 0);

jos (tulos! = nolla) {

portin nimi = tulos;

openSerialPort ();

}

}

mitätön asennus ()

{

koko (500, 250);

openSerialPort ();

}

mitätön tasapeli ()

{

tausta (0);

täyttö (255);

int y = 24, dy = 12;

teksti ("OHJEET", 12, y); y += dy;

teksti ("p: valitse sarjaportti", 12, y); y += dy;

teksti ("1: aseta nopeudeksi 0,001 tuumaa (1 mil) per lenkki", 12, y); y += dy;

teksti ("2: aseta nopeudeksi 0,010 tuumaa (10 mil) per lenkki", 12, y); y += dy;

teksti ("3: aseta nopeudeksi 10000 tuumaa (100 mil) per lenkki", 12, y); y += dy;

teksti ("nuolinäppäimet: lenkki x-y-tasossa", 12, y); y += dy;

teksti ("sivu ylös ja sivu alas: lenkki z -akselilla", 12, y); y += dy;

teksti ("$: display grbl settings", 12, y); y+= dy;

teksti ("h: mene kotiin", 12, y); y += dy;

teksti ("0: nolla kone (aseta kotiin nykyiseen sijaintiin)", 12, y); y += dy;

teksti ("g: striimaa g-kooditiedosto", 12, y); y += dy;

text ("x: lopeta g-koodin suoratoisto (tämä EI ole välitöntä)", 12, y); y += dy;

y = korkeus - dy;

teksti ("nykyinen jog -nopeus:" + nopeus + "tuumaa askelta kohden", 12, y); y -= dy;

text ("nykyinen sarjaportti:" + portin nimi, 12, y); y -= dy;

}

tyhjä avainPainettu ()

{

jos (näppäin == '1') nopeus = 0,001;

jos (näppäin == '2') nopeus = 0,01;

jos (näppäin == '3') nopeus = 0,1;

jos (! suoratoisto) {

if (keyCode == LEFT) port.write ("G91 / nG20 / nG00 X-" + nopeus + "Y0.000 Z0.000 / n");

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

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

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

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

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write ("G91 / nG20 / nG00 X0.000 Y0.000 Z-" + nopeus + "\ 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 (key == 'e') port.write ("$ 16 = 1 / n");

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

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

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

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

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

}

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

gcode = null; i = 0;

Tiedostotiedosto = null;

println ("Ladataan tiedostoa …");

selectInput ("Valitse käsiteltävä tiedosto:", "fileSelected", tiedosto);

}

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

}

void fileSelected (Tiedoston valinta) {

if (valinta == null) {

println ("Ikkuna suljettiin tai käyttäjä osui peruuta.");

} muuta {

println ("Käyttäjä valitsi" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

if (gcode == null) return;

suoratoisto = totta;

virta ();

}

}

tyhjä virta ()

{

jos (! suoratoisto) palaa;

while (totta) {

jos (i == gcode.length) {

suoratoisto = epätosi;

palata;

}

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

muu tauko;

}

println (gcode );

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

i ++;

}

void serialEvent (Sarja p)

{

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

println (s.trim ());

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

if (s.trim (). startsWith ("error")) stream (); // XXX: oikeasti?

}

Vaihe 5: Suunnittele ja tulosta kaikki osat vanerilevylle

Suunnittele ja tulosta kaikki osat vanerilevyllä
Suunnittele ja tulosta kaikki osat vanerilevyllä

Lataa robottiosa ja suunnittelu AutoCADissa ja tulosta 12 mm: n vanerilevylle ja viimeistely- ja muotoiluosalle. Jos joku tarvitsee cad -tiedostoa, jätä kommentti kommenttikenttään, niin lähetän sen suoraan.

Vaihe 6: Kokoonpano

Kokoonpano
Kokoonpano
Kokoonpano
Kokoonpano

kerää kaikki osat ja järjestä ne järjestyksessä annettuun kuvaan ja noudata kuvakaaviota.

Vaihe 7: Määritä GBRL -asetukset

Asetus, joka on osoittautunut toimivaksi roboteissamme.

$ 0 = 10 (askelpulssi, käytäc) $ 1 = 255 (askeleen tyhjäkäynnin viive, ms) $ 2 = 7 (askelportin käänteismaski: 00000111) $ 3 = 7 (portin käänteismaski: 00000111) $ 4 = 0) $ 5 = 0 (rajanapit käänteinen, bool) $ 6 = 1 (anturin nasta käänteinen, bool) $ 10 = 3 (tilaraportin peite: 00000011) $ 11 = 0,020 (risteyspoikkeama, mm) $ 12 = 0,002 (kaaren toleranssi, mm) $ 13 = 0 (raportin tuumaa, bool) $ 20 = 0 (pehmeät rajat, bool) $ 21 = 0 (kovat rajat, bool) $ 22 = 1 (aloitusjakso, bool) $ 23 = 0 (homing dir invert mask: 00000000) $ 24 = 100.000 (aloitussyöttö, mm/min) $ 25 = 500.000 (kotiutus, mm/min) $ 26 = 250 (kotiutuksen poistuminen, ms) 27 $ = 1.000 (ulosveto, mm) $ 100 = 250.000 (x, askel/mm) $ 101 = 250.000 (y, askel/mm) $ 102 = 250.000 (z, askel/mm) $ 110 = 500.000 (x maksiminopeus, mm/min) $ 111 = 500.000 (y maksiminopeus, mm/min) $ 112 = 500.000 (z max, 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 matka, mm) $ 131 = 200.000 (y maksimi liike, mm) $ 132 = 200.000 (z max liike, mm)

Vaihe 8: Lataa lopullinen koodi ja tarkista virtuaalitulos Arduino Uno -ohjelmiston hallintapaneelista

// Yksiköt: CM

float b_height = 0;

float a1 = 92;

kelluva a2 = 86;

float snude_len = 20;

boolean doZ = epätosi;

float base_angle; // = 0;

float arm1_angle; // = 0;

float arm2_angle; // = 0;

float bx = 60; // = 25;

kellua = 60; // = 0;

kellua bz = 60; // = 25;

float x = 60;

float y = 60;

kellua z = 60;

kellua q;

kellua c;

uimuri V1;

uimuri V2;

uimuri V3;

kelluke V4;

kelluke V5;

void setup () {

koko (700, 700, P3D);

nokka = uusi PeasyCam (tämä, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

void draw () {

// ligninger:

y = (hiiriX - leveys/2)*(- 1);

x = (hiiriY - korkeus/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 = radiaanit (90,0) - q;

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

arm2_angle = radiaanit (180,0) - (V5 + V1);

base_angle = astetta (atan2 (bx, by));

arm1_angle = astetta (arm1_angle);

arm2_angle = astetta (arm2_angle);

// println (by, bz);

// käsivarsi_kulma = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

varsi_kulma = 23;

arm2_angle = 23;

*/

// interaktiivinen:

// jos (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

//} muuta

// {

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

}

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

{

rotateX (1.2);

rotateZ (-1,2);

tausta (0);

valot ();

pushMatrix ();

// BASE

täyttö (150, 150, 150);

laatikkokulma (50, 50, b_height, 0);

kiertää (radiaanit (pohja_kulma), 0, 0, 1);

// ARM 1

täyttö (150, 0, 150);

laatikkokulma (10, 10, a1, varsi1_kulma);

// ARM 2

täyttö (255, 0, 0);

laatikkokulma (10, 10, a2, varsi2_kulma);

// SUDE

täyttö (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

kääntää (0, -action_box_size/2, action_box_size/2+b_height);

pushMatrix ();

kääntää (x, action_box_size- y-action_box_size/2, z-action_box_size/2);

täyttö (255, 255, 0);

laatikko (20);

popMatrix ();

täyttö (255, 255, 255, 50);

laatikko (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

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

{

kiertää (radiaaneja (kiertää), 1, 0, 0);

kääntää (0, 0, d/2);

laatikko (w, h, d);

kääntää (0, 0, d/2);

}

tyhjä avainPainettu ()

{

jos (avain == 'z')

{

doZ =! doZ;

}

jos (avain == 'h')

{

// nollaa kaikki

arm2_angle = 0;

käsivarsi_kulma = 90;

pohja_kulma = 0;

}

jos (avain == 'g')

{

println (astetta (V1));

println (astetta (V5));

}

jos (keyCode == YLÖS)

{

z ++;

}

jos (keyCode == DOWN)

{

z -;

}

jos (avain == '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);

}

}

Suositeltava: