Índice:

Garden Helper Roomba Bot: 8 etapas
Garden Helper Roomba Bot: 8 etapas

Vídeo: Garden Helper Roomba Bot: 8 etapas

Vídeo: Garden Helper Roomba Bot: 8 etapas
Vídeo: You’re welcome 😚 #Roomba #maintenance 2024, Julho
Anonim
Garden Helper Roomba Bot
Garden Helper Roomba Bot

Kiara Myers, Ahmad Alghadeer e Madison Tippet

Propósito:

Este instrutível irá ensiná-lo a programar um Roomba Bot, usando o MATLAB, para navegar por um jardim, detectando frutas / vegetais de formato circular que estão maduros o suficiente para serem colhidos com base em seu tamanho. Esse robô também envia um e-mail avisando quantas frutas estão prontas para serem colhidas e o caminho que percorreu.

Recursos:

  • Usa sensores de luz para detectar paredes e virar ligeiramente para evitar atingi-las
  • Utiliza sensores de colisão para interromper o programa quando atinge a rocha no final do jardim
  • Usa processamento de imagem para detectar um círculo no jardim e então determinar seu raio
  • Usa sensores de penhasco para detectar uma fita colorida que indica a presença de uma fruta

Etapa 1: Materiais e suprimentos:

  • Um laptop
  • MATLAB 2017
  • Limpador Roomba Vaccum
  • Raspberry Pi
  • Blocos de madeira
  • Papel branco
  • Papel preto
  • Fita colorida / tira fina de papel colorido
  • Grande pedra

Passo 2:

Etapa 3: montando seu "jardim"

Montando seu
Montando seu
  1. Pegue seu papel preto e corte círculos de vários tamanhos
  2. Cole esses círculos pretos em um grande papel branco

    Este contraste será necessário ao detectar uma fruta

  3. Use seus blocos de madeira para construir um caminho de jardim semelhante a um labirinto para o seu robô navegar

    Escolhemos um caminho em forma de U, conforme ilustrado acima

  4. No final do seu jardim, adicione uma pedra ou porta ou outro objeto para o seu robô saber que está feito
  5. Cole seu papel branco com o círculo nas paredes do jardim

    Usamos baldes para prender porque nossas paredes eram muito curtas para a câmera

  6. Coloque fita colorida / tira fina de papel colorido no chão na frente da fruta

Etapa 4: escrever o código

Navegando no Jardim

Usando sensores de impacto: para executar o programa, colocamos a codificação em uma instrução while que percorre várias instruções if até que o código seja quebrado. Se qualquer um dos bumpers for atingido, seu valor será igual a true (que em booleano é o valor 1). Uma instrução if é usada para quebrar o código quando um de seus valores for igual a 1.

Usando sensores de penhasco: dentro da instrução while, usamos uma instrução if para informar ao Roomba quando ele chegou à localização de uma planta. O Roomba detecta a fita colorida no chão examinando o limite de vermelho que os sensores de penhasco captam. Se o sensor de penhasco esquerdo ou direito detecta uma cor com um limite maior do que o do solo, ele irá parar o robô por 2 segundos (usando o comando de pausa). Durante esses 2 segundos, o Roomba obterá e exibirá uma imagem da fruta. Usando o comando imfindcircles embutido, defina um intervalo para os raios de seus círculos e seu Roomba encontrará sua fruta.

Usando o processamento de imagem: dentro da instrução if, incorporamos outra instrução if que diz: se o raio detectado, radii3, é maior ou igual ao nosso requisito mínimo de uma fruta madura, r1 (você decide isso), então conte e exiba o Roomba quantas frutas estão prontas e vire para continuar pelo jardim. Se não, é a vez de continuar pelo jardim. Nota: pode ser necessário ajustar o ângulo de rotação porque cada Roomba é diferente

Usando Light Bumpers: Em outra instrução if, os light bumpers são analisados para garantir que nenhum deles se torne maior do que nosso limite determinado. Se o pára-choque esquerdo, direito, centro esquerdo, centro direito, frontal esquerdo ou direito dianteiro ultrapassar a soleira, o Roomba girará levemente no ângulo apropriado para evitar bater em uma parede. Portanto, navegando no labirinto.

O resto do código é usado para traçar o caminho percorrido pelo Roomba e, em seguida, enviar os resultados para seu e-mail

Etapa 5: copie o código

% Objetivo: Com base em seus tamanhos, o roomba percorre um jardim e distingue vegetais / frutas que estão prontos para serem colhidos. % Entradas: sensores Lightbump, sensores Cliff, sensores Bump, imagem da câmera% Saídas: Sempre que os sensores de luz forem maiores que o limite, o roomba irá virar e tirar uma imagem, emite um bipe se o raio de% vegetais / frutas estiver entre um intervalo específico. O código quebra quando o roomba esbarra em% um objeto, envia ao astronauta um e-mail sobre quantas frutas estão prontas para serem% coletadas e um mapeamento do movimento do roomba. % Uso: declarações if e while, comandos de plotagem, código de e-mail do MATLAB

k = 0

tique

timerVal = tic

enquanto verdadeiro

v = 0,2; % velocity r.setDriveVelocity (v, v);% roomba avançar L = r.getLightBumpers; LC = L.leftCenter; Rr = L. direita; Lf = L.esquerdo; RC = L.rightCenter; LF = L.leftFront; RF = L.rightFront; Q = 75; % limiar. RTH = 30; % Limite vermelho alto RTL = 10; % Limite vermelho baixo B = r.getBumpers S = r.getCliffSensors; r1 = 24; r3 = 10; PL1 = 1800; if S.leftFront> PL1 || S.rightFront> PL1% detecta se a cor no solo está acima do limite r.stop pause (2) elapsedTime = toc (timerVal-2) tic timerVal = tic% pausa por 2 segundos img = r.getImage; % take image imshow (img)% display image [centers3, radii3] = imfindcircles (img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0,9); h = viscírculos (centros3, raios3); % procuram círculos de raios com o intervalo especificado na imagem se raios3> = r1 T = 1 k = k + 1 dist1 = 0,2. * elapsedTime% Se o raio detectado for maior ou igual ao requisito mínimo de% de uma fruta madura, então o Roomba conta essa fruta elseif radii3 <= r3 T = 0 else T = 0 dist2 = 0.2. * elapsedTime% Caso contrário, ele não conta a extremidade da fruta

if T == 1 r.setLEDDigits (num2str (k)) r.beep r.beep r.beep r.turnAngle (78)% Se uma fruta foi detectada, exibe o número no Roomba,% faz um barulho e vira elseif T == 2 r.turnAngle (78)% Se 2 frutas forem detectadas, gire para continuar através da% garden else r.turnAngle (78)% Se nenhuma fruta for detectada, então gire para continuar até a% garden end if LC> Q r.stop r.turnAngle (-7) elseif RC> Q r.parar 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% Se algum dos valores dos amortecedores de luz ultrapassar o limite, então% o Roomba irá virar ligeiramente na direção apropriada para evitar% bater em uma parede

se B.direito == 1 || B.esquerdo == 1 || B.front == 1 dist3 = 0.2. * ElapsedTime r.stop r.beep ('F # * 2, F # * 2, c, F # * 2, F # * 2') r.turnAngle (360)% Se algum dos bumbers são atingidos, então o roomba toca o som, gira,% e quebra o código

fim do intervalo

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]' senha = 'Srsora123 #' host = 'smtp.gmail.com' porta = '465'

setpref ('Internet', 'E_mail', mail); setpref ('Internet', 'SMTP_Server', host) props = java.lang. System.getProperties; props.setProperty ('mail.smtp.user', mail); props.setProperty ('mail.smtp.host', host); props.setProperty ('mail.smtp.port', porta); 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', porta); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.fallback', 'false'); sendmail (mail, 'Olá astronauta! Existem tantas frutas assim no jardim', kmsg, {'movement.png'})

Recomendado: