Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Controle de um robô Roomba com Arduino e dispositivo Android

Componentes e suprimentos

Roomba Create2
× 1
Arduino UNO
× 1
SparkFun Botão de pressão 12 mm
× 1

Aplicativos e serviços online

Controle remoto MJRoBot BT - aplicativo Android

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_Ctrl

Processo de manufatura

  1. Controle de um efeito com sensores reais
  2. Faça um detector de incêndio em minutos com Samsung SAMIIO, Arduino UNO e Raspberry Pi
  3. Construa seu robô de streaming de vídeo controlado pela Internet com Arduino e Raspberry Pi
  4. Controle remoto universal usando Arduino, 1Sheeld e Android
  5. Obstáculos para evitar o robô com servo motor
  6. Termômetro portátil com dispositivo Android
  7. Controle do Servo Motor com Arduino e MPU6050
  8. Controle de brilho do LED usando Bolt e Arduino
  9. u-blox LEA-6H 02 Módulo GPS com Arduino e Python
  10. Reconhecimento de fala e síntese com Arduino