Daftar Isi:

Menggunakan Arduino Uno untuk Posisi XYZ Lengan Robot 6 DOF: 4 Langkah
Menggunakan Arduino Uno untuk Posisi XYZ Lengan Robot 6 DOF: 4 Langkah

Video: Menggunakan Arduino Uno untuk Posisi XYZ Lengan Robot 6 DOF: 4 Langkah

Video: Menggunakan Arduino Uno untuk Posisi XYZ Lengan Robot 6 DOF: 4 Langkah
Video: TUTORIAL CARA MERAKIT ROBOT LENGAN 6 AXIS 2024, November
Anonim
Image
Image

Proyek ini adalah tentang mengimplementasikan sketsa Arduino yang pendek dan relatif mudah untuk memberikan pemosisian kinematik terbalik XYZ. Saya telah membangun lengan robot 6 servo tetapi ketika harus menemukan perangkat lunak untuk menjalankannya, tidak banyak di luar sana kecuali untuk program khusus yang berjalan pada pelindung servo khusus seperti SSC-32(U) atau program dan aplikasi lain yang rumit untuk menginstal dan berkomunikasi dengan lengan. Kemudian saya menemukan "Robotic Arm Inverse Kinematics on Arduino" Oleg Mazurov yang paling bagus di mana ia mengimplementasikan kinematika terbalik dalam sketsa Arduino sederhana.

Saya membuat dua modifikasi untuk mengadaptasi kodenya:

1. Saya menggunakan perpustakaan VarSpeedServo sebagai pengganti perpustakaan perisai servo kustomnya karena saya kemudian dapat mengontrol kecepatan servos dan saya tidak perlu menggunakan perisai servo yang dia gunakan. Untuk siapa pun yang mempertimbangkan untuk menjalankan kode yang disediakan di sini, saya sarankan Anda menggunakan perpustakaan VarSpeedServo ini, daripada perpustakaan servo.h, sehingga Anda dapat memperlambat gerakan lengan robot Anda selama pengembangan atau Anda mungkin menemukan bahwa lengan itu tiba-tiba akan menusuk Anda. wajah atau lebih buruk karena akan bergerak dengan kecepatan servo penuh.

2. Saya menggunakan pelindung sensor/servo sederhana untuk menghubungkan servos ke Arduino Uno tetapi tidak memerlukan perpustakaan servo khusus karena hanya menggunakan pin Arduino. Biayanya hanya beberapa dolar tetapi tidak diperlukan. Itu membuat koneksi bersih yang bagus dari servos ke Arduino. Dan saya tidak akan pernah kembali ke servo hardwiring ke Arduino Uno sekarang. Jika Anda menggunakan pelindung sensor/servo ini, Anda perlu membuat satu modifikasi kecil yang akan saya uraikan di bawah ini.

Kode berfungsi dengan baik dan memungkinkan Anda untuk mengoperasikan lengan dengan menggunakan satu fungsi di mana Anda melewati parameter x, y, x dan kecepatan. Sebagai contoh:

set_arm(0, 240, 100, 0, 20); // parameternya adalah (x, y, z, sudut gripper, kecepatan servo)

penundaan(3000); // penundaan diperlukan untuk memberikan waktu yang lama untuk pindah ke lokasi ini

Tidak bisa lebih sederhana. Saya akan menyertakan sketsa di bawah ini.

Video Oleg ada di sini: Mengontrol Lengan Robot dengan Arduino dan Mouse USB

Program, deskripsi, dan sumber daya asli Oleg: Kinematika Terbalik Oleg untuk Arduino Uno

Saya tidak mengerti semua matematika di balik rutinitas tetapi hal yang menyenangkan adalah Anda tidak harus menggunakan kode. Harap Anda akan mencobanya.

Langkah 1: Modifikasi Perangkat Keras

Modifikasi Perangkat Keras
Modifikasi Perangkat Keras

1. Satu-satunya hal yang diperlukan adalah servo Anda berputar ke arah yang diharapkan yang dapat mengharuskan Anda untuk secara fisik membalikkan pemasangan servos Anda. Buka halaman ini untuk melihat arah servo yang diharapkan untuk servo dasar, bahu, siku, dan pergelangan tangan:

2. Jika Anda menggunakan pelindung sensor yang saya gunakan, Anda perlu melakukan satu hal: tekuk pin yang menghubungkan 5v dari pelindung ke Arduino Uno sehingga tidak terhubung ke papan Uno. Anda ingin menggunakan tegangan eksternal pada pelindung hanya untuk memberi daya pada servos Anda, bukan Arduino Uno atau dapat menghancurkan Uno, saya tahu ketika saya membakar dua papan Uno ketika tegangan eksternal saya 6 volt daripada 5. Ini memungkinkan Anda untuk menggunakan lebih tinggi dari 5v untuk memberi daya pada servos Anda tetapi jika tegangan eksternal Anda lebih tinggi dari 5 volt maka jangan hubungkan sensor 5 volt ke pelindung atau mereka akan digoreng.

Langkah 2: Unduh Perpustakaan VarSpeedServo

Anda perlu menggunakan perpustakaan ini yang menggantikan perpustakaan servo arduino standar karena memungkinkan Anda untuk melewatkan kecepatan servo ke dalam pernyataan penulisan servo. Perpustakaan terletak di sini:

Perpustakaan VarSpeedServo

Anda cukup menggunakan tombol zip, unduh file zip lalu instal dengan Arduino IDE. Setelah terinstal, perintah di program Anda akan terlihat seperti: servo.write(100, 20);

Parameter pertama adalah sudut dan yang kedua adalah kecepatan servo dari 0 hingga 255 (kecepatan penuh).

Langkah 3: Jalankan Sketsa Ini

Berikut program lombanya. Anda perlu memodifikasi beberapa parameter untuk dimensi lengan robot Anda:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER panjangnya dalam milimeter.

2. Masukkan nomor pin servo Anda

3. Masukkan servo min dan max dalam pernyataan lampiran.

4. Kemudian coba perintah set_arm() sederhana dan kemudian fungsi zero_x(), line() dan circle() untuk pengujian. Pastikan kecepatan servo Anda rendah saat pertama kali menjalankan fungsi ini untuk mencegah kerusakan pada lengan dan lengan Anda sendiri.

Semoga beruntung.

#sertakan VarSpeedServo.h

/* Kontrol servo untuk lengan AL5D */

/* Dimensi lengan (mm) */

#define BASE_HGT 90 //tinggi alas

#define HUMERUS 100 //bahu-ke-siku "tulang"

#define ULNA 135 // "tulang" siku-ke-pergelangan tangan

#define GRIPPER 200 // panjang gripper (termasuk mekanisme putaran pergelangan tangan tugas berat)"

#define ftl(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) //konversi float ke long

/* Nama/nomor servo *

* Basis servo HS-485HB */

#menentukan BAS_SERVO 4

/* Servo Bahu HS-5745-MG */

#menentukan SHL_SERVO 5

/* Servo Siku HS-5745-MG */

#define ELB_SERVO 6

/* Servo pergelangan tangan HS-645MG */

#definisikan WRI_SERVO 7

/* Pergelangan tangan memutar servo HS-485HB */

#menentukan WRO_SERVO 8

/* Gripper servo HS-422 */

#menentukan GRI_SERVO 9

/* perhitungan awal */

float hum_sq = HUMERUS*HUMERUS;

float uln_sq = ULNA*ULNA;

int servoKecepatan = 10;

//ServoShield servo; //objek ServoShield

VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;

int loopPenghitung=0;

int lebar pulsa = 6.6;

int mikrodetikToDegrees;

batalkan pengaturan()

{

servo1.attach(BAS_SERVO, 544, 2400);

servo2.attach(SHL_SERVO, 544, 2400);

servo3.attach(ELB_SERVO, 544, 2400);

servo4.attach(WRI_SERVO, 544, 2400);

servo5.attach(WRO_SERVO, 544, 2400);

servo6.attach(GRI_SERVO, 544, 2400);

penundaan (5500);

//servos.start(); //Mulai perisai servo

servo_park();

penundaan (4000);

Serial.begin(9600);

Serial.println("Mulai");

}

lingkaran kosong()

{

loopPenghitung +=1;

//set_arm(-300, 0, 100, 0, 10); //

//tunda(7000);

//nol_x();

//garis();

//lingkaran();

penundaan (4000);

if (penghitung loop > 1) {

servo_park();

//set_arm(0, 0, 0, 0, 10); // Taman

penundaan(5000);

keluar(0); }//pause program - tekan reset untuk melanjutkan

//keluar(0);

}

/* Rutinitas posisi lengan menggunakan kinematika terbalik */

/* z adalah tinggi, y adalah jarak dari pusat ke luar, x adalah sisi ke sisi. y, z hanya bisa positif */

//void set_arm(uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)

void set_arm(float x, float y, float z, float grip_angle_d, int servoSpeed)

{

float grip_angle_r = radian(grip_angle_d); //sudut pegangan dalam radian untuk digunakan dalam perhitungan

/* Sudut alas dan jarak radial dari koordinat x, y */

float bas_angle_r = atan2(x, y);

float rdist = kuadrat((x * x) + (y * y));

/* pertama adalah koordinat y untuk lengan */

y = pertama;

/* Grip offset dihitung berdasarkan sudut grip */

float grip_off_z = (sin(grip_angle_r)) * GRIPPER;

float grip_off_y = (cos(grip_angle_r)) * GRIPPER;

/* Posisi pergelangan tangan */

float wrist_z = (z - grip_off_z) - BASE_HGT;

float wrist_y = y - grip_off_y;

/* Jarak bahu ke pergelangan tangan (AKA sw) */

float s_w = (wrist_z * wrist_z) + (wrist_y * wrist_y);

float s_w_sqrt = sqrt(s_w);

/* s_w sudut ke tanah */

float a1 = atan2(wrist_z, wrist_y);

/* s_w sudut ke humerus */

float a2 = acos(((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));

/* sudut bahu */

float shl_angle_r = a1 + a2;

float shl_angle_d = derajat(shl_angle_r);

/* sudut siku */

float elb_angle_r = acos((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));

float elb_angle_d = derajat(elb_angle_r);

float elb_angle_dn = -(180.0 - elb_angle_d);

/* sudut pergelangan tangan */

float wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/* Pulsa servo */

float bas_servopulse = 1500,0 - ((derajat(bas_angle_r)) * lebar pulsa);

float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);

float elb_servopulse = 1500,0 - ((elb_angle_d - 90,0) * pulseWidth);

//float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

//float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth);// diperbarui 2018/2/11 oleh jimrd - Saya mengubah plus menjadi minus - tidak yakin bagaimana kode ini bekerja untuk siapa pun sebelumnya. Bisa jadi siku servo dipasang dengan 0 derajat menghadap ke bawah bukan ke atas.

/* Mengatur servo */

//servos.setposition(BAS_SERVO, ftl(bas_servopulse));

microsecondsToDegrees = peta(ftl(bas_servopulse), 544, 2400, 0, 180);

servo1.write(microsecondsToDegrees, servoSpeed); // gunakan fungsi ini agar Anda dapat mengatur kecepatan servo //

//servos.setposition(SHL_SERVO, ftl(shl_servopulse));

microsecondsToDegrees = peta(ftl(shl_servopulse), 544, 2400, 0, 180);

servo2.write(microsecondsToDegrees, servoSpeed);

//servos.setposition(ELB_SERVO, ftl(elb_servopulse));

mikrodetikToDegrees = peta(ftl(elb_servopulse), 544, 2400, 0, 180);

servo3.write(microsecondsToDegrees, servoSpeed);

//servos.setposition(WRI_SERVO, ftl(wri_servopulse));

mikrodetikToDegrees = peta(ftl(wri_servopulse), 544, 2400, 0, 180);

servo4.write(microsecondsToDegrees, servoSpeed);

}

/* pindahkan servo ke posisi parkir */

batalkan servo_park()

{

//servos.setposition(BAS_SERVO, 1500);

servo1.write(90, 10);

//servos.setposition(SHL_SERVO, 2100);

servo2.write(90, 10);

//servos.setposition(ELB_SERVO, 2100);

servo3.write(90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4.write(90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5.write(90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6.write(80, 10);

kembali;

}

batalkan nol_x()

{

for(sumbu ganda = 250.0; sumbu < 400.0; sumbu += 1) {

Serial.print(" yaxis=: ");Serial.println(yaxis);

set_arm(0, yaxis, 200.0, 0, 10);

penundaan (10);

}

for(sumbu ganda = 400.0; sumbu > 250.0; sumbu -= 1) {

set_arm(0, yaxis, 200.0, 0, 10);

penundaan (10);

}

}

/*menggerakkan lengan dalam garis lurus */

baris kosong()

{

for(sumbu x ganda = -100.0; sumbu x < 100.0; sumbu x += 0.5) {

set_arm(xaxis, 250, 120, 0, 10);

penundaan (10);

}

for(sumbu x mengambang = 100.0; sumbu x > -100.0; sumbu x -= 0.5) {

set_arm(xaxis, 250, 120, 0, 10);

penundaan (10);

}

}

lingkaran kosong()

{

#menentukan RADIUS 50.0

//sudut mengambang = 0;

mengambang zaxis, yaxis;

for(sudut mengambang = 0,0; sudut < 360,0; sudut += 1,0) {

yaxis = RADIUS * sin(radian(sudut)) + 300;

zaxis = RADIUS * cos(radian(sudut)) + 200;

set_arm(0, yaxis, zaxis, 0, 50);

penundaan (10);

}

}

Langkah 4: Fakta, Isu dan Semacamnya…

Fakta, Isu dan Semacamnya…
Fakta, Isu dan Semacamnya…

1. Ketika saya menjalankan subrutin circle() robot saya bergerak lebih dalam bentuk elips daripada lingkaran. Saya pikir itu karena servos saya tidak dikalibrasi. Saya menguji salah satunya dan 1500 mikrodetik tidak sama dengan 90 derajat. Akan bekerja pada ini untuk mencoba dan menemukan solusi. Jangan percaya ada yang salah dengan algoritme melainkan dengan pengaturan saya. Perbarui 2018/2/11 - baru saja ditemukan ini karena kesalahan dalam kode aslinya. Saya tidak melihat bagaimana programnya bekerja. Kode tetap menggunakan ini: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (kode asli ditambahkan)

2. Di mana saya dapat menemukan informasi lebih lanjut tentang cara kerja fungsi set_arm(): Situs web Oleg Mazurov menjelaskan semuanya atau menyediakan tautan untuk info lebih lanjut:

3. Apakah ada pemeriksaan kondisi batas? Tidak. Ketika lengan robot saya melewati koordinat xyz yang tidak valid, ia melakukan gerakan melengkung yang lucu seperti peregangan kucing. Saya yakin Oleg memang melakukan pengecekan di program terbarunya yang menggunakan USB untuk memprogram gerakan lengan. Lihat videonya dan tautan ke kode terbarunya.

4. Kode perlu dibersihkan dan kode mikrodetik dapat dihilangkan.

Direkomendasikan: