עבור לתוכן

צריך עזרה בקוד

Featured Replies

פורסם

היי,

אני בונה רובוט HEXAPOD כעבודת גמר שלי במגמה שלי

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

הבעיה היא כזאת:

המפסק של הרובוט הוא שלט אינפרא אדום, מתי שאני לוחץ על כפתור מסויים הרובוט מתחיל לפעול

ומתי שאני לוחץ על כפתור אחר הרובוט עוצר.

הבעיה היא שאני לא יודע מה צריך לרשום בקוד בשביל שהרובוט יעצור ולא יעשה כלום, במצב Stand by

הינה הקוד:

http://pastebin.com/VHsujr40

(לא הצלחתי לשים אותו באתר :facepalm: )

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

ולד 3 יתכבה, ומתי שיתקבל הערך 16736925 הלד ידלק, מה שהתכוונתי לעשות הוא שרק הלד ידלק אבל הבעיה שגם הלד נדלק וגם התוכנית כולה

מה אני צריך לרשום אחרי השורה

if( results.value == 16736925)

בשביל שהרובוט לא יעשה כלום ויכנס לSTANDBY?

תודה מראש :xyxthumbs:

פורסם

אתה יכול לשים את ערך הכיבוי במשתנה ואז עם לולאת WHILE

לחכות

while results.value = 16736925

delay(1)

פורסם
  • מחבר

תודה על התגובה.

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

זה יכול להיות 10 שניות או אפילו 5 דקות, אז אני לא ממש יכול להשתמש בפקודה DELAY

פורסם

זה לא חשוב הזמן של הדיליי

שמור את הערך האחרון מהשלט במשתנה ועד שהוא לא יהיה מספר אחר המעבד תמיד יהיה בלולאה של ההשהייה

עכשיו שאני חושב על זה צריך להוסיף קריאה של השלט.

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

פורסם
  • מחבר

זה לא חשוב הזמן של הדיליי

שמור את הערך האחרון מהשלט במשתנה ועד שהוא לא יהיה מספר אחר המעבד תמיד יהיה בלולאה של ההשהייה

עכשיו שאני חושב על זה צריך להוסיף קריאה של השלט.

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

אוקי אז זה מה שקרה

שמתי את הקטע קוד שהבאת לי בתוכנית, שמתי את הערך שעוצר את הרובוט וזה עצר את הרובוט,

הבעיה שאחרי שהוא מקבל את ערך כלשהו הוא פשוט ננעל עליו ואני לא יכול לעשות כלום,

והבעיה השנייה היא שאני די נוב בתכנות (מאוד נוב :-X )

אז אם תוכל לכתוב לי עוד שורת קוד של מה שהתכוונת זה יוכל מאוד לעזור לי :)

פורסם

טוב , אני אוסיף לך שורות על בסיס הקוד שהעלת .

אבל זה יקרה מאוחר יותר .

פורסם
  • מחבר

טוב , אני אוסיף לך שורות על בסיס הקוד שהעלת .

אבל זה יקרה מאוחר יותר .

תודה

פורסם

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

לעניין (ההדבק פה לא ממש מסדר את המשפט אז מקווה שתבין) :

void loop() {

while (irrecv.decode(&results)){

long int decCode = results.value;

long duration, distance;

Serial.println(decCode);

if results.value ==

16736925

digitalWrite(led3,HIGH)

break;

if( results.value == 16753245)

irrecv.resume();

digitalWrite(led3,LOW);

ולמה בסוף צריך להוסיף איזה לולאת ELSE מה קורה אם לוחצים בשלט על לחצן שאינו מוגדר (אם אתה רוצה להתיחס לזה דולק \ כבוי )

עריכה :

אולי בכלל הייתי מחליף את הלוגיקה למקרים של CASE ולא כפי שעשית עם IF

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

פורסם
  • מחבר

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

לעניין (ההדבק פה לא ממש מסדר את המשפט אז מקווה שתבין) :

void loop() {

while (irrecv.decode(&results)){

long int decCode = results.value;

long duration, distance;

Serial.println(decCode);

if results.value ==

16736925

digitalWrite(led3,HIGH)

break;

if( results.value == 16753245)

irrecv.resume();

digitalWrite(led3,LOW);

ולמה בסוף צריך להוסיף איזה לולאת ELSE מה קורה אם לוחצים בשלט על לחצן שאינו מוגדר (אם אתה רוצה להתיחס לזה דולק \ כבוי )

עריכה :

אולי בכלל הייתי מחליף את הלוגיקה למקרים של CASE ולא כפי שעשית עם IF

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

רעיון טוב, אני ינסה לעשות אותו ויעדכן

פורסם

תעדכן .

הערה ,

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

פורסם

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

(הרבה יותר פשוט ממה שזה נישמע) תריץ חיפוש על arduino interrupt

פורסם
  • מחבר

ניסיתי הכל וללא הצלחה :'( (או שהתכנית לא עוצרת, או שהיא לא מגיבה)

העיבה היא שמתי שאני רוצה לעצור את התוכנית, היא נעצרת ל2 שניות ואז נכנסת לIF בתוכנית הראשית פעם אחת, מתי שהמרחק פחות מ20

http://pastebin.com/xxyzc1EF

ואז חוזרת לתוכנית פעולה הרגילה וממשיכה איתה.

למשל תוכנית שעכשיו עשיתי שאמורה לעצור ע"י INTERRUPT את הפעולה ולאפס את הערך שהתקבל:

http://pastebin.com/6JMzJ7Tw

אבל זה עושה את אותה הפעולה שרשמתי למעלה.

האם יש איזה פקודה שמאפסת הכל ואומרת לבקר לחזור לנקודה ההתחלתית? כמו RESET אבל בתוכנה?

פורסם

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

עכשיו ככה , שאלות בכדי להבין ולנסות לעזור.

כאשר אתה לוחץ על מקש הכיבוי , הרובוט מזזה ועוצר , נכון ?

כשאר אתה עוזב את מקש הכיבוי (או לאחר זמן קצר ) הרובוט חוזר לעבוד ?

מה קורה למשתנה שלך שלא משתמשים בשלט ( כלומר לחצתי על כיבוי ואז לא לחצתי יותר על כלום ) ?

מה הערך שמתקבל מקורא ה IR במקרה שכזה ?

לאיפה אני חותר ....

אם תזהה לחיצה על כיבוי (כפי שאתה מזהה)

תכניס ערך למשתנה נניח SHUTDOWN=1

ואז לולאה WHILE SHUTDOWN==1 ואז בודקת רק את ערך ה IR ורק כאשר יש ערך להדלקה(כלומר התקבלה קריאה מהחיישן שמתאימה לערך שאתה רוצה) מעדכנת את המשתנה SHUTDOWN ל 0 ומוציאה אותך מהלולאה של העצירה .

פורסם
  • מחבר

אני ישים הערות מחר ואנסה שוב כמה דברים

בקשר לשאלות שלך:

1.באחת מהתוכניות שעשיתי הוא אכן עצר מתי שלחצי על המקש כיבוי, כאשר השתמשתי בINTERRUPT עם דיליי גדול

2.באותה תוכנית כן, בתוכניות אחרת לא פשוט לא היה מגיב לאחר קבלת ערך ראשון.

3.המתשנה מקבל את הערך הראשון שהוא קולט ואז אם לא מאפסים אותו על ידי פקודת RESUME הוא נשאר על אותו הערך וללא אפשרות שינוי

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

הבעיה היא שבסיפרייה של הIR רשום שאני חייב לאפס את הערך שיש בRESULT.VALUE ורק אז לסרוק קוד חדש

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

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

היום הציעו לי רעיון שאני לא ידוע בדיוק איך אפשר לממש אותו C אבל הרעיון הוא כזה:

בסוף כל לולאה לאפס ולסרוק ערך מהשלט, אם לא התקבל שום ערך אז להחזיר את הערך הקודם ולהמשיך בלולאה

אם התקבל ערך חדש לעבור ללולאה של הערך שהתקבל

תודה על העזרה דרך אגב :)

פורסם

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים