Përmbajtje:

Ktheni dhomën tuaj në një Mars Rover: 5 hapa
Ktheni dhomën tuaj në një Mars Rover: 5 hapa

Video: Ktheni dhomën tuaj në një Mars Rover: 5 hapa

Video: Ktheni dhomën tuaj në një Mars Rover: 5 hapa
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Nëntor
Anonim
Ktheni dhomën tuaj në një Rover Mars
Ktheni dhomën tuaj në një Rover Mars

Hapi 1: Mblidhni materialet tuaja

Për të përfunduar këtë projekt, do t'ju duhet të grumbulloni materialet e mëposhtme:

1 Robot Roomba

1 Pako Raspberry Pi

1 Kamera video

Qasja në MATLAB

Hapi 2: Shkarkoni kutitë e veglave Roomba për MATLAB

Shkarkoni kutitë e veglave Roomba për MATLAB
Shkarkoni kutitë e veglave Roomba për MATLAB
Shkarkoni kutitë e veglave Roomba për MATLAB
Shkarkoni kutitë e veglave Roomba për MATLAB

Drejtoni kodin e mëposhtëm në mënyrë që të instaloni kutitë e nevojshme të veglave për të përfunduar këtë projekt.

funksion roombaInstall

clc;

% lista e skedarëve për tu instaluar

skedarë = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% vendndodhja nga e cila do të instalohet

opsionet = zgjedhjet në internet ('CertificateFilename', ''); % i thonë që të injorojë kërkesat e certifikatës

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Instalo/Përditëso Roomba';

% shfaqni qëllimin dhe merrni konfirmimin

kërkesë = {

'Ky program do të shkarkojë këto skedarë EF 230 Roomba:'

''

strjoin (skedarë, '')

''

'te kjo dosje:'

''

cd

''

'Doni të vazhdoni? '

};

biep;

yn = questdlg (shpejtë,…

dlgTitulli,…

'Po', 'Jo', 'Po');

nëse ~ strcmp (yn, 'Po'), kthehu; fund

% merrni listën e skedarëve që ekzistojnë

skedarët_ ekzistues = skedarët (argëtimi i qelizave (@exist, fotografi)> 0);

nëse ~ është i zbrazët (skedarët_ekzistues)

% sigurohuni që është vërtet mirë t'i zëvendësoni ato

prompt = {'Po zëvendësoni këto skedarë (t):'

''

strjoin (skedarët_ ekzistues, '')

''

'Dakord për të zëvendësuar?'

};

biep;

yn = questdlg (shpejtë,…

dlgTitulli,…

'Po', 'Jo', 'Po');

nëse ~ strcmp (yn, 'Po'), kthehu; fund

fund

% shkarko skedarët

cnt = 0;

për i = 1: gjatësia (skedarët)

f = skedarët {i};

disp (['Shkarkimi' f]);

provo

url = [server f];

websave (f, url, opsionet); % opsione të shtuara për të shmangur gabimet e sigurisë

cnt = cnt + 1;

kap

disp (['Gabim në shkarkim' f]);

bedel = [f '.html'];

nëse ekziston (bedel, 'skedar') == 2

fshij (bedel)

fund

fund

fund

nëse cnt == gjatësia (skedarët)

msg = 'Instalimi është i suksesshëm';

waitfor (msgbox (msg, dlgTitle));

tjeter

msg = 'Gabim në instalim - shiko dritaren e komandës për detaje';

waitfor (errordlg (msg, dlgTitle));

fund

fund %roombaInstall

Hapi 3: Lidhuni me dhomën tuaj

Tani është koha për t'u lidhur me Roomba tuaj duke përdorur WiFi. Duke përdorur 2 gishta, shtypni butonat Dock dhe Spot njëkohësisht për të ndezur ose rivendosur Roomba -n tuaj. Tjetra, Drejtoni kodin r = roomba (# i Roomba -s tuaj) në dritaren e komandës të MATLAB për t'u lidhur me robotin tuaj. Pasi të keni ekzekutuar këtë komandë, Roomba juaj duhet të jetë gati për të shkuar.

Hapi 4: Zgjidhni se si dëshironi të kontrolloni dhomën tuaj

Zgjidhni se si dëshironi të kontrolloni dhomën tuaj
Zgjidhni se si dëshironi të kontrolloni dhomën tuaj
Zgjidhni se si dëshironi të kontrolloni dhomën tuaj
Zgjidhni se si dëshironi të kontrolloni dhomën tuaj

Ka dy mënyra që mund të kontrolloni Roomba -n tuaj: në mënyrë autonome ose duke përdorur një smartphone si kontrollues.

Nëse zgjidhni të drejtoni Roomba në mënyrë autonome, do t'ju duhet të përdorni tre sensorë të integruar: sensorë të shkëmbinjve, sensorë të përplasjes dhe sensorë të dritës.

Për të përdorur një smartphone, së pari duhet të lidhni smartphone -in tuaj me kompjuterin tuaj duke ndjekur hapat e mëposhtëm.

SH NOTNIM: Kompjuteri dhe smartphone juaj duhet të jenë në të njëjtin rrjet WiFi në mënyrë që të lidhen siç duhet!

1. Shkarkoni aplikacionin MATLAB nga dyqani i aplikacioneve në pajisjen tuaj.

2. Shkruani "lidhësin aktiv" në dritaren tuaj të komandës dhe vendosni një fjalëkalim që do të duhet të futet në të dy pajisjet.

3. Pasi ta keni bërë këtë, MATLAB do t'ju japë adresën IP të kompjuterëve tuaj. Ju duhet të hyni në faqen e cilësimeve në aplikacionin MATLAB në smartphone tuaj dhe të shtoni një kompjuter duke përdorur adresën IP të dhënë dhe fjalëkalimin që keni futur më parë.

4. Në dritaren e komandës në kompjuterin tuaj, shkruani kodin m = mobiledev dhe kjo duhet të inicializojë telefonin tuaj të mençur si kontrollues për Roomba -n tuaj.

5. Kompjuteri dhe smartphone juaj duhet të jenë gati për të shkuar tani.

Hapi 5: Drejtoni dhomën tuaj

Tani që keni të gjitha mjetet e nevojshme për të krijuar Mars Rover -in tuaj, jeni gati të krijoni kodin tuaj. Ne kemi bashkangjitur një kod shembull më poshtë si për drejtimin autonome ashtu edhe për drejtimin e kontrolluar nga smartphone.

Drejtimi Autonome

funksioni Explore_modified (r)

%argumente hyrëse: 1 objekt roomba, r

%argumente dalëse: asnjë

%përshkrim:

Funksioni %përdor një lak të pafund ndërsa lejon për të lejuar autonominë

%eksplorim i rrethinës së botit.

%

%funciton gjithashtu jep udhëzime për roomba se çfarë të bëni

%situatat e mëposhtme: Rrota (at) humbin kontaktet me tokën, an

%objekti zbulohet para ose në secilën anë të botit, dhe a

%rënie e papritur zbulohet para ose në të dyja anët e botit.

%

%udhëzimet tipike përfshijnë komandat e lëvizjes që synojnë të maksimizohen

%eksplorimi ose shmangia e një rreziku të zbuluar dhe komandat për të komunikuar

%informacion në lidhje me zbulimet e botëve (fotografi), pozicioni (grafiku), %dhe gjendja (paralajmërim i bllokuar) me përdoruesin përmes matlab dhe/ose email. Disa

%komandat zanore shtohen për kënaqësi.

%aftësitë e konfigurimit të postës elektronike

mail = '[email protected]';

fjalëkalim = 'EF230Roomba';

setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Internet', 'E_mail', postë);

setpref ('Internet', 'SMTP_Username', postë);

setpref ('Internet', 'SMTP_Password', fjalëkalim);

props = java.lang. System.getProposies;

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;

pasqyrë_datum = 2700; %vendosur vlerën e referencës të sensorëve të shkëmbit

dritaBumper_datum = 200; %vendosur vlera e referencës së sensorëve të dritës Parakolp

pos = [0, 0]; %e ndryshueshme për ruajtjen e pozicionit me datën e inicializuar

kënd = 0; %vendosur këndin e referencës

rrjetë = 0; %zhvendosja e këndit neto

i = 2; %përsëritës për shtimin e rreshtave në ndryshoren e ruajtjes së pozicionit

dist = 0;

r.setDriveVelocity (v, v); %start roomba duke ecur përpara

ndërsa e vërtetë

Cliff = r.getCliffSensore;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %gjeneron 1 kënd të rastit midis 20 dhe 60 gradë. Përdoret për të parandaluar që boti të ngec në një lak

%Çfarë duhet bërë nëse një ose më shumë rrota humbet kontaktin me tokën:

%ndalo lëvizjen, dërgoni një email paralajmërues me pamjen e rrethinës, %dhe pyesni përdoruesin nëse do të vazhdojë ose të presë për ndihmë

nëse Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.ndaloj

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni 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 = 'mbërthyer.png';

pozicioni = savepos (pos);

%---------------------------

sendmail (posta, 'HELP!', 'Unë jam bllokuar në një shkëmb!', {imfile, position})

lista = {'Vazhdo', 'Ndalo'};

idx = menu ('Çfarë duhet të bëj?', listë);

nëse idx == 2

pushim

fund

%Çfarë duhet të bëni nëse një objekt zbulohet para bot:

%ndalo, lëviz prapa, bëj fotografi, paralajmëro përdoruesin e zbulimit

%përmes postës elektronike, ktheni 90 gradë dhe vazhdoni të eksploroni

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.ndaloj;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

r.moveDistanca (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni 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';

pozicioni = savepos (pos);

%---------------------------

sendmail (mail, 'Alert!', 'Kam gjetur diçka!', {imfile, position})

kënd = 90;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.setDriveVelocity (v, v);

%Çfarë duhet të bëni nëse objekti zbulohet në të majtë të bot:

%ndalo, kthehu në drejtim të objektit, rezervo, fotografo, vigjilent

%përdorues i zbulimit përmes postës elektronike, kthejeni 90 gradë dhe vazhdoni të eksploroni

elseif Light.leftF front> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.ndaloj;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

kënd = 30;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.moveDistanca (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni 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';

pozicioni = savepos (pos);

%---------------------------

sendmail (mail, 'Alert!', 'Kam gjetur diçka!', {imfile, position})

kënd = -90;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.setDriveVelocity (v, v);

%Çfarë duhet të bëni nëse objekti zbulohet në të djathtë të bot:

%ndalo, kthehu në drejtim të objektit, rezervo, fotografo, vigjilent

%përdorues i zbulimit përmes postës elektronike, kthejeni 90 gradë dhe vazhdoni të eksploroni

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.ndaloj;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

kënd = -30;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.moveDistanca (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

pauzë (1.5);

r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

pozicioni = savepos (pos);

%---------------------------

sendmail (mail, 'Alert!', 'Kam gjetur diçka!', {imfile, position});

kënd = 90;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.setDriveVelocity (v, v);

%Çfarë duhet bërë nëse zbulohet shkëmbi në të majtë të botit:

%ndalo, lëviz prapa, kthehu djathtas, vazhdo të eksplorosh

elseif Cliff.left <pasqyroj_datum || Cliff.leftFront <reflekto_datum

r.ndaloj;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

r.moveDistanca (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (rrjetë); %merrni x koordinatë

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %merrni y koordinatë

i = i+1;

kënd = -RandAngle;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.setDriveVelocity (v, v);

%Çfarë duhet bërë nëse zbulohet shkëmbi në të djathtë të botit:

%ndalo, lëviz prapa, kthehu majtas, vazhdo të eksplorosh

elseif Cliff.djathtas <pasqyroj_datum || Cliff.rightFront <pasqyroj_datum

r.ndaloj;

dist = r.getDistance;

pos (i, 1) = dist * sind (këndi); %merrni x koordinatë

pos (i, 2) = dist * cosd (këndi); %merrni y koordinatë

i = i+1;

r.moveDistanca (-. 125);

kënd = RandAngle;

netangle = rrjetë+kënd;

r.tornAngle (kënd);

r.setDriveVelocity (v, v);

fund

fund

Kontrolluesi i smartphone

Opsionet = {'Autonome', 'Kontrolli manual'}

Prompt = menu ("Si do të donit të kontrollonit roverin?", Opsionet)

m = mobiledev

r = roomba (19)

nëse Prompt == 1

Eksploroni (r)

tjeter

ndërsa e vërtetë

pauzë (.5)

Të dhëna telefonike = m. Orientimi;

Azi = Të dhënat telefonike (1);

Fusha = Të dhënat telefonike (2);

Ana = Të dhënat e telefonit (3);

nëse Ana> 130 || Në anën <-130 %nëse telefoni kthehet me fytyrë poshtë ndaloni dhomën dhe dalni lakun

r.ndaloj

r. beep ('C, C, C, C')

pushim

elseif Side> 25 && Ana <40 %nëse telefoni është i kthyer anash midis 25 dhe 40 gradë kthehet majtas 5 gradë

r.krahAngle (-5);

elseif Ana> 40 %nëse telefoni është kthyer anash mbi 40 gradë kthejeni majtas 45 gradë

r.tornAngle (-45)

elseif Side -40 %nëse telefoni kthehet anash midis -25 dhe -40 gradë kthehet djathtas 5 gradë

r. ktheseAngle (5);

elseif Ana <-40 %nëse telefoni kthehet anash më pak se -40 gradë kthehet majtas 45 gradë

r. turnAngle (45)

fund

%Nëse telefoni mbahet pranë vertikalit, merrni një imazh dhe vizatoni atë

nëse Pitch <-60 && image <= 9

r.biep

img = r.getImage;

nënplot (3, 3, imazh)

imshow (img)

fund

%lëvizin përpara dhe prapa bazuar në orientimin para dhe mbrapa

nëse Pitch> 15 && Pitch <35 %nëse hapi midis 15 dhe 35 gradë ecni përpara në distancë të shkurtër

%marrin të dhëna të parakolpit të dritës para se të lëvizni

litBump = r.getLightBumpers;

nëse litBump.leftF front> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %nëse diçka është përpara dhomës dhe godet nëse lëviz përpara bëni zhurmë dhe shfaqni mesazh

r.beep ('C ^^, F#^, C ^^, F#^')

tjetër %lëviz

r.moveDistanca (.03);

%Merrni të dhëna parakolp pas lëvizjes

Bump = r.getBumpers;

nëse Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r. biep ('A, C, E')

r.moveDistanca (-. 01)

fund

%marrin të dhëna të sensorit të shkëmbit

Cliff = r.getCliffSensore;

nëse Cliff.left> 1500 || Cliff.leftF front> 1500 || Cliff.rightF front> 1500 || Cliff.right> 1500 %nëse diçka shkakton sensorin e shkëmbit trajtojeni atë si lavë dhe mbështetuni

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistanca (-. 031)

fund

fund

elseif Katran> 35 %nëse lartësia më e madhe 35 gradë ecni përpara në distancë më të gjatë

%marrin të dhëna të parakolpit të dritës para se të lëvizni

litBump = r.getLightBumpers;

nëse litBump.leftF front> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightF front> 15 %nëse diçka është përpara dhomës dhe godet nëse lëviz përpara bëni zhurmë dhe shfaqni mesazh

r.beep ('C ^^, F#^, C ^^, F#^')

tjetër %lëviz

r.moveDistanca (.3)

%Merrni të dhëna parakolp pas lëvizjes

Bump = r.getBumpers;

nëse Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %nëse godisni diçka bëni një zhurmë, shfaqni mesazhin dhe bëni kopje rezervë

r.beep ('A, C, E')

r.moveDistanca (-. 01)

fund

%marrin të dhëna të sensorit të shkëmbit pas lëvizjes

Cliff = r.getCliffSensore;

nëse Cliff.left> 1500 || Cliff.leftF front> 1500 || Cliff.rightF front> 1500 || Cliff.right> 1500 %nëse diçka shkakton sensorin e shkëmbit trajtojeni atë si lavë dhe mbështetuni

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistanca (-. 31)

fund

fund

elseif Pitch -35 %nëse hapi midis -15 dhe -35 gradë lëvizin prapa në distancë të shkurtër

r.moveDistanca (-. 03);

%marrin të dhëna të sensorit të shkëmbit pas lëvizjes

Cliff = r.getCliffSensore;

nëse Cliff.left> 1500 || Cliff.leftF front> 1500 || Cliff.rightF front> 1500 || Cliff.right> 1500 %nëse diçka shkakton sensorin e shkëmbit trajtojeni atë si lavë dhe mbështetuni

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistanca (.04)

fund

elseif Katran -60 %nëse hapi midis -35 dhe -60 gradë lëvizin prapa në distancë më të gjatë

r.moveDistanca (-. 3)

%marrin të dhëna të sensorit të shkëmbit pas lëvizjes

Cliff = r.getCliffSensore;

nëse Cliff.left> 1500 || Cliff.leftF front> 1500 || Cliff.rightF front> 1500 || Cliff.right> 1500 %nëse diçka shkakton sensorin e shkëmbit trajtojeni atë si lavë dhe mbështeteni

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistanca (.31)

fund

fund

fund

fund

Recommended: