Controle de um robô Roomba com Arduino e dispositivo Android
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
|
Sobre este projeto
Como um dos vencedores do Instructables Robotics Contest 2016, recebi como prêmio um iRobot Roomba Create2. É uma plataforma excelente e muito acessível para o desenvolvimento de robótica, custando cerca de US $ 200. O Create 2 permite uma variedade de métodos de programação. Para começar, usei-o com um Arduino e um aplicativo Android para mover o robô. Neste primeiro tutorial, explorarei como conectar o Arduino ao Roomba via porta serial e como comandar seus motores, LEDS e som. Em projetos futuros, explorarei seus sensores e também usarei um Raspberry Pi para conectar o Roomba à internet.
Abaixo, um vídeo mostrando meus primeiros resultados programando um robô Roomba:
Etapa 1:lista de materiais
- iRobot Create2
- Arduino UNO
- Módulo Bluetooth HC-06
- Botão de pressão
Etapa 2:Roomba Create2
O Roomba é um robô de tração diferencial, com 2 rodas e rodízio frontal. Sua velocidade vai até 500 mm / se pode ser comandada para subir ou voltar.
Para a sinalização podemos contar com 4 display de 7 segmentos e 5 LEDs (ver figura):
- Limpo
- Spot
- Dock
- Aviso / Cheque
- Sujeira / detritos
Como sensores internos, temos entre outros:
- Detector de penhasco (4 na frente)
- detectores de aumento (2 na frente)
- Codificadores de roda
Para programação, deve ser usado o documento:iRobot® Create® 2 Open Interface (OI). O Roomba pode ser programado em 3 modos:
Modo passivo:
- Ao enviar o comando Iniciar ou qualquer um dos comandos do modo de limpeza (por exemplo, Spot, Clean, Seek Dock), o OI entra no modo Passivo. Quando o OI está no modo Passivo, você pode solicitar e receber dados do sensor usando qualquer um dos comandos do sensor, mas não pode alterar os parâmetros de comando atuais para os atuadores (motores, alto-falante, luzes, drivers de baixo, saídas digitais) para outra coisa .
Modo de segurança:oferece controle total do Roomba, com exceção das seguintes condições relacionadas à segurança:
- Carregador conectado e ligado.
- Detecção de queda de roda (em qualquer roda).
- Detecção de um penhasco enquanto se move para frente (ou para trás com um pequeno raio de giro, menos de um raio de robô).
- Se uma das condições relacionadas à segurança acima ocorrer enquanto o OI está no modo de segurança, o Roomba para todos os motores e retorna ao modo passivo.
Modo completo:
- Dá a você controle total sobre o Roomba, todos os seus atuadores e todas as condições relacionadas à segurança que são restritas quando o OI está no modo de segurança, já que o modo completo desliga o penhasco, queda da roda e recursos de segurança do carregador interno .
Etapa 3:a conexão serial
Para comunicação entre o Roomba e o Arduino, a porta serial será usada. Por padrão, o Roomba se comunica a 115.200 baud, mas para se comunicar com o Arduino, vamos alterá-lo para 19.200.
Existem 2 maneiras de definir a taxa de transmissão do Roomba:
- Ao desligar o Roomba, continue pressionando o botão Clean / Power depois que a luz se apaga. Após cerca de 10 segundos, o Roomba toca uma melodia de tons decrescentes. O Roomba se comunicará a 19.200 baud até que o processador perca a energia da bateria ou a taxa de baud seja explicitamente alterada por meio da OI.
- Use o pino de alteração da taxa de transmissão (pino 5 no conector Mini-DIN) para alterar a taxa de transmissão do Roomba. Depois de ligar o Roomba, aguarde 2 segundos e, em seguida, pressione a alteração da taxa de baud três vezes. Cada pulso deve durar entre 50 e 500 milissegundos. O Roomba se comunicará a 19200 baud até que o processador perca a energia da bateria ou a taxa de baud seja explicitamente alterada por meio do OI.
O diagrama acima mostra como o Arduino deve ser conectado ao conector Roomba Mini-DIN
Etapa 4:iniciar o Roomba
A primeira coisa que deve ser feita ao programar um Roomba é:
- "Acorde" o robô
- Defina o modo (seguro ou completo)
Podemos "acordá-lo", enviando um pulso baixo para o pino 5 do Mini-DIN (detectar a entrada do dispositivo), conforme mostrado na função abaixo:
void wakeUp (void) {setWarningLED (ON); digitalWrite (ddPin, HIGH); atraso (100); digitalWrite (ddPin, LOW); atraso (500); digitalWrite (ddPin, HIGH); atraso (2000);}
Para iniciar o Roomba sempre 2 códigos devem ser enviados:"START" [128] e o modo, no nosso caso "SAFE MODE" [131]. Se você deseja um "MODO COMPLETO", o código [132] deve ser enviado.
void startSafe () {Roomba.write (128); // Iniciar Roomba.write (131); // Atraso do modo de segurança (1000);}
Etapa 5:Ligando os LEDs e a tela
Ligando os LEDs
Conforme descrito na introdução, o Roomba tem 5 LEDs:
- Power / Clean (bicolor vermelho / verde e intensidade controlada)
- Spot (Verde, intensidade fixa)
- Dock (verde, intensidade fixa)
- Aviso / Verificar (laranja, intensidade fixa)
- Sujeira / detritos (azul, intensidade fixa)
Todos os LEDs podem ser comandados usando o código [139]. Para controlar o LED de energia, você deve enviar dois bytes de dados para o Roomba:"cor" e "intensidade".
Cor:
- Verde =0
- laranja =128
- vermelho =255
Intensidade:
- Baixo =0
- Máx =255
A função setPowerLED (byte setColor, byte setIntensity) faz isso:
void setDigitLEDs (byte dígito1, byte dígito2, byte dígito3, byte dígito4) {Roomba.write (163); Roomba.write (digit1); Roomba.write (dígito2); Roomba.write (digit3); Roomba.write (digit4);}
Por exemplo, para ligar o LED POWER com a cor laranja na metade de sua intensidade, você pode chamar a função conforme abaixo:
setPowerLED (128, 128);
Para ligar os 4 LEDs restantes, as funções abaixo devem ser usadas:
setDebrisLED (ON); setDockLED (ON); setSpotLED (ON); setWarningLED (ON);
Todas as funções acima possuem um código semelhante a este:
void setDebrisLED (bool ativar) {debrisLED =ativar; Roomba.write (139); Roomba.write ((debrisLED? 1:0) + (spotLED? 2:0) + (dockLED? 4:0) + (warningLED? 8:0)); Roomba.write (cor (byte)); Roomba.write ((byte) intensidade);}
Basicamente, a diferença será a linha:
debrisLED =ativar;
que deve ser alterado habilitando cada um dos outros LEDs ( spotLED, dockLED, warningLED )
Envio de mensagens para exibição
O Roomba tem quatro telas de 7 segmentos que você pode usar para enviar mensagens de duas maneiras diferentes:
- Código [163]:LEDs de dígitos brutos (numéricos)
- Código [164]:Dígitos LEDs ASCII (Aproximação de letras e códigos especiais)
Exibir números é muito fácil. Deve-se enviar o código [163], seguindo os 4 dígitos a serem exibidos. A função: setDigitLEDs (byte dígito1, byte dígito2, byte dígito3, byte dígito4) faz isso por você:
void setDigitLEDs (byte dígito1, byte dígito2, byte dígito3, byte dígito4) {Roomba.write (163); Roomba.write (digit1); Roomba.write (dígito2); Roomba.write (digit3); Roomba.write (digit4);}
Por exemplo, para exibir "1, 2, 3, 4", você deve chamar a função:
setDigitLEDs (1, 2, 3, 4);
Com o código [164], é possível enviar aproximação de ASCII. A função setDigitLEDFromASCII (dígito de byte, letra de caractere) faz isso conosco:
void setDigitLEDFromASCII (byte dig, char letter) {switch (dig) {case 1:digit1 =letter; pausa; caso 2:dígito 2 =letra; pausa; caso 3:dígito3 =letra; pausa; caso 4:dígito4 =letra; pausa; } Roomba.write (164); Roomba.write (digit1); Roomba.write (dígito2); Roomba.write (digit3); Roomba.write (digit4);}
Para simplificar, crio uma nova função para enviar os 4 dígitos ao mesmo tempo:
void writeLEDs (char a, char b, char c, char d) {setDigitLEDFromASCII (1, a); setDigitLEDFromASCII (2, b); setDigitLEDFromASCII (3, c); setDigitLEDFromASCII (4, d);}
Por exemplo, para exibir "STOP", você deve chamar a função:
writeLEDs ('s', 't', 'o', 'p');
Etapa 6:mover o Roomba
Para mobilidade, o Roomba tem 2 motores CC independentes que podem ser programados para funcionar até 500 mm / s. Existem vários comandos que podem ser usados para conduzir o robô. Os principais são:
- Código [137]:Drive ==> Deve enviar +/- Velocidade em mm / se +/- Raio em mm
- Código [145]:Drive Direct ==> Deve enviar Velocidade Esquerda / Direita em mm / s (+ para Avançar e - para Retroceder)
- Código [146]:Drive PWM ==> Deve enviar +/- dados PWM para as rodas esquerda e direita
Abaixo está o código para essas 3 opções:
drive vazio (velocidade interna, raio interno) {grampo (velocidade, -500, 500); // def velocidade máxima e mínima em mm / s clamp (raio, -2000, 2000); // def raio máximo e mínimo em mm Roomba.write (137); Roomba.write (velocidade>> 8); Roomba.write (velocidade); Roomba.write (raio>> 8); Roomba.write (radius);} // ---------------------------------------- ----------------------- vazio driveWheels (int right, int left) {clamp (right, -500, 500); braçadeira (esquerda, -500, 500); Roomba.write (145); Roomba.write (direita>> 8); Roomba.write (à direita); Roomba.write (esquerdo>> 8); Roomba.write (à esquerda); } // ----------------------------------------------- ---------------- vazio driveWheelsPWM (int rightPWM, int leftPWM) {clamp (rightPWM, -255, 255); braçadeira (leftPWM, -255, 255); Roomba.write (146); Roomba.write (rightPWM>> 8); Roomba.write (rightPWM); Roomba.write (leftPWM>> 8); Roomba.write (leftPWM);}
Observe que a função "grampo" define os valores máximo e mínimo que podem ser inseridos. Esta função é definida no arquivo rombaDefines.h:
#define clamp (value, min, max) (value max? max:value)
Usando o código acima, funções mais simples podem ser criadas para orientar o Roomba:
/ ------------------------------------------- -------------------- vazio turnCW (velocidade curta sem sinal, graus curtos sem sinal) {drive (velocidade, -1); braçadeira (velocidade, 0, 500); atraso (6600); drive (0,0);} // ---------------------------------------- ----------------------- vazio turnCCW (velocidade curta sem sinal, graus curtos sem sinal) {drive (velocidade, 1); braçadeira (velocidade, 0, 500); atraso (6600); drive (0,0);} // ---------------------------------------- ----------------------- void driveStop (void) {drive (0,0);} // ----------- -------------------------------------------------- --void driveLeft (int left) {driveWheels (left, 0);} // ------------------------------- -------------------------------- void driveRight (int right) {driveWheels (0, right);}
Observe que para virar em ângulo, o argumento "atraso" deve ser calculado especificamente para uma determinada velocidade. Abaixo alguns exemplos que podem ser usados para testar os motores:
turnCW (40, 180); // gira 180 graus no sentido horário e stopdriveWheels (20, -20); // girar driveLeft (20); // virando à esquerda
Para testar os motores, é bom adicionar um push button externo (no meu caso conectado ao Arduino pino 12), para que você possa baixar o código para o Arduino, iniciando o Roomba, mas interrompendo a execução até que o botão seja pressionado. Normalmente, para teste de motores, você pode fazê-lo na parte de configuração do código.
Como exemplo, consulte o código simples do Arduino abaixo (observe que o código usa funções e definições desenvolvidas antes):
#include "roombaDefines.h" #include // Roomba Create2 connectionint rxPin =10; int txPin =11; SoftwareSerial Roomba (rxPin, txPin); // ------ --------------------------------------- void setup () {Roomba.begin (19200); pinMode (ddPin, OUTPUT); pinMode (buttonPin, INPUT_PULLUP); // conectado ao pino 12 do Arduino e usado para "iniciar" o atraso (2000); acordar (); // Wake-up Roomba startSafe (); // Iniciar o Roomba no modo de segurança while (digitalRead (buttonPin)) {} // esperar que o botão seja pressionado para executar código de execução contínua turnCW (40, 180); // teste o Roomba gire 180 graus no sentido horário e pare} // ----------------------------------- ---------- void loop () {}
Etapa 7:controle do Roomba via Bluetooth
Para completar nossa primeira parte do projeto, vamos instalar um módulo Bluetooth (HC-06) em nosso Arduino. O diagrama acima mostra como fazer isso. Normalmente, o HC-06 é ajustado de fábrica com uma taxa de transmissão de 9.600. É importante que você altere para 19.200 para ser compatível com a velocidade de comunicação do Arduino-Roomba. Você pode fazer isso enviando um comando AT para o módulo (AT + BAUD5 onde "5" é o código para 19.200).
Se você tiver alguma dúvida sobre o funcionamento do HC-06, dê uma olhada no meu tutorial:Conectando "coisas" via Bluetooth / Android / Arduino.
Para controlar o Roomba, usaremos um App genérico que foi desenvolvido por mim para controlar robôs móveis, usando o MIT AppInventor 2:"MJRoBot BT Remote Control". O aplicativo pode ser baixado gratuitamente na loja do Google por meio do link:Aplicativo:MJRoBot BT Remote Control.
O aplicativo possui uma interface simples, permitindo enviar comandos ao módulo BT em ambos, modo TEXTO ou diretamente por meio de botões pré-programados (cada vez que um botão é pressionado, um caractere é enviado):
- w:para frente
- s:para trás
- d:Certo
- a:Esquerda
- f:Pare
- p:ON / OFF (não usado nesta primeira parte)
- m:Manual / Automático (usado para reiniciar o Roomba se um obstáculo como um penhasco for encontrado no Modo de segurança)
- +:Velocidade +
- -:Velocidade -
Você também pode enviar outros comandos como texto, se necessário. Também existe uma janela de texto para mensagens recebidas do módulo BT. Este recurso é muito importante durante a fase de testes, podendo ser utilizado da mesma forma que o "Monitor Serial".
O loop () parte do código estará "ouvindo" o dispositivo bluetooth e dependendo do comando recebido, execute uma ação:
void loop () {checkBTcmd (); // verifique se um comando é recebido do controle remoto BT manualCmd ();}
A função checkBTcmd () é mostrado abaixo:
void checkBTcmd () // verifica se um comando é recebido do controle remoto BT {if (BT1.available ()) {command =BT1.read (); BT1.flush (); }}
Assim que um comando é recebido, a função manualCmd () tomará a ação apropriada:
void manualCmd () {switch (command) {case 'm':startSafe (); Serial.print ("Roomba em modo de segurança"); BT1.print ("Roomba BT Ctrl OK - Modo de segurança"); BT1.println ('\ n'); comando ='f'; playSound (3); pausa; case 'f':driveStop (); // desligar ambos os motores writeLEDs ('s', 't', 'o', 'p'); estado =comando; pausa; caso 'w':drive (motorSpeed, 0); writeLEDs ('', 'g', 'o', ''); estado =comando; pausa; caso 'd':driveRight (motorSpeed); writeLEDs ('r', 'i', 'g', 'h'); pausa; caso 'a':driveLeft (motorSpeed); writeLEDs ('l', 'e', 'f', 't'); pausa; case 's':drive (-motorSpeed, 0); writeLEDs ('b', 'a', 'c', 'k'); estado =comando; pausa; caso '+':if (estado =='w') {motorSpeed =motorSpeed + 10; if (motorSpeed> MAX_SPEED) {motorSpeed =MAX_SPEED; } comando ='w'; } else {command =state;} break; case '-':if (state =='w') {motorSpeed =motorSpeed - 10; } if (motorSpeed
Etapa 8:Conclusão
O código Arduino completo usado aqui e documentos relacionados podem ser encontrados em meu GITHUB:Roomba_BT_Ctrl.
Observe que nem todos os atuadores Roomba foram comentados neste tutorial. Existem outros motores, usados para limpeza, outros LEDs usados para programação, botões, sensores, etc.
Várias das funções que criei em meu programa foram baseadas na biblioteca Create 2 desenvolvida por Dom Amato. Você pode baixar a biblioteca completa em: https://github.com/brinnLabs/Create2 .
Minha intenção aqui era manter a simplicidade e dar a você uma plataforma inicial para começar a jogar com o Roomba. No futuro, pretendo publicar outros tutoriais, usando um Raspberry-Pi, conectar o Roomba à internet, ler seus sensores, etc.
Como sempre, espero que este projeto possa ajudar outras pessoas a encontrar seu caminho no emocionante mundo da eletrônica e da robótica!
Para mais projetos, visite meu blog (em português):
MJRoBot.org
Saludos do sul do mundo!
Vejo vocês no meu próximo tutorial!
Obrigada
Marcelo
Código
Github
https://github.com/Mjrovai/Roomba_BT_CtrlProcesso de manufatura
- Controle de um efeito com sensores reais
- Faça um detector de incêndio em minutos com Samsung SAMIIO, Arduino UNO e Raspberry Pi
- Construa seu robô de streaming de vídeo controlado pela Internet com Arduino e Raspberry Pi
- Controle remoto universal usando Arduino, 1Sheeld e Android
- Obstáculos para evitar o robô com servo motor
- Termômetro portátil com dispositivo Android
- Controle do Servo Motor com Arduino e MPU6050
- Controle de brilho do LED usando Bolt e Arduino
- u-blox LEA-6H 02 Módulo GPS com Arduino e Python
- Reconhecimento de fala e síntese com Arduino