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

הבנת ערבוב ערוצים: 4 שלבים (עם תמונות)
הבנת ערבוב ערוצים: 4 שלבים (עם תמונות)

וִידֵאוֹ: הבנת ערבוב ערוצים: 4 שלבים (עם תמונות)

וִידֵאוֹ: הבנת ערבוב ערוצים: 4 שלבים (עם תמונות)
וִידֵאוֹ: אסתי לומדת על מיניות גברית | אסתי בשטח 2024, נוֹבֶמבֶּר
Anonim
Image
Image
שיטת המיקס »אין
שיטת המיקס »אין

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

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

אם תפתח ג'ויסטיק, בדרך כלל תראה שני פוטנציומטרים בפנים. האחד למדוד את המיקום הנוכחי שלך לאורך ציר Y (למעלה ולמטה), והשני למדידת המקום בו אתה נמצא לאורך ציר ה- X (מצד לצד).

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

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

בואו נסתכל על כמה גישות ערבוב שונות.

שלב 1: שיטת ערבוב »אין

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

לדוגמה, אם אתה דוחף את הג'ויסטיק כל הדרך ישר קדימה, ציר ה- Y הוא במצערת מלאה וציר ה- X הוא 0. כך שהיית נוסע במעגלים במקום ללכת ישר.

שלב 2: שיטת שיטה »סובב

שיטת שיטה »סובב
שיטת שיטה »סובב

עמית לעבודה ציין לי פעם שבצביטה אתה יכול לסובב את המשדר שלך 45 מעלות לתערובת של עני. אם אתה חושב שהערכים משני הפוטנציומטרים בג'ויסטיק הם ציר x y על רשת (כאשר שני הצירים משתרעים על -100 עד +100) זה מאוד הגיוני מכיוון שאתה הולך +100 על שני הצירים כשאתה דוחף את הג'ויסטיק למעלה וימינה. אז אם זה ממפה ישירות לשני ערוצי השלדה שלך (הצד השמאלי והימני של הרובוט שלך) זה יגרום לרובוט שלך להתקדם.

אז שיטת הערבוב הראשונה שניסיתי אי פעם הייתה לסובב מתמטית את התיאום x ו- y 45 מעלות בערך בנקודת המרכז של הרשת.

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

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

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

בואו נסתכל על כמה דוגמאות קוד.

הערות אודות דוגמאות הקוד שלי: אני משאיר כיצד אתה מקבל את ערכי joystick_x ו- joystick_y כפי שהוא ישתנה בהתאם לפרויקט שלך. כמו כן, אני אמפה/מגביל ל ± 100 אבל סביר להניח שתצטרך למפות ל- 1000 - 2000 עבור PWM או 0 - 255 עבור פלט אנלוגי וכו '. אני תמיד מגביל … רק במקרה.

דוגמה של ארדואינו:

// לסובב מתמטית

rad כפול = -45*M_PI/180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad); int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

דוגמת JavaScript:

// מתמטית rotatevar rad = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad); rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // עוזר functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

שלב 3: שיטת שיטה »פשוטה

שיטת שיטה »פשוטה
שיטת שיטה »פשוטה

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

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

ודרך אגב אני לא קורא לזה פשוט בגנאי … יש יופי בפשטות.

דוגמה של ארדואינו:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

דוגמת JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // constrain leftChannel = constrain (leftChannel, -100, 100); rightChannel = constrain (rightChannel, -100, 100); // עוזר functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

שלב 4: שיטת שיטה »פרופורציונלית

שיטת שיטה »מידתית
שיטת שיטה »מידתית

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

בסופו של דבר אתה מגיע לסולם של -200 עד +200 לכל הכיוונים בדוגמאות שלי אני ממפה את זה ל ± 100 כי זה מייצג את אחוז הכוח המגיע לכל ערוץ - אולם תרצה למפות אותו לכל מה שעושה שימוש- מארז לבקר המנוע שלך. לדוגמה, אם אתה שולח אות PWM, תוכל למפות אותו ל- 1000 עד 2000 או אם אתה שולח אות אנלוגי, תוכל למפות אותו ל- 0-255 ולהגדיר את הכיוון כבולאני וכו '.

דוגמה של ארדואינו:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // במקרים מסוימים המקסימום הוא 100, במקרים מסוימים הוא 200 // בואו נחשב את ההפרש כך שהמקסימום הוא תמיד 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // מפה מ ± 200 עד ± 100 או כל טווח שאתה צריך leftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

דוגמת JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // במקרים מסוימים המקסימום הוא 100, במקרים מסוימים הוא 200, // בואו נחשב את ההפרש כך שהמקסימום הוא תמיד 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // מפה מ ± 200 אחורה עד ± 100 או כל מה שאתה צריך leftThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // כמה פונקציות עוזר var constrain = function (num, min, max) {return Math.min (Math. מקסימום (מספר, דקות), מקסימום); }; var map = function (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; inMin = inMin + inMax; num = num + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); mapped = outSpan*(p/100) - (outMax/2); החזר ממופה;};

מוּמלָץ: