Isi kandungan:
- Langkah 1: Pengubahsuaian Perkakasan
- Langkah 2: Muat turun Perpustakaan VarSpeedServo
- Langkah 3: Jalankan Lakaran ini
- Langkah 4: Fakta, Isu dan seumpamanya…
Video: Menggunakan Arduino Uno untuk Kedudukan XYZ 6 Lengan Robot DOF: 4 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:11
Projek ini adalah mengenai pelaksanaan lakaran Arduino yang pendek dan mudah untuk menyediakan kedudukan kinematik terbalik XYZ. Saya telah membina lengan robot servo 6 tetapi ketika mencari perisian untuk menjalankannya, tidak banyak yang terdapat di luar sana kecuali untuk program khusus yang berjalan pada perisai servo tersuai seperti SSC-32 (U) atau program dan aplikasi lain yang rumit untuk dipasang dan berkomunikasi dengan lengan. Kemudian saya menjumpai "Robotic Arm Inverse Kinematics on Arduino" Oleg Mazurov yang paling hebat di mana dia menerapkan kinematik terbalik dalam lakaran Arduino ringkas.
Saya membuat dua pengubahsuaian untuk menyesuaikan kodnya:
1. Saya menggunakan perpustakaan VarSpeedServo sebagai pengganti pustaka servo peribadinya kerana saya kemudian dapat mengawal kelajuan servo dan saya tidak perlu menggunakan pelindung servo yang digunakannya. Bagi sesiapa yang mempertimbangkan untuk menjalankan kod yang disediakan di sini, saya mengesyorkan agar anda menggunakan perpustakaan VarSpeedServo ini, dan bukannya perpustakaan servo.h, supaya anda dapat melambatkan pergerakan lengan robot anda semasa pembangunan atau anda mungkin mendapati lengan itu secara tidak disangka akan mendorong anda masuk wajah atau lebih teruk kerana akan bergerak dengan kelajuan servo penuh.
2. Saya menggunakan pelindung sensor / servo sederhana untuk menghubungkan servo ke Arduino Uno tetapi ia tidak memerlukan perpustakaan servo khas kerana ia hanya menggunakan pin Arduino. Harganya hanya beberapa dolar tetapi tidak diperlukan. Ia menjadikan sambungan servo yang bersih dan bersih ke Arduino. Dan saya tidak akan pernah kembali ke servo kabel ke Arduino Uno sekarang. Sekiranya anda menggunakan pelindung sensor / servo ini, anda perlu membuat satu modifikasi kecil yang akan saya gariskan di bawah.
Kod ini berfungsi dengan baik dan membolehkan anda mengoperasikan lengan dengan menggunakan satu fungsi di mana anda melewati parameter x, y, x dan speed. Sebagai contoh:
set_arm (0, 240, 100, 0, 20); // parameternya adalah (x, y, z, sudut gripper, servo speed)
kelewatan (3000); // kelewatan diperlukan untuk membolehkan masa lengan bergerak ke lokasi ini
Tidak mungkin lebih sederhana. Saya akan memasukkan lakaran di bawah.
Video Oleg ada di sini: Mengendalikan Lengan Robotik dengan Arduino dan Tetikus USB
Program, penerangan, dan sumber asli Oleg: Income Kinematics Oleg untuk Arduino Uno
Saya tidak memahami semua matematik di sebalik rutin tetapi yang menariknya ialah anda tidak perlu menggunakan kodnya. Harap anda akan mencubanya.
Langkah 1: Pengubahsuaian Perkakasan
1. Satu-satunya perkara yang diperlukan ialah servo anda beralih ke arah yang diharapkan yang memerlukan anda membalikkan pemasangan servos anda secara fizikal. Pergi ke halaman ini untuk melihat arah servo yang diharapkan untuk servo pangkal, bahu, siku, dan pergelangan tangan:
2. Sekiranya anda menggunakan pelindung sensor yang saya gunakan, anda perlu melakukan satu perkara: bengkokkan pin yang menghubungkan 5v dari perisai ke Arduino Uno sehingga tidak menyambung ke papan Uno. Anda ingin menggunakan voltan luaran pada perisai untuk menghidupkan servo anda sahaja, bukan Arduino Uno atau ia boleh memusnahkan Uno, saya tahu semasa saya membakar dua papan Uno ketika voltan luaran saya adalah 6 volt daripada 5. Ini membolehkan anda untuk menggunakan lebih tinggi daripada 5v untuk menghidupkan servo anda tetapi jika voltan luaran anda lebih tinggi daripada 5 volt maka jangan sambungkan sensor 5 volt ke pelindung atau mereka akan digoreng.
Langkah 2: Muat turun Perpustakaan VarSpeedServo
Anda perlu menggunakan pustaka ini yang menggantikan pustaka servo arduino standard kerana ia membolehkan anda meneruskan kelajuan servo ke dalam penyataan penulisan servo. Perpustakaan terletak di sini:
Perpustakaan VarSpeedServo
Anda hanya boleh menggunakan butang zip, memuat turun fail zip dan kemudian memasangnya dengan Arduino IDE. Setelah memasang arahan dalam program anda akan kelihatan seperti: servo.write (100, 20);
Parameter pertama adalah sudut dan yang kedua adalah kelajuan servo dari 0 hingga 255 (kelajuan penuh).
Langkah 3: Jalankan Lakaran ini
Inilah program bersaing. Anda perlu mengubah beberapa parameter untuk dimensi lengan robot anda:
1. BASE_HGT, HUMERUS, ULNA, GRIPPER panjang dalam milimeter.
2. Masukkan nombor pin servo anda
3. Masukkan servo min dan max dalam pernyataan lampiran.
4. Kemudian cuba perintah set_arm () sederhana dan kemudian fungsi zero_x (), line () dan circle () untuk ujian. Pastikan kelajuan servo anda rendah pada kali pertama anda menjalankan fungsi-fungsi ini untuk mengelakkan kerosakan pada lengan dan lengan anda sendiri.
Semoga berjaya.
#sertakan VarSpeedServo.h
/ * Kawalan servo untuk lengan AL5D * /
/ * Dimensi lengan (mm) * /
#tentukan BASE_HGT 90 // ketinggian asas
#tentukan HUMERUS 100 // "tulang" bahu-ke-siku
#tentukan ULNA 135 // "tulang" siku ke pergelangan tangan
#define GRIPPER 200 // gripper (termasuk mekanisme putar pergelangan tangan tugas berat) panjang"
#define ftl (x) ((x)> = 0? (panjang) ((x) +0.5):(panjang) ((x) -0.5)) // terapung ke penukaran panjang
/ * Nama / nombor servo *
* Servo asas HS-485HB * /
#tentukan BAS_SERVO 4
/ * Bahu Servo HS-5745-MG * /
#tentukan SHL_SERVO 5
/ * Elbow Servo HS-5745-MG * /
#tentukan ELB_SERVO 6
/ * Pergelangan tangan servo HS-645MG * /
#tentukan WRI_SERVO 7
/ * Servo putar pergelangan tangan HS-485HB * /
#tentukan WRO_SERVO 8
/ * Gripper servo HS-422 * /
#tentukan GRI_SERVO 9
/ * pra-pengiraan * /
float hum_sq = HUMERUS * HUMERUS;
float uln_sq = ULNA * ULNA;
int servoSPeed = 10;
// ServoShield servos; // Objek ServoShield
VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;
int loopCounter = 0;
int pulseWidth = 6.6;
int mikrodetikToDegrees;
persediaan tidak sah ()
{
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);
kelewatan (5500);
//servos.start (); // Mulakan pelindung servo
servo_park ();
kelewatan (4000);
Serial.begin (9600);
Serial.println ("Mula");
}
gelung kosong ()
{
loopCounter + = 1;
// set_arm (-300, 0, 100, 0, 10); //
// kelewatan (7000);
// zero_x ();
// baris ();
// bulatan ();
kelewatan (4000);
jika (loopCounter> 1) {
servo_park ();
// set_arm (0, 0, 0, 0, 10); // taman
kelewatan (5000);
jalan keluar (0); } // jeda program - tekan semula untuk meneruskan
// keluar (0);
}
/ * rutin penentuan kedudukan lengan menggunakan kinematik terbalik * /
/ * z adalah tinggi, y adalah jarak dari pusat pangkalan ke luar, x adalah sisi ke sisi. y, z hanya boleh positif * /
// void set_arm (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)
kekosongan set_arm (float x, float y, float z, float grip_angle_d, int servoSpeed)
{
float grip_angle_r = radian (grip_angle_d); // sudut cengkaman dalam radian untuk digunakan dalam pengiraan
/ * Sudut dasar dan jarak jejari dari koordinat x, y * /
terapung bas_angle_r = atan2 (x, y);
float rdist = sqrt ((x * x) + (y * y));
/ * rdist adalah koordinat untuk lengan * /
y = rdist;
/ * Pengimbangan cengkaman dikira berdasarkan sudut cengkaman * /
float grip_off_z = (sin (grip_angle_r)) * GRIPPER;
float grip_off_y = (cos (grip_angle_r)) * GRIPPER;
/ * Kedudukan pergelangan tangan * /
pergelangan tangan terapung_z = (z - grip_off_z) - BASE_HGT;
pergelangan tangan terapung_y = y - grip_off_y;
/ * Jarak bahu ke pergelangan tangan (AKA sw) * /
apungan s_w = (pergelangan tangan_z * pergelangan tangan_z) + (pergelangan tangan_y * pergelangan tangan_y);
terapung s_w_sqrt = sqrt (s_w);
/ * sudut s_w ke tanah * /
apungan a1 = atan2 (pergelangan tangan_, pergelangan tangan_y);
/ * sudut s_w ke humerus * /
apungan a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));
/ * sudut bahu * /
terapung shl_angle_r = a1 + a2;
terapung shl_angle_d = darjah (shl_angle_r);
/ * sudut siku * /
float elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));
terapung elb_angle_d = darjah (elb_angle_r);
terapung elb_angle_dn = - (180.0 - elb_angle_d);
/ * sudut pergelangan tangan * /
terapung wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;
/ * Denyut servo * /
float bas_servopulse = 1500.0 - ((darjah (bas_angle_r)) * pulseWidth);
float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);
float elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * pulseWidth);
// terapung wri_servopulse = 1500 + (wri_angle_d * pulseWidth);
// terapung wri_servopulse = 1500 + (wri_angle_d * pulseWidth);
float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // dikemas kini 2018/2/11 oleh jimrd - Saya menukar tambah menjadi tolak - tidak pasti bagaimana kod ini berfungsi untuk sesiapa sahaja sebelum ini. Mungkin servo siku dipasang dengan 0 darjah menghadap ke bawah dan bukannya ke atas.
/ * Tetapkan servo * /
//servos.setposition(BAS_SERVO, ftl (bas_servopulse));
mikrodetikToDegrees = peta (ftl (bas_servopulse), 544, 2400, 0, 180);
servo1.write (mikrodetikToDegrees, servoSpeed); // gunakan fungsi ini supaya anda dapat mengatur kelajuan servo //
//servos.setposition(SHL_SERVO, ftl (shl_servopulse));
mikrodetikToDegrees = peta (ftl (shl_servopulse), 544, 2400, 0, 180);
servo2.write (mikrodetikToDegrees, servoSpeed);
//servos.setposition(ELB_SERVO, ftl (elb_servopulse));
mikrodetikToDegrees = peta (ftl (elb_servopulse), 544, 2400, 0, 180);
servo3.write (mikrodetikToDegrees, servoSpeed);
//servos.setposition(WRI_SERVO, ftl (wri_servopulse));
mikrodetikToDegrees = peta (ftl (wri_servopulse), 544, 2400, 0, 180);
servo4.write (mikrodetikToDegrees, servoSpeed);
}
/ * pindahkan servo ke tempat letak kereta * /
kosong 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;
}
batal zero_x ()
{
untuk (double yaxis = 250.0; yaxis <400.0; yaxis + = 1) {
Serial.print ("yaxis =:"); Serial.println (yaxis);
set_arm (0, yaxis, 200.0, 0, 10);
kelewatan (10);
}
untuk (double yaxis = 400.0; yaxis> 250.0; yaxis - = 1) {
set_arm (0, yaxis, 200.0, 0, 10);
kelewatan (10);
}
}
/ * bergerak lengan dalam garis lurus * /
garis kosong ()
{
untuk (xaxis berganda = -100.0; xaxis <100.0; xaxis + = 0.5) {
set_arm (xaxis, 250, 120, 0, 10);
kelewatan (10);
}
untuk (terapung xaxis = 100.0; xaxis> -100.0; xaxis - = 0.5) {
set_arm (xaxis, 250, 120, 0, 10);
kelewatan (10);
}
}
bulatan kosong ()
{
#tentukan RADIUS 50.0
// sudut apungan = 0;
terapung zaxis, yaxis;
untuk (sudut apungan = 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);
kelewatan (10);
}
}
Langkah 4: Fakta, Isu dan seumpamanya…
1. Semasa saya menjalankan bulatan () subrutin robot saya bergerak lebih dalam bentuk elips daripada bulatan. Saya fikir itu kerana servos saya tidak dikalibrasi. Saya menguji salah satu daripadanya dan 1500 mikrodetik tidak sama dengan 90 darjah. Akan berusaha untuk mencuba dan mencari jalan penyelesaian. Jangan percaya ada yang tidak kena dengan algoritma itu tetapi dengan tetapan saya. Kemas kini 2018/2/11 - baru sahaja mengetahui bahawa ini disebabkan oleh kesalahan pada kod asal. Saya tidak melihat bagaimana programnya berfungsi Memperbaiki kod menggunakan ini: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (kod asal menambah)
2. Di mana saya boleh mendapatkan lebih banyak maklumat mengenai bagaimana fungsi set_arm () berfungsi: Laman web Oleg Mazurov menerangkan segalanya atau menyediakan pautan untuk maklumat lebih lanjut:
3. Adakah terdapat pemeriksaan keadaan sempadan? Tidak. Apabila lengan robot saya dilewatkan koordinat xyz yang tidak betul, ia melakukan gerakan melengkung yang lucu seperti kucing yang meregang. Saya percaya Oleg melakukan pemeriksaan dalam program terbarunya yang menggunakan USB untuk memprogram pergerakan lengan. Lihat videonya dan pautan ke kod terbarunya.
4. Kod perlu dibersihkan dan kod mikrodetik dapat dihapuskan.
Disyorkan:
DC Motor dan Encoder untuk Kedudukan dan Kawalan Kelajuan: 6 Langkah
DC Motor and Encoder for Position and Speed Control: Pengenalan Kami adalah sekumpulan pelajar UQD10801 (Robocon I) dari Universiti Tun Hussei Onn Malaysia (UTHM). Kami mempunyai 9 kumpulan dalam kursus ini. Kumpulan saya adalah kumpulan 2. Aktiviti kumpulan kami adalah DC motor dan pengekod untuk kawalan kedudukan dan kelajuan. Objek kumpulan kami
Lengan Terkawal Telefon Pintar Murah (+ Kedudukan Penjimatan Pilihan): 5 Langkah
Lengan Dikendalikan Telefon Pintar Murah (+ Posisi Menyimpan Pilihan): ProjekMemacu lengan robot yang dikendalikan oleh telefon pintar menggunakan peranti bluetooth. Bonus kaedah: kami mempunyai butang yang membolehkan arduino mengingat kedudukan. Bila-bila masa kita mahu, kita boleh pergi ke kedudukan yang disimpan ini dengan butang lain. Perintah FRLE PROJET
4 Robot Lengan Mekanik DOF Dikendalikan oleh Arduino: 6 Langkah
4 Robot Lengan Mekanik DOF Dikendalikan oleh Arduino: Baru-baru ini saya membeli set ini di aliexpress, tetapi saya tidak dapat menemui arahan, yang sesuai dengan model ini. Jadi akhirnya membinanya hampir dua kali dan melakukan banyak eksperimen untuk mengetahui sudut pemasangan servo yang tepat. Dokumentasi yang munasabah adalah dia
Cara Memasang Lengan Robot Kayu yang Mengesankan (Bahagian 1: Robot untuk Penjejakan Garis) - Berdasarkan Mikro: Bit: 9 Langkah
Cara Memasang Lengan Robot Kayu yang Mengesankan (Bahagian 1: Robot untuk Penjejakan Garis) - Berdasarkan Mikro: Bit: Lelaki kayu ini mempunyai tiga bentuk, sangat berbeza dan mengagumkan. Kemudian mari kita masuk satu persatu
Cara Menggunakan Beberapa Potongan Kayu untuk Memasang Lengan Robot Kayu yang Comel dan Kuat: 10 Langkah
Cara Menggunakan Beberapa Potongan Kayu untuk Memasang Lengan Robot Kayu yang Comel dan Kuat: Nama lengan robot adalah WoodenArm. Ia kelihatan sangat comel! Sekiranya anda mahukan lebih terperinci mengenai WoodenArm, sila rujuk www.lewansoul.com Sekarang kita boleh membuat pengenalan mengenai WoodenArm, mari kita lanjutkan