Isi kandungan:

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

Video: Arduino Base Pick and Place Robot: 8 Langkah

Video: Arduino Base Pick and Place Robot: 8 Langkah
Video: Arduino DIY MeArm 4DOF Wooden Robotics Robot Arm Kit + SG90 / MG90s Servo Motor 2024, November
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

Saya telah membuat lengan robot perindustrian super murah (kurang dari 1000 dolar) untuk membolehkan pelajar menggodam robotik skala lebih besar dan untuk membolehkan produksi tempatan kecil menggunakan robot dalam prosesnya tanpa melanggar bank. Kemudahannya untuk membina dan menjadikan golongan ini terdiri daripada 15 hingga 50 tahun.

Langkah 1: Keperluan Komponen

Keperluan Komponen
Keperluan Komponen
Keperluan Komponen
Keperluan Komponen
Keperluan Komponen
Keperluan Komponen
Keperluan Komponen
Keperluan Komponen

1. Arduino + Perisai + Pin + Kabel

2. Pengawal Motosikal: dm860A (Ebay)

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

4. M8x45 + 60 + 70 bolt dan M8 bolt.

5. Papan Lapis 12mm.

6. Nilon 5mm.

7. Pencuci buta 8mm.

8. Skru Kayu 4.5x40mm.

9. Kaunter M3 tenggelam, 10. bekalan kuasa 12v

11. pemandu motor servo arduino

Langkah 2: Muat turun Gui

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

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

Langkah 3: Sambungan

Sambungan
Sambungan
Sambungan
Sambungan
Sambungan
Sambungan

Sambungkan wayar yang diberikan dalam gambar adalah pemahaman yang lebih baik untuk anda.

kita perlu menghubungkan pemandu motor ke Arduino dan penyambung lain yang diperlukan mengikut robot anda.

Langkah 4: Muat naik Firmware dan Periksa Hasil Kod di Arduino Dashboard

Memasang firmware pada Arduino - GRBL:

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

Catatan: Anda mungkin mengalami konflik ketika menyusun di Arduino. Keluarkan semua perpustakaan lain dari folder perpustakaan anda (../documents/Arduino/libraries).

Penyediaan perisian api

Tetapkan aktifkan ke waktu tamat yang lebih baru. Gunakan sambungan bersiri dan tulis:

$1=255

Tetapkan homing:

$22=1

Ingatlah untuk menetapkan siri ke baud: 115200

Kod G yang berguna

Tetapkan titik sifar untuk robot:

G10 L2 Xnnn Ynnn Znnn

Gunakan titik sifar:

G54

Permulaan khas untuk robot pusat:

G10 L2 X1.5 Y1.2 Z1.1

G54

Gerakkan robot ke kedudukan pantas:

G0 Xnnn Ynnn Znnn

Contoh:

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

Gerakkan robot ke kedudukan pada kelajuan tertentu:

G1 Xnnn Ynnn Znnn Fnnn

G1 X11 Y3 Z4 F300 (kembali)

F mestilah antara 10 (slooooow) dan 600 (cepat)

Unit lalai untuk X, Y dan Z

Semasa menggunakan tetapan langkah / unit lalai (250 langkah / unit) untuk GRBL dan

langkah pemacu stepper untuk 800 langkah / rev unit berikut berlaku untuk semua paksi:

+ - 32 unit = + - 180 darjah

Contoh kod pemprosesan:

Kod ini dapat berkomunikasi secara langsung dengan Arduino GRBL.

github.com/damellis/gctrl

Ingatlah untuk menetapkan siri ke baud: 115200

Kod uoload di ardunio

import java.awt.event. KeyEvent;

import javax.swing. JOptionPane;

pemprosesan import.serial. *;

Port bersiri = null;

// pilih dan ubah baris yang sesuai untuk sistem operasi anda

// biarkan kosong untuk menggunakan port interaktif (tekan 'p' dalam program)

String portname = null;

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

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

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

streaming boolean = salah;

kelajuan apungan = 0.001;

Rentetan gcode;

int i = 0;

batal bukaSerialPort ()

{

jika (portname == null) kembali;

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

port = Serial baru (ini, nama port, 115200);

port.bufferUntil ('\ n');

}

batal pilihSerialPort ()

{

Hasil rentetan = (String) JOptionPane.showInputDialog (ini, "Pilih port bersiri yang sesuai dengan papan Arduino anda.", "Pilih port bersiri", JOptionPane. PLAIN_MESSAGE, batal, Siri. senarai (), 0);

jika (hasil! = batal) {

nama port = hasil;

openSerialPort ();

}

}

persediaan tidak sah ()

{

saiz (500, 250);

openSerialPort ();

}

undian tidak sah ()

{

latar belakang (0);

isi (255);

int y = 24, dy = 12;

teks ("ARAHAN", 12, y); y + = dy;

teks ("p: pilih port bersiri", 12, y); y + = dy;

teks ("1: tetapkan kelajuan hingga 0,001 inci (1 mil) setiap jog", 12, y); y + = dy;

teks ("2: tetapkan kelajuan hingga 0,010 inci (10 mil) setiap jog", 12, y); y + = dy;

teks ("3: tetapkan kelajuan hingga 0.100 inci (100 mil) setiap jog", 12, y); y + = dy;

teks ("kekunci anak panah: berjoging dalam satah x-y", 12, y); y + = dy;

teks ("halaman atas & halaman bawah: jog dalam paksi z", 12, y); y + = dy;

teks ("$: tetapan paparan grbl", 12, y); y + = dy;

teks ("h: pulang ke rumah", 12, y); y + = dy;

teks ("0: mesin sifar (tetapkan rumah ke lokasi semasa)", 12, y); y + = dy;

teks ("g: stream fail g-code", 12, y); y + = dy;

teks ("x: hentikan streaming g-code (ini TIDAK segera)", 12, y); y + = dy;

y = tinggi - dy;

teks ("kelajuan jog semasa:" + kelajuan + "inci setiap langkah", 12, y); y - = dy;

teks ("port bersiri semasa:" + nama port, 12, y); y - = dy;

}

kekunci kekosongan Ditekan ()

{

jika (kunci == '1') kelajuan = 0.001;

jika (kunci == '2') kelajuan = 0.01;

jika (kunci == '3') kelajuan = 0.1;

jika (! streaming) {

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

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

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

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

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

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

jika (kunci == '0') openSerialPort ();

jika (kunci == 'p') pilihSerialPort ();

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

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

}

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

gcode = null; i = 0;

Fail fail = null;

println ("Memuatkan fail …");

selectInput ("Pilih fail untuk diproses:", "fileSelected", fail);

}

jika (kunci == 'x') streaming = salah;

}

batal failPilih (Pemilihan fail) {

jika (pemilihan == null) {

println ("Tetingkap ditutup atau tekan pengguna membatalkan.");

} lain {

println ("Pengguna dipilih" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ());

jika (gcode == null) kembali;

streaming = benar;

aliran ();

}

}

aliran kosong ()

{

sekiranya (! streaming) kembali;

sementara (benar) {

jika (i == gcode.length) {

streaming = palsu;

kembali;

}

jika (gcode .trim (). panjang () == 0) i ++;

lain pecah;

}

println (gcode );

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

saya ++;

}

batal serialEvent (Serial p)

{

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

println (s.trim ());

if (s.trim (). beginWith ("ok")) aliran ();

if (s.trim (). beginWith ("error")) aliran (); // XXX: betul-betul?

}

Langkah 5: Reka dan Cetak Semua Bahagian dalam Lembaran Papan lapis

Reka dan Cetak Semua Bahagian dalam Lembaran Papan lapis
Reka dan Cetak Semua Bahagian dalam Lembaran Papan lapis

Muat turun bahagian dan reka bentuk robot dalam AutoCAD dan cetak pada kepingan papan lapis 12mm dan bahagian akhir dan reka bentuk. Sekiranya ada yang memerlukan fail cad, sila tinggalkan komen di ruangan komen, saya akan menghantar anda secara langsung.

Langkah 6: Perhimpunan

perhimpunan
perhimpunan
perhimpunan
perhimpunan

kumpulkan semua bahagian dan susun mengikut urutan pada gambar yang diberikan dan ikuti rajah gambar.

Langkah 7: Tetapkan Tetapan GBRL

Tetapan yang terbukti berfungsi pada robot kami.

$ 0 = 10 (nadi langkah, usec) $ 1 = 255 (kelewatan step idle, msec) $ 2 = 7 (topeng invert port step: 00000111) $ 3 = 7 (topeng invert port dir: 00000111) $ 4 = 0 (langkah mengaktifkan invert, bool) $ 5 = 0 (had had pin, bool) $ 6 = 1 (pin prob invert, bool) $ 10 = 3 (status report mask: 00000011) $ 11 = 0.020 (simpang penyimpangan, mm) $ 12 = 0.002 (toleransi arka, mm) $ 13 = 0 (inci laporan, bool) $ 20 = 0 (had lembut, bool) $ 21 = 0 (had keras, bool) $ 22 = 1 (kitaran homing, bool) $ 23 = 0 (topeng invert dir homing: 00000000) $ 24 = 100.000 (umpan pulang, mm / min) $ 25 = 500.000 (pencarian homing, mm / min) $ 26 = 250 (debouning homing, msec) $ 27 = 1.000 (pull-off homing, mm) $ 100 = 250.000 (x, langkah / mm) $ 101 = 250.000 (y, langkah / mm) $ 102 = 250.000 (z, langkah / mm) $ 110 = 500.000 (kadar x maksimum, mm / min) $ 111 = 500.000 (kadar maksimum y, mm / min) $ 112 = 500.000 (kadar maksimum z, 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 maksimum perjalanan, mm) $ 131 = 200.000 (perjalanan maksimum, mm) $ 132 = 200.000 (perjalanan maksimum z, mm)

Langkah 8: Muat naik Kod Akhir dan Periksa Hasil Maya di Papan Pemuka Perisian Arduino Uno

// Unit: CM

apungan b_height = 0;

apungan a1 = 92;

apungan a2 = 86;

float snude_len = 20;

boolean doZ = false;

float base_angle; // = 0;

lengan apung1_angle; // = 0;

lengan apung2_angle; // = 0;

apungan bx = 60; // = 25;

terapung dengan = 60; // = 0;

apungan bz = 60; // = 25;

apungan x = 60;

terapung y = 60;

apungan z = 60;

apungan q;

apungan c;

terapung V1;

terapung V2;

terapung V3;

terapung V4;

terapung V5;

batal persediaan () {

saiz (700, 700, P3D);

cam = PeasyCam baru (ini, 300);

cam.setMinimumDistance (50);

cam.setMaximumDistance (500);

}

undian tidak sah () {

// ligninger:

y = (tetikusX - lebar / 2) * (- 1);

x = (tetikusY - tinggi / 2) * (- 1);

bz = z;

oleh = y;

bx = x;

terapung 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 = radian (90.0) - q;

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

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

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

arm1_angle = darjah (arm1_angle);

arm2_angle = darjah (arm2_angle);

// println (oleh, bz);

// arm1_angle = 90;

// arm2_angle = 45;

/*

arm2_angle = 23;

arm1_angle = 23;

arm2_angle = 23;

*/

// interaktif:

// jika (doZ)

//

// {

// base_angle = base_angle + mouseX-pmouseX;

//} lain

// {

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

putarZ (-1.2);

latar belakang (0);

lampu ();

pushMatrix ();

// ASAS

isi (150, 150, 150);

box_corner (50, 50, b_height, 0);

putar (radian (base_angle), 0, 0, 1);

// ARM 1

isi (150, 0, 150);

box_corner (10, 10, a1, arm1_angle);

// ARM 2

isi (255, 0, 0);

box_corner (10, 10, a2, arm2_angle);

// PENILAIAN

isi (255, 150, 0);

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

popMatrix ();

pushMatrix ();

float action_box_size = 100;

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

pushMatrix ();

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

isi (255, 255, 0);

kotak (20);

popMatrix ();

isi (255, 255, 255, 50);

kotak (action_box_size, action_box_size, action_box_size);

popMatrix ();

}

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

{

putar (radian (putar), 1, 0, 0);

terjemahkan (0, 0, d / 2);

kotak (w, h, d);

terjemahkan (0, 0, d / 2);

}

kekunci kekosongan Ditekan ()

{

jika (kunci == 'z')

{

doZ =! doZ;

}

jika (kunci == 'h')

{

// tetapkan semua ke sifar

arm2_angle = 0;

arm1_angle = 90;

base_angle = 0;

}

jika (kunci == 'g')

{

println (darjah (V1));

println (darjah (V5));

}

jika (keyCode == UP)

{

z ++;

}

jika (keyCode == KE BAWAH)

{

z -;

}

jika (kunci == '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);

}

}

Disyorkan: