Բովանդակություն:

Arduino Uno- ի օգտագործումը 6 DOF ռոբոտային թևի XYZ դիրքի համար. 4 քայլ
Arduino Uno- ի օգտագործումը 6 DOF ռոբոտային թևի XYZ դիրքի համար. 4 քայլ

Video: Arduino Uno- ի օգտագործումը 6 DOF ռոբոտային թևի XYZ դիրքի համար. 4 քայլ

Video: Arduino Uno- ի օգտագործումը 6 DOF ռոբոտային թևի XYZ դիրքի համար. 4 քայլ
Video: How to use Prototyping Shield with breadboard for Arduino 2024, Դեկտեմբեր
Anonim
Image
Image

Այս նախագիծը վերաբերում է կարճ և համեմատաբար հեշտ Arduino ուրվագծի իրականացմանը `XYZ հակադարձ կինեմատիկական դիրքն ապահովելու համար: Ես կառուցել էի 6 servo robotic թև, բայց երբ խոսքը վերաբերում էր դրա գործարկման ծրագրակազմ գտնելուն, այնտեղ շատ բան չկար, բացառությամբ հատուկ ծրագրերի, որոնք աշխատում էին հատուկ սերվո վահաններով, ինչպես SSC-32 (U) կամ այլ ծրագրեր և ծրագրեր: բարդ է տեղադրել և շփվել թևի հետ: Հետո գտա Օլեգ Մազուրովի ամենահիանալի «Robotic Arm Inverse Kinematics on Arduino» - ն, որտեղ նա հակադարձ կինեմատիկա կիրառեց Arduino- ի պարզ ուրվագծում:

Ես երկու փոփոխություն կատարեցի ՝ նրա կոդը հարմարեցնելու համար.

1. Ես օգտագործեցի VarSpeedServo գրադարանը `իր սովորական servo shield գրադարանի փոխարեն, քանի որ այդ ժամանակ ես կարող էի վերահսկել սերվերի արագությունը, և ես ստիպված չէի օգտագործել նրա օգտագործած servo վահանը: Յուրաքանչյուրի համար, ով մտածում է այստեղ տրամադրված ծածկագրի գործարկման մասին, խորհուրդ եմ տալիս օգտագործել այս VarSpeedServo գրադարանը, այլ ոչ թե servo.h գրադարանը, որպեսզի զարգացման ընթացքում դանդաղեցնեք ձեր ձեռքի ռոբոտային շարժումը, կամ կարող եք պարզել, որ ձեռքը ձեզ անսպասելիորեն կխփի դեմքը կամ ավելի վատ, քանի որ այն կշարժվի ամբողջ սերվո արագությամբ:

2. Ես օգտագործում եմ մի պարզ սենսոր/սերվո վահան `սերվերը Arduino Uno- ին միացնելու համար, բայց այն չի պահանջում հատուկ servo գրադարան, քանի որ այն օգտագործում է Arduino- ի կապում: Այն արժե ընդամենը մի քանի դոլար, բայց դա պարտադիր չէ: Այն ապահովում է սերվերի գեղեցիկ մաքուր միացում Arduino- ին: Եվ ես երբեք չեմ վերադառնա Arduino Uno- ի քրտնաջան սերվերին: Եթե դուք օգտագործում եք այս սենսորային/servo վահանը, դուք պետք է կատարեք մեկ փոքր փոփոխություն, որը ես կներկայացնեմ ստորև:

Կոդը հիանալի է աշխատում և թույլ է տալիս գործել թևով ՝ օգտագործելով մեկ գործառույթ, որում անցնում եք x, y, x և արագության պարամետրերը: Օրինակ:

set_arm (0, 240, 100, 0, 20); // պարամետրերն են (x, y, z, gripper angle, servo speed)

ուշացում (3000); // ուշացում է պահանջվում, որպեսզի թույլատրվի ձեռքի ժամանակը տեղափոխել այս վայր

Ավելի պարզ չէր կարող լինել: Ստորև կներառեմ էսքիզը:

Օլեգի տեսահոլովակն այստեղ է. Կառավարում է Robotic Arm- ը Arduino- ով և USB մկնիկով

Օլեգի օրիգինալ ծրագիրը, նկարագրությունները և ռեսուրսները. Օլեգի հակադարձ կինեմատիկան Arduino Uno- ի համար

Ես չեմ հասկանում առօրյայի բոլոր մաթեմատիկան, բայց հաճելին այն է, որ պետք չէ օգտագործել ծածկագիրը: Հուսով եմ ՝ կփորձեք:

Քայլ 1: Սարքավորման փոփոխություններ

Սարքաշարի փոփոխություններ
Սարքաշարի փոփոխություններ

1. Միակ բանը, որ պահանջվում է, այն է, որ ձեր սերվոն շրջվի սպասված ուղղություններով, ինչը կարող է ձեզանից պահանջել ֆիզիկապես շրջել ձեր սերվերի տեղադրումը: Գնացեք այս էջ ՝ հիմքի, ուսի, արմունկի և դաստակի սերվերի սպասվող սերվոյի ուղղությունը տեսնելու համար.

2. Եթե դուք օգտագործում եք սենսորային վահանը, որը ես օգտագործում եմ, դուք պետք է մեկ բան անեք դրան. Մի կողմ թեքեք այն կապը, որը 5 վահանը վահանից միացնում է Arduino Uno- ին այնպես, որ այն չմիանա Uno տախտակին: Դուք ցանկանում եք վահանի արտաքին լարումը օգտագործել միայն ձեր սերվերը, ոչ թե Arduino Uno- ն, կամ այն կարող է ոչնչացնել Uno- ն, ես գիտեմ, որ ես այրեցի երկու Uno տախտակ, երբ իմ արտաքին լարումը 6 վոլտ էր, այլ ոչ թե 5: Սա թույլ է տալիս ձեզ օգտագործել 5 վ -ից բարձր ՝ ձեր սերվերը սնուցելու համար, բայց եթե ձեր արտաքին լարումը 5 վոլտից բարձր է, ապա միացրեք 5 վոլտ սենսորներ վահանին, հակառակ դեպքում դրանք տապակվելու են:

Քայլ 2: Ներբեռնեք VarSpeedServo գրադարանը

Դուք պետք է օգտագործեք այս գրադարանը, որը փոխարինում է ստանդարտ arduino servo գրադարանին, քանի որ այն թույլ է տալիս սերվո արագություն փոխանցել servo գրելու հայտարարության մեջ: Գրադարանը գտնվում է այստեղ ՝

VarSpeedServo գրադարան

Կարող եք պարզապես օգտագործել zip կոճակը, ներբեռնել zip ֆայլը, այնուհետև տեղադրել այն Arduino IDE- ով: Տեղադրվելուց հետո ձեր ծրագրի հրամանը նման կլինի. Servo.write (100, 20);

Առաջին պարամետրը անկյունն է, իսկ երկրորդը ՝ սերվոյի արագությունը 0 -ից մինչև 255 (լրիվ արագություն):

Քայլ 3: Գործարկեք այս ուրվագիծը

Ահա մրցութային ծրագիրը: Դուք պետք է փոփոխեք մի քանի պարամետր ձեր ձեռքի ռոբոտացված չափերի համար.

1. BASE_HGT, HUMERUS, ULNA, GRIPPER երկարությունները միլիմետրերով:

2. Մուտքագրեք ձեր servo pin համարները

3. Կցել հայտարարություններում մուտքագրեք servo min և max:

4. Այնուհետև փորձեք պարզ set_arm () հրամանը և այնուհետև զրոյական_x (), տող () և շրջանակ () գործառույթները փորձարկման համար: Համոզվեք, որ ձեր սերվոյի արագությունը ցածր է առաջին անգամ այս գործառույթները գործարկելիս ՝ ձեր և ձեր թևը չվնասելու համար:

Հաջողություն.

#ներառել VarSpeedServo.h

/ * Servo հսկողություն AL5D թևի համար */

/ * Ձեռքի չափսեր (մմ) */

#սահմանել BASE_HGT 90 // բազայի բարձրությունը

#սահմանեք HUMERUS 100 // ուսից արմունկ «ոսկոր»

#սահմանի ULNA 135 // արմունկից դաստակի «ոսկոր»

#սահմանեք GRIPPER 200 // բռնակ (ներառյալ դաստակի պտտման ծանր մեխանիզմ) երկարություն »

#սահմանել ftl (x) ((x)> = 0? (երկար) ((x) +0.5). (երկար) ((x) -0.5)) // բոց երկար փոխակերպման

/ * Սերվո անուններ/թվեր *

* Base servo HS-485HB */

#սահմանի BAS_SERVO 4

/ * Ուսի Servo HS-5745-MG */

#սահմանի SHL_SERVO 5

/ * Անկյուն Servo HS-5745-MG */

#սահմանի ELB_SERVO 6

/ * Ձեռքի սերվո HS-645MG */

#սահմանի WRI_SERVO 7

/ * Ձեռքի պտտվող servo HS-485HB */

#սահմանի WRO_SERVO 8

/ * Gripper servo HS-422 */

#սահմանի GRI_SERVO 9

/ * նախահաշվարկներ */

float hum_sq = HUMERUS*HUMERUS;

բոց uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servos; // ServoShield օբյեկտ

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

int loopCounter = 0;

int զարկերակ Լայնություն = 6.6;

int microsecondsToDegrees;

դատարկ կարգավորում ()

{

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. կցել (WRO_SERVO, 544, 2400);

servo6. կցել (GRI_SERVO, 544, 2400);

ուշացում (5500);

//servos.start (); // Սկսեք servo վահանը

servo_park ();

ուշացում (4000);

Serial.begin (9600);

Serial.println («Սկսել»);

}

դատարկ շրջան ()

{

loopCounter += 1;

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

// ուշացում (7000);

// զրո_ x ();

// տող ();

// շրջան ();

ուշացում (4000);

եթե (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // այգի

ուշացում (5000);

ելք (0); } // դադար ծրագիր - շարունակելու համար սեղմեք reset

// ելք (0);

}

/ * թևերի դիրքավորման ռեժիմ ՝ օգտագործելով հակադարձ կինեմատիկա */

/* z- ը բարձրություն է, y- ն հեռավորությունն է բազային կենտրոնից դեպի դուրս, x- ն ՝ կողմը կողմ: y, z- ն կարող է լինել միայն դրական */

// դատարկ set_arm (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)

դատարկ set_arm (float x, float y, float z, float grip_angle_d, int servoSpeed)

{

float grip_angle_r = ռադիաններ (grip_angle_d); // բռնման անկյունը ռադիաններում `հաշվարկներում օգտագործելու համար

/ * Հիմնական անկյունը և ճառագայթային հեռավորությունը x, y կոորդինատներից */

բոց bas_angle_r = atan2 (x, y);

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

/ * rdist է y կոորդինատ թեւի համար */

y = rdist;

/ * Բռնման անջատումները հաշվարկվում են բռնելով անկյունի հիման վրա */

float grip_off_z = (մեղք (grip_angle_r)) * GRIPPER;

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

/ * Դաստակի դիրքը */

float wrist_z = (z - grip_off_z) - BASE_HGT;

float wrist_y = y - grip_off_y;

/ * Ուսից մինչև դաստակ հեռավորությունը (AKA sw) */

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

բոց s_w_sqrt = sqrt (s_w);

/ * s_w անկյուն գետնին */

float a1 = atan2 (wrist_z, wrist_y);

/ * s_w անկյուն դեպի հումերուս */

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

/ * ուսի անկյուն */

բոց shl_angle_r = a1 + a2;

բոց shl_angle_d = աստիճաններ (shl_angle_r);

/ * արմունկի անկյուն */

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

բոց elb_angle_d = աստիճաններ (elb_angle_r);

բոց elb_angle_dn = - (180.0 - elb_angle_d);

/ * դաստակի անկյուն */

float wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Սերվո իմպուլսներ */

float bas_servopulse = 1500.0 - ((աստիճաններ (bas_angle_r)) * զարկերակի լայնություն);

float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * զարկերակի լայնություն);

բոց 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); // թարմացվել է 2018/2/11 jimrd- ով - ես գումարածը փոխեցի մինուսի - վստահ չեմ, թե ինչպես էր այս ծածկագիրը նախկինում աշխատում ինչ -որ մեկի մոտ: Կարող է լինել, որ արմունկային սերվոը տեղադրված էր 0 աստիճանով դեպի ներքև, քան դեպի վեր:

/ * Սահմանել սերվերը */

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

microsecondsToDegrees = քարտեզ (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (microsecondsToDegrees, servoSpeed); // օգտագործեք այս գործառույթը, որպեսզի կարողանաք սահմանել սերվոյի արագություն //

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

microsecondsToDegrees = քարտեզ (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (microsecondsToDegrees, servoSpeed);

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

microsecondsToDegrees = քարտեզ (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (microsecondsToDegrees, servoSpeed);

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

microsecondsToDegrees = քարտեզ (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (microsecondsToDegrees, servoSpeed);

}

/ * սերվերը տեղափոխել կայանատեղի *

դատարկ 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. գրել (90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4. գրել (90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5. գրել (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6. գրել (80, 10);

վերադարձ;

}

դատարկ զրո_ x ()

{

համար (կրկնակի yaxis = 250.0; yaxis <400.0; yaxis += 1) {

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

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

ուշացում (10);

}

համար (կրկնակի yaxis = 400.0; yaxis> 250.0; yaxis -= 1) {

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

ուշացում (10);

}

}

/ * ձեռքը շարժում է ուղիղ գծով */

դատարկ գիծ ()

{

համար (կրկնակի xaxis = -100.0; xaxis <100.0; xaxis += 0.5) {

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

ուշացում (10);

}

համար (float xaxis = 100.0; xaxis> -100.0; xaxis -= 0.5) {

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

ուշացում (10);

}

}

դատարկ շրջան ()

{

#սահմանի ՌԱԴԻՈՍ 50.0

// լողացող անկյուն = 0;

float zaxis, yaxis;

for (float angle = 0.0; անկյուն <360.0; անկյուն += 1.0) {

yaxis = RADIUS * մեղք (ռադիաններ (անկյուն)) + 300;

zaxis = RADIUS * cos (ռադիաններ (անկյուն)) + 200;

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

ուշացում (10);

}

}

Քայլ 4: Փաստեր, խնդիրներ և նման բաներ…

Փաստեր, խնդիրներ և նման բաներ…
Փաստեր, խնդիրներ և նման բաներ…

1. Երբ ես վարում եմ շրջանաձև () ենթածրագիրը, իմ ռոբոտը ավելի շատ շարժվում է էլիպսաձև տեսքով, քան շրջան: Կարծում եմ, որ դա տեղի է ունենում այն պատճառով, որ իմ սերվոները ճշգրտված չեն: Ես փորձարկեցի դրանցից մեկը և 1500 միկրո վայրկյան նույնը չէր, ինչ 90 աստիճան: Կաշխատի դրա վրա `լուծում գտնելու համար: Մի հավատացեք, որ ինչ -որ բան սխալ է ալգորիթմի մեջ, այլ ավելի շուտ իմ կարգավորումներում: Թարմացնել 2018/2/11. Հենց նոր հայտնաբերեցի, որ դա պայմանավորված է սկզբնական կոդի սխալի պատճառով: Ես չեմ տեսնում, թե ինչպես էր աշխատում նրա ծրագիրը Ֆիքսված ծածկագիր օգտագործելով սա. Float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (սկզբնական կոդը ավելացվում էր)

2. Որտե՞ղ կարող եմ ավելի շատ տեղեկություններ գտնել այն մասին, թե ինչպես է աշխատում set_arm () գործառույթը. Օլեգ Մազուրովի կայքը բացատրում է ամեն ինչ կամ տրամադրում հղումներ լրացուցիչ տեղեկությունների համար ՝

3. Կա՞ որևէ սահմանային վիճակի ստուգում: Ո՛չ: Կարծում եմ, որ Օլեգը որոշակի ստուգումներ է կատարում իր վերջին ծրագրում, որը USB- ով օգտագործում է ձեռքի շարժումները ծրագրավորելու համար: Դիտեք նրա տեսանյութը և հղեք նրա վերջին ծածկագրին:

4. Կոդը պետք է մաքրվի, և միկրովայրկյան ծածկագիրը կարող է հանվել:

Խորհուրդ ենք տալիս: