Table des matières:

Mars Roomba Project UTK : 4 étapes
Mars Roomba Project UTK : 4 étapes

Vidéo: Mars Roomba Project UTK : 4 étapes

Vidéo: Mars Roomba Project UTK : 4 étapes
Vidéo: DIY How to Make Amazing Robot Vacuum Cleaner 2024, Juillet
Anonim
Projet Mars Roomba UTK
Projet Mars Roomba UTK
Projet Mars Roomba UTK
Projet Mars Roomba UTK

AVIS DE NON-RESPONSABILITÉ: CELA NE FONCTIONNERA QUE SI LE ROOMBA EST INSTALLÉ DANS UN

DE FAÇON TRÈS SPÉCIFIQUE, CET INSTRUCTIBLE A ÉTÉ CRÉÉ POUR ET DESTINÉ À ÊTRE UTILISÉ PAR LES ÉTUDIANTS ET LE FACULTÉ DE L'UNIVERSITÉ DU TENNESSEE

Ce code est utilisé pour configurer un Roomba pour exécuter du code écrit et enregistré localement dans MATLAB. Cela ne fonctionnera pas si vous ne parvenez pas à obtenir les bibliothèques nécessaires sur le site Web de l'Université du Tennessee. Si vous disposez des bibliothèques, vous pouvez les utiliser pour programmer votre propre Roomba à l'aide des fonctions de la bibliothèque. Ce Instructable vous apprend comment installer les bibliothèques, créer un dossier pour tout le code et comment coder et utiliser le programme que nous avons fourni ci-dessous.

Matériaux nécessaires:

· Roomba

· MATLAB

· Raspberry Pi et caméra Pi

Étape 1: Obtenir les bibliothèques

Sur le site Web d'ingénierie, une boîte à outils/bibliothèque est fournie, téléchargez-la et placez-la dans un nouveau dossier. Ce dossier doit contenir tous les fichiers de travail du projet car toute fonction utilisée dans un programme que vous créez devra faire référence à la bibliothèque. Après avoir fait cela, vous pouvez commencer à travailler sur vos programmes

Étape 2: Écriture des programmes

Il y a pas mal de fonctions qui peuvent être utilisées dans le programme, ces fonctions sont accessibles en utilisant la commande "doc roomba". En utilisant ces fonctions, vous pouvez contrôler votre Roomba de différentes manières. Le code ci-dessous utilise les capteurs de bosse, les capteurs de barre lumineuse, la caméra et les capteurs de falaise de différentes manières pour créer un rover mars. Nous avons utilisé les capteurs de choc pour détecter lorsque le Roomba heurte un objet, lorsque cela se produit, le robot fait marche arrière, se retourne et continue de se déplacer. Avant que le Roomba ne heurte un objet, la barre lumineuse détectera l'objet et ralentira le Roomba de sorte que lorsqu'il heurte l'objet pour activer le capteur de choc, le Roomba sera moins endommagé/affecté par l'impact. La caméra recherche de l'eau ou de la lave à la surface, s'il n'y a pas de liquide trouvé, le robot continuera à chercher, s'il y a de l'eau trouvée, le robot enverra un message aux opérateurs. Les capteurs de falaise sont conçus pour arrêter le robot s'il s'approche d'une falaise. Si le robot détecte une falaise, il s'inversera et se retournera pour éviter de tomber.

Étape 3: Coder

Copiez et collez ceci dans un fichier MATLAB situé dans le même dossier que les bibliothèques

functionMainRoombaFile(r)

r.setDriveVelocity(0.1, 0.1)

while true % Infinte while boucle pour maintenir le code en cours d'exécution

dontFall = cliffCheck(r) % Affecte la variable 'dontFall' à la fonction 'cliffCheck'

if dontFall % if instruction pour continuer dans le code après la fin de 'cliffCheck'

r.setDriveVelocity(0.1, 0.1) % Maintient Roomba en mouvement après la fin du 'cliffCheck'

end % termine 'dontFall' if instruction

bumper=bumpcheck(r) % Affecte la variable 'bumper' à la fonction 'bumpcheck'

if bumper % if instruction à poursuivre dans le code après la fin du 'bumpcheck'

r.setDriveVelocity(0.1, 0.1) % Maintient Roomba en mouvement une fois le « bump check » terminé

end % termine 'pare-chocs' si l'instruction

liquids = LiquidCheck(r) % Affecte la variable 'liquids' à la fonction 'LiquidCheck'

if liquids % if instruction à poursuivre dans le code après la fin de 'LiquidCheck'

r.setDriveVelocity(0.1, 0.1) % Maintient Roomba en mouvement après la fin du 'LiquidCheck'

end % termine 'liquides' si instruction

lightbumper=lightcheck(r) % Affecte la variable 'lightbumper' à la fonction 'lightcheck'

pause(0.1) % Pause brève pour éviter une itération de boucle continue

end % termine la boucle while infinie

fin % fin fonction

function bumper=bumpcheck(r) % Crée la fonction 'bumpcheck'

bumpdata= r.getBumpers % Affecte toutes les données du bumper à la variable 'bumpdata'

bumper = bumpdata.right || bumpdata.left || bumpdata.front % Crée une variable stockée, 'bumper', pour les différents bumpers

if bumpdata.right>0 % If instruction pour provoquer différentes fonctions du roomba si Bumper est heurté

r.stop % Arrête Roomba

r.moveDistance (-0,3, 0,2) % Inverse Roomba 0,3 m

r.turnAngle(90, 0.5) % Fait pivoter le Roomba de 90 degrés aussi vite que possible

finir

si bumpdata.front>0

r.stop

r.moveDistance (-0,3, 0,2)

r.turnAngle(randi(270), 0.5) % Fait pivoter le Roomba à un intervalle aléatoire entre 0 et 270 degrés aussi vite que possible

finir

si bumpdata.left>0

r.stop

r.moveDistance (-0,3, 0,2)

r.turnAngle(-90, 0.5) % Fait pivoter le Roomba de -90 degrés aussi vite que possible

finir

finir

function lightbumper=lightcheck(r) % Crée la fonction 'lightcheck'

lightdata= r.getLightBumpers % Attribue toutes les données du capteur de bosse lumineuse à la variable 'lightdata'

lightbumper = lightdata.left || lightdata.right || lightdata.rightCenter || lightdata.leftCenter % Crée une variable stockée, 'lightbumper', pour les différents pare-chocs lumineux

if lightbumper % If instruction pour appeler les données du lightbumper d'en haut

if lightdata.left>10 % If instruction pour provoquer différentes fonctions du roomba si le pare-chocs léger détecte plus de 10 valeurs

r.setDriveVelocity (0,05, 0,05) % Ralentit le roomba pour se préparer au choc

end % termine l'instruction if initiale

si lightdata.rightCenter>10

r.setDriveVelocity(0.05, 0.05)

finir

si lightdata.right>10

r.setDriveVelocity(0.05, 0.05)

finir

si lightdata.leftCenter>10

r.setDriveVelocity(0.05, 0.05)

finir

end % termine 'lightbumper' if instruction

fin %ends la fonction lightcheck

function dontFall = cliffCheck(r) % Crée la fonction 'cliffCheck'

données = r.getCliffSensors; % Attribue toutes les données du capteur de falaise à la variable « données »

dontFall = data.left<1020 || data.leftFront<1020 || data.rightFront<1020 || data.right<1020 % Crée une variable stockée, 'dontFall', pour les différents capteurs de falaise

if dontFall % If instruction pour appeler les données du capteur de falaise d'en haut

if data.left < 1010 % If instruction pour provoquer différentes fonctions du roomba si le capteur d'escarpement détecte moins de 1010 valeurs

r.stop

r.moveDistance (-0,2, 0,2) % Inverse Roomba 0,2 m

r.turnAngle(-90, 0.5) % Fait pivoter le Roomba de -90 degrés aussi vite que possible

elseif data.leftFront < 1010

r.stop

r.moveDistance (-0,3, 0,2)

r.turnAngle(90, 0.5) % Fait pivoter le Roomba de 90 degrés aussi vite que possible

elseif data.rightFront < 1010

r.stop

r.moveDistance (-0,3, 0,2)

r.turnAngle(90, 0.5) % Fait pivoter le Roomba de 90 degrés aussi vite que possible

elseif data.right < 1010

r.stop

r.moveDistance (-0,3, 0,2)

r.turnAngle(90, 0.5) % Fait pivoter le Roomba de 90 degrés aussi vite que possible

finir

finir

finir

function liquids = LiquidCheck(r) % Crée la fonction 'LiquidCheck'

while true %start boucle infinie pour l'étalonnage

img = r.getImage; % lit la caméra hors du robot

image(img) % montre l'image dans une fenêtre de figure

red_mean = Mean(mean(img(200, 150, 1)))% lit la quantité moyenne de pixels rouges

blue_mean = Mean(mean(img(200, 150, 3)))% lit la quantité moyenne de pixels bleus

liquides = red_mean || blue_mean % Crée une variable stockée, 'liquides', pour les différentes variables de couleur

if liquids % If instruction pour appeler les données d'image d'en haut

if red_mean>170 % If instruction pour provoquer différentes fonctions du roomba si la caméra voit une couleur rouge moyenne supérieure à 170

r.stop % arrête roomba

r.setLEDCenterColor(255) % définit le cercle en rouge

r.setLEDDigits(); % effacer l'affichage

f = waitbar(0, '*MESSAGE ENTRANT*'); % crée une barre d'attente pour un message de chargement

r.setLEDDigits('HOT'); % définit l'affichage LED sur la sortie « HOT »

pause(0.5) %Bref Pause pour lire les informations affichées

r.setLEDDigits('LAVA'); % définit l'affichage LED sur la sortie « LAVA »

pause (0,5)

barre d'attente(.33, f, '*MESSAGE ENTRANT*'); %crée une augmentation de la barre d'attente

r.setLEDDigits('HOT');

pause (0,5)

r.setLEDDigits('LAVA');

pause (0,5)

barre d'attente(.67, f, '*MESSAGE ENTRANT*'); % crée une augmentation de la barre d'attente

r.setLEDDigits('HOT');

pause (0,5)

r.setLEDDigits('LAVA');

waitbar(1, f, '*MESSAGE ENTRANT*'); %complète la barre d'attente

pause(1)

close(f) %ferme la barre d'attente

r.setLEDDigits(); % efface l'affichage LED

fermer tout %Ferme toutes les fenêtres précédentes

axes('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Efface la fenêtre de tracé des axes et du graphique

y=0,5; % définit la position y du texte dans la fenêtre de traçage

x=0,06; % définit la position x du texte dans la fenêtre de traçage

title('FROM MARS ROOMBA', 'fontsize', 32) % Ajoute un titre à la fenêtre de traçage

quadeqtxt = 'DANGER LAVE'; % Définit la variable 'quadeqtxt' à la sortie 0

text(x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % affiche le texte quadeq dans la fenêtre de traçage

r.moveDistance (-0,2, 0,2) % inverse le roomba 0,2 m

r.turnAngle(180, 0.5) % tourne le roomba de 180 degrés aussi vite que possible

r.setLEDCenterColor(128, 128); % règle la LED centrale du roomba sur orange

fermer tout %ferme les fenêtres ouvertes restantes

elseif blue_mean>175 % If instruction pour provoquer différentes fonctions du roomba si la caméra voit une couleur bleue moyenne supérieure à 175

r.stop % arrête roomba

r.setLEDCenterColor(255) % définit le cercle en rouge

r.setLEDDigits(); % effacer l'affichage

f = waitbar(0, '*MESSAGE ENTRANT*'); % crée une barre d'attente pour un message de chargement

r.setLEDDigits('RECHERCHE'); % définit l'affichage LED sur la sortie « LOOK »

pause(0.5) %Bref Pause pour lire les informations affichées

r.setLEDDigits('WATR'); % définit l'affichage LED sur la sortie « WATR »

pause (0,5)

barre d'attente(.33, f, '*MESSAGE ENTRANT*'); %crée une augmentation de la barre d'attente

r.setLEDDigits('RECHERCHE');

pause (0,5)

r.setLEDDigits('WATR');

pause (0,5)

barre d'attente(.67, f, '*MESSAGE ENTRANT*'); % crée une augmentation de la barre d'attente

r.setLEDDigits('RECHERCHE');

pause (0,5)

r.setLEDDigits('WATR');

waitbar(1, f, '*MESSAGE ENTRANT*'); %complète la barre d'attente

pause(1)

close(f) %ferme la barre d'attente

r.setLEDDigits(); % efface l'affichage LED

fermer tout %Ferme toutes les fenêtres précédentes

axes('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Efface la fenêtre de tracé des axes et du graphique

y=0,5; % définit la position y du texte dans la fenêtre de traçage

x=0,06; % définit la position x du texte dans la fenêtre de traçage

title('FROM MARS ROOMBA', 'fontsize', 32) % Ajoute un titre à la fenêtre de traçage

quadeqtxt = 'EAU TROUVEE'; % Définit la variable 'quadeqtxt' à la sortie 0

text(x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % affiche le texte quadeq dans la fenêtre de traçage

r.moveDistance (-0,2, 0,2) % inverse le roomba 0,2 m

r.turnAngle(180, 0.5) % tourne le roomba de 180 degrés aussi vite que possible

r.setLEDCenterColor(128, 128); % règle la LED centrale du roomba sur orange

fermer tout %ferme les fenêtres ouvertes restantes

end %ends 'red_mean' if instruction

end %ends 'liquides' si instruction

end % ferme la boucle while infinie

end % termine la fonction 'LiquidCheck'

Étape 4: Exécuter le code

Après avoir copié et collé le code dans MATLAB, vous devez vous connecter au Roomba. Une fois le Roomba connecté, vous devez nommer la variable r. Les fonctions utilisent la variable r lorsqu'elles se réfèrent au Roomba, donc le Roomba doit être défini comme la variable r. Après avoir exécuté le code, le Roomba devrait fonctionner comme indiqué.

Conseillé: