תוכן עניינים:
- שלב 1: אסוף את החומרים שלך
- שלב 2: הורד את ארגזי הכלים של Roomba עבור MATLAB
- שלב 3: התחבר ל- Roomba שלך
- שלב 4: בחר כיצד ברצונך לשלוט ב- Roomba שלך
- שלב 5: נהג ב- Roomba שלך
וִידֵאוֹ: הפיכת הרומבה שלך למאדים רובר: 5 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:12
שלב 1: אסוף את החומרים שלך
על מנת להשלים פרויקט זה, יהיה עליך לאסוף את החומרים הבאים:
רובוט 1 Roomba
1 ערכת פטל פטל
מצלמת וידאו אחת
גישה ל- MATLAB
שלב 2: הורד את ארגזי הכלים של Roomba עבור MATLAB
הפעל את הקוד הבא על מנת להתקין את ארגזי הכלים הדרושים להשלמת פרויקט זה.
חדר פונקציות התקנת
clc;
רשימת קבצים % להתקנה
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% מיקום להתקנה
options = weboptions ('CertificateFilename', ''); % אמרו לו להתעלם מדרישות התעודה
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'התקנת/עדכון Roomba';
מטרת תצוגה % וקבל אישור
הנחיה = {
'תוכנית זו תוריד את קבצי EF 230 Roomba הבאים:'
''
strjoin (קבצים, '')
''
'לתיקיה זו:'
''
CD
''
'האם אתה רוצה להמשיך? '
};
ביפ;
yn = questdlg (הנחיה, …
dlgTitle,…
'כן', 'לא', 'כן');
אם ~ strcmp (yn, 'כן'), חזור; סוֹף
% get רשימת הקבצים הקיימים
הקיימים_קבצים = קבצים (cellfun (@exist, קבצים)> 0);
אם ~ הוא ריק (קיים_קבצים)
ודא שזה באמת בסדר להחליף אותם
prompt = {'אתה מחליף את הקבצים האלה:'
''
strjoin (קיים_קבצים, '')
''
'בסדר להחליף?'
};
ביפ;
yn = questdlg (הנחיה, …
dlgTitle,…
'כן', 'לא', 'כן');
אם ~ strcmp (yn, 'כן'), חזור; סוֹף
סוֹף
הורד את הקבצים %
cnt = 0;
עבור i = 1: אורך (קבצים)
f = קבצים {i};
disp (['הורדה' ו]);
לְנַסוֹת
url = [שרת f];
websave (f, url, אופציות); % נוספו אפשרויות למניעת טעויות אבטחה
cnt = cnt + 1;
לתפוס
disp (['שגיאה בהורדה' f]);
דמה = [f '.html'];
אם קיים (דמה, 'קובץ') == 2
מחק (דמה)
סוֹף
סוֹף
סוֹף
אם cnt == אורך (קבצים)
msg = 'ההתקנה הצליחה';
waitfor (msgbox (msg, dlgTitle));
אַחֵר
msg = 'שגיאת התקנה - ראה חלון פקודה לפרטים';
waitfor (errordlg (msg, dlgTitle));
סוֹף
סוף %roombaInstall
שלב 3: התחבר ל- Roomba שלך
עכשיו הגיע הזמן להתחבר לרומבה שלך באמצעות WiFi. באמצעות 2 אצבעות, לחץ על לחצני העגינה והנקודה בו זמנית כדי להפעיל או לאפס את Roomba שלך. לאחר מכן, הפעל את הקוד r = roomba (# של Roomba שלך) בחלון הפקודה של MATLAB כדי להתחבר לרובוט שלך. לאחר שתבצע את הפקודה הזו, Roomba שלך אמור להיות מוכן לצאת לדרך.
שלב 4: בחר כיצד ברצונך לשלוט ב- Roomba שלך
ישנן שתי דרכים בהן אתה יכול לשלוט ב- Roomba שלך: באופן אוטונומי או שימוש בסמארטפון כבקר.
אם תבחר לנהוג ברומבה באופן אוטונומי, יהיה עליך להשתמש בשלושה חיישנים מובנים: חיישני צוק, חיישני בליטה וחיישני אור.
על מנת להשתמש בסמארטפון, תחילה עליך לחבר את הטלפון החכם למחשב על ידי ביצוע השלבים הבאים.
הערה: המחשב והסמארטפון שלך צריכים להיות באותה רשת WiFi כדי להתחבר כראוי!
1. הורד את אפליקציית MATLAB מחנות האפליקציות במכשיר שלך.
2. הקלד "מחבר מופעל" בחלון הפקודה שלך והגדר סיסמה שתצטרך להזין בשני המכשירים.
3. לאחר שתעשה זאת, MATLAB תיתן לך את כתובת ה- IP של המחשב שלך. עליך להיכנס לדף ההגדרות באפליקציית MATLAB בסמארטפון שלך ולהוסיף מחשב באמצעות כתובת ה- IP הנתונה והסיסמה שהזנת קודם לכן.
4. בחלון הפקודה במחשב, הקלד את הקוד m = mobiledev וזה אמור לאתחל את הסמארטפון שלך כבקר עבור Roomba שלך.
5. המחשב והסמארטפון שלך אמורים להיות מוכנים לפעולה כעת.
שלב 5: נהג ב- Roomba שלך
כעת, כשיש לך את כל הכלים הדרושים ליצירת מארס רובר שלך, אתה מוכן ליצור קוד משלך. צירפנו קוד דוגמה להלן הן לנהיגה האוטונומית והן לנהיגה בשליטת סמארטפון.
נהיגה אוטונומית
פונקציה Explore_modified (r)
%טיעוני קלט: אובייקט roomba אחד, r
%פלט ארגומנטים: אין
%תיאור:
פונקציית %משתמשת בלולאה אינסופית תוך כדי לאפשר אוטונומית
חקר %של סביבת הבוט.
%
%funciton מספקת גם הוראות לרומבה מה לעשות
%המצבים הבאים: גלגלים מאבדים מגע עם הקרקע, א
אובייקט %מזוהה מול או משני צדי הבוט, וא
%ירידה פתאומית מזוהה מול או משני צדי הבוט.
%
%הוראות אופייניות כוללות פקודות תנועה שנועדו למקסם
חקר %או הימנע מסכנה שזוהתה ופקודות לתקשר
מידע על תגליות הבוטים (תמונות), מיקום (גרף), %וציין (אזהרה תקועה) עם המשתמש באמצעות matlab ו/או דוא ל. כַּמָה
%פקודות צליל מתווספות להנאה.
%הגדרת יכולות דוא ל
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('אינטרנט', 'SMTP_Server', 'smtp.gmail.com');
setpref ('אינטרנט', 'דואר אלקטרוני', דואר);
setpref ('אינטרנט', 'SMTP_Username', דואר);
setpref ('אינטרנט', 'SMTP_Password', סיסמה);
props = java.lang. System.getProperties;
props.setProperty ('mail.smtp.starttls.enable', 'true');
props.setProperty ('mail.smtp.auth', 'true');
props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');
props.setProperty ('mail.smtp.socketFactory.port', '465');
% r = roomba (19)
r.beep ('G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C1 ^^, C1 ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');
v =.1;
reflect_datum = 2700; %הגדר ערך התייחסות לחיישני צוק
lightBumper_datum = 200; ערך מוגדר של %חיישני פגוש ערך התייחסות
pos = [0, 0]; משתנה %לאחסון מיקום עם נתח אתחול
זווית = 0; %להגדיר זווית התייחסות
netangle = 0; %עקירת זווית נטו
i = 2; איטרציה %להוספת שורות למיקום משתנה אחסון
dist = 0;
r.setDriveVelocity (v, v); %להתחיל roomba להתקדם
בעוד שזה נכון
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %מייצר זווית אקראית אחת בין 20 ל -60 מעלות. משמש כדי למנוע מבוט להיתקע בלולאה
%מה לעשות אם גלגל אחד או יותר מאבד את הקשר עם הקרקע:
%עצור תנועה, שלח מייל אזהרה עם תמונה של הסביבה, %ושאל את המשתמש אם להמשיך או לחכות לעזרה
אם Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
r.beep ('F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^ ')
img = r.getImage;
imwrite (img, 'stuck.png');
%--------------------------
imfile = 'stuck.png';
מיקום = savepos (pos);
%---------------------------
sendmail (מייל, 'עזרה!', 'אני תקוע על צוק!', {imfile, position})
list = {'המשך', 'עצור'};
idx = menu ('מה עלי לעשות?', רשימה);
אם idx == 2
לשבור
סוֹף
%מה לעשות אם אובייקט מזוהה מול הבוט:
%עצור, חזור אחורה, צלם, התראה למשתמש על גילוי
%באמצעות דואר אלקטרוני, סובב 90 מעלות והמשך לחקור
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
r.beep ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
מיקום = savepos (pos);
%---------------------------
sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position})
זווית = 90;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.setDriveVelocity (v, v);
%מה לעשות אם אובייקט מזוהה משמאל לבוט:
%עצור, פנה לכיוון אובייקט, גבה, צלם, התראה
%משתמש הגילוי באמצעות דוא ל, סובב 90 מעלות והמשך חקר
elseif Light.leftFront> lightBumper_datum || Light. left> lightBumper_datum || בליטה.שמאל == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
זווית = 30;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
r.beep ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
imwrite (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
מיקום = savepos (pos);
%---------------------------
sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position})
זווית = -90;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.setDriveVelocity (v, v);
%מה לעשות אם אובייקט מזוהה מימין לבוט:
עצור %, פנה לכיוון אובייקט, גבה, צלם, התראה
%משתמש הגילוי באמצעות דוא ל, סובב 90 מעלות והמשך חקר
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
זווית = -30;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
הפסקה (1.5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
מיקום = savepos (pos);
%---------------------------
sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position});
זווית = 90;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.setDriveVelocity (v, v);
%מה לעשות אם צוק מזוהה משמאל לבוט:
%עוצרים, נעים אחורה, פונים ימינה, ממשיכים לחקור
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y
i = i+1;
זווית = -RandAngle;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.setDriveVelocity (v, v);
%מה לעשות אם צוק מזוהה מימין לבוט:
%עוצרים, נעים אחורה, פונים שמאלה, ממשיכים לחקור
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (זווית); %לקבל x לתאם
pos (i, 2) = dist * cosd (זווית); %קבל תיאום y
i = i+1;
r.moveDistance (-. 125);
זווית = RandAngle;
netangle = netangle+זווית;
r.turnAngle (זווית);
r.setDriveVelocity (v, v);
סוֹף
סוֹף
בקר סמארטפון
Options = {'אוטונומי', 'שליטה ידנית'}
הנחיה = תפריט ('כיצד היית רוצה לשלוט ברובר?', אפשרויות)
m = mobiledev
r = roomba (19)
אם הנחיה == 1
מגלה ארצות)
אַחֵר
בעוד שזה נכון
השהה (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
צד = PhoneData (3);
אם צד> 130 || צד <-130 %אם הטלפון מתהפך עם הפנים כלפי מטה עצור את החדר ויצא מהלולאה
r.stop
r.bep ('C, C, C, C')
לשבור
elseif צד> 25 && צד <40 %אם הטלפון מופנה הצידה בין 25 ל 40 מעלות פנה 5 שמאלה
r.turnAngle (-5);
הצד אחר> 40 %אם הטלפון מופנה הצידה מעל 40 מעלות פנה שמאלה 45 מעלות
r.turnAngle (-45)
אחרת צד -40 %אם הטלפון מופנה הצידה בין -25 ל -40 מעלות פנה ימינה 5 מעלות
r.turnAngle (5);
elseif צד <-40 %אם הטלפון מופנה הצידה פחות מ -40 מעלות פנה שמאלה 45 מעלות
r.turnAngle (45)
סוֹף
%אם הטלפון מוחזק ליד האנכיים קח תמונה וצייר אותה
אם Pitch <-60 && image <= 9
r.bep
img = r.getImage;
עלילת משנה (3, 3, תמונה)
imshow (img)
סוֹף
%לנוע קדימה ואחורה בהתבסס על הכיוון הקדמי והאחור
אם Pitch> 15 && Pitch <35 %אם המגרש בין 15 ל- 35 מעלות נעים קדימה למרחק קצר
%מקבלים נתוני פגוש קל לפני המעבר
litBump = r.getLightBumpers;
אם litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %אם משהו נמצא לפני החדר, והוא יפגע אם הוא זז קדימה תעשה רעש ותציג הודעה
r.beep ('C ^^, F#^, C ^^, F#^')
אחר מהלך של %
r.moveDistance (.03);
קבל נתוני באמפר לאחר המעבר
Bump = r.getBumpers;
אם Bump.right == 1 || בליטה.שמאל == 1 || Bump.front == 1
r.bep ('A, C, E')
r.moveDistance (-.01)
סוֹף
%מקבלים נתוני חיישן מצוק
Cliff = r.getCliffSensors;
אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
סוֹף
סוֹף
elseif Pitch> 35 %אם המגרש גדול יותר מ -35 מעלות נעים קדימה למרחק רב יותר
%מקבלים נתוני פגוש קל לפני המעבר
litBump = r.getLightBumpers;
אם litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %אם משהו נמצא לפני החדר, והוא יפגע אם הוא זז קדימה, תעשה רעש ותציג הודעה
r.beep ('C ^^, F#^, C ^^, F#^')
אחר מהלך של %
r.moveDistance (.3)
קבל נתוני באמפר לאחר המעבר
Bump = r.getBumpers;
אם Bump.right == 1 || בליטה.שמאל == 1 || Bump.front == 1 %אם אתה מכה במשהו, עשה רעש, הצג הודעה וגבה
r.bep ('A, C, E')
r.moveDistance (-.01)
סוֹף
%מקבלים נתוני חיישן מצוק לאחר המעבר
Cliff = r.getCliffSensors;
אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
סוֹף
סוֹף
elseif Pitch -35 %אם המגרש בין -15 ל -35 מעלות זז אחורה למרחק קצר
r.moveDistance (-. 03);
%מקבלים נתוני חיישן מצוק לאחר המעבר
Cliff = r.getCliffSensors;
אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
סוֹף
elseif Pitch -60 %אם המגרש בין -35 ל -60 מעלות זז אחורה למרחק רב יותר
r.moveDistance (-. 3)
%מקבלים נתוני חיישן מצוק לאחר המעבר
Cliff = r.getCliffSensors;
אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
סוֹף
סוֹף
סוֹף
סוֹף
מוּמלָץ:
הפיכת רובוט מטומטם מטומטם לחכם יותר: 4 שלבים
הפיכת רובוט מטומטם למעשי דשא חכם יותר: אז יש לי רובוט מכסחת דשא מקסים אך טיפשי (התמונה מ www.harald-nyborg.dk). הרובוט הזה אמור לחתוך לי את הדשא, אבל הדשא שלי גדול ומורכב מדי בשביל זה באמת להיכנס לפינות. לא מוצג בציורים שלי הוא המון
הפיכת מלחם להמרת פינצטה: 3 שלבים (עם תמונות)
המרת מלחם להמרת פינצטה הלחמה: היי. בימינו, אלקטרוניקה רבה משתמשת ברכיבי SMD, תיקון פרטים כאלה ללא ציוד ספציפי הוא מסובך. גם אם אתה צריך להחליף את LED ה- SMD, הלחמה והלחמה עלולים להיות מאתגרים ללא מאוורר חום או טווי הלחמה
הפיכת כל מכונית R/C למכונית R/C בקרת אפליקציות Bluetooth: 9 שלבים
הפיכת כל מכונית R/C למכשיר בקרת אפליקציות Bluetooth: פרויקט זה מציג את השלבים לשינוי מכונית שלט רחוק רגיל למכונית שליטה Bluetooth (BLE) עם לוח רובוטיקה Wombatics SAM01, אפליקציית Blynk ו- MIT App Inventor. יש הרבה מכוניות RC בעלות נמוכה עם הרבה תכונות כמו פנסי LED
הפיכת אפליקציית הטלפון של Viper Smartstart לקרירה עוד יותר !: 5 שלבים
מה שהופך את אפליקציית הטלפון Viper Smartstart לקרירה עוד יותר !: יש לי מודול Bluetooth של viper smartstart במכונית שלי. מהטלפון שלי אני יכול לנעול, לפתוח, להניע ולעצור את המנוע. זהו ה- Instructable שפרסמתי עבור אותו פרויקט. https://www.instructables.com/id/StartStop-LockUnlo … זה מאוד שימושי עם זאת
הפיכת כרית הקירור למחשב נייד Targus שלך לידידותי למשתמש: 3 שלבים
הפיכת כרית הקירור של מחשב נייד Targus שלך לידידותי למשתמש: כרית הקירור פועלת היטב לצנן את המחשב הנייד שלך, אך כבל החשמל הבלתי מרושע הבולט מהחזית יכול להישבר בקלות או להפריע. במדריך זה, אראה לך כיצד לפרק, לשנות ולהרכיב מחדש את כרית הקירור שלך כדי למקסם את