Mundarija:

6 ta DOF robot qo'lini XYZ joylashuvi uchun Arduino Uno -dan foydalanish: 4 qadam
6 ta DOF robot qo'lini XYZ joylashuvi uchun Arduino Uno -dan foydalanish: 4 qadam

Video: 6 ta DOF robot qo'lini XYZ joylashuvi uchun Arduino Uno -dan foydalanish: 4 qadam

Video: 6 ta DOF robot qo'lini XYZ joylashuvi uchun Arduino Uno -dan foydalanish: 4 qadam
Video: Among Us in HD (Part 47) TIMBER #Shorts 2024, Noyabr
Anonim
Image
Image

Bu loyiha XYZ teskari kinematik joylashishni ta'minlash uchun qisqa va nisbatan oson Arduino eskizini amalga oshirish haqida. Men 6 ta servo robotli qo'l qurgan edim, lekin uni ishga tushirish uchun dasturiy ta'minot topishga kelganda, SSC-32 (U) kabi maxsus servo qalqonlarda ishlaydigan maxsus dasturlar yoki boshqa dasturlar va ilovalar bundan mustasno edi. qo'l bilan o'rnatish va aloqa qilish murakkab. Keyin men Oleg Mazurovning eng zo'r "Arduino ustidagi robotli qo'llar teskari kinematikasini" topdim, u erda teskari kinematikani oddiy Arduino eskizida amalga oshirdi.

Men uning kodini moslashtirish uchun ikkita o'zgartirish kiritdim:

1. Men VarSpeedServo kutubxonasini uning maxsus servo qalqon kutubxonasi o'rniga ishlatardim, chunki men servo tezligini nazorat qila olardim va u ishlatgan servo qalqondan foydalanmasligim kerak edi. Bu erda berilgan kodni ishlatishni istagan har bir kishi uchun, servo.h kutubxonasidan emas, balki ushbu VarSpeedServo kutubxonasidan foydalanishingizni tavsiya qilaman, shunda siz robot qo'l harakatini rivojlanish jarayonida sekinlashtirasiz yoki qo'lingiz sizni kutilmaganda ichkariga urib yuborishi mumkin. yuz yoki undan ham yomoni, chunki u to'liq servo tezlikda harakat qiladi.

2. Men servolarni Arduino Uno -ga ulash uchun oddiy sensor/servo qalqondan foydalanaman, lekin u maxsus servo kutubxonani talab qilmaydi, chunki u faqat Arduino pinlarini ishlatadi. Bu faqat bir necha dollar turadi, lekin bu talab qilinmaydi. Bu servolarning Arduino -ga yaxshi toza ulanishini ta'minlaydi. Va men hech qachon Arduino Uno xizmat ko'rsatadigan servoga qaytmayman. Agar siz ushbu sensor/servo qalqondan foydalansangiz, men quyida tasvirlab beradigan bitta kichik o'zgartirish kiritishingiz kerak.

Kod juda yaxshi ishlaydi va x, y, x va tezlik parametrlarini uzatadigan bitta funktsiyadan foydalanib qo'lni boshqarishga imkon beradi. Masalan:

set_arm (0, 240, 100, 0, 20); // parametrlari (x, y, z, tutqich burchagi, servo tezligi)

kechikish (3000); // qo'lning vaqtini bu joyga ko'chirish uchun kechiktirish kerak

Oddiy bo'lishi mumkin emas. Men quyida eskizni kiritaman.

Olegning videosi bu erda: Arduino va USB sichqonchasi yordamida robot qo'lini boshqarish

Olegning asl dasturi, tavsifi va manbalari: Arduino Uno uchun Olegning teskari kinematikasi

Men muntazam matematikani tushunmayman, lekin yaxshi narsa shundaki, siz kodni ishlatishingiz shart emas. Umid qilamanki, siz buni sinab ko'rasiz.

1 -qadam: Uskuna modifikatsiyalari

Uskuna modifikatsiyalari
Uskuna modifikatsiyalari

1. Faqat sizning servo kutilgan tomonga burilishi talab qilinadi, bu sizning servolarni o'rnatishni jismonan o'zgartirishingizni talab qilishi mumkin. Asosiy, elka, tirsak va bilak servolari uchun kutilayotgan servo yo'nalishini ko'rish uchun ushbu sahifaga o'ting:

2. Agar men foydalanayotgan sensorli qalqondan foydalansangiz, unga bitta narsani qilishingiz kerak: qalqondan 5vni Arduino Uno -ga ulaydigan pinni Uno taxtasiga ulanmasligi uchun egib oling. Siz qalqondagi tashqi kuchlanishni Arduino Uno -ni emas, balki faqat servolarni quvvatlantirish uchun ishlatmoqchisiz yoki bu Uno -ni buzishi mumkin, bilaman, men tashqi kuchlanishim 5 volt emas, 6 volt bo'lganida ikkita Uno taxtasini yoqib yuborganman. servolarni quvvatlantirish uchun 5V dan yuqori quvvatni ishlating, lekin tashqi kuchlanishingiz 5 voltdan yuqori bo'lsa, qalqonga 5 voltli datchiklarni ulamang, aks holda ular qovuriladi.

2 -qadam: VarSpeedServo kutubxonasini yuklab oling

Siz standart arduino servo kutubxonasi o'rnini bosadigan ushbu kutubxonadan foydalanishingiz kerak, chunki u servo yozish bayonotiga servo tezligini uzatishga imkon beradi. Kutubxona bu erda joylashgan:

VarSpeedServo kutubxonasi

Siz faqat zip tugmachasidan foydalanishingiz, zip faylini yuklab olishingiz va keyin Arduino IDE bilan o'rnatishingiz mumkin. Sizning dasturingizga buyruq o'rnatilgandan so'ng quyidagicha bo'ladi: servo.write (100, 20);

Birinchi parametr - burchak, ikkinchisi - servo tezligi 0 dan 255 gacha (to'liq tezlik).

3 -qadam: Ushbu eskizni ishga tushiring

Mana, musobaqa dasturi. Robot qo'l o'lchovlari uchun bir nechta parametrlarni o'zgartirish kerak:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER uzunliklari millimetrda.

2. Servo pin raqamlarini kiriting

3. Ilova qo'shimchalariga servo min va max kiriting.

4. Keyin oddiy set_arm () buyrug'ini, so'ngra zero_x (), line () va aylana () funktsiyalarini sinab ko'ring. Qo'l va o'z qo'lingizga zarar yetkazmaslik uchun bu funktsiyalarni birinchi marta ishga tushirganingizda servo tezligingiz past bo'lishiga ishonch hosil qiling.

Omad.

#o'z ichiga VarSpeedServo.h

/ * AL5D qo'li uchun servo boshqaruv */

/ * Qo'l o'lchamlari (mm) */

#BASE_HGT 90 // tayanch balandligini aniqlang

#define HUMERUS 100 // elkadan tirsagacha "suyak"

#define ULNA 135 // bilakdan tirsagacha "suyak"

#depine GRIPPER 200 // ushlagich (bilagini burish mexanizmini o'z ichiga oladi) uzunligi"

#define ftl (x) ((x)> = 0? (uzun) ((x) +0.5):(uzun) ((x) -0.5)) // uzoq konvertatsiya qilish

/ * Servo nomlari/raqamlari *

* HS-485HB asosiy servo */

#BAS_SERVO ni aniqlang 4

/ * Yelka Servo HS-5745-MG */

SHL_SERVO 5 ni aniqlang

/ * Tirsak Servo HS-5745-MG */

#ELB_SERVO ni aniqlang 6

/ * HS-645MG bilak servo */

#ta'rif WRI_SERVO 7

/ * HS-485HB bilagini aylantirish servo */

#ta'rif WRO_SERVO 8

/ * HS-422 tutqichli tutqich *

#ta'rif GRI_SERVO 9

/ * oldindan hisob-kitoblar */

float hum_sq = HUMERUS*HUMERUS;

float uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servolari; // ServoShield obyekti

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

int loopCounter = 0;

int pulseWidth = 6.6;

int microsecondsToDegrees;

bo'sh o'rnatish ()

{

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

kechikish (5500);

//servos.start (); // Servo qalqonini ishga tushiring

servo_park ();

kechikish (4000);

Serial.begin (9600);

Serial.println ("Boshlash");

}

bo'sh halqa ()

{

loopCounter += 1;

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

// kechikish (7000);

// nol_x ();

// chiziq ();

// doira ();

kechikish (4000);

agar (loopCounter> 1) {

servo_park ();

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

kechikish (5000);

chiqish (0); } // dasturni to'xtatib turish - davom etish uchun reset tugmasini bosing

// chiqish (0);

}

/ * teskari kinematika yordamida qo'llarni joylashtirish tartibi */

/* z - balandlik, y - tayanch markazidan masofa, x - yonma -yon. y, z faqat ijobiy bo'lishi mumkin */

// 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); // hisoblashda ishlatish uchun radianlarda tutish burchagi

/ * Asosiy burchak va x, y koordinatalaridan radiusli masofa */

float bas_angle_r = atan2 (x, y);

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

/ * rdist - qo'lning koordinatasi */

y = rdist;

/ * Tutash burchagiga qarab hisoblangan siljishlar */

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

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

/ * Bilak pozitsiyasi */

float wrist_z = (z - grip_off_z) - BASE_HGT;

suzuvchi bilak_y = y - grip_off_y;

/ * Yelka bilagigacha (AKA sw) */

float s_w = (bilak_z * bilak_z) + (bilak_y * bilak_y);

float s_w_sqrt = sqrt (s_w);

/ * s_w erga burchak */

float a1 = atan2 (bilak_z, bilak_y);

/ * s_w dumg'aza burchagi */

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

/ * elka burchagi */

float shl_angle_r = a1 + a2;

float shl_angle_d = daraja (shl_angle_r);

/ * tirsak burchagi */

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

float elb_angle_d = daraja (elb_angle_r);

float elb_angle_dn = - (180.0 - elb_angle_d);

/ * bilak burchagi */

suzuvchi wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Servo impulslari */

float bas_servopulse = 1500.0 - ((darajalar (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);

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

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

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // jimrd tomonidan 2018/2/11 yangilandi - men plyusni minusga o'zgartirdim - bu kod oldin hech kim uchun qanday ishlaganini bilmayman. Tirsak servo yuqoriga emas, balki 0 daraja pastga qaragan holda o'rnatilgan bo'lishi mumkin.

/ * Servolarni o'rnatish */

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

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

servo1.write (microsecondsToDegrees, servoSpeed); // servo tezligini sozlash uchun bu funktsiyadan foydalaning //

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

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

servo2.write (microsecondsToDegrees, servoSpeed);

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

microsecondsToDegrees = xarita (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (microsecondsToDegrees, servoSpeed);

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

microsecondsToDegrees = xarita (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (microsecondsToDegrees, servoSpeed);

}

/ * servolarni to'xtash joyiga o'tkazish */

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

qaytish;

}

bekor nol_x ()

{

uchun (er -xotin yaxis = 250,0; yaxis <400,0; yaxis += 1) {

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

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

kechikish (10);

}

uchun (er -xotin yaxis = 400,0; yaxis> 250,0; yaxis -= 1) {

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

kechikish (10);

}

}

/ * qo'lni to'g'ri chiziqda harakatlantiradi */

bo'sh chiziq ()

{

uchun (er -xotin xaksis = -100.0; xaxis <100.0; xaxis += 0.5) {

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

kechikish (10);

}

uchun (float xaxis = 100.0; xaxis> -100.0; xaxis -= 0.5) {

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

kechikish (10);

}

}

bo'sh doira ()

{

#RADIUS 50.0 ni aniqlang

// suzish burchagi = 0;

float zaxis, yaxsi;

uchun (float burchagi = 0,0; burchak <360,0; burchak += 1,0) {

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

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

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

kechikish (10);

}

}

4 -qadam: Faktlar, muammolar va shunga o'xshashlar …

Faktlar, muammolar va shunga o'xshashlar …
Faktlar, muammolar va shunga o'xshashlar …

1. Men aylanani () kichik dasturini ishga tushirganimda, robotim aylanadan ko'ra ko'proq elliptik shaklda harakat qiladi, menimcha, bu mening servolarim sozlanmaganligidadir. Men ulardan birini sinab ko'rdim va 1500 mikrosaniya 90 daraja bilan bir xil emas edi. Buning ustida harakat qilib, yechim topadi. Algoritmda noto'g'ri narsa borligiga ishonmang, aksincha mening sozlamalarimda. Yangilanish 2018/2/11 - bu asl koddagi xato tufayli aniqlandi. Uning dasturi qanday ishlatilganini ko'rmayapman Ruxsat etilgan kod: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (asl kod qo'shilgan edi)

2. Set_arm () funktsiyasi qanday ishlashi haqida ko'proq ma'lumotni qayerdan topsam bo'ladi: Oleg Mazurov veb-sayti hamma narsani tushuntiradi yoki qo'shimcha ma'lumot olish uchun havolalarni beradi:

3. Chegaraviy shartlarni tekshirish bormi? Yo'q. Robot qo'limni noto'g'ri xyz koordinatasidan o'tkazib yuborganida, u mushukning cho'zilishi kabi kamar harakatini bajaradi. Menimcha, Oleg qo'l harakatlarini dasturlash uchun USB -dan foydalanadigan so'nggi dasturini tekshiradi. Uning videosini ko'ring va uning so'nggi kodiga havola qiling.

4. Kodni tozalash kerak va mikrosaniyali kodni yo'q qilish mumkin.

Tavsiya: