Სარჩევი:

Arduino Uno– ს გამოყენება XYZ პოზიციონირებისთვის 6 DOF Robotic Arm: 4 ნაბიჯი
Arduino Uno– ს გამოყენება XYZ პოზიციონირებისთვის 6 DOF Robotic Arm: 4 ნაბიჯი

ვიდეო: Arduino Uno– ს გამოყენება XYZ პოზიციონირებისთვის 6 DOF Robotic Arm: 4 ნაბიჯი

ვიდეო: Arduino Uno– ს გამოყენება XYZ პოზიციონირებისთვის 6 DOF Robotic Arm: 4 ნაბიჯი
ვიდეო: როგორ გააკეთოთ ლითონის დეტექტორი მულტიმეტრის გამოყენებით 2024, ნოემბერი
Anonim
Image
Image

ეს პროექტი არის მოკლე და შედარებით მარტივი Arduino ესკიზის განხორციელება, რომელიც უზრუნველყოფს XYZ ინვერსიულ კინემატიკურ პოზიციონირებას. მე ავაშენე 6 სერვო რობოტული ხელი, მაგრამ როდესაც საქმე პროგრამული უზრუნველყოფის პოვნას მოვიდა, იქ ბევრი არაფერი იყო, გარდა საბაჟო პროგრამებისა, რომლებიც მუშაობდნენ პერსონალურ სერვო ფარებზე, როგორიცაა SSC-32 (U) ან სხვა პროგრამები და პროგრამები. გართულებულია ინსტალაცია და ხელთან ურთიერთობა. შემდეგ აღმოვაჩინე ოლეგ მაზუროვის ყველაზე შესანიშნავი "Robotic Arm Inverse Kinematics on Arduino", სადაც მან გამოიყენა ინვერსიული კინემატიკა არდუინოს უბრალო ესკიზში.

მე გავაკეთე ორი მოდიფიკაცია მისი კოდის შესაცვლელად:

1. მე გამოვიყენე VarSpeedServo ბიბლიოთეკა მისი პერსონალური servo shield ბიბლიოთეკის ნაცვლად, რადგან მაშინ შემიძლია გავაკონტროლო სერვისების სიჩქარე და არ მომიწიოს მის მიერ გამოყენებული servo ფარის გამოყენება. ვინც განიხილავს აქ მოცემულ კოდს, მე გირჩევთ გამოიყენოთ ეს VarSpeedServo ბიბლიოთეკა და არა servo.h ბიბლიოთეკა, ასე რომ თქვენ შეგიძლიათ შეანელოთ თქვენი რობოტული მკლავის მოძრაობა განვითარების პროცესში, ან შეიძლება აღმოაჩინოთ, რომ მკლავი მოულოდნელად დაგარტყამს სახე ან უარესი, რადგან ის გადავა სრული სერვო სიჩქარით.

2. მე ვიყენებ მარტივ სენსორს/სერვო ფარს, რათა სერვოები დავუკავშირო Arduino Uno– ს, მაგრამ ის არ საჭიროებს სპეციალურ სერვო ბიბლიოთეკას, რადგან ის იყენებს არდუინოს ქინძისთავებს. ეს მხოლოდ რამდენიმე დოლარი ღირს, მაგრამ ეს არ არის საჭირო. ეს უზრუნველყოფს სერვოს ლამაზ სუფთა კავშირს არდუინოსთან. და მე არასოდეს დავბრუნდები არდუინო უნიოს მყარ სერვისებზე. თუ თქვენ იყენებთ ამ სენსორს/სერვო ფარს, თქვენ უნდა შეასრულოთ ერთი უმნიშვნელო მოდიფიკაცია, რომელსაც ქვემოთ გამოვყოფ.

კოდი მშვენივრად მუშაობს და გაძლევთ საშუალებას იმუშაოთ ხელზე ერთი ფუნქციის გამოყენებით, რომელშიც თქვენ გაივლით x, y, x და სიჩქარის პარამეტრებს. Მაგალითად:

set_arm (0, 240, 100, 0, 20); // პარამეტრები არის (x, y, z, gripper angle, servo speed)

დაგვიანება (3000); // დაგვიანებით საჭიროა ხელის დროის დასატოვებლად ამ ადგილას

არ შეიძლება უფრო მარტივი. ქვემოთ ჩავრთავ ესკიზს.

ოლეგის ვიდეო აქ არის: აკონტროლებს რობოტულ მკლავს არდუინოთი და USB მაუსით

ოლეგის ორიგინალური პროგრამა, აღწერა და რესურსები: ოლეგის ინვერსიული კინემატიკა არდუინო უნოსთვის

მე არ მესმის ყველა მათემატიკა რუტინის მიღმა, მაგრამ სასიამოვნო ის არის, რომ თქვენ არ გჭირდებათ კოდის გამოყენება. იმედია ცდები.

ნაბიჯი 1: აპარატურის მოდიფიკაცია

აპარატურის მოდიფიკაცია
აპარატურის მოდიფიკაცია

1. ერთადერთი რაც საჭიროა არის ის, რომ თქვენი სერვო გადატრიალდეს მოსალოდნელი მიმართულებით, რამაც შეიძლება მოგთხოვოთ ფიზიკურად შეცვალოთ თქვენი სერვისების დამონტაჟება. გადადით ამ გვერდზე, რომ ნახოთ ძირის, მხრის, იდაყვის და მაჯის სერვისების სავარაუდო სერვო მიმართულება:

2. თუ თქვენ იყენებთ სენსორულ ფარს, რომელსაც მე ვიყენებ, თქვენ უნდა გააკეთოთ ერთი რამ: გადაუხვიეთ პინი, რომელიც აკავშირებს 5 ვ ფარს არდუინო უნოსთან ისე, რომ არ დაუკავშირდეს უნიოს დაფას. თქვენ გინდათ გამოიყენოთ გარე ძაბვა ფარზე, რომ გაამძაფროთ მხოლოდ თქვენი სერვისები და არა Arduino Uno, ან შეიძლება გაანადგუროს Uno, მე ვიცი, რომ მე დავწვი ორი Uno დაფა, როდესაც ჩემი გარე ძაბვა იყო 6 ვოლტი და არა 5. ეს გაძლევთ საშუალებას გამოიყენეთ 5 ვ -ზე მეტი თქვენი სერვისის დასაწყებად, მაგრამ თუ თქვენი გარე ძაბვა 5 ვოლტზე მეტია, მაშინ არ დაუკავშიროთ 5 ვოლტის სენსორი ფარს, წინააღმდეგ შემთხვევაში ისინი შემწვარი იქნება.

ნაბიჯი 2: ჩამოტვირთეთ VarSpeedServo ბიბლიოთეკა

თქვენ უნდა გამოვიყენოთ ეს ბიბლიოთეკა, რომელიც ცვლის სტანდარტულ arduino servo ბიბლიოთეკას, რადგან ის საშუალებას გაძლევთ გადარიცხოთ 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 () ბრძანება და შემდეგ ტესტირებისთვის zero_x (), line () და circle () ფუნქციები. დარწმუნდით, რომ თქვენი სერვო სიჩქარე დაბალია პირველად ამ ფუნქციების შესრულებისას, რათა თავიდან აიცილოთ თქვენი მკლავისა და საკუთარი მკლავის დაზიანება.

Წარმატებები.

#ჩართეთ VarSpeedServo.h

/ * სერვო კონტროლი AL5D მკლავისთვის */

/ * ხელის ზომები (მმ) */

#განსაზღვრეთ BASE_HGT 90 // ბაზის სიმაღლე

#განსაზღვრეთ HUMERUS 100 // მხრის იდაყვის "ძვალი"

#განსაზღვრეთ ULNA 135 // იდაყვიდან მაჯამდე "ძვალი"

#განსაზღვრეთ GRIPPER 200 // მჭიდი (მათ შორის მაჯის მძიმე როტაციის მექანიზმი) სიგრძე"

#define ftl (x) ((x)> = 0? (გრძელი) ((x) +0.5): (გრძელი) ((x) -0.5)) // ათწილადი გრძელ კონვერტაციაზე

/ * სერვო სახელები/რიცხვები *

* ბაზის სერვო HS-485HB */

#განსაზღვრეთ BAS_SERVO 4

/ * Shoulder Servo HS-5745-MG */

#განსაზღვრეთ SHL_SERVO 5

/ * იდაყვის სერვო 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;

float uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servos; // ServoShield ობიექტი

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

int loopCounter = 0;

int პულსი სიგანე = 6.6;

int microsecondsToDerees;

ბათილად დაყენება ()

{

servo1.attach (BAS_SERVO, 544, 2400);

servo2.attach (SHL_SERVO, 544, 2400);

servo3.atach (ELB_SERVO, 544, 2400);

servo4.atach (WRI_SERVO, 544, 2400);

servo5.atach (WRO_SERVO, 544, 2400);

servo6.atach (GRI_SERVO, 544, 2400);

დაგვიანება (5500);

//servos.start (); // დაიწყეთ servo shield

servo_park ();

დაგვიანება (4000);

სერიული.დაწყება (9600);

Serial.println ("დაწყება");

}

ბათილი მარყუჟი ()

{

loopCounter += 1;

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

// დაგვიანება (7000);

// ნულოვანი_ x ();

// ხაზი ();

// წრე ();

დაგვიანება (4000);

if (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // პარკი

დაგვიანება (5000);

გასვლა (0); } // პაუზის პროგრამა - გასაგრძელებლად დააჭირეთ გადატვირთვას

// გასვლა (0);

}

/ * მკლავის პოზიციონირების რუტინა შებრუნებული კინემატიკის გამოყენებით */

/* z არის სიმაღლე, y არის მანძილი ბაზის ცენტრიდან გარეთ, x არის გვერდიდან გვერდზე. y, z შეიძლება იყოს მხოლოდ დადებითი */

// ბათილი 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 = რადიანები (grip_angle_d); // გაჭიმვის კუთხე რადიანებში გამოსაყენებლად

/ * ძირითადი კუთხე და რადიალური მანძილი x, y კოორდინატებიდან */

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

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

/ * მხრის კუთხე */

float shl_angle_r = a1 + a2;

float shl_angle_d = გრადუსი (shl_angle_r);

/ * იდაყვის კუთხე */

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

float elb_angle_d = გრადუსი (elb_angle_r);

float 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) * 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); // განახლებულია 2018/2/11 ჯიმრდის მიერ - მე შევცვალე პლუსი მინუსზე - არ ვარ დარწმუნებული როგორ მუშაობდა ეს კოდი ვინმესთვის ადრე. შეიძლება იდაყვის სერვო დამონტაჟებული იყოს 0 გრადუსით ქვემოთ, ვიდრე ზემოთ.

/ * სერვისების დაყენება */

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

microsecondsToDegrees = რუკა (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (მიკროწამებიToDerees, servoSpeed); // გამოიყენეთ ეს ფუნქცია ისე, რომ თქვენ შეგიძლიათ დააყენოთ servo სიჩქარე //

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

microsecondsToDegrees = რუკა (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (მიკროწამებიToDerees, servoSpeed);

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

microsecondsToDegrees = რუკა (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (microsecondsToDerees, servoSpeed);

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

microsecondsToDegrees = რუკა (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (microsecondsToDerees, servoSpeed);

}

/ * სერვისების გადატანა პარკინგის პოზიციაზე */

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. დაწერეთ (90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4.write (90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5. დაწერეთ (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6. დაწერე (80, 10);

დაბრუნების;

}

სიცარიელე zero_x ()

{

for (ორმაგი yaxis = 250.0; yaxis <400.0; yaxis += 1) {

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

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

დაგვიანება (10);

}

for (ორმაგი yaxis = 400.0; yaxis> 250.0; yaxis -= 1) {

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

დაგვიანება (10);

}

}

/ * მოძრაობს მკლავში სწორი ხაზით */

ბათილი ხაზი ()

{

for (ორმაგი xaxis = -100.0; xaxis <100.0; xaxis += 0.5) {

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

დაგვიანება (10);

}

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

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

დაგვიანება (10);

}

}

ბათილი წრე ()

{

#განსაზღვრეთ რადიუსი 50.0

// float angle = 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. არის თუ არა რაიმე საზღვრის მდგომარეობის შემოწმება? არა. როდესაც ჩემი რობოტის მკლავი გადადის არასწორი xyz კოორდინატით, ის აკეთებს ამ სასაცილო თაღოვან მოძრაობას კატის დაჭიმვის მსგავსად. მე მჯერა, რომ ოლეგი ახორციელებს შემოწმებას თავის უახლეს პროგრამაში, რომელიც USB- ს იყენებს მკლავის მოძრაობების დასაპროგრამებლად. ნახეთ მისი ვიდეო და ბმული მის უახლეს კოდზე.

4. საჭიროა კოდის გასუფთავება და მიკროწამიანი კოდის ამოღება.

გირჩევთ: