Orodha ya maudhui:

Kutumia Arduino Uno kwa Uwekaji wa XYZ wa 6 DOF Robotic Arm: Hatua 4
Kutumia Arduino Uno kwa Uwekaji wa XYZ wa 6 DOF Robotic Arm: Hatua 4

Video: Kutumia Arduino Uno kwa Uwekaji wa XYZ wa 6 DOF Robotic Arm: Hatua 4

Video: Kutumia Arduino Uno kwa Uwekaji wa XYZ wa 6 DOF Robotic Arm: Hatua 4
Video: MKS Gen L - внешний драйвер 2024, Novemba
Anonim
Image
Image

Mradi huu ni juu ya kutekeleza mchoro mfupi na rahisi wa Arduino kutoa nafasi ya kinematic ya XYZ inverse. Nilikuwa nimejenga mkono wa roboti wa servo 6 lakini ilipokuja kupata programu ya kuiendesha, hakukuwa na mengi huko nje isipokuwa mipango ya kawaida inayotumia ngao za servo kama SSC-32 (U) au programu na programu zingine ambazo zilikuwa ngumu kufunga na kuwasiliana na mkono. Kisha nikapata "Kinematics Inverse Inverse Kinematics" ya Oleg Mazurov kwenye Arduino "ambapo alitekeleza kinematics ya inverse katika mchoro rahisi wa Arduino.

Nilifanya marekebisho mawili ili kubadilisha nambari yake:

1. Nilitumia maktaba ya VarSpeedServo badala ya maktaba yake ya ngao ya servo kwa sababu ningeweza kudhibiti kasi ya servos na singeweza kutumia ngao ya servo aliyotumia. Kwa mtu yeyote anayezingatia kutumia nambari iliyotolewa hapa ninapendekeza utumie maktaba hii ya VarSpeedServo, badala ya maktaba ya servo.h, ili uweze kupunguza mwendo wako wa mkono wa roboti wakati wa maendeleo au unaweza kugundua kuwa mkono utakutia bila kutarajia uso au mbaya zaidi kwa sababu itakuwa ikitembea kwa kasi kamili ya servo.

2. Ninatumia sensor rahisi / ngao ya servo kuunganisha servos na Arduino Uno lakini haiitaji maktaba maalum ya servo kwani hutumia tu pini za Arduino. Inagharimu pesa chache tu lakini haihitajiki. Inafanya uhusiano mzuri safi wa servos na Arduino. Na sitarudi tena kwa huduma ngumu za Arduino Uno sasa. Ikiwa unatumia hii sensorer / ngao ya servo unahitaji kufanya marekebisho moja madogo ambayo nitaelezea hapa chini.

Nambari inafanya kazi vizuri na inakuwezesha kutumia mkono kwa kutumia kazi moja ambayo unapitisha vigezo vya x, y, x na kasi. Kwa mfano:

seti_arm (0, 240, 100, 0, 20); Vigezo vya // ni (x, y, z, pembe ya gripper, kasi ya servo)

kuchelewesha (3000); // kuchelewa kunahitajika kuruhusu muda wa mkono kuhamia eneo hili

Haikuweza kuwa rahisi. Nitajumuisha mchoro hapa chini.

Video ya Oleg iko hapa: Kudhibiti mkono wa Robotic na Arduino na Panya ya USB

Mpango wa asili wa Oleg, maelezo, na rasilimali: Kinematics Inverse ya Oleg ya Arduino Uno

Sielewi hesabu zote nyuma ya kawaida lakini jambo zuri sio lazima utumie nambari. Natumahi utajaribu.

Hatua ya 1: Mabadiliko ya vifaa

Mabadiliko ya vifaa
Mabadiliko ya vifaa

1. Kitu pekee kinachohitajika ni kwamba servo yako igeuke katika mwelekeo unaotarajiwa ambao unaweza kukuhitaji ubadilishe upangilio wa servos zako. Nenda kwenye ukurasa huu kuona mwelekeo wa servo unaotarajiwa kwa msingi, bega, kiwiko, na servos za mkono:

2. Ikiwa unatumia ngao ya sensa ambayo ninatumia unahitaji kufanya jambo moja kwake: piga pini inayounganisha 5v kutoka kwa ngao hadi Arduino Uno ili isiingie kwenye bodi ya Uno. Unataka kutumia voltage ya nje kwenye ngao kuwezesha servos zako tu, sio Arduino Uno au inaweza kuharibu Uno, najua kama nilichoma bodi mbili za Uno wakati voltage yangu ya nje ilikuwa volts 6 badala ya 5. Hii hukuruhusu kutumia juu kuliko 5v kuwezesha servos zako lakini ikiwa voltage yako ya nje iko juu kuliko volts 5 basi usiunganishe sensorer 5 za volt kwenye ngao au zitakaangwa.

Hatua ya 2: Pakua Maktaba ya VarSpeedServo

Unahitaji kutumia maktaba hii ambayo inachukua nafasi ya maktaba ya kiwango cha arduino servo kwa sababu hukuruhusu kupitisha kasi ya servo kwenye taarifa ya kuandika servo. Maktaba iko hapa:

Maktaba ya VarSpeedServo

Unaweza tu kutumia kitufe cha zip, pakua faili ya zip kisha usakinishe na Arduino IDE. Mara tu ikiwa imewekwa amri katika programu yako itaonekana kama: servo.write (100, 20);

Kigezo cha kwanza ni pembe na ya pili ni kasi ya servo kutoka 0 hadi 255 (kasi kamili).

Hatua ya 3: Endesha Mchoro huu

Hapa kuna mpango wa kushindana. Unahitaji kurekebisha vigezo vichache vya mwelekeo wako wa roboti:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER urefu wa milimita.

2. Ingiza nambari zako za servo

3. Ingiza dakika ya servo na max katika taarifa za ambatisho.

4. Kisha jaribu amri rahisi set_arm () na kisha zero_x (), mstari () na duara () kazi za kupima. Hakikisha kasi yako ya servo iko chini mara ya kwanza unapoendesha kazi hizi kuzuia kuharibu mkono wako na mkono wako mwenyewe.

Bahati njema.

# pamoja na VarSpeedServo.h

/ * Udhibiti wa Servo kwa mkono wa AL5D * /

/ * Vipimo vya mkono (mm) * /

#fafanua BASE_HGT 90 // urefu wa msingi

#fafanua HUMERUS 100 // bega-kwa-kiwiko "mfupa"

#fafanua ULNA 135 // mfupa "wa kiwiko na mkono"

#fafanua GRIPPER 200 // gripper (ikiwa ni pamoja na utaratibu mzito wa mkono wa mzunguko) urefu"

#fafanua ftl (x) ((x)> = 0? (ndefu) ((x) +0.5): (ndefu) ((x) -0.5))

/ * Majina / nambari za Servo *

* Msingi servo HS-485HB * /

#fafanua BAS_SERVO 4

/ * Bega Servo HS-5745-MG * /

#fafanua SHL_SERVO 5

/ * Kiwiko Servo HS-5745-MG * /

#fafanua ELB_SERVO 6

/ * Wrist servo HS-645MG * /

#fafanua WRI_SERVO 7

/ * Mzunguko wa mkono Servo HS-485HB * /

#fafanua WRO_SERVO 8

/ * Kishikizi cha servo HS-422 * /

#fafanua GRI_SERVO 9

/ * mahesabu ya awali * /

kuelea hum_sq = HUMERUS * HUMERUS;

kuelea uln_sq = ULNA * ULNA;

int servoSPeed = 10;

// ServoShield servos; // Kitu cha ServoShield

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

int loopCounter = 0;

mapigo ya upana upana = 6.6;

int microsecondsToDerees;

kuanzisha batili ()

{

kiambatisho cha servo1 (BAS_SERVO, 544, 2400);

kiambatisho cha servo2 (SHL_SERVO, 544, 2400);

kiambatisho cha servo3 (ELB_SERVO, 544, 2400);

kiambatisho cha servo4 (WRI_SERVO, 544, 2400);

kiambatisho cha servo5 (WRO_SERVO, 544, 2400);

kiambatisho cha servo6 (GRI_SERVO, 544, 2400);

kuchelewesha (5500);

//servos.start (); // Anza ngao ya servo

servo_park ();

kuchelewesha (4000);

Serial. Kuanza (9600);

Serial.println ("Anza");

}

kitanzi batili ()

{

loopCounter + = 1;

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

// kuchelewa (7000);

// zero_x ();

// mstari ();

// mduara ();

kuchelewesha (4000);

ikiwa (loopCounter> 1) {

servo_park ();

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

kuchelewesha (5000);

toka (0); } // mpango wa kusitisha - piga upya ili kuendelea

// kutoka (0);

}

/ * utaratibu wa kuweka mkono kutumia kinematics inverse * /

/ * z ni urefu, y ni umbali kutoka kituo cha msingi nje, x ni upande kwa upande. y, z inaweza tu kuwa chanya * /

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

batili set_arm (kuelea x, kuelea y, kuelea z, kuelea grip_angle_d, int servoSpeed)

{

kuelea grip_angle_r = radians (grip_angle_d); // mtego angle katika radians kwa matumizi katika mahesabu

/ * Pembe ya msingi na umbali wa radial kutoka x, y kuratibu * /

kuelea bas_angle_r = atan2 (x, y);

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

/ * rdist ni uratibu wa mkono * /

y = rdist;

/ * Msaada wa mtego umehesabiwa kulingana na pembe ya mtego * /

kuelea grip_off_z = (dhambi (grip_angle_r)) * GRIPPER;

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

/ * Msimamo wa Wrist * /

kuelea wrist_z = (z - mtego_off_z) - BASE_HGT;

kuelea wrist_y = y - mtego_off_y;

/ * Bega kwa umbali wa mkono (AKA sw) * /

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

kuelea s_w_sqrt = sqrt (s_w);

/ * s_w pembe kwa ardhi * /

kuelea a1 = atan2 (wrist_z, wrist_y);

/ * s_w angle kwa humerus * /

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

/ * pembe ya bega * /

kuelea shl_angle_r = a1 + a2;

kuelea shl_angle_d = digrii (shl_angle_r);

/ * pembe ya kiwiko * /

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

kuelea elb_angle_d = digrii (elb_angle_r);

kuelea elb_angle_dn = - (180.0 - elb_angle_d);

/ * pembe ya mkono * /

kuelea wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Kunde za Servo * /

kuelea bas_servopulse = 1500.0 - ((digrii (bas_angle_r)) * mapigo Upana);

kuelea shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * mapigo Upana);

kuelea elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * upana wa mapigo);

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

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

kuelea wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // ilisasishwa 2018/2/11 na jimrd - nilibadilisha pamoja kuwa minus - sijui jinsi nambari hii ilifanya kazi kwa mtu yeyote hapo awali. Inawezekana kwamba servo ya kiwiko ilikuwa imewekwa na digrii 0 ikitazama chini badala ya juu.

/ * Weka servos * /

nafasi ya //servos. BAS_SERVO, ftl (bas_servopulse));

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

andika servo1. (microsecondsToDerees, ServoSpeed); // tumia kazi hii ili uweze kuweka kasi ya servo //

nafasi ya //servos. SHL_SERVO, ftl (shl_servopulse));

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

servo2.andika (microsecondsToDerees, servoSpeed);

nafasi ya //servos. ELB_SERVO, ftl (elb_servopulse));

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

servo3. andika (microsecondsToDerees, servoSpeed);

nafasi ya //servos. WRI_SERVO, ftl (wri_servopulse));

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

andika.

}

/ * songa servos kwenye nafasi ya maegesho * /

batili servo_park ()

{

nafasi ya //servos. BAS_SERVO, 1500);

andika servo1 (90, 10);

nafasi ya //servos. (SHL_SERVO, 2100);

andika servo2 (90, 10);

nafasi ya //servos. ELB_SERVO, 2100);

andika servo3 (90, 10);

nafasi ya //servos (WRI_SERVO, 1800);

andika servo4 (90, 10);

nafasi ya //servos. WRO_SERVO, 600);

andika servo5 (90, 10);

nafasi ya //servos (GRI_SERVO, 900);

andika servo6. (80, 10);

kurudi;

}

batili zero_x ()

{

kwa (mara mbili yaxis = 250.0; yaxis <400.0; yaxis + = 1) {

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

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

kuchelewesha (10);

}

kwa (mara mbili yaxis = 400.0; yaxis> 250.0; yaxis - = 1) {

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

kuchelewesha (10);

}

}

/ * inasonga mkono kwa mstari ulionyooka * /

laini batili ()

{

kwa (mara mbili xaxis = -100.0; xaxis <100.0; xaxis + = 0.5) {

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

kuchelewesha (10);

}

kwa (kuelea xaxis = 100.0; xaxis> -100.0; xaxis - = 0.5) {

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

kuchelewesha (10);

}

}

duara tupu ()

{

#fafanua RADIUS 50.0

// pembe ya kuelea = 0;

kuelea zaxis, yaxis;

kwa (angle ya kuelea = 0.0; angle <360.0; angle + = 1.0) {

yaxis = RADIUS * dhambi (radians (angle)) + 300;

zaxis = RADIUS * cos (radians (angle)) + 200;

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

kuchelewesha (10);

}

}

Hatua ya 4: Ukweli, Maswala na kama …

Ukweli, Maswala na mengineyo…
Ukweli, Maswala na mengineyo…

1. Ninapoendesha mduara () subroutine robot yangu inahamia zaidi kwa umbo la duara kuliko duara. Nadhani hiyo ni kwa sababu servos zangu hazijalinganishwa. Nilijaribu moja yao na microsecond 1500 hazikuwa sawa na digrii 90. Itafanya kazi hii kujaribu na kupata suluhisho. Usiamini kuna kitu kibaya na algorithm lakini badala ya mipangilio yangu. Sasisha 2018/2/11 - umegundua tu hii ni kwa sababu ya hitilafu katika nambari ya asili. Sioni jinsi mpango wake ulifanya kazi Nambari ya kudumu kwa kutumia hii: kuelea wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (nambari asili ilikuwa ikiongeza)

2. Ninaweza kupata wapi habari zaidi juu ya jinsi kazi ya set_arm () inavyofanya kazi: Wavuti ya Oleg Mazurov inaelezea kila kitu au hutoa viungo kwa habari zaidi:

3. Je! Kuna hali yoyote ya ukaguzi wa mipaka? Hapana. Wakati mkono wangu wa roboti unapopitishwa uratibu batili wa xyz hufanya aina hii ya kuchekesha ya harakati ya kupindika kama paka ikinyoosha. Ninaamini Oleg anafanya ukaguzi katika programu yake ya hivi karibuni ambayo hutumia USB kupanga harakati za mkono. Tazama video yake na unganisha nambari yake mpya.

4. Kanuni inahitaji kusafishwa na nambari ya microsecond inaweza kufutwa.

Ilipendekeza: