Table des matières:

Garden Helper Roomba Bot : 8 étapes
Garden Helper Roomba Bot : 8 étapes

Vidéo: Garden Helper Roomba Bot : 8 étapes

Vidéo: Garden Helper Roomba Bot : 8 étapes
Vidéo: ULTIMATE Cleaning Challenge - 5 lbs of Cereal vs Roomba i8+ Robot Vacuum. 2024, Juillet
Anonim
Aide de jardin Roomba Bot
Aide de jardin Roomba Bot

Kiara Myers, Ahmad Alghadeer et Madison Tippet

But:

Cette instructable vous apprendra comment programmer un robot Roomba, à l'aide de MATLAB, pour naviguer dans un jardin, en détectant les fruits/légumes de forme circulaire suffisamment mûrs pour être cueillis en fonction de leur taille. Ce robot vous envoie également un e-mail, vous alertant du nombre de fruits prêts à être cueillis et du chemin parcouru.

Caractéristiques:

  • Utilise des capteurs de lumière pour détecter les murs et tourner légèrement afin d'éviter de les heurter
  • Utilise des capteurs de choc afin d'interrompre le programme lorsqu'il heurte le rocher au bout du jardin
  • Utilise le traitement d'image pour détecter un cercle dans le jardin et ensuite déterminer son rayon
  • Utilise des capteurs de falaise pour détecter une bande colorée qui indique la présence d'un fruit

Étape 1: Matériaux et fournitures:

  • Un ordinateur portable
  • MATLAB 2017
  • Aspirateur Roomba
  • Tarte aux framboises
  • Blocs de bois
  • Papier blanc
  • Papier noir
  • Ruban de couleur/fine bande de papier de couleur
  • Gros rocher

Étape 2:

Étape 3: Assembler votre « jardin »

Assemblage de votre
Assemblage de votre
  1. Prenez votre papier noir et découpez des cercles de différentes tailles
  2. Collez ces cercles noirs sur un grand papier blanc

    Ce contraste sera nécessaire lors de la détection d'un fruit

  3. Utilisez vos blocs de bois pour construire un chemin de jardin en forme de labyrinthe pour que votre robot puisse naviguer

    Nous avons choisi un chemin en forme de U comme illustré ci-dessus

  4. Au bout de votre jardin, ajoutez une pierre ou une porte ou un autre objet pour que votre robot sache que c'est fait
  5. Collez votre papier blanc avec le cercle sur les murs du jardin

    Nous avons utilisé des seaux pour le coller parce que nos murs étaient trop courts pour la caméra

  6. Mettez du ruban de couleur/une fine bande de papier de couleur sur le sol devant le fruit

Étape 4: Rédaction du code

Naviguer dans le jardin

Utilisation de Bump Sensors: Pour exécuter le programme, nous plaçons le codage dans une instruction while qui parcourt diverses instructions if jusqu'à ce que le code soit cassé. Si l'un des bumpers est touché, sa valeur sera égale à true (ce qui, en booléen, est une valeur de 1). Une instruction if est utilisée pour casser le code lorsque l'une de leurs valeurs est égale à 1.

Utilisation de capteurs Cliff: dans l'instruction while, nous utilisons une instruction if pour indiquer au Roomba quand il est arrivé à l'emplacement d'une usine. Le Roomba détecte la bande colorée sur le sol en examinant le seuil de rouge que les capteurs de falaise captent. Si le capteur de falaise gauche ou droite détecte une couleur avec un seuil supérieur à celui du sol, alors il arrêtera le robot pendant 2 secondes (en utilisant la commande pause). Pendant ces 2 secondes, le Roomba prendra et affichera une image du fruit. À l'aide de la commande intégrée imfindcircles, définissez une plage pour les rayons de vos cercles et votre Roomba trouvera votre soi-disant fruit.

Utilisation du traitement d'image: dans l'instruction if, nous intégrons une autre instruction if qui dit: si le rayon détecté, radius3, est supérieur ou égal à notre exigence minimale d'un fruit mûr, r1 (vous décidez), puis comptez et affichez sur le Roomba combien de fruits sont prêts et tournent pour continuer à travers le jardin. Sinon, au tour de continuer à travers le jardin. Remarque: vous devrez peut-être ajuster l'angle que vous tournez car chaque Roomba est différent

Utilisation de pare-chocs légers: dans une autre instruction if, les pare-chocs légers sont analysés pour s'assurer qu'aucun d'entre eux ne dépasse notre seuil déterminé. Si le pare-chocs gauche, droit, centre gauche, centre droit, avant gauche ou avant droit dépasse le seuil, le Roomba tournera légèrement dans l'angle approprié pour éviter de heurter un mur. Par conséquent, naviguer dans le labyrinthe.

Le reste du code est utilisé pour tracer le chemin emprunté par le Roomba puis envoyer les résultats à votre email

Étape 5: copiez le code

% Objectif: En fonction de leurs tailles, le roomba parcourra un jardin et distinguera les légumes/fruits prêts à être ramassés. % Entrées: capteurs Lightbump, capteurs Cliff, capteurs Bump, image de la caméra % Sorties: chaque fois que les capteurs de lumière sont supérieurs au seuil, le roomba se tourne et prend une image, émet un bip si le rayon de % légumes/fruits se situe entre une plage spécifique. Le code se casse lorsque le roomba heurte % un objet, envoie à l'astronaute un e-mail indiquant combien de fruits sont prêts à être % ramassés et une cartographie du mouvement du roomba. % d'utilisation: instructions If et while, commandes de traçage, code de courrier électronique de MATLAB

k=0

tic

timerVal=tic

bien que vrai

v=.2; % vitesse r.setDriveVelocity(v, v);%roomba aller de l'avant L=r.getLightBumpers; LC=L.leftCenter; Rr=L.droite; Lf=L.gauche; RC=L.rightCenter; LF=L.leftFront; RF=L.rightFront; Q= 75; % seuil. RTH=30; %Seuil rouge haut RTL=10; %Seuil rouge bas B=r.getBumpers S=r.getCliffSensors; r1=24; r3=10; PL1=1800; si S.leftFront > PL1 || S.rightFront > PL1 % détecte si la couleur au sol est supérieure au seuil r.stop pause(2) elapsedTime=toc(timerVal-2) tic timerVal=tic % pause pendant 2 secondes img = r.getImage; %prendre l'image imshow(img)%afficher l'image [centers3, radius3] = imfindcircles(img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9); h = viscercles(centres3, rayons3); % recherchez les cercles de rayons avec la plage spécifiée dans l'image si rayons3>=r1 T=1 k=k+1 dist1=0.2.*elapsedTime %Si le rayon détecté est supérieur ou égal au % requis minimum d'un fruit mûr, alors le Roomba compte ce fruit elseif radius3<=r3 T=0 else T=0 dist2=0.2.*elapsedTime %Si non, alors il ne compte pas le fruit end

if T==1 r.setLEDDigits(num2str(k)) r.beep r.beep r.beep r.turnAngle(78) %Si un fruit a été détecté, affichez le nombre sur Roomba, %faites un bruit, et tournez elseif T==2 r.turnAngle(78) %Si 2 fruits sont détectés, alors tourner pour continuer à travers le %jardin else r.turnAngle(78) %Si aucun fruit n'est détecté, alors tourner pour continuer à travers le %jardin end end if LC >Q r.stop Angleturnr(-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 %Si l'une des valeurs des pare-chocs légers dépasse le seuil, alors %le Roomba tournera légèrement dans la direction appropriée pour éviter % de heurter un mur

si B.droit ==1 || B.gauche==1 || B.front==1 dist3=0.2.*elapsedTime r.stop r.beep('F#*2, F#*2, c, F#*2, F#*2') r.turnAngle(360) %Si l'un des les bumbers sont touchés, puis le roomba joue du son, tourne en rond, % et casse le code

fin de pause

end scatter(0.533, 0, '^') maintien sur scatter(0.533, dist1, '<') maintien sur scatter(-dist2, dist1, 'v') maintien sur scatter(-dist2, 0, 'd') saveas (gcf, 'Mouvement.png')

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

setpref('Internet', 'E_mail', courrier); setpref('Internet', 'SMTP_Server', hôte) props = java.lang. System.getProperties; props.setProperty('mail.smtp.user', mail); props.setProperty('mail.smtp.host', hôte); 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(mail, 'Bonjour astronaute ! Il y a tant de fruits dans le jardin', kmsg, {'movement.png'})

Conseillé: