Talaan ng mga Nilalaman:

Paggamit ng Arduino Uno para sa XYZ Positioning ng 6 DOF Robotic Arm: 4 na Hakbang
Paggamit ng Arduino Uno para sa XYZ Positioning ng 6 DOF Robotic Arm: 4 na Hakbang

Video: Paggamit ng Arduino Uno para sa XYZ Positioning ng 6 DOF Robotic Arm: 4 na Hakbang

Video: Paggamit ng Arduino Uno para sa XYZ Positioning ng 6 DOF Robotic Arm: 4 na Hakbang
Video: Arduino MASTERCLASS | Full Programming Workshop in 90 Minutes! 2024, Nobyembre
Anonim
Image
Image

Ang proyektong ito ay tungkol sa pagpapatupad ng isang maikli at medyo madali na Arduino sketch upang magbigay ng XYZ kabaligtaran na kinematic na pagpoposisyon. Nakagawa ako ng isang 6 servo robotic arm ngunit pagdating sa paghahanap ng software upang patakbuhin ito, walang gaanong bagay doon maliban sa mga pasadyang programa na tumatakbo sa mga pasadyang servo na kalasag tulad ng SSC-32 (U) o iba pang mga programa at app na kumplikado upang mai-install at makipag-usap sa braso. Pagkatapos ay natagpuan ko ang pinakahusay na "Robotic Arm Inverse Kinematics sa Arduino" ni Oleg Mazurov kung saan ipinatupad niya ang kabaligtaran na kinematics sa isang simpleng sketch ng Arduino.

Gumawa ako ng dalawang pagbabago upang maiakma ang kanyang code:

1. Ginamit ko ang silid aklatan ng VarSpeedServo kapalit ng kanyang pasadyang silid-aklatan ng servo shield sapagkat maaari kong makontrol ang bilis ng mga servo at hindi ko gagamitin ang ginamit niyang servo shield. Para sa sinumang isinasaalang-alang ang pagpapatakbo ng code na ibinigay dito Inirerekumenda ko na gamitin mo ang library na ito ng VarSpeedServo, sa halip na ang silid-aklatan ng servo.h, upang mapabagal mo ang iyong paggalaw ng robotic na braso sa panahon ng pag-unlad o maaari mong makita na ang braso ay hindi inaasahan na sundutin ka ang mukha o mas masahol pa dahil lilipat ito sa buong bilis ng servo.

2. Gumagamit ako ng isang simpleng sensor / servo na kalasag upang ikonekta ang mga servos sa Arduino Uno ngunit hindi nangangailangan ito ng espesyal na silid-aklatan ng servo dahil ginagamit lamang nito ang mga pin ng Arduino. Magastos lang ito ng kaunting pera ngunit hindi ito kinakailangan. Ginagawa nito para sa isang magandang malinis na koneksyon ng mga servos sa Arduino. At hindi na ako babalik sa mga masisipag na servo sa Arduino Uno ngayon. Kung gagamitin mo ang sensor / servo shield na ito kailangan mong gumawa ng isang menor de edad na pagbabago na ibabalangkas ko sa ibaba.

Ang code ay gumagana nang mahusay at nagbibigay-daan sa iyo upang mapatakbo ang braso sa pamamagitan ng paggamit ng isang solong pag-andar kung saan ipinapasa mo ang x, y, x at mga parameter ng bilis. Halimbawa:

set_arm (0, 240, 100, 0, 20); // mga parameter ay (x, y, z, gripper anggulo, bilis ng servo)

pagkaantala (3000); Kinakailangan ang // pagkaantala upang payagan ang oras ng braso na lumipat sa lokasyon na ito

Hindi maaaring maging mas simple. Isasama ko ang sketch sa ibaba.

Narito ang video ni Oleg: Pagkontrol sa Robotic Arm kasama ang Arduino at USB Mouse

Orihinal na programa, paglalarawan, at mapagkukunan ni Oleg: Inverse Kinematics ni Oleg para sa Arduino Uno

Hindi ko maintindihan ang lahat ng matematika sa likod ng gawain ngunit ang magandang bagay ay hindi mo kailangang gamitin ang code. Sana ay subukan mo ito.

Hakbang 1: Mga Pagbabago sa Hardware

Mga Pagbabago sa Hardware
Mga Pagbabago sa Hardware

1. Ang tanging bagay na kinakailangan ay ang iyong servo ay lumiliko sa mga inaasahang direksyon na maaaring mangailangan mong pisikal na baligtarin ang pag-mount ng iyong mga servo. Pumunta sa pahinang ito upang makita ang inaasahang direksyon ng servo para sa mga base, balikat, siko, at mga pulso servos:

2. Kung gagamitin mo ang sensor ng kalasag na ginagamit ko kailangan mong gawin ang isang bagay dito: yumuko ang pin na nagkokonekta sa 5v mula sa kalasag patungo sa Arduino Uno sa labas ng paraan upang hindi ito kumonekta sa Uno board. Nais mong gamitin ang panlabas na boltahe sa kalasag upang mapagana lamang ang iyong mga servo, hindi ang Arduino Uno o maaari itong sirain ang Uno, alam ko habang sinunog ko ang dalawang mga board ng Uno kapag ang aking panlabas na boltahe ay 6 volts kaysa sa 5. Pinapayagan ka nitong upang magamit ang mas mataas sa 5v upang mapagana ang iyong mga servos ngunit kung ang iyong panlabas na boltahe ay mas mataas sa 5 volts pagkatapos ay huwag ikonekta ang anumang 5 volt sensor sa kalasag o sila ay pinirito.

Hakbang 2: I-download ang VarSpeedServo Library

Kailangan mong gamitin ang library na ito na pumapalit sa karaniwang arduino servo library dahil pinapayagan kang ipasa ang isang bilis ng servo sa pahayag ng pagsulat ng servo. Makikita ang library dito:

Library ng VarSpeedServo

Maaari mo lamang gamitin ang zip button, i-download ang zip file at pagkatapos ay i-install ito sa Arduino IDE. Kapag na-install ang utos sa iyong programa ay magiging hitsura ng: servo.write (100, 20);

Ang unang parameter ay ang anggulo at ang pangalawa ay ang bilis ng servo mula 0 hanggang 255 (buong bilis).

Hakbang 3: Patakbuhin ang Sketch na Ito

Narito ang paligsahan na programa. Kailangan mong baguhin ang ilang mga parameter para sa iyong robotic arm dimentions:

1. haba ng BASE_HGT, HUMERUS, ULNA, GRIPPER sa millimeter.

2. Ipasok ang iyong mga numero ng servo pin

3. Ipasok ang servo min at max sa mga kalakip na pahayag.

4. Pagkatapos ay subukan ang isang simpleng set_arm () utos at pagkatapos ang zero_x (), linya () at bilog () na mga pagpapaandar para sa pagsubok. Siguraduhin na ang bilis ng iyong servo ay mababa sa unang pagkakataon na pinatakbo mo ang mga pagpapaandar na ito upang maiwasan ang pagkasira ng iyong braso at ng iyong sariling braso.

Swerte mo

# isama ang VarSpeedServo.h

/ * Servo control para sa AL5D arm * /

/ * Mga sukat ng braso (mm) * /

# tukuyin ang BASE_HGT 90 // taas ng base

# tukuyin ang HUMERUS 100 // balikat-hanggang-siko na "buto"

#define ULNA 135 // elbow-to-wrist "buto"

#define GRIPPER 200 // gripper (incl. mabibigat na tungkulin na paikutin ang pulso na mekanismo) haba"

#define ftl (x) ((x)> = 0? (haba) ((x) +0.5):(mahaba) ((x) -0.5)) // float to long conversion

/ * Mga pangalan / numero ng servo *

* Base servo HS-485HB * /

# tukuyin ang BAS_SERVO 4

/ * Shoulder Servo HS-5745-MG * /

# tukuyin ang SHL_SERVO 5

/ * Elbow Servo HS-5745-MG * /

# tukuyin ang ELB_SERVO 6

/ * Servo ng pulso HS-645MG * /

# tukuyin ang WRI_SERVO 7

/ * Paikutin ng pulso ang servo HS-485HB * /

# tukuyin ang WRO_SERVO 8

/ * Gripper servo HS-422 * /

# tukuyin ang GRI_SERVO 9

/ * paunang kalkulasyon * /

float hum_sq = HUMERUS * HUMERUS;

float uln_sq = ULNA * ULNA;

int servoSPeed = 10;

// ServoShield servos; // ServoShield object

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

int loopCounter = 0;

int pulseWidth = 6.6;

int microsecondsToDegrees;

walang bisa ang pag-setup ()

{

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

pagkaantala (5500);

//servos.start (); // Start the servo Shield

servo_park ();

pagkaantala (4000);

Serial.begin (9600);

Serial.println ("Start");

}

walang bisa loop ()

{

loopCounter + = 1;

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

// pagkaantala (7000);

// zero_x ();

// line ();

//bilog();

pagkaantala (4000);

kung (loopCounter> 1) {

servo_park ();

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

pagkaantala (5000);

exit (0); } // pause program - hit reset upang magpatuloy

// exit (0);

}

/ * Karaniwan sa pagpoposisyon ng braso sa paggamit ng kabaligtaran na kinematics * /

/ * z ay taas, y ay distansya mula sa base center palabas, x ay magkatabi. y, z ay maaari lamang maging positibo * /

// 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 = radians (grip_angle_d); // grip anggulo sa radians para magamit sa mga kalkulasyon

/ * Angulo ng base at distansya ng radial mula sa x, y mga coordinate * /

float bas_angle_r = atan2 (x, y);

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

/ * Ang rdist ay y coordinate para sa braso * /

y = rdist;

/ * Ang mga offset ng mahigpit na pagkalkula ay kinakalkula batay sa anggulo ng mahigpit na pagkakahawak * /

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

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

/ * Posisyon ng pulso * /

float wrist_z = (z - grip_off_z) - BASE_HGT;

float wrist_y = y - grip_off_y;

/ * Distansya ng balikat sa pulso (AKA sw) * /

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

float s_w_sqrt = sqrt (s_w);

/ * s_w angulo sa lupa * /

float a1 = atan2 (pulso_z, pulso_y);

/ * s_w anggulo sa humerus * /

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

/ * anggulo ng balikat * /

float shl_angle_r = a1 + a2;

float shl_angle_d = degrees (shl_angle_r);

/ * anggulo ng siko * /

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

float elb_angle_d = degrees (elb_angle_r);

float elb_angle_dn = - (180.0 - elb_angle_d);

/ * anggulo ng pulso * /

float wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Servo pulses * /

float bas_servopulse = 1500.0 - ((degrees (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); // update 2018/2/11 ni jimrd - binago ko ang plus sa isang minus - hindi sigurado kung paano gumana ang code na ito para sa sinuman dati. Maaaring ang siko na servo ay naka-mount na may 0 degree na nakaharap sa ibaba kaysa sa pataas.

/ * Itakda ang mga servos * /

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

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

servo1.write (microsecondsToDegrees, servoSpeed); // gamitin ang pagpapaandar na ito upang maitakda mo ang bilis ng servo //

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

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

servo2.write (microsecondsToDegrees, servoSpeed);

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

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

servo3.write (microsecondsToDegrees, servoSpeed);

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

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

servo4.write (microsecondsToDegrees, servoSpeed);

}

/ * ilipat ang mga servos sa posisyon ng paradahan * /

walang bisa 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. magsulat (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6.write (80, 10);

bumalik;

}

void zero_x ()

{

para sa (dobleng yaxis = 250.0; yaxis <400.0; yaxis + = 1) {

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

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

antala (10);

}

para sa (dobleng yaxis = 400.0; yaxis> 250.0; yaxis - = 1) {

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

antala (10);

}

}

/ * gumagalaw ng braso sa isang tuwid na linya * /

walang bisa na linya ()

{

para sa (dobleng xaxis = -100.0; xaxis <100.0; xaxis + = 0.5) {

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

antala (10);

}

para sa (float xaxis = 100.0; xaxis> -100.0; xaxis - = 0.5) {

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

antala (10);

}

}

walang bisa na bilog ()

{

# tukuyin ang RADIUS 50.0

// float anggulo = 0;

float zaxis, yaxis;

para sa (float anggulo = 0.0; anggulo <360.0; anggulo + = 1.0) {

yaxis = RADIUS * sin (radians (anggulo)) + 300;

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

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

antala (10);

}

}

Hakbang 4: Mga Katotohanan, Isyu at Mga Tulad …

Katotohanan, Isyu at Katulad…
Katotohanan, Isyu at Katulad…

1. Kapag pinatakbo ko ang bilog () na subroutine ang aking robot ay higit na gumagalaw sa isang elliptical na hugis kaysa sa isang bilog. Sa palagay ko ay dahil ang aking mga servo ay hindi naka-calibrate. Sinubukan ko ang isa sa kanila at ang 1500 microseconds ay hindi pareho ng 90 degree. Gagana ito upang subukan at makahanap ng solusyon. Huwag maniwala na mayroong anumang mali sa algorithm ngunit sa aking mga setting. I-update ang 2018/2/11 - natuklasan lamang na ito ay dahil sa error sa orihinal na code. Hindi ko makita kung paano gumana ang kanyang programa Fixed code gamit ito: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (nagdaragdag ang orihinal na code)

2. Saan ako makakahanap ng karagdagang impormasyon tungkol sa kung paano gumagana ang pagpapaandar na set_arm (): Ang website ng Oleg Mazurov ay nagpapaliwanag ng lahat o nagbibigay ng mga link para sa karagdagang impormasyon:

3. Mayroon bang pagsusuri sa kundisyon ng kundisyon? Hindi. Kapag ang aking robot braso ay naipasa ang isang hindi wastong xyz coordinate ginagawa nito ang nakakatawang uri ng paggalaw ng arching tulad ng isang pusa na lumalawak. Naniniwala ako na si Oleg ay gumagawa ng ilang pag-check sa kanyang pinakabagong programa na gumagamit ng isang USB upang mai-program ang paggalaw ng braso. Tingnan ang kanyang video at link sa kanyang pinakabagong code.

4. Kailangang malinis ang code at maaaring maalis ang microsecond code.

Inirerekumendang: