Cuprins:

Garden Helper Roomba Bot: 8 pași
Garden Helper Roomba Bot: 8 pași

Video: Garden Helper Roomba Bot: 8 pași

Video: Garden Helper Roomba Bot: 8 pași
Video: You’re welcome 😚 #Roomba #maintenance 2024, Iulie
Anonim
Garden Helper Roomba Bot
Garden Helper Roomba Bot

Kiara Myers, Ahmad Alghadeer și Madison Tippet

Scop:

Acest instructable vă va învăța cum să programați un Roomba Bot, folosind MATLAB, pentru a naviga printr-o grădină, detectând fructe / legume în formă circulară care sunt suficient de coapte pentru a fi culese în funcție de mărimea lor. De asemenea, acest robot vă trimite un e-mail, care vă avertizează câte fructe sunt gata de culese și calea pe care a călătorit.

Caracteristici:

  • Folosește senzori de lumină pentru a detecta pereții și a se roti ușor pentru a evita lovirea lor
  • Folosește senzori de lovire pentru a sparge programul atunci când lovește stânca la capătul grădinii
  • Folosește procesarea imaginilor pentru a detecta un cerc din grădină și apoi a determina raza acestuia
  • Folosește senzori de stâncă pentru a detecta o bandă colorată care indică prezența unui fruct

Pasul 1: Materiale și consumabile:

  • Un laptop
  • MATLAB 2017
  • Roomba Vaccum Cleaner
  • Raspberry Pi
  • Blocuri de lemn
  • Hartie alba
  • Foaie neagra
  • Bandă colorată / bandă subțire de hârtie colorată
  • Stâncă mare

Pasul 2:

Pasul 3: Asamblarea „grădinii” tale

Asamblarea ta
Asamblarea ta
  1. Luați-vă hârtia neagră și tăiați cercuri de diferite dimensiuni
  2. Bandați aceste cercuri negre pe o hârtie albă mare

    Acest contrast va fi necesar la detectarea unui fruct

  3. Utilizați blocurile de lemn pentru a construi o cale de grădină asemănătoare unui labirint pentru ca robotul dvs. să poată naviga

    Am ales o cale în formă de U așa cum se arată mai sus

  4. La sfârșitul grădinii dvs. adăugați o piatră sau o ușă sau un alt obiect pentru ca robotul dvs. să știe că s-a terminat
  5. Bandați hârtia albă cu cercul pe pereții grădinii

    Am folosit găleți pentru a o lipi, deoarece pereții noștri erau prea scurți pentru cameră

  6. Puneți bandă colorată / fâșie subțire de hârtie colorată pe pământ în fața fructului

Pasul 4: Scrierea codului

Navigând prin grădină

Utilizarea senzorilor Bump: Pentru a rula programul, plasăm codarea într-o instrucțiune while care parcurge diverse instrucțiuni if până când codul este rupt. Dacă vreunul dintre bare de protecție este lovit, va rezulta ca valoarea lor să fie egală cu adevărat (care în Boolean este o valoare de 1). O instrucțiune if este utilizată pentru a sparge codul atunci când una dintre valorile lor este egală cu 1.

Utilizarea senzorilor Cliff: în cadrul declarației while, folosim o declarație if pentru a spune Roomba când a ajuns la locația unei plante. Roomba detectează banda colorată de pe podea examinând pragul de roșu pe care îl ridică senzorii de stâncă. Dacă senzorul stâncă sau dreapta de stâncă detectează o culoare cu un prag mai mare decât cel al solului, atunci va opri robotul timp de 2 secunde (folosind comanda pauză). În aceste 2 secunde, Roomba va lua și va afișa o imagine a fructului. Folosind comanda imfindcircles încorporată, setați un interval pentru razele cercurilor dvs., iar Roomba dvs. va găsi așa-numitul fruct.

Utilizarea procesării imaginii: în cadrul instrucțiunii if, încorporăm o altă instrucțiune if care spune: dacă raza detectată, radii3, este mai mare sau egală cu cerința noastră minimă de fructe coapte, r1 (tu decideți acest lucru), apoi numărați și afișați pe Roomba câți fructe sunt gata și se întorc pentru a continua prin grădină. Dacă nu, rândul va continua prin grădină. Notă: poate fi necesar să reglați unghiul pe care îl rotiți, deoarece fiecare Roomba este diferit

Utilizarea barei de protecție a luminii: într-o altă instrucțiune if, bare de protecție a luminii sunt analizate pentru a fi siguri că niciuna dintre ele nu devine mai mare decât pragul nostru determinat. Dacă fie stânga, dreapta, centrul stânga, centrul drept, stânga față sau dreapta bara de protecție luminoasă depășește pragul, atunci Roomba se va întoarce ușor în unghiul corespunzător pentru a evita lovirea unui perete. Prin urmare, navigarea în labirint.

Restul codului este folosit pentru a trasa calea luată de Roomba și apoi pentru a trimite rezultatele la adresa dvs. de e-mail

Pasul 5: Copiați codul

Scop: În funcție de dimensiunile lor, roomba va trece printr-o grădină și va distinge legumele / fructele care sunt gata pentru a fi culese. % Intrări: senzori Lightbump, senzori Cliff, senzori Bump, imagine de la cameră% Ieșiri: Ori de câte ori senzorii de lumină sunt mai mari decât pragul roomba se va întoarce și va face o imagine, emite un semnal sonor dacă raza% legume / fructe este între un anumit interval. Codul se sparge atunci când roomba se lovește de% un obiect, îi trimite astronautului un e-mail despre câte fructe sunt gata să fie% ridicate și o mapare a mișcării roomba. % Utilizare: instrucțiuni If și while, trasarea comenzilor, cod de e-mail de la MATLAB

k = 0

tic

timerVal = tic

în timp ce este adevărat

v =.2; % speed r.setDriveVelocity (v, v);% roomba merge înainte L = r.getLightBumpers; LC = L.leftCenter; Rr = L.drept; Lf = L.stânga; RC = L.rightCenter; LF = L.stângaFront; RF = L.frightFront; Q = 75; % prag. RTH = 30; % Prag roșu ridicat RTL = 10; % Prag roșu scăzut B = r.getBumpers S = r.getCliffSensors; r1 = 24; r3 = 10; PL1 = 1800; dacă S.leftFront> PL1 || S.rightFront> PL1% detectează dacă culoarea de pe sol este peste pragul r.stop pause (2) elapsedTime = toc (timerVal-2) tic timerVal = tic% pause timp de 2 secunde img = r.getImage; % take image imshow (img)% display image [centres3, radii3] = imfindcircles (img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9); h = viscircles (centres3, radii3); % căutați cercuri de raze cu intervalul specificat în imagine dacă razele3> = r1 T = 1 k = k + 1 dist1 = 0,2. * scurs Timp% Dacă raza detectată este mai mare sau egală cu% cerința minimă pentru un fruct copt, atunci Roomba numără acest fruct altfel dacă razele 3 <= r3 T = 0 altul T = 0 dist2 = 0,2. * scurs Timp% Dacă nu, atunci nu ia în calcul sfârșitul fructului

if T == 1 r.setLEDDigits (num2str (k)) r.beep r.beep r.beep r.turnAngle (78)% Dacă a fost detectat un fruct, afișați numărul pe Roomba,% faceți un zgomot și rotiți elseif T == 2 r.turnAngle (78)% Dacă sunt detectate 2 fructe, atunci întoarceți-vă pentru a continua prin% grădina else r.turnAngle (78)% Dacă nu sunt detectate fructe, atunci întoarceți-vă pentru a continua prin% capătul grădinii dacă LC> Q r.stop r.turnAngle (-7) elseif RC> Q r.stop r.turnAngle (7) elseif LF> Q r.stop r.turnAngle (-7) elseif RF> Q r.stop r. turnAngle (7) elseif Lf> Q r.stop r.turnAngle (-7) elseif Rr> Q r.stop r.turnAngle (7) end% Dacă oricare dintre valorile barei de protecție a luminii depășește pragul, atunci% Roomba se va întoarce ușor în direcția corespunzătoare pentru a evita% lovirea unui perete

dacă B.right == 1 || B.stânga == 1 || B.front == 1 dist3 = 0.2. * ElapsedTime r.stop r.beep ('F # * 2, F # * 2, c, F # * 2, F # * 2') r.turnAngle (360)% Dacă oricare dintre bumbere sunt lovite, apoi roomba redă sunet, se învârte în jur,% și rupe codul

sfârșitul pauzei

end scatter (0.533, 0, '^') hold on scatter (0.533, dist1, '<') hold on scatter (-dist2, dist1, 'v') hold on scatter (-dist2, 0, 'd') saveas (gcf, 'Movement.png')

kmsg = num2str (k) mail = '[email protected]' password = 'Srsora123 #' host = 'smtp.gmail.com' port = '465'

setpref ('Internet', 'E-mail', mail); setpref ('Internet', 'SMTP_Server', gazdă) props = java.lang. System.getProperties; props.setProperty ('mail.smtp.user', mail); props.setProperty ('mail.smtp.host', gazdă); props.setProperty ('mail.smtp.port', port); props.setProperty ('mail.smtp.starttls.enable', 'true'); props.setProperty ('mail.smtp.debug', 'true'); props.setProperty ('mail.smtp.auth', 'true'); props.setProperty ('mail.smtp.socketFactory.port', port); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.fallback', 'false'); sendmail (poștă, „Bună ziua astronaut! Există multe fructe în grădină”, kmsg, {'movement.png'})

Recomandat: