ዝርዝር ሁኔታ:

የ 6 DOF ሮቦቲክ ክንድ: 4 ደረጃዎች ለ XYZ አቀማመጥ አርዱዲኖ ዩኖን መጠቀም
የ 6 DOF ሮቦቲክ ክንድ: 4 ደረጃዎች ለ XYZ አቀማመጥ አርዱዲኖ ዩኖን መጠቀም

ቪዲዮ: የ 6 DOF ሮቦቲክ ክንድ: 4 ደረጃዎች ለ XYZ አቀማመጥ አርዱዲኖ ዩኖን መጠቀም

ቪዲዮ: የ 6 DOF ሮቦቲክ ክንድ: 4 ደረጃዎች ለ XYZ አቀማመጥ አርዱዲኖ ዩኖን መጠቀም
ቪዲዮ: ዮጋ ለጀማሪዎች በአሊና አናናዲ #2። በ 40 ደቂቃዎች ውስጥ ጤናማ ተጣጣፊ አካል። ሁለንተናዊ ዮጋ። 2024, ህዳር
Anonim
Image
Image

ይህ ፕሮጀክት የ XYZ የተገላቢጦሽ አቀማመጥን ለማቅረብ አጭር እና በአንፃራዊነት ቀላል የአርዱኖ ንድፍን ስለመተግበር ነው። እኔ የ 6 servo ሮቦቲክ ክንድ ገንብቼ ነበር ነገር ግን እሱን ለማሄድ ሶፍትዌርን ለማግኘት ሲመጣ እንደ SSC-32 (U) ወይም ሌሎች ፕሮግራሞች እና መተግበሪያዎች ባሉ በብጁ ሰርቪስ ጋሻዎች ላይ ከሚሠሩ ብጁ ፕሮግራሞች በስተቀር ብዙ አልነበሩም። ከእጅ ጋር ለመጫን እና ለመገናኘት የተወሳሰበ። ከዚያ የኦሌግ ማዙሮቭን እጅግ በጣም ጥሩ የሆነውን “የሮቦቲክ ክንድ ተገላቢጦሽ ኪነማቲክስ በአርዱዲኖ” ላይ አገኘሁ።

እኔ የእርሱን ኮድ ለማስተካከል ሁለት ማሻሻያዎችን አደረግሁ-

1. እኔ የቫርሴፔድ ሰርቨር ቤተ -መጽሐፍትን በብጁ ሰርቪስ ጋሻ ቤተ -መጽሐፍት ምትክ እጠቀም ነበር ፣ ምክንያቱም እኔ የ servos ን ፍጥነት መቆጣጠር ስለምችል እና እሱ የተጠቀሰውን የ servo ጋሻ መጠቀም አያስፈልገኝም። እዚህ የተሰጠውን ኮድ ለማስኬድ ለሚያስብ ማንኛውም ሰው በእድገቱ ወቅት የሮቦት ክንድ እንቅስቃሴዎን ለማቅለል ወይም ከ ‹servo.h› ቤተ -መጽሐፍት ይልቅ ይህንን የ ‹VarSpeedServo› ቤተ -መጽሐፍት እንዲጠቀሙ እመክራለሁ ወይም ክንድዎ ሳይታሰብ ወደ ውስጥ ሊገባዎት ይችላል። ፊቱ ወይም የከፋው ምክንያቱም በሙሉ servo ፍጥነት ስለሚንቀሳቀስ።

2. ሰርዶቹን ከ Arduino Uno ጋር ለማገናኘት ቀለል ያለ አነፍናፊ/ሰርቪስ ጋሻ እጠቀማለሁ ግን የአርዲኖን ፒኖች ስለሚጠቀም ልዩ servo ቤተ -መጽሐፍት አያስፈልገውም። ጥቂት ዶላር ብቻ ያስከፍላል ግን አይፈለግም። ከአርዱዲኖ ጋር የ servos ጥሩ ንፁህ ግንኙነትን ይፈጥራል። እና አሁን ወደ አርዱዲኖ ኡኖ ወደ ጠንክሮ አገልግሎት ወደ ኋላ አልመለስም። ይህንን አነፍናፊ/servo ጋሻ የሚጠቀሙ ከሆነ እኔ ከዚህ በታች የምዘረዝረውን አንድ ትንሽ ማሻሻያ ማድረግ ያስፈልግዎታል።

ኮዱ በጥሩ ሁኔታ ይሠራል እና የ x ፣ y ፣ x እና የፍጥነት መለኪያዎች የሚያልፉበትን አንድ ተግባር በመጠቀም ክንድዎን እንዲሰሩ ያስችልዎታል። ለምሳሌ:

set_arm (0, 240, 100, 0, 20); // መለኪያዎች (x ፣ y ፣ z ፣ gripper angle ፣ servo ፍጥነት) ናቸው

መዘግየት (3000); // ወደዚህ ቦታ ለመንቀሳቀስ የእጅ ጊዜ ለመፍቀድ/ መዘግየት ያስፈልጋል

ቀላል ሊሆን አይችልም። ከዚህ በታች ያለውን ንድፍ እጨምራለሁ።

የኦሌግ ቪዲዮ እዚህ አለ - የሮቦቲክ ክንድ በአርዱዲኖ እና በዩኤስቢ መዳፊት መቆጣጠር

የኦሌግ የመጀመሪያ መርሃ ግብር ፣ መግለጫዎች እና ሀብቶች -የኦሌግ የተገላቢጦሽ ኪነማት ለ አርዱዲኖ ኡኖ

ከመደበኛ አሠራሩ በስተጀርባ ያለውን ሁሉንም ሂሳብ አልገባኝም ግን ጥሩው ነገር ኮዱን መጠቀም የለብዎትም። እርስዎ እንደሚሞክሩት ተስፋ ያድርጉ።

ደረጃ 1 የሃርድዌር ማሻሻያዎች

የሃርድዌር ማሻሻያዎች
የሃርድዌር ማሻሻያዎች

1. የሚፈለገው ብቸኛው ነገር የእርስዎ አገልጋዮች የአገልጋዮችዎን መጫኛ በአካል እንዲቀለበስ በሚፈልጉት አቅጣጫዎች መዞሩ ነው። ለመሠረት ፣ ለትከሻ ፣ ለክርን እና ለእጅ አንጓ servos የሚጠበቀውን የአርሶ አቅጣጫን ለማየት ወደዚህ ገጽ ይሂዱ

2. እኔ የምጠቀምበትን የአነፍናፊ ጋሻ የሚጠቀሙ ከሆነ አንድ ነገር ማድረግ ያስፈልግዎታል - 5 ቮን ከጋሻው ወደ አርዱዲኖ ኡኖ የሚያገናኘውን ፒን ከኡኖ ቦርድ ጋር እንዳይገናኝ ከመንገድ ላይ ያጥፉት። የአርዱዲኖን ኡኖን ሳይሆን ሰርቮስዎን ብቻ ለማብራት በጋሻው ላይ ያለውን የውጭ ቮልቴጅን መጠቀም ይፈልጋሉ ወይም ዩኖን ሊያጠፋው ይችላል ፣ የእኔ ውጫዊ ቮልቴጅ 6 ቮልት ሳይሆን 5. ሁለት የዩኖ ቦርዶችን እንዳቃጠልሁ አውቃለሁ። ይህ ይፈቅድልዎታል። ሰርቪስዎን ለማብራት ከ 5v በላይ ለመጠቀም ፣ ነገር ግን የእርስዎ ውጫዊ voltage ልቴጅ ከ 5 ቮልት በላይ ከሆነ ከዚያ ማንኛውንም የ 5 ቮልት ዳሳሾችን ወደ ጋሻው አያገናኙ ወይም እነሱ ይጠበባሉ።

ደረጃ 2 የ VarSpeedServo ቤተ -መጽሐፍትን ያውርዱ

የ servo ፍጥነትን ወደ servo ጻፍ መግለጫ እንዲያስተላልፉ ስለሚፈቅድልዎት መደበኛውን የአርዱዲኖ servo ቤተ -መጽሐፍትን የሚተካ ይህንን ቤተ -መጽሐፍት መጠቀም ያስፈልግዎታል። ቤተ -መጽሐፍት እዚህ ይገኛል

VarSpeedServo ቤተ -መጽሐፍት

የዚፕ ቁልፍን ብቻ መጠቀም ፣ የዚፕ ፋይሉን ማውረድ እና ከዚያ በአርዱዲኖ አይዲኢ መጫን ይችላሉ። አንዴ በፕሮግራምዎ ውስጥ ትዕዛዙ ከተጫነ የሚከተለውን ይመስላል servo.write (100 ፣ 20) ፤

የመጀመሪያው ግቤት አንግል ሲሆን ሁለተኛው ደግሞ ከ 0 እስከ 255 (ሙሉ ፍጥነት) የ servo ፍጥነት ነው።

ደረጃ 3: ይህንን ንድፍ ያሂዱ

የውድድር ፕሮግራሙ እነሆ። ለሮቦቲክ የእጅዎ ልኬቶች ጥቂት ልኬቶችን ማሻሻል ያስፈልግዎታል

1. BASE_HGT ፣ HUMERUS ፣ ULNA ፣ GRIPPER ርዝመቶች በ ሚሊሜትር።

2. የእርስዎን servo pin ቁጥሮች ያስገቡ

3. በአባሪ መግለጫዎች ውስጥ የ servo ደቂቃ እና ከፍተኛውን ያስገቡ።

4. ከዚያ ቀለል ያለ የ set_arm () ትዕዛዝን እና ከዚያ ለዜሮ ዜሮ_ኤክስ () ፣ መስመር () እና ክበብ () ተግባሮችን ይሞክሩ። ክንድዎን እና የራስዎን ክንድ እንዳይጎዱ ለመከላከል እነዚህን ተግባራት ለመጀመሪያ ጊዜ ሲያካሂዱ የ servo ፍጥነትዎ ዝቅተኛ መሆኑን ያረጋግጡ።

መልካም እድል.

#VarSpeedServo.h ን ያካትቱ

/ * ለ AL5D ክንድ የ Servo ቁጥጥር */

/ * የክንድ ልኬቶች (ሚሜ) */

#ጥራት BASE_HGT 90 // የመሠረት ቁመት

#ገላጭ ሁመር 100 // ከትከሻ እስከ ክርን “አጥንት”

#ጥራት ULNA 135 // ከክርን-እስከ-አንጓ “አጥንት”

#ጥራት GRIPPER 200 // gripper (የከባድ የእጅ አንጓ የማሽከርከር ዘዴን ጨምሮ) ርዝመት”

#define ftl (x) ((x)> = 0? (ረጅም) ((x) +0.5):(ረጅም) ((x) -0.5)) // ወደ ረጅም ልወጣ ተንሳፈፈ

/ * Servo ስሞች/ቁጥሮች *

* Base servo HS-485HB */

#BAS_SERVO 4 ን ይግለጹ

/ * የትከሻ Servo HS-5745-MG */

#SHL_SERVO ን ይግለጹ 5

/ * የክርን ሰርቮ HS-5745-MG */

#ELB_SERVO ን ይግለጹ 6

/ * የእጅ አንጓ servo HS-645MG */

#መለየት WRI_SERVO 7

/ * የእጅ አንጓ servo HS-485HB */

#WRO_SERVO 8 ን ይግለጹ

/ * Gripper servo HS-422 */

#GRI_SERVO ን ይግለጹ 9

/ * ቅድመ-ስሌቶች */

ተንሳፋፊ 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 pulseWidth = 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.attach (WRO_SERVO, 544, 2400);

servo6.attach (GRI_SERVO, 544, 2400);

መዘግየት (5500);

//servos.start (); // የ servo ጋሻውን ያስጀምሩ

servo_park ();

መዘግየት (4000);

Serial.begin (9600);

Serial.println ("ጀምር");

}

ባዶነት loop ()

{

loopCounter += 1;

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

// መዘግየት (7000);

// zero_x ();

// መስመር ();

// ክበብ ();

መዘግየት (4000);

ከሆነ (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)

ባዶ set_arm (ተንሳፋፊ x ፣ float y ፣ float z ፣ float grip_angle_d ፣ int servoSpeed)

{

ተንሳፋፊ grip_angle_r = ራዲያን (grip_angle_d); በስሌቶች ውስጥ ለመጠቀም በራዲያኖች ውስጥ // የመያዣ አንግል

/ * የመሠረት አንግል እና ራዲያል ርቀት ከ x ፣ y መጋጠሚያዎች */

ተንሳፋፊ bas_angle_r = atan2 (x, y);

ተንሳፋፊ rdist = sqrt ((x * x) + (y * y));

/ * rdist ለ ክንድ አስተባባሪ ነው */

y = rdist;

/ * በመያዣ አንግል ላይ በመመስረት የግፊት ማካካሻዎች */

ተንሳፋፊ grip_off_z = (ኃጢአት (grip_angle_r)) * GRIPPER;

ተንሳፋፊ grip_off_y = (cos (grip_angle_r)) * GRIPPER;

/ * የእጅ አንጓ አቀማመጥ */

ተንሳፋፊ የእጅ አንጓ_z = (z - grip_off_z) - BASE_HGT;

ተንሳፋፊ የእጅ አንጓ = y - grip_off_y;

/ * ከትከሻ እስከ የእጅ አንጓ ርቀት (AKA sw) */

float s_w = (wrist_z * wrist_z) + (የእጅ አንጓ * የእጅ አንጓ);

ተንሳፋፊ s_w_sqrt = sqrt (s_w);

/ * s_w አንግል ወደ መሬት */

ተንሳፋፊ a1 = atan2 (የእጅ አንጓ ፣ የእጅ አንጓ);

/ * s_w አንግል ወደ humerus */

ተንሳፋፊ a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));

/ * የትከሻ አንግል */

ተንሳፋፊ shl_angle_r = a1 + a2;

ተንሳፋፊ shl_angle_d = ዲግሪዎች (shl_angle_r);

/ * የክርን አንግል */

ተንሳፋፊ 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);

/ * የእጅ አንጓ */

ተንሳፋፊ wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Servo ጥራጥሬዎች */

ተንሳፋፊ bas_servopulse = 1500.0 - ((ዲግሪ (bas_angle_r)) * pulseWidth);

ተንሳፋፊ shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);

ተንሳፋፊ elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * pulseWidth);

// ተንሳፋፊ wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

// ተንሳፋፊ wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

ተንሳፋፊ wri_servopulse = 1500 - (wri_angle_d * pulseWidth) ፤ // ተዘምኗል 2018/2/11 በ jimrd - ጭማሪውን ወደ ተቀነስኩ - ይህ ኮድ ከዚህ በፊት ለማንም እንዴት እንደሰራ እርግጠኛ አይደለሁም። የክርን servo ወደ ላይ ሳይሆን ከ 0 ዲግሪዎች ወደታች በመጫን ሊሆን ይችላል።

/ * Servos ን ያዘጋጁ//

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

microsecondsToDegrees = ካርታ (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1. ይፃፉ (ማይክሮ ሰከንዶች ToDegrees ፣ servoSpeed); // የ servo ፍጥነት ማዘጋጀት እንዲችሉ ይህንን ተግባር ይጠቀሙ/

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

microsecondsToDegrees = ካርታ (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2. ጻፍ (ማይክሮ ሰከንዶች ቶ ዲግሬስ ፣ servoSpeed);

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

microsecondsToDegrees = ካርታ (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3. ጻፍ (ማይክሮ ሰከንድ ቶ ዲግሬስ ፣ servoSpeed);

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

microsecondsToDegrees = ካርታ (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4. ይፃፉ (ማይክሮ ሰከንዶች ToDegrees ፣ servoSpeed);

}

/ * servos ን ወደ ማቆሚያ ቦታ ያንቀሳቅሱ */

ባዶ servo_park ()

{

//servos.setposition (BAS_SERVO, 1500);

1. ጻፍ (90 ፣ 10);

//servos.setposition (SHL_SERVO, 2100);

servo2. ጻፍ (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);

መመለስ;

}

ባዶ zero_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);

}

ለ (ተንሳፋፊ xaxis = 100.0; xaxis> -100.0 ፣ xaxis -= 0.5) {

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

መዘግየት (10);

}

}

ባዶ ክበብ ()

{

#ራዲየስ 50.0 ን ይግለጹ

// ተንሳፋፊ አንግል = 0;

ተንሳፋፊ zaxis, yaxis;

ለ (ተንሳፋፊ አንግል = 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 ዲግሪ ጋር ተመሳሳይ አልነበረም። መፍትሄ ለማግኘት እና ለመሞከር በዚህ ላይ ይሠራል። በአልጎሪዝም (algorithm) ላይ ስህተት አለ ብለው አያምኑም ይልቁንስ በእኔ ቅንጅቶች ላይ። 2018/2/11 ን ያዘምኑ - ይህ አሁን የተገኘው በዋናው ኮድ ስህተት ምክንያት ነው። ፕሮግራሙ እንዴት እንደሠራ አይታየኝም ቋሚ ኮድ: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (የመጀመሪያው ኮድ ታክሏል)

2. የ set_arm () ተግባር እንዴት እንደሚሠራ ተጨማሪ መረጃ ከየት ማግኘት እችላለሁ የኦሌግ ማዙሮቭ ድር ጣቢያ ሁሉንም ነገር ያብራራል ወይም ለበለጠ መረጃ አገናኞችን ይሰጣል

3. የድንበር ሁኔታ ማጣራት አለ? አይደለም። የእኔ ሮቦት ክንድ ልክ ያልሆነ የ xyz አስተባባሪ ሲተላለፍ እንደ ድመት ሲዘረጋ ይህን አስቂኝ የመገጣጠም እንቅስቃሴ ያደርጋል። አምናለሁ ኦሌግ የእጆቹን እንቅስቃሴዎች በፕሮግራሙ ለማዘጋጀት ዩኤስቢ በሚጠቀምበት የቅርብ ጊዜ ፕሮግራሙ ውስጥ አንዳንድ ምርመራዎችን ያደርጋል። ቪዲዮውን ይመልከቱ እና ወደ የቅርብ ጊዜው ኮድ ያገናኙ።

4. ኮድ ማጽዳት እና ማይክሮ ሰከንድ ኮድ ሊወገድ ይችላል።

የሚመከር: