תוכן עניינים:

שימוש ב- Arduino Uno למיקום XYZ של 6 זרוע רובוטית DOF: 4 שלבים
שימוש ב- Arduino Uno למיקום XYZ של 6 זרוע רובוטית DOF: 4 שלבים

וִידֵאוֹ: שימוש ב- Arduino Uno למיקום XYZ של 6 זרוע רובוטית DOF: 4 שלבים

וִידֵאוֹ: שימוש ב- Arduino Uno למיקום XYZ של 6 זרוע רובוטית DOF: 4 שלבים
וִידֵאוֹ: Using LCD I2C with Arduino UNO (Hebrew) 2024, דֵצֶמבֶּר
Anonim
Image
Image

פרויקט זה עוסק ביישום סקיצה קצרה וקלה יחסית של Arduino כדי לספק מיקום קינמטי הפוך XYZ. בניתי זרוע רובוטית של 6 סרוו, אך בכל הנוגע למציאת תוכנות להפעלה, לא היה שם הרבה פרט לתוכניות מותאמות אישית הפועלות על מגיני סרוו מותאמים אישית כמו SSC-32 (U) או תוכנות ואפליקציות אחרות שהיו מסובך להתקנה ולתקשר עם הזרוע. אחר כך מצאתי את "קינמטיקה הפוכה של הזרוע הרובוטית על אולג מזורוב על ארדואינו", שם יישם קינמטיקה הפוכה במערכון פשוט של ארדואינו.

ערכתי שני שינויים כדי להתאים את הקוד שלו:

1. השתמשתי בספריית VarSpeedServo במקום ספריית מגן הסרוו המותאמת אישית שלו מכיוון שאז אוכל לשלוט על מהירות הסרוווס ולא אצטרך להשתמש במגן הסרוו שבו השתמש. לכל מי ששוקל להריץ את הקוד המסופק כאן אני ממליץ לך להשתמש בספריית VarSpeedServo זו, ולא בספריית servo.h, כך שתוכל להאט את תנועת הזרוע הרובוטית שלך במהלך הפיתוח או שתגלה שהזרוע תדחוף אותך במפתיע הפנים או גרוע מכך מכיוון שהוא ינוע במהירות סרוו מלאה.

2. אני משתמש במגוון חיישן/סרוו פשוט לחיבור הסרוווס ל- Arduino Uno אך הוא אינו דורש ספריית סרוו מיוחדת מכיוון שהוא משתמש רק בסיכות של הארדואינו. זה עולה רק כמה דולרים אבל זה לא חובה. זה מאפשר חיבור נקי ונחמד של הסרווס לארדואינו. ולעולם לא אחזור לשרוואות עם חיבורים לאונדואינו אונו כעת. אם אתה משתמש במגן חיישן/סרוו זה עליך לבצע שינוי אחד קטן שאפרט להלן.

הקוד עובד מצוין ומאפשר לך להפעיל את הזרוע באמצעות פונקציה אחת שבה אתה מעביר את הפרמטרים x, y, x ומהירות. לדוגמה:

set_arm (0, 240, 100, 0, 20); // הפרמטרים הם (x, y, z, זווית אחיזה, מהירות סרוו)

עיכוב (3000); // נדרש עיכוב כדי לאפשר לזמן הזרוע לעבור למיקום זה

לא יכול להיות פשוט יותר. אכלול את הסקיצה להלן.

הסרטון של אולג נמצא כאן: שליטה בזרוע רובוטית עם ארדואינו ועכבר USB

התוכנית, התיאורים והמשאבים המקוריים של אולג: קינמטיקה הפוכה של אולג עבור Arduino Uno

אני לא מבין את כל המתמטיקה שמאחורי השגרה אבל הדבר הטוב הוא שאתה לא צריך להשתמש בקוד. מקווה שתנסה.

שלב 1: שינויי חומרה

שינויי חומרה
שינויי חומרה

1. הדבר היחיד שנדרש הוא שהסרוו שלך יפנה לכיוונים הצפויים, מה שעלול לדרוש ממך להפוך פיזית את הרכבה של סרוו שלך. עבור לדף זה כדי לראות את כיוון הסרווו הצפוי עבור סרוו בסיס, כתף, מרפק ופרק כף היד:

2. אם אתה משתמש במגן החיישן שבו אני משתמש עליך לעשות לו דבר אחד: לכופף את הסיכה המחברת את ה -5 וו מהמגן ל- Arduino Uno מהדרך כך שהיא לא תתחבר ללוח ה- Uno. אתה רוצה להשתמש במתח החיצוני על המגן כדי להפעיל רק את הסרבים שלך, לא את ה- Arduino Uno או שהוא עלול להרוס את ה- Uno, אני יודע כששרפתי שני לוחות Uno כשהמתח החיצוני שלי היה 6 וולט ולא 5. זה מאפשר לך להשתמש בעוצמה גבוהה מ -5 וולט כדי להפעיל את הסרווואים שלך, אך אם המתח החיצוני שלך גבוה מ -5 וולט, אל תחבר חיישני 5 וולט למגן או שהם יטוגנו.

שלב 2: הורד את ספריית VarSpeedServo

עליך להשתמש בספרייה זו המחליפה את ספריית הסרוו הארדואינית הסטנדרטית מכיוון שהיא מאפשרת לך להעביר מהירות סרוו לאמירת הכתיבה של סרוו. הספרייה נמצאת כאן:

ספריית VarSpeedServo

אתה יכול פשוט להשתמש בכפתור ה- zip, להוריד את קובץ ה- zip ולאחר מכן להתקין אותו עם ה- Arduino IDE. לאחר ההתקנה הפקודה בתוכנית שלך תיראה כך: servo.write (100, 20);

הפרמטר הראשון הוא הזווית והשני הוא מהירות הסרוו מ 0 עד 255 (מהירות מלאה).

שלב 3: הפעל את הסקיצה הזו

להלן תוכנית התחרות. עליך לשנות מספר פרמטרים עבור ממדי הזרוע הרובוטיים שלך:

1. אורכי BASE_HGT, HUMERUS, ULNA, GRIPPER במילימטרים.

2. הזן את מספרי סיכות הסרוו שלך

3. הזן את ה- servo min ו- max בהצהרות המצורפות.

4. לאחר מכן נסה פקודה set_arm () פשוטה ולאחר מכן את הפונקציות zero_x (), line () ו- circle () לבדיקה. וודא שמהירות הסרוו שלך נמוכה בפעם הראשונה שאתה מפעיל פונקציות אלה כדי למנוע פגיעה בזרוע ובזרוע שלך.

בהצלחה.

#כלול VarSpeedServo.h

/ * בקרת סרוו לזרוע AL5D */

/ * מידות זרוע (מ מ) */

#define BASE_HGT 90 // גובה בסיס

#הגדר HUMERUS 100 // עצם כתף עד מרפק

#define ULNA 135 // מרפק עד פרק כף היד "עצם"

#define GRIPPER 200 // גריפר (כולל מנגנון סיבוב פרק כף היד) אורך"

#define ftl (x) ((x)> = 0? (ארוך) ((x) +0.5):(ארוך) ((x) -0.5)) // צף להמרה ארוכה

/ * שמות/מספרים של סרוו *

* סרוו בסיס HS-485HB */

#הגדר BAS_SERVO 4

/ * סרוו כתף HS-5745-MG */

#הגדר SHL_SERVO 5

/ * מרפק סרוו HS-5745-MG */

#הגדר ELB_SERVO 6

/ * סרוו שורש כף היד HS-645MG */

#הגדר WRI_SERVO 7

/ * סרוו מסובב פרק כף היד HS-485HB */

#הגדר WRO_SERVO 8

/ * סרוו גריפר HS-422 */

#הגדר GRI_SERVO 9

/ * חישובים מוקדמים */

לצוף hum_sq = HUMERUS*HUMERUS;

לצוף uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// סרווס ServoShield; // אובייקט 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_park ();

עיכוב (4000);

Serial.begin (9600);

Serial.println ("התחל");

}

לולאת חלל ()

{

loopCounter += 1;

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

// עיכוב (7000);

// zero_x ();

//קַו();

//מעגל();

עיכוב (4000);

if (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // פארק

עיכוב (5000);

יציאה (0); } // השהה תוכנית - לחץ על איפוס כדי להמשיך

// יציאה (0);

}

/ * שגרת מיקום הזרועות תוך ניצול קינמטיקה הפוכה */

/* z הוא הגובה, y המרחק ממרכז הבסיס החוצה, x הוא מצד לצד. y, z יכול להיות רק חיובי */

// 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); // זווית אחיזה ברדיאנים לשימוש בחישובים

/ * זווית בסיס ומרחק רדיאלי מ x, קואורדינטות y */

צף bas_angle_r = atan2 (x, y);

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

/ * rdist הוא קואורדינטת y לזרוע */

y = rdist;

/ * קיזוז אחיזה מחושב על פי זווית אחיזה */

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

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

/ * תנוחת פרק כף היד */

צף wrist_z = (z - grip_off_z) - BASE_HGT;

צף wrist_y = y - grip_off_y;

/ * מרחק כתף לפרק כף היד (AKA sw) */

צף s_w = (wrist_z * wrist_z) + (wrist_y * wrist_y);

צף s_w_sqrt = sqrt (s_w);

/ * זווית sw לקרקע */

צף 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;

/ * פולסי סרוו */

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

// 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 = map (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (microsecondsToDegrees, servoSpeed); // השתמש בפונקציה זו כדי שתוכל להגדיר מהירות סרוו //

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

microsecondsToDegrees = map (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);

}

/ * העבר סרוויים למיקום חניה */

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.write (90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4.write (90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5.write (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6.write (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);

}

}

/ * מזיז את הזרוע בקו ישר */

קו חלל ()

{

עבור (שיעורים כפולים = -100.0; שיעורים <100.0; שיעורים += 0.5) {

set_arm (שיעורים, 250, 120, 0, 10);

עיכוב (10);

}

עבור (שיעול צף = 100.0; שיעורי> -100.0; שיעורים -= 0.5) {

set_arm (שיעורים, 250, 120, 0, 10);

עיכוב (10);

}

}

מעגל חלל ()

{

#define RADIUS 50.0

// זווית צף = 0;

צף זאקס, יאקסיס;

עבור (זווית צף = 0.0; זווית <360.0; זווית += 1.0) {

yaxis = RADIUS * sin (רדיאנים (זווית)) + 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. צריך לנקות את הקוד ולמנוע קוד מיקרו -שנייה.

מוּמלָץ: