- תרשים מעגל
- יצירת אותות PWM על סיכת GPIO לבקרת מנוע סרוו
- תכנות PIC16F8771A לזרוע רובוטית
- סימולציה של קוד הזרוע הרובוטית של PIC
- תכנון PCB באמצעות EasyEDA
- חישוב והזמנת דוגמאות באופן מקוון
- עבודה של PIC זרוע רובוטית
מקו הייצור של תעשיות ייצור הרכב וכלה ברובוטים הטל-כירורגיים בחלל, נשק רובוטי נמצא בכל מקום. המנגנונים של רובוטים אלה דומים לאדם אשר ניתן לתכנת לתפקוד דומה ויכולות מוגברות. בעזרתם ניתן לבצע פעולות חוזרות ומהירות ומדויקות יותר מבני אדם, או להשתמש בסביבות קשות מבלי לסכן חיי אדם. בנינו כבר Record and Play Armotic Arm באמצעות ארדואינו, שניתן היה להכשיר אותו למשימה מסוימת ולגרום לחזור לנצח.
במדריך זה נשתמש בתקן התעשייתי PIC16F877A 8-bit Microcontroller כדי לשלוט על אותה זרוע רובוטית עם פוטנציומטרים. האתגר בפרויקט זה הוא כי ל- PIC16F877A יש רק שני סיכות בעלות יכולת PWN, אך עלינו לשלוט בכ -5 מנועי סרוו עבור הרובוט שלנו אשר דורש 5 סיכות PWM בודדות. אז עלינו להשתמש בסיכות GPIO וליצור אותות PWM על סיכות PIC GPIO באמצעות הפרעות הטיימר. עכשיו, כמובן שנוכל לשדרג למיקרו-בקר טוב יותר או להשתמש ב- IC של דה-מולטיפלקס כדי להקל על העניינים כאן. אך בכל זאת, כדאי לנסות את הפרויקט לחוויית הלמידה.
המבנה המכני של הזרוע הרובוטית בה אני משתמש בפרויקט זה הודפס בתלת מימד לחלוטין עבור הפרויקט הקודם שלי; תוכלו למצוא את קבצי העיצוב המלאים והליך ההרכבה כאן. לחלופין, אם אין לכם מדפסת תלת מימד תוכלו לבנות זרוע רובוטית פשוטה באמצעות קרטונים כפי שמופיע בקישור. בהנחה שיש לך איכשהו אחיזה בזרוע הרובוטית שלך, אתה יכול להמשיך לפרויקט.
תרשים מעגל
תרשים המעגל השלם עבור זרוע רובוטית מבוססת PIC מיקרו-בקר זו מוצג להלן. התרשימות שורטטו באמצעות EasyEDA.
תרשים המעגל די פשוט; הפרויקט השלם מופעל על ידי מתאם 12V. 12V זה מומר לאחר מכן ל- + 5V באמצעות שני ווסת מתח 7805. האחד מתויג כ- 5V והשני מתויג כ- 5V (2). הסיבה לכך שיש שני ווסתים היא שכאשר הסרוו מסתובב הוא מושך זרם רב שיוצר נפילת מתח. ירידת מתח זו מאלצת את ה- PIC להפעיל מחדש את עצמה, ולכן איננו יכולים להפעיל את ה- PIC וגם את מנועי הסרוו על אותה מסילה + 5V. אז זה שתויג כ- 5V משמש להפעלת מיקרו-בקר PIC, LCD ופוטנציומטרים ופלט רגולטור נפרד המסומן כ- 5V (2) משמש להפעלת מנועי הסרוו.
חמשת פינות היציאה של הפוטנציומטרים המספקות מתח משתנה בין 0 וולט ל -5 וולט מחוברות לסיכות האנלוגיות An0 ל- AN4 של ה- PIC. מכיוון שאנו מתכננים להשתמש בטיימרים ליצירת PWM, ניתן לחבר את מנועי הסרוו לכל סיכת GPIO. בחרתי סיכות טופס RD2 ל RD6 עבור מנועי סרוו, אבל זה יכול להיות כל GPIO לבחירתך.
מכיוון שהתוכנית כוללת הרבה ניפוי שגיאות, תצוגת LCD בגודל 16x2 גם מממשקת ליציאת B של ה- PIC. זה יציג את מחזור החובה של מנועי סרוו הנשלטים. מלבד זאת הרחבתי גם חיבורים לכל GPIO וסיכות אנלוגיות, למקרה אם חייבים להתממשק חיישנים כלשהם בעתיד. לבסוף חיברתי גם את סיכת המתכנת H1 לתכנות ישירות את ה- PIC עם pickit3 באמצעות אפשרות התכנות ICSP.
יצירת אותות PWM על סיכת GPIO לבקרת מנוע סרוו
לאחר שהמעגל מוכן עלינו להבין כיצד ליצור אותות PWN על סיכת ה- GPIO של PIC כדי לשלוט על מנוע הסרוו. כבר עייפנו משהו דומה בשיטת הפסקת טיימר והצלחנו. כאן אנחנו רק הולכים לבנות על גבי זה, אז אם אתה חדש כאן, אני ממליץ לך לקרוא את המדריך הקודם לפני שתמשיך הלאה.
כל מנועי סרוו התחביב עובדים בתדר של 50 הרץ. המשמעות של מחזור דופק שלם אחד עבור מנוע סרוו יהיה 1/50 (F = 1 / T) שהוא 20ms. מתוך 20 ms שלמים זה אות הבקרה הוא רק בין 0 ל 2 ms בעוד ששאר האות תמיד כבוי. האיור שלהלן מראה כיצד זמן ההפעלה משתנה בין 0 ל -2 ms כדי לסובב את המנוע בין 0 ל -180 מעלות למשך 20 ms הכולל.
עם זאת בחשבון עלינו לכתוב את התוכנית בצורה כזו שה- PIC קורא ב 0 עד 1204 מהפוטנציומטר וממפה אותה ל 0 עד 100 אשר יהיה מחזור החובה של מנוע הסרוו. באמצעות מחזור חובה זה אנו יכולים לחשב את זמן ההפעלה של מנוע הסרוו. אז נוכל לאתחל את הפסקת הטיימר כדי לעלות על גדותיו במרווח קבוע כך שהוא פועל בדומה לתפקוד ה- millis () בארדואינו. עם זאת, אנו יכולים להחליף את סיכת GPIO הסטטוס להיות גבוהה למשך הרצוי ולכבות אותה לאחר 20ms (מחזור שלם אחד) ואז לחזור על אותו תהליך. עכשיו, אחרי שהבנו את ההיגיון, בואו ניכנס לתוכנית.
תכנות PIC16F8771A לזרוע רובוטית
כמו תמיד ניתן למצוא את התוכנית המלאה עם סרטון בסוף עמוד זה, ניתן להוריד קוד גם מכאן עם כל הקבצים הדרושים. בחלק זה נדון בהיגיון העומד מאחורי התוכנית. התוכנית משתמשת במודול ADC, מודול טיימר ומודול LCD לשליטה על הזרוע הרובוטית. אם אינך מודע כיצד להשתמש בתכונות ADC או בתכונות טיימר או בממשק LCD עם PIC, תוכל לחזור לקישורים המתאימים כדי ללמוד אותם. ההסבר להלן ניתן בהנחה שהקורא מכיר מושגים אלה.
תצורת טיימר 0 נמל
החלק החשוב ביותר בקוד הוא הגדרת טיימר 0 ליותר מדי זרימה לכל עיכוב ספציפי. ניתן לתת את הנוסחאות לחישוב עיכוב זה כ-
עיכוב = ((256-REG_val) * (Prescal * 4)) / Fosc
באמצעות הרישום OPTION_REG ו- TMR0 הגדרנו את טיימר 0 לפעול עם ערך prescalar של 32 ו- REG val מוגדר ל 248. תדר הגביש (Fosc) המשמש בחומרה שלנו הוא 20Mhz. עם ערכים אלה ניתן לחשב את העיכוב כ-
עיכוב = ((256-248) * (32 * 4)) / (20000000) = 0.0000512 שניות (או) = 0.05 אלפיות השנייה
אז עכשיו הגדרנו את הטיימר לגלוש בכל 0.05ms. הקוד לעשות את אותו הדבר ניתן להלן
/ ***** תצורת יציאה לטיימר ****** / OPTION_REG = 0b00000100; // Timer0 עם freq חיצוני ו- 32 כ prescalar // מאפשר גם PULL UPs TMR0 = 248; // טען את ערך הזמן עבור 0.0001 שניות; delayValue יכול להיות בין 0-256 בלבד TMR0IE = 1; // אפשר סיבית הפסקת טיימר ברישום PIE1 GIE = 1; // אפשר הפרעה גלובלית PEIE = 1; // אפשר את ההפרעה ההיקפית / *********** ______ *********** /
מתוך חלון הבקרה הכולל של 0ms עד 2ms של מנוע הסרוו אנו יכולים לשלוט בו ברזולוציה של 0.05msec, המאפשרת לנו (2 / 0.05) 40 מצבים שונים עבור המנוע בין 0 ל -180 מעלות. אתה יכול להקטין ערך זה עוד יותר אם ה- MCU שלך יכול לתמוך בו כדי להשיג יותר עמדות ושליטה מדויקת.
שגרת שירות הפסקה (ISR)
כעת, כשיש לנו את טיימר 0 מוגדר לזרימת יתר עבור כל 0.05ms, נקבע כי דגל ההפרעה TMR0IF מוגדר ל- 0.05ms. אז בתוך פונקציית ה- ISR נוכל לאפס את הדגל הזה ולהגדיל משתנה שנקרא ספירה על ידי אחד. אז עכשיו המשתנה הזה יוגדל ב -1 לכל 0.05ms.
חלל הפסקת זמן__סר () { אם (TMR0IF == 1) // דגל הטיימר הופעל עקב הצפת טיימר -> מוגדר להצפה לכל 0.05ms { TMR0 = 248; // טען את הטיימר ערך TMR0IF = 0; // נקה טיימר להפסיק ספירת דגלים ++; // ספרו תוספות ב -1 לכל 0.05 ms }
חישוב מחזור העבודה והזמן בזמן
בשלב הבא עלינו לחשב את מחזור החובה ובזמן עבור כל חמשת מנוע הסרוו. יש לנו חמישה מנועי סרוו שכל אחד מהם משמש לשליטה בקטע זרוע בודד. אז עלינו לקרוא את ערך ה- ADC של כל החמישה ולחשב את מחזור החובה ובזמן עבור כל אחד מהם.
ערך ה- ADC יהיה בטווח שבין 0 ל -1024 אשר ניתן להמיר למחזור חובה של 0% עד 100% על ידי הכפלת 0.0976 (100/1024 = 0.0976) לערך המתקבל. יש להמיר את מחזור החובה של 0 עד 100% לזמן ההפעלה. אנו יודעים שבמחזור חובה של 100% זמן ההפעלה צריך להיות 2 ms (ל 180 מעלות) ולכן הכפלת 0.02 (2/100 = 0.02) תמיר 0 ל 100 מחזור חובה ל 0 עד 2 ms. אבל אז ספירת משתני הטיימר שלנו מוגדרת להגדלה אחת לכל 0.05ms. משמעות הדבר היא שערך הספירה יהיה 20 (1 / 0.05 = 20) לכל 1ms. אז עלינו להכפיל 20 עם 0.02 כדי לחשב את הזמן המדויק לתוכנית שלנו שייתן לנו את הערך 0.4 (0.02 * 20 = 0.4). הקוד עבור אותו מופיע למטה, אתה יכול לראות אותו חוזר 5 פעמים עבור כל 5 הסירים באמצעות לולאה for. הערכים המתקבלים נשמרים במערך T_ON.
עבור (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // קרא את הערך של POT באמצעות ADC Duty_cycle = (POT_val * 0.0976); // מפה 0 עד 1024 עד 0 עד 100 T_ON = Duty_cycle * 0.4; // 20 * 0.02
בחירת המנוע לסובב
איננו יכולים לשלוט על כל חמשת המנועים יחד מכיוון שהוא יביא לכבד את קוד ה- ISR להאט את המיקרו-בקר כולו. אז אנחנו צריכים לסובב רק מנוע סרוו אחד בכל פעם. כדי לבחור איזה סרוו לסובב, המיקרו-בקר עוקב אחר זמן ההפעלה של כל חמשת מנועי הסרוו ומשווה אותו לזה שקדם לו בזמן. אם חל שינוי בזמן ON, אנו יכולים להסיק כי יש להזיז את הסרווו המסוים. הקוד עבור אותו מוצג להלן.
אם (T_ON! = Pev_val) { Lcd_Clear (); סרוו = pot_num; Lcd_Set_Cursor (2,11); Lcd_Print_String ("S:"); Lcd_Print_Char (סרוו + '0'); אם (pot_num == 0) {Lcd_Set_Cursor (1,1); Lcd_Print_String ("A:");} אחר אם (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} אחרת אם (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} אחרת אם (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} אחר אם (pot_num == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle)% 10; char d1 = (Duty_cycle / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
אנו מדפיסים גם את מחזור החובה של סרוו על גבי מסך ה- LCD כדי שהמשתמש יוכל להיות מודע למיקומו הנוכחי. בהתבסס על השינוי בזמן ההפעלה, סרוו המשתנה מעודכן עם מספרים מ- 0 עד 4 שכל אחד מהם מייצג מנועים בודדים.
שליטה במנוע הסרוו בתוך ה- ISR
בתוך ה- ISR יש לנו את ספירת המשתנים המצטברת לכל 0.05ms, המשמעות היא שבכל 1ms המשתנה יגדל ב -20. באמצעות זה עלינו לשלוט בסיכות כדי לייצר אות PWM. אם ערך הספירה נמוך מהזמן בזמן, GPIO של מנוע זה מופעל באמצעות השורה הבאה
PORTD = PORTD - servo_code;
כאן במערך סרוו_קוד יש את פירוט הסיכה של כל חמשת מנוע הסרוו ועל סמך הערך בסרוו משתנה ישמש את הקוד עבור מנוע סרוו מסוים זה. אז זה מבחינה לוגית או (-) עם ביטים PORTD קיימים, כך שלא נפריע לערכים של מנוע אחר ונעדכן רק את המנוע המסוים הזה. באופן דומה לכיבוי הסיכה
PORTD = PORTD & ~ (servo_code);
הפכנו את ערך הסיביות באמצעות אופרטור ההיפוך ההגיוני (~) ואז ביצענו פעולת AND (&) ב- PORTD כדי לכבות רק את הסיכה הרצויה תוך השארת הפינים האחרים במצב הקודם שלהם. קטע הקוד המלא מוצג למטה.
חלל הפסקת זמן__סר () { אם (TMR0IF == 1) // דגל הטיימר הופעל עקב הצפת טיימר -> מוגדר להצפה לכל 0.05ms { TMR0 = 248; // טען את הטיימר ערך TMR0IF = 0; // נקה טיימר להפסיק ספירת דגל ++ // ספירת תוספות ב -1 לכל 0.05ms -> הספירה תהיה 20 לכל 1ms (0.05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; אם (ספירה> = 20 * 20) ספירה = 0; אם (ספירה <= (T_ON)) PORTD = PORTD - servo_code; אחרת PORTD = PORTD & ~ (servo_code); }
אנו יודעים שהמחזור הכולל צריך להימשך 20ms לפני שהסיכה של GPIO מופעלת שוב. אז אנחנו בודקים אם הספירה חרגה מ- 20ms על ידי השוואת ערך הספירה עם 400 (אותו חישוב כפי שפורט לעיל) ואם כן עלינו לאתחל את הספירה לאפס שוב.
סימולציה של קוד הזרוע הרובוטית של PIC
תמיד עדיף לדמות את הקוד לפני שלוקחים אותו לחומרה האמיתית. אז השתמשתי ב- Proteus כדי לדמות את הקוד שלי ואימת שהוא עובד כהלכה. המעגל המשמש לסימולציה מוצג להלן. השתמשנו באוסילוסקופ כדי לבדוק אם אותות ה- PWM נוצרים כנדרש. כמו כן אנו יכולים לאמת אם מנועי ה- LCD והסרוו מסתובבים כצפוי.
כפי שאתה יכול לראות את LCD מציג את המחזור של D מנוע להיות 07 בהתבסס על שווי הסיר שהנו 3 rd מנוע. בדומה אם מועבר סיר אחר, מחזור העבודה של אותו סיר ומספר המנוע שלו יוצג על גבי LCD. אות ה- PWM המוצג באוסילוסקופ מוצג להלן.
תקופת המחזור הכוללת נמדדת 22.2ms באמצעות אפשרות הסמן באוסילוסקופ, הקרובה מאוד ל 20ms הרצויה. לבסוף אנו בטוחים שהקוד עובד, ולכן כדי להמשיך עם המעגל נוכל להלחין אותו על לוח perf או להשתמש ב- PCB. זה לא יעבוד בקלות על קרש הלחם כי ה- POT תמיד נוטה לתת כמה בעיות בגלל חיבורים לקויים.
תכנון PCB באמצעות EasyEDA
לתכנון זרוע רובוטית זו של PIC בחרנו בכלי ה- EDA המקוון שנקרא EasyEDA. אני משתמש בו כבר הרבה זמן ונראה שהוא מאוד נוח בגלל הזמינות העצומה שלו של טביעת רגל וקל לשימוש בטבע. לאחר תכנון ה- PCB, אנו יכולים להזמין את דגימות ה- PCB על ידי שירותי ייצור PCB בעלות נמוכה. הם מציעים גם שירות מקורות רכיבים כאשר יש להם מלאי גדול של רכיבים אלקטרוניים ומשתמשים יכולים להזמין את הרכיבים הנדרשים שלהם יחד עם הזמנת ה- PCB.
תוך כדי תכנון המעגלים וה- PCB שלך, אתה יכול גם להפוך את המעגלים והעיצובי שלך ל- PCB לציבוריים, כך שמשתמשים אחרים יוכלו להעתיק או לערוך אותם ויכולים להפיק תועלת מהעבודה שלך, הפכנו גם את כל פריסות המעגל וה- PCB לציבוריות למעגל זה, בדוק הקישור למטה:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
באמצעות קישור זה תוכלו להזמין ישירות את אותו PCB בו אנו משתמשים בפרויקט זה ולהשתמש בו. לאחר סיום העיצוב ניתן לראות את הלוח כמודל תלת ממדי אשר יעזור מאוד להמחיש כיצד הלוח יופיע לאחר ייצור. המודל התלת ממדי של הלוח בו אנו משתמשים מוצג להלן. מלבד זאת תוכלו גם לצפות בשכבה העליונה והתחתונה של הלוח כדי לבדוק אם המסך החלקלק הוא כצפוי.
חישוב והזמנת דוגמאות באופן מקוון
לאחר השלמת העיצוב של PCB רובוט PIC זה, תוכלו להזמין את ה- PCB דרך JLCPCB.com. כדי להזמין את ה- PCB מ- JLCPCB, אתה זקוק ל- Gerber File. כדי להוריד קבצי גרבר של ה- PCB שלך פשוט לחץ על הלחצן צור קובץ ייצור בדף העורך של EasyEDA ואז הורד את קובץ הגרבר משם או לחץ על הזמנה ב- JLCPCB כמוצג בתמונה למטה. פעולה זו תפנה אותך אל JLCPCB.com, שם תוכל לבחור את מספר PCB שאתה רוצה להזמין, כמה שכבות נחושת אתה צריך, עובי PCB, משקל נחושת ואפילו צבע PCB, כמו תמונת המצב המוצגת להלן:
לאחר שבחרת את כל האפשרויות, לחץ על "שמור לעגלה" ואז תועבר לדף בו תוכל להעלות את קובץ הגרבר שלך שהורדנו מ- EasyEDA. העלה את קובץ הגרבר שלך ולחץ על "שמור לעגלה". ולבסוף לחץ על Checkout בצורה מאובטחת כדי להשלים את ההזמנה שלך, ואז תקבל את לוחות ה- PCB שלך כעבור כמה ימים. הם מייצרים את ה- PCB בקצב נמוך מאוד שהוא 2 $. זמן הבנייה שלהם הוא גם פחות, כלומר 48 שעות עם אספקת DHL של 3-5 ימים, בעיקרון תקבלו את ה- PCB שלכם תוך שבוע מרגע ההזמנה.
לאחר הזמנת ה- PCB, תוכל לבדוק את התקדמות הייצור של ה- PCB שלך עם תאריך ושעה. אתה בודק את זה על ידי מעבר לדף חשבון ולחץ על "התקדמות הייצור".
לאחר מספר ימים של הזמנת PCB קיבלתי את דגימות ה- PCB באריזה יפה כפי שמוצג בתמונות למטה.
ואחרי שקיבלתי את החלקים האלה הלחמתי את כל הרכיבים הנדרשים על גבי PCB. הלחמתי ישירות את ה- POT ישירות במקום להשתמש בחוטי חיבור מכיוון שחוטי הנקבה לנקבה שבהם השתמשתי בהתחלה שם נתנו מתח יציאה אנלוגי מוזר כנראה בגלל מגעים רופפים. לאחר שכל הרכיבים הורכבו, ה- PCB שלי נראה בערך כך.
אולי שמתם לב שיש רק 7805 אחד בלוח זה. הסיבה לכך היא שבתחילה חשבתי שאוכל לברוח רק עם הרגולטור להפעלת PIC וגם מנוע סרוו, ומאוחר יותר הבנתי שאני צריך שניים. אז השתמשתי במעגל חיצוני להפעלת מנועי הסרוו דרך החוטים הירוקים שאתה רואה כאן.
אף על פי כן אינך צריך לדאוג הרבה מכך משום; ביצעתי את השינויים ב- PCB כעת. אתה יכול להשתמש ב- PCB המתוקן ולהלחין את שני הווסתים שעל הסיפון עצמו.
עבודה של PIC זרוע רובוטית
אחרי כל העבודה המעייפת הגיע הזמן להשתלם. הלחמו את כל הרכיבים על הלוח והעלו את התוכנית לבקר ה- PIC. הקוד השלם ניתן למטה או ניתן להוריד אותו מכאן. מחבר התכנות המסופק על הלוח אמור לעזור לכם להעלות את התוכנית ישירות באמצעות Pickit 3 ללא טרחה רבה. לאחר העלאת התוכנית אתה אמור לראות את LCD המציג את סרוו הנמצא בשליטה כרגע. למידע נוסף על תכנות ה- PIC Microcontroller, פשוט עקוב אחר המדריך הקודם.
משם תוכלו פשוט לסובב את הסיר ולבדוק כיצד מנועי הסרוו מגיבים לכל פוטנציומטר. ברגע שאתה מבין את הפורמט אתה יכול לשלוט בזרוע הרובוטית כדי לבצע את כל הפעולות שאתה צריך כדי לבצע וליהנות. תוכלו למצוא את העבודה המלאה של הפרויקט בסרטון המקושר למטה.
זה החבר'ה מקווים שהבנתם את הפרויקט ולמדתם ממנו משהו חדש. אם יש לך שאלות השאיר אותן בסעיף ההערות או השתמש בפורומים לדיונים טכניים אחרים.