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

פתרון שלם סיבובי Arduino: 5 שלבים
פתרון שלם סיבובי Arduino: 5 שלבים

וִידֵאוֹ: פתרון שלם סיבובי Arduino: 5 שלבים

וִידֵאוֹ: פתרון שלם סיבובי Arduino: 5 שלבים
וִידֵאוֹ: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, נוֹבֶמבֶּר
Anonim
פתרון שלם סיבובי Arduino
פתרון שלם סיבובי Arduino

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

ישנם אינספור מאמרים אודות פרטי העבודה ומצבי השימוש של מקודדים רוטרי, וקודי דוגמה וספריות רבות על אופן השימוש בהם. הבעיה היחידה היא שאף אחד מהם לא עובד במדויק ב -100% עם טווח המחירים הנמוך ביותר של מודולים סיבוביים סיניים.

שלב 1: מקודדים רוטרי בפנים

מקודדים רוטרי בפנים
מקודדים רוטרי בפנים
מקודדים רוטרי בפנים
מקודדים רוטרי בפנים
מקודדים רוטרי בפנים
מקודדים רוטרי בפנים

החלק הסיבובי של המקודד כולל שלושה סיכות (ועוד שניים לחלק המתג האופציונלי). האחד הוא נקודה משותפת (GND שחור), השניים האחרים נועדו לקביעת כיוון כאשר הכפתור מסתובב (הם נקראים לעתים קרובות CLK כחול ו- DT אדום). שני אלה מחוברים לסיכת קלט PULLUP של המיקרו -בקר, מה שהופך את הרמה HIGH לקריאת ברירת המחדל שלהם. כאשר הכפתור מופנה קדימה (או עם כיוון השעון), תחילה CLK הכחול יורד לרמה נמוכה, ואז DT אדום עוקב. אם מתקדמים הלאה, CLK הכחול עולה בחזרה ל- HIGH, ואז כאשר תיקון ה- GND הנפוץ עוזב את שני סיכות החיבור, ה- DT האדום עולה גם הוא ל- HIGH. ובכך משלימים סימן FWD מלא אחד (או עם כיוון השעון). כך גם בכיוון BWD השני (או נגד כיוון השעון), אך כעת אדום נופל ראשון, וכחול עולה אחורה אחורה כפי שמוצג בשתי התמונות ברמה בהתאמה.

שלב 2: אומללות שגורמת לרבים כאב אמיתי

סבל שגורם לרבים כאב אמיתי
סבל שגורם לרבים כאב אמיתי
סבל שגורם לרבים כאב אמיתי
סבל שגורם לרבים כאב אמיתי
סבל שגורם לרבים כאב אמיתי
סבל שגורם לרבים כאב אמיתי

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

שלב 3: פתרון מכונת מדינה סופית (FSM)

פתרון Finite State Machine (FSM)
פתרון Finite State Machine (FSM)

התמונה מציגה את מרחב המצב המלא של שינויי הרמה האפשריים עבור שני הסיכות (כחול CLK ואדום DT), הן עבור הקפצות נכונות ושקריות. בהתבסס על מכשיר מצב זה ניתן לתכנת פתרון מלא שתמיד עובד במדויק במאת האחוזים. מכיוון שאין צורך בעיכובי סינון בפתרון זה, הוא גם המהיר ביותר האפשרי. יתרון נוסף בהפרדת שטח המצב של הסיכות ממצב העבודה הוא שאפשר ליישם מצבי סקר או להפריע כרצונו. סקרים או הפרעות יכולים לזהות שינויי רמות בסיכות ושגרה נפרדת תחשב את המצב החדש על סמך המצב הנוכחי ואירועים בפועל של שינויי רמות.

שלב 4: קוד ארדואינו

קוד ארדואינו
קוד ארדואינו

הקוד שלהלן סופר את קרציות FWD ו- BWD על הצג הטורי ומשלב גם את פונקציית המתג האופציונלית.

// פיטר צ'סורגיי 2019-04-10

// סיכות של המיפוי הרוטרי ליציאות Arduino

#הגדר SW 21 #הגדר CLK 22 #הגדר DT 23

// הערך הנוכחי והקודם של המונה מכוונן על ידי הסיבוב

int curVal = 0; int prevVal = 0;

// שבע מצבים של FSM (מכונת מצב סופית)

#הגדר IDLE_11 0 #הגדר SCLK_01 1 #הגדר SCLK_00 2 #הגדר SCLK_10 3 #הגדר SDT_10 4 #הגדר SDT_00 5 #הגדר SDT_01 6 int state = IDLE_11;

הגדרת בטל () {

Serial.begin (250000); Serial.println ("התחל …"); // רמה גבוהה תהיה ברירת המחדל עבור כל הסיכות pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // הן CLK והן DT יפעילו הפרעות לכל שינויי הרמה attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

לולאת חלל () {

// טיפול במתג האופציונלי המשולב בכמה מקודדים סיבוביים אם (digitalRead (SW) == LOW) {Serial.println ("לחץ"); בעוד (! digitalRead (SW)); } // כל שינוי בערך הנגדי מוצג ב- Serial Monitor אם (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// מעברי מכונת מדינה לשינויים ברמת CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; אחרת אם (מצב == SCLK_10) מצב = SCLK_00; אחרת אם (מצב == SDT_10) מצב = SDT_00; } אחר {if (state == SCLK_01) state = IDLE_11; אחרת אם (מצב == SCLK_00) מצב = SCLK_10; אחרת אם (מצב == SDT_00) מצב = SDT_10; אחרת אם (state == SDT_01) {state = IDLE_11; curVal--; }}}

// מעברי מכונת מדינה לשינויים ברמת DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; אחרת אם (מצב == SDT_01) מצב = SDT_00; אחרת אם (מצב == SCLK_01) מצב = SCLK_00; } אחר {if (state == SDT_10) state = IDLE_11; אחרת אם (מצב == SDT_00) מצב = SDT_01; אחרת אם (מצב == SCLK_00) מצב = SCLK_01; אחרת אם (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

שלב 5: אינטגרציה ללא רבב

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

מוּמלָץ: