Innehållsförteckning:
- Steg 1: Samla dina material
- Steg 2: Ladda ner Roomba verktygslådor för MATLAB
- Steg 3: Anslut till din Roomba
- Steg 4: Välj hur du vill styra din Roomba
- Steg 5: Kör din Roomba
Video: Förvandla din Roomba till en Mars Rover: 5 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:37
Steg 1: Samla dina material
För att slutföra detta projekt måste du samla in följande material:
1 Roomba -robot
1 Raspberry Pi -kit
1 Videokamera
Tillgång till MATLAB
Steg 2: Ladda ner Roomba verktygslådor för MATLAB
Kör följande kod för att installera nödvändiga verktygslådor för att slutföra projektet.
funktionsrumbaInstall
clc;
% lista över filer som ska installeras
filer = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% plats att installera från
options = weboptions ('CertificateFilename', ''); % berätta att den ignorerar certifikatkrav
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba -installation/uppdatering';
% visningsändamål och få bekräftelse
prompt = {
'Detta program hämtar dessa EF 230 Roomba -filer:'
''
strjoin (filer, '')
''
'till den här mappen:'
''
CD
''
'Vill du fortsätta? '
};
pip;
yn = questdlg (prompt, …
dlgTitle, …
'Ja', 'Nej', 'Ja');
om ~ strcmp (yn, 'Ja'), returnera; slutet
% få lista över filer som finns
befintliga_filer = filer (cellfun (@exist, filer)> 0);
om ~ isempty (befintliga_filer)
% se till att det verkligen är ok att byta ut dem
prompt = {'Du ersätter dessa filer:'
''
strjoin (befintliga_filer, '')
''
'OK att byta ut?'
};
pip;
yn = questdlg (prompt, …
dlgTitle, …
'Ja', 'Nej', 'Ja');
om ~ strcmp (yn, 'Ja'), returnera; slutet
slutet
% ladda ner filerna
cnt = 0;
för i = 1: längd (filer)
f = filer {i};
disp (['Hämtar' f]);
Prova
url = [server f];
webbspara (f, url, alternativ); % tillagda alternativ för att undvika säkerhetsfel
cnt = cnt + 1;
fånga
disp (['Fel vid nedladdning' f]);
dummy = [f '.html'];
if exist (dummy, 'file') == 2
ta bort (dummy)
slutet
slutet
slutet
om cnt == längd (filer)
msg = 'Installationen lyckades';
waitfor (msgbox (msg, dlgTitle));
annan
msg = 'Installationsfel - se kommandofönstret för mer information';
waitfor (errordlg (msg, dlgTitle));
slutet
slutet %roombaInstall
Steg 3: Anslut till din Roomba
Nu är det dags att ansluta till din Roomba med WiFi. Använd två fingrar och tryck på Dock- och Spot -knapparna samtidigt för att slå på eller återställa din Roomba. Kör sedan koden r = roomba (# av din Roomba) i kommandofönstret i MATLAB för att ansluta till din robot. När du har kört det här kommandot bör din Roomba vara redo att gå.
Steg 4: Välj hur du vill styra din Roomba
Det finns två sätt att styra din Roomba: autonomt eller att använda en smartphone som styrenhet.
Om du väljer att köra Roomba självständigt måste du använda de tre inbyggda sensorerna: klippsensorer, stötsensorer och ljussensorer.
För att använda en smartphone måste du först ansluta din smartphone till din dator genom att följa stegen nedan.
OBS: Din dator och smartphone måste vara på samma WiFi -nätverk för att kunna ansluta korrekt!
1. Ladda ner MATLAB -appen från appbutiken på din enhet.
2. Skriv "connector on" i ditt kommandofönster och ange ett lösenord som måste matas in i båda enheterna.
3. Efter att ha gjort det kommer MATLAB att ge dig din dators IP -adress. Du måste gå in på inställningssidan i MATLAB -appen på din smartphone och lägga till en dator med den angivna IP -adressen och lösenordet du angav tidigare.
4. I kommandofönstret på din dator skriver du koden m = mobiledev och detta bör initialisera din smartphone som en kontroller för din Roomba.
5. Din dator och smartphone ska vara redo att gå nu.
Steg 5: Kör din Roomba
Nu när du har alla nödvändiga verktyg för att skapa din Mars Rover, är du redo att skapa din egen kod. Vi har bifogat en exempelkod nedan för både autonom körning och smarttelefonstyrd körning.
Autonom körning
funktion Explore_modified (r)
%inmatningsargument: 1 roomba -objekt, r
%output -argument: ingen
%beskrivning:
%-funktionen använder en oändlig medan loop för att tillåta autonom
%utforskning av botens omgivning.
%
%funciton ger också instruktioner till roomba om vad de ska göra i
%följande situationer: Hjul förlorar kontakt med marken, an
%objekt detekteras framför eller på endera sidan av boten, och a
%plötslig nedgång detekteras framför eller till endera sidan av boten.
%
%typiska instruktioner inkluderar rörelsekommandon avsedda att maximera
%utforskning eller undvik en upptäckt fara och kommandon att kommunicera
%information om botarnas upptäckter (bilder), position (graf), %och ange (strandad varning) med användaren via matlab och/eller e -post. Flera
%ljudkommandon läggs till för njutning.
%konfigurera e -postfunktioner
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E_mail', e -post);
setpref ('Internet', 'SMTP_Username', mail);
setpref ('Internet', 'SMTP_Password', lösenord);
rekvisita = 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; %ställ in referensvärde för klippsensorer
lightBumper_datum = 200; %inställt ljus Stötfångarsensorer referensvärde
pos = [0, 0]; %variabel för positionslagring med datum initialiserat
vinkel = 0; %ställ in referensvinkel
netangle = 0; %nettovinkelförskjutning
i = 2; %iterator för att lägga till rader för lagringsvariabel
dist = 0;
r.setDriveVelocity (v, v); %starta roomba framåt
medan det är sant
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %genererar 1 slumpmässig vinkel mellan 20 och 60 grader. Används för att förhindra att bot fastnar i en loop
%Vad ska jag göra om ett eller flera hjul tappar kontakten med marken:
%stoppa rörelsen, skicka ett varningsmejl med bild av omgivningen, %och fråga användaren om den ska fortsätta eller vänta på hjälp
om Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r. stopp
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, "HJÄLP!", "Jag är strandad på en klippa!", {imfile, position})
list = {'Fortsätt', 'Stopp'};
idx = menu ('Vad ska jag göra?', lista);
om idx == 2
ha sönder
slutet
%Vad ska jag göra om ett objekt detekteras framför bot:
%stopp, gå tillbaka, ta bild, varna användaren om upptäckten
%via e -post, vrid 90 grader och fortsätt utforska
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r. stopp;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Vad ska jag göra om objektet upptäcks till vänster om botten:
%stopp, vänd mot objektet, säkerhetskopiera, ta bild, varna
%upptäcktsanvändare via e -post, vrid 90 grader och fortsätt utforska
elseif Light.leftFront> lightBumper_datum || Ljus.vänster> lightBumper_datum || Bump.vänster == 1
r. stopp;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = 30;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = -90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Vad ska jag göra om objektet upptäcks till höger om bot:
%stopp, vänd mot objektet, säkerhetskopiera, ta bild, varna
%upptäcktsanvändare via e -post, vrid 90 grader och fortsätt utforska
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r. stopp;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = -30;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
paus (1,5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position});
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Vad ska jag göra om klippan detekteras till vänster om botten:
%stopp, gå bakåt, sväng höger, fortsätt utforska
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r. stopp;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = -RandAngle;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Vad ska jag göra om klippan detekteras till höger om bot:
%stopp, gå bakåt, sväng vänster, fortsätt utforska
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r. stopp;
dist = r.getDistance;
pos (i, 1) = dist * sind (vinkel); %få x koordinat
pos (i, 2) = dist * cosd (vinkel); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
vinkel = RandAngle;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
slutet
slutet
Smartphone Controller
Options = {'Autonomous', 'Manual Control'}
Prompt = meny ('Hur skulle du vilja styra rovern?', Alternativ)
m = mobiledev
r = roomba (19)
om Prompt == 1
Utforska (r)
annan
medan det är sant
paus (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Sida = PhoneData (3);
om sidan> 130 || Sida <-130 %om telefonen vänds med framsidan nedåt stoppa roomba och avsluta slingan
r. stopp
r. pip ('C, C, C, C')
ha sönder
elseif Sida> 25 && Sida <40 %om telefonen vrids i sidled mellan 25 och 40 grader sväng vänster 5 grader
r.turnAngle (-5);
elseif Sida> 40 %om telefonen vrids åt sidan över 40 grader sväng vänster 45 grader
r.turnAngle (-45)
annarsif Sida -40 %om telefonen vrids åt sidan mellan -25 och -40 grader sväng höger 5 grader
r.turnAngle (5);
elseif Sida <-40 %om telefonen vrids åt sidan mindre än -40 grader sväng vänster 45 grader
r.turnAngle (45)
slutet
%Om telefonen hålls nära vertikalen tar du en bild och plottar den
om Pitch <-60 && image <= 9
r. pip
img = r.getImage;
delplan (3, 3, bild)
imshow (img)
slutet
%gå framåt och bakåt baserat på fram- och bakriktningen
om Pitch> 15 && Pitch <35 %om pitch mellan 15 och 35 grader går framåt kort sträcka
%får lätt stötfångardata innan du flyttar
litBump = r.getLightBumpers;
om litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %om något är framför roomba och kommer att slå om det rör sig framåt gör buller och visar meddelande
r.beep ('C ^^, F#^, C ^^, F#^')
annars %flytta
r.moveDistance (.03);
Få hämtningsdata efter att ha flyttat
Bump = r.getBumpers;
om Bump.right == 1 || Bump.vänster == 1 || Bump.front == 1
r. pip ('A, C, E')
r.moveDistance (-. 01)
slutet
%få data från klippsensorn
Cliff = r.getCliffSensors;
om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
slutet
slutet
annars om tonhöjd> 35 %om tonhöjden är högre än 35 grader, gå längre sträckor framåt
%får lätt stötfångardata innan du flyttar
litBump = r.getLightBumpers;
om litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %om något är framför roomba och kommer att slå om det rör sig framåt, ljud och visa meddelande
r.beep ('C ^^, F#^, C ^^, F#^')
annars %flytta
r.moveDistance (.3)
Få hämtningsdata efter att ha flyttat
Bump = r.getBumpers;
om Bump.right == 1 || Bump.vänster == 1 || Bump.front == 1 %om du träffar något gör ett ljud, visar meddelande och säkerhetskopierar
r. pip ('A, C, E')
r.moveDistance (-. 01)
slutet
%får kliffsensordata efter att ha flyttat
Cliff = r.getCliffSensors;
om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
slutet
slutet
elseif Pitch -35 %om tonhöjd mellan -15 och -35 grader flyttar tillbaka kort distans
r.moveDistance (-. 03);
%får kliffsensordata efter att ha flyttat
Cliff = r.getCliffSensors;
om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
slutet
elseif Pitch -60 %om tonhöjd mellan -35 och -60 grader flyttas bakåt längre avstånd
r.moveDistance (-. 3)
%får kliffsensordata efter att ha flyttat
Cliff = r.getCliffSensors;
om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
slutet
slutet
slutet
slutet
Rekommenderad:
Förvandla din trådbundna dörrklocka till en smart dörrklocka med IFTTT: 8 steg
Förvandla din trådbundna dörrklocka till en smart dörrklocka med IFTTT: WiFi -dörrklockan gör din befintliga trådbundna dörrklocka till en smart dörrklocka. https://www.fireflyelectronix.com/product/wifidoor
Förvandla din trådbundna dörrklocka till en smart dörrklocka med hemassistent: 6 steg
Förvandla din trådbundna dörrklocka till en smart dörrklocka med hemassistent: Förvandla din befintliga trådbundna dörrklocka till en smart dörrklocka. Få ett meddelande till din telefon eller para med din befintliga ytterdörrkamera för att få en foto- eller videovarning när någon ringer på din dörrklocka. Läs mer på: fireflyelectronix.com/pro
Förvandla din gamla TV eller CRT -skärm till en retrospelstation: 5 steg
Förvandla din gamla TV eller CRT -skärm till en retro spelstation: I denna instruktion visar jag dig hur du gör din gamla TV eller CRT -skärm till en retro spelstation. Du kan också använda din nya TV eller LED -skärm som ger ditt barndomsminne tillbaka
Förvandla din videobandspelare till en RF- eller A/V -sändare: 4 steg
Förvandla din videobandspelare till en RF- eller A/V -sändare: Det här är ganska enkelt. Skjut en antenn på baksidan av utgången på en videokamera. Och ställ in din TV. Men den här metoden ser hemsk ut och fungerar bara på cirka 1 meter. Detta hindrar inte någon från att sticka i en TV -förstärkare. Det vore olagligt men
Hacka din servo V1.00 - Förvandla din servo till en kraftfull linjär manöverdon: 7 steg
Hacka din servo V1.00 - Förvandla din servo till en kraftfull linjär ställdon: förutsatt att du har verktygen och servon som du kan bygga detta för under ett par dollar. Ställdonet sträcker sig med en hastighet av cirka 50 mm/min. Det är ganska långsamt men mycket kraftfullt. Se min video i slutet av inlägget där det lilla ställdonet