Índice:
- Etapa 1: Reúna seus materiais
- Etapa 2: Baixe as caixas de ferramentas do Roomba para MATLAB
- Etapa 3: conecte-se ao seu Roomba
- Etapa 4: escolha como deseja controlar seu Roomba
- Etapa 5: conduza seu Roomba
Vídeo: Transformando seu Roomba em um Mars Rover: 5 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
Etapa 1: Reúna seus materiais
Para concluir este projeto, você precisará reunir os seguintes materiais:
1 robô Roomba
1 Kit Raspberry Pi
1 câmera de vídeo
Acesso ao MATLAB
Etapa 2: Baixe as caixas de ferramentas do Roomba para MATLAB
Execute o código a seguir para instalar as caixas de ferramentas necessárias para concluir este projeto.
function roombaInstall
clc;
% lista de arquivos para instalar
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% local de onde instalar
options = weboptions ('CertificateFilename', ''); % dizem para ignorar os requisitos do certificado
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Instalação / atualização do Roomba';
% exibir objetivo e obter confirmação
prompt = {
'Este programa irá baixar estes arquivos EF 230 Roomba:'
''
strjoin (arquivos, '')
''
'para esta pasta:'
''
CD
''
'Você quer continuar? '
};
bip;
yn = questdlg (prompt,…
dlgTitle, …
'Sim', 'Não', 'Sim');
if ~ strcmp (yn, 'Sim'), retorna; fim
% obtém a lista de arquivos que existem
existing_files = files (cellfun (@exist, files)> 0);
if ~ isempty (existing_files)
% certifique-se de que está tudo bem para substituí-los
prompt = {'Você está substituindo este (s) arquivo (s):'
''
strjoin (existing_files, '')
''
'OK para substituir?'
};
bip;
yn = questdlg (prompt,…
dlgTitle, …
'Sim', 'Não', 'Sim');
if ~ strcmp (yn, 'Sim'), retorna; fim
fim
% baixe os arquivos
cnt = 0;
para i = 1: comprimento (arquivos)
f = arquivos {i};
disp (['Baixando' f]);
Experimente
url = [servidor f];
websave (f, url, opções); % opções adicionadas para evitar erros de segurança
cnt = cnt + 1;
pegar
disp (['Erro ao baixar' f]);
dummy = [f '.html'];
se existir (fictício, 'arquivo') == 2
deletar (fictício)
fim
fim
fim
if cnt == length (arquivos)
msg = 'Instalação bem sucedida';
waitfor (msgbox (msg, dlgTitle));
outro
msg = 'Erro de instalação - veja a janela de comando para detalhes';
waitfor (errordlg (msg, dlgTitle));
fim
fim% roombaInstall
Etapa 3: conecte-se ao seu Roomba
Agora é hora de se conectar ao seu Roomba usando wi-fi. Usando 2 dedos, pressione os botões Dock e Spot simultaneamente para ligar ou redefinir o Roomba. Em seguida, execute o código r = roomba (# do seu Roomba) na janela de comando do MATLAB para se conectar ao seu robô. Depois de executar esse comando, seu Roomba deve estar pronto para funcionar.
Etapa 4: escolha como deseja controlar seu Roomba
Existem duas maneiras de controlar o Roomba: de forma autônoma ou usando um smartphone como controlador.
Se você optar por dirigir o Roomba de forma autônoma, precisará usar os três sensores integrados: sensores de penhasco, sensores de colisão e sensores de luz.
Para usar um smartphone, primeiro você precisa conectar seu smartphone ao computador seguindo as etapas abaixo.
NOTA: Seu computador e smartphone precisam estar na mesma rede WiFi para se conectar corretamente!
1. Baixe o aplicativo MATLAB da loja de aplicativos em seu dispositivo.
2. Digite "conector ligado" na janela de comando e defina uma senha que precisará ser inserida em ambos os dispositivos.
3. Depois de fazer isso, o MATLAB fornecerá o endereço IP do seu computador. Você precisa ir para a página de configurações no aplicativo MATLAB em seu smartphone e adicionar um computador usando o endereço IP fornecido e a senha que você digitou anteriormente.
4. Na janela de comando em seu computador, digite o código m = mobiledev e isso deve inicializar seu smartphone como um controlador para seu Roomba.
5. Seu computador e smartphone devem estar prontos agora.
Etapa 5: conduza seu Roomba
Agora que você tem todas as ferramentas necessárias para criar seu Mars Rover, está pronto para criar seu próprio código. Anexamos um código de exemplo abaixo para a direção autônoma e a direção controlada por smartphone.
Direção Autônoma
função Explore_modified (r)
% argumentos de entrada: 1 objeto roomba, r
% argumentos de saída: nenhum
%Descrição:
A função% utiliza um loop while infinito para permitir a autonomia
% exploração dos arredores do bot.
%
% funciton também fornece instruções para o roomba sobre o que fazer em
% nas seguintes situações: Roda (s) perde (m) contato com o solo, um
% objeto é detectado na frente ou para qualquer lado do bot, e um
% queda repentina é detectada na frente ou em qualquer um dos lados do bot.
%
% instruções típicas incluem comandos de movimento destinados a maximizar
% exploração ou evita um perigo detectado e comandos para se comunicar
% de informações sobre as descobertas dos bots (fotos), posição (gráfico), % e estado (aviso ocioso) com o usuário via matlab e / ou e-mail. Diversos
% comandos de som são adicionados para diversão.
% configurar recursos de e-mail
mail = '[email protected]';
senha = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E_mail', mail);
setpref ('Internet', 'SMTP_Username', mail);
setpref ('Internet', 'SMTP_Password', senha);
props = java.lang. System.getProperties;
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;
reflect_datum = 2700; % definir o valor de referência dos sensores de penhasco
lightBumper_datum = 200; % definir valor de referência de sensores de pára-choques leves
pos = [0, 0]; % variável para armazenamento de posição com datum inicializado
ângulo = 0; % definido ângulo de referência
netangle = 0; % deslocamento do ângulo líquido
i = 2; % iterator para adicionar linhas para posicionar a variável de armazenamento
dist = 0;
r.setDriveVelocity (v, v); % iniciar o roomba avançando
enquanto verdadeiro
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); % gera 1 ângulo aleatório entre 20 e 60 graus. Usado para evitar que o bot fique preso em um loop
% O que fazer se uma ou mais rodas perder o contato com o solo:
% pare o movimento, envie um e-mail de aviso com a imagem dos arredores, % e pergunte ao usuário se deve prosseguir ou esperar por ajuda
if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
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, 'stick.png');
%--------------------------
imfile = 'preso.png';
posição = savepos (pos);
%---------------------------
sendmail (mail, 'HELP!', 'Estou encalhado em um penhasco!', {imfile, posição})
list = {'Continuar', 'Parar'};
idx = menu ('O que devo fazer?', lista);
se idx == 2
pausa
fim
% O que fazer se um objeto for detectado na frente do bot:
% pare, volte, tire uma foto, alerte o usuário sobre a descoberta
% via e-mail, gire 90 graus e continue explorando
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
r.bipe ('A1 ^, A1 ^, A4 ^, A2 ^, G2 ^, G2 ^, G4 ^, Bb2 ^, Bb2 ^, Bb3.5 ^, G1 ^, A8 ^')
img = r.getImage;
imwrite (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
posição = savepos (pos);
%---------------------------
sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição})
ângulo = 90;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.setDriveVelocity (v, v);
% O que fazer se o objeto for detectado à esquerda do bot:
% pare, vire em direção ao objeto, recue, tire uma foto, alerta
% usuário de descoberta via e-mail, vire 90 graus e continue explorando
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
ângulo = 30;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
r.bipe ('A4 ^, A4 ^, G1 ^, E1 ^, C3.5 ^, C2 ^^, C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, E8 ^')
img = r.getImage;
imwrite (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
posição = savepos (pos);
%---------------------------
sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição})
ângulo = -90;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.setDriveVelocity (v, v);
% O que fazer se o objeto for detectado à direita do bot:
% pare, vire em direção ao objeto, recue, tire uma foto, alerta
% usuário de descoberta via e-mail, vire 90 graus e continue explorando
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
ângulo = -30;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
pausa (1,5);
r.bipe ('C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, C8 ^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
posição = savepos (pos);
%---------------------------
sendmail (mail, 'Alerta!', 'Encontrei algo!', {imfile, posição});
ângulo = 90;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.setDriveVelocity (v, v);
% O que fazer se o penhasco for detectado à esquerda do bot:
% pare, mova para trás, vire à direita, continue explorando
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % get x coordinate
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obter a coordenada y
i = i + 1;
ângulo = -RandAngle;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.setDriveVelocity (v, v);
% O que fazer se o penhasco for detectado à direita do bot:
% pare, mova para trás, vire à esquerda, continue explorando
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (ângulo); % get x coordinate
pos (i, 2) = dist * cosd (ângulo); % obter a coordenada y
i = i + 1;
r.moveDistance (-. 125);
ângulo = Ângulo Rand;
rede = rede + ângulo;
r.turnAngle (ângulo);
r.setDriveVelocity (v, v);
fim
fim
Controlador de smartphone
Opções = {'Autônomo', 'Controle Manual'}
Prompt = menu ('Como você gostaria de controlar o rover?', Opções)
m = mobiledev
r = roomba (19)
se Prompt == 1
Explorador)
outro
enquanto verdadeiro
pausa (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Lado = PhoneData (3);
se lado> 130 || Lado <-130% se o telefone estiver virado para baixo, interromper o roomba e sair do loop
r.stop
r.bipe ('C, C, C, C')
pausa
elseif Side> 25 && Side <40% se o telefone for virado de lado entre 25 e 40 graus, vire à esquerda 5 graus
r.turnAngle (-5);
elseif Side> 40% se o telefone for virado de lado por mais de 40 graus, vire à esquerda 45 graus
r.turnAngle (-45)
elseif Side-40% se o telefone for virado de lado entre -25 e -40 graus, vire à direita 5 graus
r.turnAngle (5);
elseif Side <-40% se o telefone for virado para o lado menos de -40 graus, vire à esquerda 45 graus
r.turnAngle (45)
fim
% Se o telefone for segurado perto da vertical, pegue uma imagem e plote-a
se Pitch <-60 && image <= 9
r.beep
img = r.getImage;
subtrama (3, 3, imagem)
imshow (img)
fim
% movem para frente e para trás com base na orientação frontal e traseira
se o pitch> 15 && Pitch <35% se o pitch entre 15 e 35 graus, avance uma curta distância
% obtém dados de bumper leves antes de mover
litBump = r.getLightBumpers;
if litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% se algo estiver na frente do roomba e irá bater se mover para frente, fazer barulho e exibir uma mensagem
r.beep ('C ^^, F # ^, C ^^, F # ^')
else% move
r.moveDistance (0,03);
% Obtenha dados do bumper depois de mover
Bump = r.getBumpers;
if Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r.bipe ('A, C, E')
r.moveDistance (-. 01)
fim
% obtém dados do sensor de penhasco
Cliff = r.getCliffSensors;
se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
fim
fim
elseif Pitch> 35% se pitch maior 35 graus mover para frente a uma distância maior
% obtém dados de bumper leves antes de mover
litBump = r.getLightBumpers;
if litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% se algo estiver na frente do roomba e irá bater se mover para frente, fazer barulho e exibir uma mensagem
r.beep ('C ^^, F # ^, C ^^, F # ^')
else% move
r.moveDistance (.3)
% Obtenha dados do bumper depois de mover
Bump = r.getBumpers;
if Bump.right == 1 || Bump.left == 1 || Bump.front == 1% se você bater em algo, faça um barulho, exiba uma mensagem e faça backup
r.bipe ('A, C, E')
r.moveDistance (-. 01)
fim
% obtém dados do sensor de penhasco após a movimentação
Cliff = r.getCliffSensors;
se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
fim
fim
elseif Pitch-35% se pitch entre -15 e -35 graus mover para trás curta distância
r.moveDistance (-. 03);
% obtém dados do sensor de penhasco após a movimentação
Cliff = r.getCliffSensors;
se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e faça backup
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
fim
elseif Pitch-60% se o pitch entre -35 e -60 graus mover para trás em uma distância maior
r.moveDistance (-. 3)
% obtém dados do sensor de penhasco após a movimentação
Cliff = r.getCliffSensors;
se Cliff.esquerdo> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% se algo acionar o sensor de penhasco, trate-o como lava e recue
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
fim
fim
fim
fim
Recomendado:
Transformando qualquer carro R / C em um carro R / C de controle de aplicativo Bluetooth: 9 etapas
Transformando qualquer carro R / C em um carro R / C de controle de aplicativo Bluetooth: Este projeto mostra as etapas para transformar um carro de controle remoto comum em um carro de controle Bluetooth (BLE) com placa de robótica Wombatics SAM01, Blynk App e MIT App Inventor. muitos carros RC de baixo custo com muitos recursos, como faróis de LED e
Transformando a porta USB das placas baseadas em SAMD21 em uma porta serial de hardware !: 3 etapas
Transformando a porta USB das placas baseadas em SAMD21 em uma porta serial de hardware! Hoje em dia, é padrão usar uma porta USB da placa Arduino (ou qualquer outra compatível) como porta serial emulada. Isso é muito útil para depurar, enviar e receber dados de nossas adoráveis placas. Eu estava trabalhando no uChip quando, passando pelo datash
Transformando um fone de ouvido de computador antigo em um microfone: 4 etapas
Transformando um fone de ouvido de computador antigo em um microfone: bom dia. Encontrei este fone de ouvido com microfone por perto. Eu testei e o microfone ainda está bom, enquanto o fone de ouvido não estava. Já tenho um novo par de fones de ouvido e não quero jogar isso fora. E então tive uma ideia
Transformando um Compressor de Geladeira em uma Bomba de Vácuo: 5 Etapas
Transformando um Compressor de Geladeira em uma Bomba de Vácuo: Há algum tempo eu queria uma bomba de vácuo, mas me recuso a pagar o preço por uma nova que pareça ter força e capacidade suficientes de que imagino precisar. Eu li em diferentes fóruns sobre a fabricação de uma bomba de vácuo a partir de um compressor de geladeira, mas
Transformando seu Windows XP ou Vista em um Mac e Linux: 10 etapas
Transformando seu Windows XP ou Vista em um Mac e Linux: Este Instructable mostrará como transformar seu windows pc em um mac e pc, bem como rodar Linux.- Eu recomendo que você tenha pelo menos 2 GB de RAM - e mais de 10 GB de espaço no disco rígido (se você quiser Linux) Vista ou XP é recomendado - estou fazendo isso em