מכשירי קלט ממלאים תפקיד חיוני בכל פרויקטים אלקטרוניים. התקני קלט אלה עוזרים למשתמש לקיים אינטראקציה עם העולם הדיגיטלי. התקן קלט יכול להיות פשוט כמו לחצן לחיצה או מסובך כמו מסך מגע; זה משתנה בהתאם לדרישת הפרויקט. במדריך זה אנו נלמד כיצד לממשק ג'ויסטיק עם מיקרו-בקר PIC שלנו, ג'ויסטיק הוא דרך מגניבה לקיים אינטראקציה עם העולם הדיגיטלי וכמעט כולם היו משתמשים במשחקי וידיאו בגיל ההתבגרות שלהם.
נראה שג'ויסטיק הוא מכשיר מתוחכם, אך למעשה מדובר רק בשילוב של שני פוטנציומטרים ולחצן כפתור. לפיכך קל מאוד להתממשק לכל MCU בתנאי שנדע להשתמש בתכונת ADC של אותו MCU. למדנו כבר כיצד להשתמש ב- ADC עם PIC, ולכן זוהי רק עבודה לממשק הג'ויסטיק. לאנשים חדשים בפיקיט מומלץ ללמוד את פרויקט ה- ADC הנ"ל וכן את פרויקט רצף המהבהב לד כדי להקל על הבנת הפרויקט.
חומר נדרש
- PicKit 3 לתכנות
- מודול ג'וי סטיק
- PIC16F877A IC
- 40 - מחזיק סיכת סיכה
- לוח Perf
- 20 מגה הרץ קריסטל OSC
- סיכות ברגסטיק
- נגד 220ohm
- 5 נוריות LED בכל צבע
- 1 ערכת הלחמה
- IC 7805
- מתאם 12 וולט
- חוטי חיבור
- קרש לחם
הבנת מודול הג'ויסטיק:
ג'ויסטיקים זמינים בצורות ובגדלים שונים. מודול ג'ויסטיק טיפוסי מוצג באיור למטה. ג'ויסטיק הוא לא יותר מכמה פוטנציומטרים ולחיצת כפתור המותקנים מעל סידור מכני חכם. הפוטנציומטר משמש לעקוב אחר תנועת ה- X וה- Y של הג'ויסטיק והלחצן משמש כדי לחוש אם לוחצים על הג'ויסטיק. שני הפוטנציומטרים מוציאים מתח אנלוגי שתלוי במיקום הג'ויסטיק. ונוכל לקבל את כיוון התנועה על ידי פירוש שינויי המתח הללו באמצעות מיקרו-בקר כלשהו. בעבר התממשקנו ג'ויסטיק עם AVR, ג'ויסטיק עם Arduino ו- Raspberry Pi.
לפני שמתממשקים כל חיישן או מודול למיקרו-בקר חשוב לדעת כיצד הוא מתפקד. כאן יש לג'ויסטיק 5 פינים יציאה מתוכם שניים מיועדים להספק ושלושה מיועדים לנתונים. על המודול להיות מופעל באמצעות + 5 וולט. סיכות הנתונים נקראות בשם VRX, VRY ו- SW.
המונח "VRX" מייצג מתח משתנה בציר ה- X והמונח "VRY" מייצג מתח משתנה בציר Y ו- "SW" מייצג מתג.
לכן כאשר אנו מעבירים את הג'ויסטיק שמאלה או ימינה ערך המתח ב- VRX ישתנה וכאשר נשנה אותו למעלה או למטה VRY ישתנה. באופן דומה כאשר אנו מזיזים אותו באלכסון שנינו VRX ו- VRY ישתנו. כשאנחנו לוחצים על המתג סיכת ה- SW תחובר לקרקע. האיור שלהלן יעזור לך להבין את ערכי התפוקה הרבה יותר טוב
תרשים מעגל:
עכשיו, כשאנחנו יודעים איך עובד המקל ג'וי, נוכל להגיע למסקנה שנצטרך שני סיכות ADC וסיכה כניסה דיגיטלית אחת כדי לקרוא את כל שלושת סיכות הנתונים של מודול הג'ויסטיק. תרשים המעגל השלם מוצג בתמונה למטה
כפי שניתן לראות בתרשים המעגל, במקום הג'ויסטיק השתמשנו בשני פוטנציומטר RV1 ו- RV3 ככניסות מתח אנלוגיות וכניסה לוגית למתג. אתה יכול לעקוב אחר התוויות הכתובות בצבע סגול כדי להתאים את שמות הסיכות וליצור את החיבורים שלך בהתאם.
שים לב שהסיכות האנלוגיות מחוברות לערוצים A0 ו- A1 והמתג הדיגיטלי מחובר ל- RB0. יהיו לנו גם 5 נורות LED מחוברות כפלט, כך שנוכל להדליק אחת בהתבסס על כיוון הזזת הג'ויסטיק. אז סיכות פלט אלה מחוברות ל- PORT C מ- RC0 ל- RC4. לאחר שסיננו את דיאגרמת המעגל שלנו נוכל להמשיך בתכנות, ואז לדמות את התוכנית במעגל זה ואז לבנות את המעגל על קרש לחם ואז להעלות את התוכנית לחומרה. כדי לתת לך מושג החומרה שלי לאחר ביצוע החיבורים לעיל מוצגת למטה
תכנות לממשק הג'ויסטיק:
תוכנית לממשק ג'ויסטיק עם PIC הוא פשוט ישר קדימה. אנו כבר יודעים לאילו פינים מחובר הג'ויסטיק ומה תפקידם, לכן עלינו פשוט לקרוא את המתח האנלוגי מהפינים ולשלוט על נוריות הפלט בהתאם.
התוכנית המלאה לשם כך ניתנת בסוף מסמך זה, אך לצורך הסבר על הדברים אני מפר את הקוד לקטעי משמעות משמעותיים בהמשך.
כמו תמיד התוכנית מופעלת על ידי הגדרת סיביות התצורה, אנחנו לא מתכוונים לדון הרבה בקביעת סיביות תצורה מכיוון שכבר למדנו אותה בפרויקט LED Blinking וזהה גם עבור פרויקט זה. לאחר הגדרת סיביות התצורה עלינו להגדיר את פונקציות ה- ADC לשימוש במודול ה- ADC ב- PIC שלנו. פונקציות אלו נלמדו גם כיצד להשתמש ב- ADC עם מדריך PIC. לאחר מכן, עלינו להכריז אילו פינים הם כניסות ואילו פינים של פלט. כאן ה- LED מחובר ל- PORTC כך שהם פינים פלט וסיכת המתג של ג'ויסטיק היא סיכת כניסה דיגיטלית. לכן אנו משתמשים בשורות הבאות כדי להכריז על אותו דבר:
// ***** תצורת קלט / פלט **** // TRISC = 0X00; // פורט C משמש כיציאות פלט PORTC = 0X00; // השתמש בכל הפינים נמוך TRISB0 = 1; // RB0 משמש כקלט // *** סוף תצורת קלט / פלט ** ///
אין להגדיר את סיכות ה- ADC כסיכות קלט מכיוון שבשימוש בפונקציית ADC יוקצה כסיכת קלט. לאחר הגדרת הפינים, אנו יכולים לקרוא לפונקציה ADC_initialize שהגדרנו קודם. פונקציה זו תקבע את רישומי ה- ADC הנדרשים ותכין את מודול ה- ADC.
ADC_Initialize (); // הגדר את מודול ה- ADC
עכשיו, אנחנו צעד לתוך האינסוף שלנו בעוד לולאה. בתוך הלולאה הזו עלינו לפקח על הערכים של VRX, VRY ו- SW ועל סמך הערכים יש לנו לשלוט על תפוקת ה- LED. אנו יכולים להתחיל את תהליך הניטור על ידי קריאת המתח האנלוגי של VRX ו- VRY על ידי שימוש בשורות הבאות
int joy_X = (ADC_Read (0)); // קרא את ציר ה- X של הג'ויסטיק int joy_Y = (ADC_Read (1)); // קרא את ציר ה- Y של הג'ויסטיק
שורה זו תחסוך את הערך של VRX ו- VRY במשתנה joy_X ו- joy_Y בהתאמה. הפונקציה ADC_Read (0) פירושה שאנחנו קוראים את ערך ADC מערוץ 0 שהוא סיכה A0. חיברנו את VRX ו- VRY לסיכה A0 ו- A1 וכך קראנו מ- 0 ו- 1.
אם אתה יכול להיזכר בהדרכת ה- ADC שלנו אנו יודעים שאנו קוראים את המתח האנלוגי שה- PIC שהוא מכשיר דיגיטלי יקרא אותו בין 0 ל -1023. ערך זה תלוי במיקום של מודול הג'ויסטיק. אתה יכול להשתמש בתרשים התווית לעיל כדי לדעת לאיזה ערך אתה יכול לצפות לכל מיקום של הג'ויסטיק.
כאן השתמשתי בערך הגבול של 200 כגבול תחתון וערך של 800 כגבול עליון. אתה יכול להשתמש בכל מה שאתה רוצה. אז בואו נשתמש בערכים אלה ונתחיל להדליק את נוריות ה- LED בהתאם. לשם כך עלינו להשוות את הערך של joy_X לערכים שהוגדרו מראש באמצעות לולאת IF ולהפוך את סיכות LED גבוהות או נמוכות כפי שמוצג להלן. שורות ההערות יעזרו לך להבין טוב יותר
אם (joy_X <200) // שמחה עלתה {RC0 = 0; RC1 = 1;} // זוהר LED עליון אחר אם (joy_X> 800) // שמחה עברה למטה {RC0 = 1; RC1 = 0;} // זוהר LED נמוך אחר // אם לא מועבר {RC0 = 0; RC1 = 0;} // כבה את שני המוליכות
אנו יכולים לעשות את אותו הדבר גם עבור הערך של ציר Y. עלינו רק להחליף את המשתנה joy_X ב- joy_Y וגם לשלוט בשני הפינים הבאים של ה- LED כפי שמוצג להלן. שים לב שכשהג'ויסטיק אינו זז אנו מכבים את שתי נורות ה- LED.
אם (joy_Y <200) // Joy עבר שמאלה {RC2 = 0; RC3 = 1;} // זוהר שמאל LED אחר אם (joy_Y> 800) // שמחה הועברה ימינה {RC2 = 1; RC3 = 0;} // נורית זוהר ימינה אחרת // אם לא מועברת {RC2 = 0; RC3 = 0;} // כבה את שני הנוריות
עכשיו יש לנו עוד דבר אחרון לעשות, עלינו לבדוק את המתג אם לוחצים עליו. סיכת המתג מחוברת ל- RB0 כך שנוכל להשתמש שוב אם לולאה ולבדוק אם היא פועלת. אם לוחצים עליו נדליק את ה- LED כדי לציין שהמתג נלחץ.
אם (RB0 == 1) // אם לחצו על Joy RC4 = 1; // זוהר LED באמצע אחר RC4 = 0; // כיבוי נורית LED
תצוגת סימולציה:
ניתן לדמות את הפרויקט השלם באמצעות תוכנת Proteus. לאחר שכתבת את התוכנית הידור את הקוד וקשר את קוד ה- hex של הסימולציה למעגל. אז אתה צריך להבחין בנורות ה- LED הזוהרות בהתאם למיקום הפוטנציומטרים. הסימולציה מוצגת להלן:
חומרה ועבודה:
לאחר אימות הקוד באמצעות הסימולציה, נוכל לבנות את המעגל על לוח לחם. אם עקבת אחר מדריכי PIC היית שם לב שאנו משתמשים באותו לוח פרפ שיש בו הלחמה במעגל PIC ובמעגל 7805. אם אתה מעוניין גם להכין אחד כזה שתשתמש בו עם כל פרויקטי ה- PIC שלך, ואז הלחם את המעגל על לוח מושלם. או שאתה יכול גם לבנות את המעגל השלם גם על קרש לחם. לאחר סיום החומרה זה יהיה משהו כזה למטה.
כעת העלה את הקוד למיקרו-בקר PIC באמצעות ה- PICkit3. אתה יכול להפנות את פרויקט LED Blink להדרכה. עליכם להבחין באור הצהוב הולך גבוה ברגע העלאת התוכנית. כעת השתמשו בג'ויסטיק ושנו את הכפתור, לכל כיוון הג'ויסטיק תוכלו להבחין בנורת LED המתאימה גבוהה. כאשר לוחצים על המתג באמצע הוא יכבה את נורית ה- LED באמצע.
עבודה זו היא רק דוגמה, ניתן לבנות עליה הרבה פרויקטים מעניינים. את העבודה המלאה של הפרויקט ניתן למצוא גם בסרטון המופיע בסוף עמוד זה.
מקווה שהבנתם את הפרויקט ונהניתם לבנות אותו, אם יש לכם בעיה בכך אתם מוזמנים לפרסם אותו בסעיף ההערות למטה או לכתוב אותו בפורומים לקבלת עזרה.