Spisu treści:

Robot Arduino Base Pick and Place: 8 kroków
Robot Arduino Base Pick and Place: 8 kroków

Wideo: Robot Arduino Base Pick and Place: 8 kroków

Wideo: Robot Arduino Base Pick and Place: 8 kroków
Wideo: Arduino pick and place robot | Pick and Place Robot using Arduino + Android App | Bluetooth Robot 2024, Lipiec
Anonim
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 Robot

Zrobiłem super tanie (mniej niż 1000 dolarów) przemysłowe ramię robota, aby umożliwić studentom hakowanie robotyki na większą skalę i aby małe lokalne produkcje mogły używać robotów w swoich procesach bez rozbijania banku. Jego łatwe do zbudowania i uczynienia z grupy wiekowej osób od 15 do 50 lat.

Krok 1: Wymagania dotyczące komponentów

Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów
Wymagania dotyczące komponentów

1. Arduino + Tarcza + Szpilki + Kable

2. Sterownik silnika: dm860A (Ebay)

3. Silnik krokowy: 34hs5435c-37b2 (Ebay)

4. Śruby M8x45+60+70 i śruby M8.

5. Sklejka 12 mm.

6. Nylon 5mm.

7. Podkładki żaluzjowe 8mm.

8. Wkręty do drewna 4,5x40mm.

9. Zatopiony licznik M3, 10. Zasilanie 12 v

11. sterownik silnika serwo arduino

Krok 2: Pobierz przewodnik

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

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

Krok 3: Połączenie

Połączenie
Połączenie
Połączenie
Połączenie
Połączenie
Połączenie

Podłącz przewody które są podane na obrazku to dla Ciebie większe zrozumienie.

musimy podłączyć sterownik silnika do Arduino i innych złącz, które są wymagane zgodnie z twoim robotem.

Krok 4: Prześlij oprogramowanie układowe i sprawdź wynik kodu w panelu Arduino

Instalacja oprogramowania na Arduino - GRBL:

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

Uwaga: Podczas kompilacji w Arduino może wystąpić konflikt. Usuń wszystkie inne biblioteki z folderu biblioteki (../documents/Arduino/libraries).

Konfiguracja oprogramowania

Ustaw enable na nowszy limit czasu. Użyj połączenia szeregowego i napisz:

$1=255

Ustaw bazowanie:

$22=1

Pamiętaj, aby ustawić serial na baud: 115200

Przydatne kody G

Ustaw punkt zerowy dla robota:

G10 L2 Xnnn Ynnn Znnn

Użyj punktu zerowego:

G54

Typowa inicjalizacja do robota centralnego:

G10 L2 X1,5 Y1,2 Z1,1

G54

Szybko przesuń robota do pozycji:

G0 Xnnn Ynnn Znnn

Przykład:

G0 X10.0 Y3.1 Z4.2 (powrót)

Przesuń robota do pozycji z określoną prędkością:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (powrót)

F powinno wynosić od 10 (wolno) do 600 (szybko)

Domyślne jednostki dla X, Y i Z

Podczas korzystania z domyślnych ustawień kroków/jednostek (250 kroków/jednostek) dla GRBL i

napęd krokowy ustawiony na 800 kroków/obr dla wszystkich osi obowiązują następujące jednostki:

+- 32 jednostki = +-180 stopni

Przykładowy kod przetwarzania:

Ten kod może komunikować się bezpośrednio z Arduino GRBL.

github.com/damellis/gctrl

Pamiętaj, aby ustawić serial na baud: 115200

Kod uoload w ardunio

import java.awt.event. KeyEvent;

importowanie javax.swing. JOptionPane;

importowanie przetwarzania.serial.*;

Port szeregowy = null;

// wybierz i zmodyfikuj odpowiednią linię dla swojego systemu operacyjnego

// zostaw jako null, aby użyć portu interaktywnego (naciśnij 'p' w programie)

Nazwa portu ciągu = null;

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

//String nazwa portu = "/dev/ttyUSB0"; // Linux

//String nazwa portu = "COM6"; // Windows

strumieniowanie logiczne = fałsz;

prędkość pływaka = 0,001;

String gcode;

int i = 0;

void otwórzSerialPort()

{

if (portname == null) return;

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

port = nowy numer seryjny (ten, nazwa portu, 115200);

port.bufferUntil('\n');

}

void selectSerialPort()

{

Wynik ciągu = (ciąg) JOptionPane.showInputDialog(to, "Wybierz port szeregowy odpowiadający Twojej płytce Arduino.", "Wybierz port szeregowy", JOptionPane. PLAIN_MESSAGE, zero, Serial.list(), 0);

if (wynik != null) {

nazwa_portu = wynik;

openSerialPort();

}

}

pusta konfiguracja()

{

rozmiar (500, 250);

openSerialPort();

}

nieważne remis()

{

tło(0);

wypełnić(255);

int y = 24, dy = 12;

text("INSTRUKCJE", 12, y); y += dy;

text("p: wybierz port szeregowy", 12, y); y += dy;

text("1: ustaw prędkość na 0,001 cala (1 mil) na impuls", 12, y); y += dy;

text("2: ustaw prędkość na 0,010 cala (10 mil) na impuls", 12, y); y += dy;

text("3: ustaw prędkość na 0,100 cala (100 mil) na impuls", 12, y); y += dy;

text("klawisze strzałek: przesuń w płaszczyźnie x-y", 12, y); y += dy;

text("strona w górę & strona w dół: przesuń w osi z", 12, y); y += dy;

text("$: wyświetl ustawienia grbl", 12, y); y+= dy;

text("h: idź do domu", 12, y); y += dy;

text("0: zero maszyny (ustaw dom do bieżącej lokalizacji)", 12, y); y += dy;

text("g: przesyłaj plik z kodem g", 12, y); y += dy;

text("x: zatrzymaj przesyłanie strumieniowe g-code (to NIE jest natychmiastowe)", 12, y); y += dy;

y = wysokość - dy;

text("bieżąca prędkość biegu: " + prędkość + " cale na krok", 12, y); y -= dy;

text("bieżący port szeregowy: " + nazwa portu, 12, y); y -= dy;

}

nieważny klawiszNaciśnięty()

{

jeśli (klawisz == '1') prędkość = 0,001;

jeśli (klawisz == '2') prędkość = 0,01;

jeśli (klawisz == '3') prędkość = 0,1;

jeśli (!streaming) {

if (keyCode == LEWO) port.write("G91\nG20\nG00 X-" + prędkość + " Y0.000 Z0.000\n");

if (keyCode == PRAWY) port.write("G91\nG20\nG00 X" + prędkość + " Y0.000 Z0.000\n");

if (keyCode == UP) port.write("G91\nG20\nG00 X0.000 Y" + prędkość + " Z0.000\n");

if (keyCode == DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + prędkość + " Z0.000\n");

if (keyCode == KeyEvent. VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + prędkość + "\n");

if (keyCode == KeyEvent. VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + prędkość + "\n");

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

if (klucz == 'v') port.write("$0=75\n$1=74\n$2=75\n");

//if (klucz == 'v') port.write("$0=100\n$1=74\n$2=75\n");

if (klucz == 's') port.write("$3=10\n");

if (klucz == 'e') port.write("$16=1\n");

if (klucz == 'd') port.write("$16=0\n");

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

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

if (klucz == '$') port.write("$$\n");

if (klucz == 'h') port.write("$H\n");

}

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

gcode = null; i = 0;

plik pliku = null;

println("Ładowanie pliku…");

selectInput("Wybierz plik do przetworzenia:", "fileSelected", plik);

}

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

}

void fileSelected(Wybór pliku) {

if (wybór == null) {

println("Okno zostało zamknięte lub użytkownik nacisnął Cancel.");

} w przeciwnym razie {

println("Wybrany przez użytkownika " + selection.getAbsolutePath());

gcode = loadStrings(selection.getAbsolutePath());

if (gcode == null) return;

strumieniowanie = prawda;

strumień();

}

}

pusty strumień()

{

if (!streaming) return;

podczas (prawda) {

if (i == gcode.length) {

przesyłanie strumieniowe = fałsz;

powrót;

}

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

inaczej złamać;

}

println(gcode);

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

i++;

}

void serialEvent(Serial p)

{

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

println(s.trim());

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

if (s.trim().startsWith("błąd")) stream(); // XXX: naprawdę?

}

Krok 5: Zaprojektuj i wydrukuj wszystkie części w arkuszu ze sklejki

Zaprojektuj i wydrukuj wszystkie części w arkuszu ze sklejki
Zaprojektuj i wydrukuj wszystkie części w arkuszu ze sklejki

Pobierz część robota i projekt w programie AutoCAD, a następnie wydrukuj na arkuszu ze sklejki o grubości 12 mm oraz część wykończeniową i projektową. Jeśli ktoś potrzebuje pliku cad plz, zostaw komentarz w polu komentarza, wyślę go bezpośrednio.

Krok 6: Montaż

montaż
montaż
montaż
montaż

zbierz wszystkie części i ułóż w kolejności na podanym obrazku i postępuj zgodnie ze schematem obrazka.

Krok 7: Skonfiguruj ustawienia GBRL

Ustawienie, które sprawdziło się w naszych robotach.

$0=10 (impuls kroku, usec) $1=255 (opóźnienie bezczynności kroku, ms) $2=7 (maska odwrócenia portu:00000111) $3=7 (maska odwrócenia portu dir:0000111) $4=0 (odwrócenie włączenia kroku, bool) $5=0 (odwrócone piny graniczne, bool) $6=1 (odwrócone piny sondy, bool) $10=3 (maska raportu stanu:00000011) $11=0.020 (odchylenie połączenia, mm) $12=0.002 (tolerancja łuku, mm) $13 =0 (raportuj cale, bool) $20=0 (miękkie limity, bool) $21=0 (twarde limity, bool) $22=1 (cykl bazowania, 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, msek) $27=1.000 (homing pull-off, mm) $100=250.000 (x, krok/mm) $101= 250.000 (y, krok/mm) 102$=250.000 (z, krok/mm) 110$=500.000 (x maks. przest., mm/min) $111=500.000 (y maks. przest., mm/min) $112=500.000 (z maks. przest., mm/min.) mm/min) 120 USD = 10 000 (x przyśpieszenie, mm/s^2) 121 USD = 10 000 (przyśpieszenie y, mm/s^2) 122 USD = 10 000 (przyśpieszenie z, mm/s^2) 130 USD = 200 000 (x maksymalny skok, mm) $131=200.000 (y maks. przesuw, mm) $132=200.000 (z maks. przesuw, mm)

Krok 8: Prześlij kod końcowy i sprawdź wirtualny wynik w panelu oprogramowania Arduino Uno

// Jednostki: CM

pływak b_wysokość = 0;

pływak a1 = 92;

pływak a2 = 86;

pływak snude_len = 20;

boolean doZ = fałsz;

float base_angle;// = 0;

pływak ramię1_kąt; // = 0;

pływak ramię2_angle; //= 0;

pływak bx = 60;// = 25;

zmiennoprzecinkowa o = 60;// = 0;

pływak bz = 60;// = 25;

pływak x = 60;

pływak y = 60;

pływak z = 60;

pływak q;

pływak c;

pływak V1;

pływak V2;

pływak V3;

pływak V4;

pływak V5;

pusta konfiguracja () {

rozmiar (700, 700, P3D);

krzywka = nowa PeasyCam(to, 300);

cam.setMinimumDistance(50);

cam.setMaximumDistance(500);

}

nieważne rysowanie () {

//ligninger:

y = (myszX - szerokość/2)*(-1);

x = (myszY - wzrost/2)*(-1);

bz = z;

przez = 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;

ramię1_kąt = q;

V4 = radiany(90,0) - q;

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

kąt ramienia2 = radiany (180,0) - (V5 + V1);

kąt_podstawy = stopnie(atan2(bx, by));

ramię1_kąt=stopnie(ram1_kąt);

arm2_angle=stopnie(arm2_angle);

//println(by, bz);

//kąt ramienia1 = 90;

//kąt ramienia2 = 45;

/*

kąt ramienia2 = 23;

ramię1_kąt= 23;

ramię2_kąt=23;

*/

// interaktywne:

// jeśli (doZ)

//

// {

// base_angle = base_angle+ mouseX-pmouseX;

// } w przeciwnym razie

// {

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

{

obróćX(1.2);

obróćZ(-1,2);

tło(0);

światła();

pushMatrix();

// BAZA

wypełnienie (150, 150, 150);

box_corner(50, 50, b_height, 0);

obróć(radiany(kąt_podstawy), 0, 0, 1);

// RAMIĘ 1

wypełnienie(150, 0, 150);

box_corner(10, 10, a1, ramię1_kąt);

// RAMIĘ 2

wypełnienie(255, 0, 0);

box_corner(10, 10, a2, ramię2_angle);

// SNUDE

wypełnienie(255, 150, 0);

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

popMatrix();

pushMatrix();

float action_box_size=100;

przetłumacz(0, -action_box_size/2, action_box_size/2+b_height);

pushMatrix();

przetłumacz(x, wielkość_pudełka_działania- y-rozmiar_pudełka_działania/2, z-rozmiar_pudełka_działania/2);

wypełnienie(255, 255, 0);

pudełko(20);

popMatrix();

wypełnienie(255, 255, 255, 50);

box(action_box_size, action_box_size, action_box_size);

popMatrix();

}

void box_corner(float w, float h, float d, float obrót)

{

obróć(radiany(obróć), 1, 0, 0);

przetłumacz(0, 0, d/2);

pudełko (szer., wys., gł.);

przetłumacz(0, 0, d/2);

}

nieważny klawiszNaciśnięty()

{

jeśli (klucz == 'z')

{

doZ = !doZ;

}

jeśli (klucz == 'h')

{

// ustaw wszystko na zero

kąt ramienia2 = 0;

ramię1_kąt = 90;

kąt_podstawy = 0;

}

jeśli (klucz == 'g')

{

println(stopnie(V1));

println(stopnie(V5));

}

jeśli (keyCode == UP)

{

z++;

}

jeśli (keyCode == DOWN)

{

z-;

}

jeśli (klucz == 'o')

{

y = 50;

z = 50;

println(q);

println(c, "c");

println(V1, "V1");

println(V2);

drukujln(V3);

println(arm1_angle);

println(V4);

drukujln(V5);

println(arm2_angle);

}

}

Zalecana: