Robo Sumo: lutas inteligentes com robôs


( c ) A

cada ano, cerca de mil equipes de todo o Japão participam de uma feroz batalha em um torneio de robôs. Neste concurso, você não verá motosserras, tochas e descargas elétricas - em resumo, nada que lhe ocorre quando você ouvir a frase "batalha de robôs".

Não se trata apenas da batalha - é um sumô robótico que é valorizado por suas qualidades especiais: elegância, simplicidade e capacidade de mostrar inteligência na estratégia. A competição ocorre em um anel redondo de metal com apenas 1,5 m de diâmetro, ao longo do perímetro do qual é traçada uma linha branca de 5 cm de largura.Um robô que atravessa essa fronteira é considerado um perdedor. E nessa aparente simplicidade jaz um abismo de oportunidade.

Contaremos como a “batalha de robôs” se tornou uma competição intelectual para programadores e forneceremos instruções detalhadas para a montagem de um robo-sumô.

Sensores de busca de fronteiras e inimigos



( c ) Os

olhos do robô são sensores infravermelhos. O grau de reflexão IR é medido por um elemento fotossensível. A cor branca da borda não foi escolhida por acaso - ela reflete mais luz do que a superfície preta do anel.

O robô está equipado com vários sensores infravermelhos responsáveis ​​pela "busca" da fronteira. Os sensores frontais, como regra, ajudam a controlar a velocidade do movimento - o lutador não deve deixar o campo devido ao zelo excessivo. Os sensores traseiros “seguem” a abordagem da borda do anel: tendo recebido uma resposta deles, o robô muda de direção.

E medindo o tempo necessário para refletir os raios, você pode entender a localização do inimigo. Muitos robôs (mas não todos) mudam de direção, considerando esse parâmetro.

Regras de batalha



Além das vantagens listadas acima, os sensores de infravermelho também têm uma desvantagem - o campo de visão permanece estreito, devido ao aparecimento de muitos pontos cegos, cuja utilização no ataque é a principal estratégia de robôs altamente manobráveis.

No entanto, isso funciona apenas com robôs autônomos. Quando um sumoist robótico independente colide com um oponente controlado por rádio, ele não pode usar a estratégia de ataque da zona cega, pois o operador vê mais do que o robô.

Em vez de atacar pontos cegos, os Autobots usam uma estratégia de ataque dos cantos. Em geral, o lutador não tem muitas manobras disponíveis: girar, empurrar, frear e parar.

No entanto, para confundir o inimigo, alguns lutadores jogam bandeiras brancas em um ou nos dois lados do casco. Atraindo o inimigo para a bandeira, eles atacam seu lado vulnerável e o empurram para fora do ringue.

Obviamente, surgiram maneiras de se defender contra esse ataque. O aparecimento de bandeiras à esquerda e à direita significa que o corpo do robô está no centro. Se o robô jogou a bandeira de um lado, seu corpo está no lugar oposto.

Alguns bots podem não apenas atrair o inimigo, mas também ocultar seus sensores. Para fazer isso, eles são pintados de preto ou revestimentos refletivos são adicionados.

Armamento



A batalha dos robôs sumôistas não é apenas um alvo. Muitos deles estão equipados com uma lâmina afiada de escavadeira. Ele permite que você levante seu oponente e o mova para fora da quadra ou até cause danos graves. É verdade que esta arma reduz a capacidade de manobra do lutador.

Em um sumô humano, a principal arma do lutador é sua massa impressionante. Curiosamente, em robôs, a massa também desempenha um "papel significativo".

Apesar do fato de que, de acordo com as regras, o comprimento do robô (em ambos os lados) não excede 20 cm e o peso não deve ser superior a 3 kg, o robo-sumoist pode "pesar" várias dezenas de quilogramas. Este "peso" é alcançado através de ímãs. Sim, às vezes a técnica pode "grudar" praticamente no chão, já que o anel é baseado em uma superfície de metal.

Mente da máquina


Ao criar robôs, cuja principal tática é a alta capacidade de manobra, menos ímãs são usados. A ênfase principal neste caso é colocada em um motor poderoso. No entanto, a vitória na batalha raramente depende apenas de ferro.

O principal para os robôs de sumô é a estratégia, escrita na forma de código. A escolha do ferro também depende disso. Frequentemente, os robôs se movem tão rápido que é difícil acompanhar seus movimentos. No entanto, o comportamento super manobrável é baseado na lógica estrita do programa. Considere os princípios pelos quais é criado.

Criação de robôs de sumô



Vamos voltar à experiência de especialistas do site hackster.io que prepararam um guia completo sobre a criação de um típico robô-sumo.

Os seguintes componentes são usados ​​no projeto:

  • Controlador CytronTechnologies × 1;
  • sensor infravermelho (3-80 cm) × 5;
  • conjunto de rodas de silicone JSumo (52 x 30 mm) × 2;
  • módulo de rastreamento infravermelho × 2;
  • Motor de engrenagem CC (12 V, 380 rpm) × 4;
  • Bateria LiPo (11,1 V, 1300 mAh) × 1.


1. Controlador


Você pode usar o Arduino Uno, Mega ou Nano. Você também precisará de uma placa para conectar todos os sensores. Obviamente, você pode criar sua própria placa de expansão e conectar todos os contatos ao Arduino, ou comprar uma placa pronta e conectar todos os componentes eletrônicos.


2. O motor


Essa é uma das partes mais importantes das quais depende o desempenho do robô. Idealmente, você precisa de um motor com alta velocidade e torque, mas, neste caso, seu tamanho será grande. Você deve garantir que todos os motores e rodas caibam em uma caixa de 20 x 20 cm.

Existem vários tipos de motores que você pode usar em seu projeto.

Um motor com uma engrenagem cilíndrica e planetária , na qual o eixo de saída é paralelo ao motor.


Motor de engrenagem helicoidal . O eixo de saída aqui é perpendicular. Essa opção pode ser preferível, pois haverá mais espaço no robô para outros componentes.


Duas rodas vs quatro rodas


Uma tração nas quatro rodas definitivamente dará mais oportunidades para empurrar um robô oponente. No entanto, sua mobilidade é menor que a de uma de duas rodas. Ainda assim, a tração nas quatro rodas foi usada neste projeto de demonstração.

3. Rodas



Não há muitas opções de borracha boa para um robô de sumô no mercado. Os engenheiros optaram por rodas de silicone fabricadas pela Jsumo. No entanto, você pode usar as rodas de um carro de brinquedo.

Preste atenção na montagem - verifique se a roda selecionada corresponde ao tamanho do furo correspondente ao eixo de saída do motor. Este projeto utiliza um eixo de 6 mm, respectivamente, a roda possui um orifício de 6 mm.

4. Sensores



Para detectar objetos, você pode usar os dois sensores infravermelhos e, por exemplo, ultrassônicos.

Os especialistas recomendam iniciar um ataque quando a distância do inimigo não for superior a 60 cm, portanto, é possível colocar um sensor com um alcance de sensibilidade de até 1 m.


Para este robô, foram instalados três sensores infravermelhos - um por lado.


Um sensor infravermelho também deve ser instalado na parte inferior do robô, o que ajudará a detectar uma linha branca na borda do anel. Você pode instalar vários conjuntos de sensores de borda na frente e na traseira, dependendo da sua estratégia de direção.

5. Bateria



Uma bateria de polímero de lítio é normalmente usada, pois fornece mais energia do que outros tipos de bateria do mesmo tamanho.

6. O chassi do robô


Você pode usar a base pronta da Cytron, que se ajusta ao tamanho permitido do robô (20 x 20 cm), ou faça você mesmo do zero.


Como a impressão 3D é mais econômica, o mergulhador compartilhou arquivos para impressão doméstica.


7. Montagem


O diagrama e a tabela abaixo fornecem uma visão geral das conexões com fio do robô Sumo.



Primeiro, você precisa soldar dois fios (o tamanho recomendado é 16-18 AWG) no terminal do motor e depois conectá-lo ao controlador.


Além disso, todos os motores e sensores precisam ser soldados com fios.


Agora nos voltamos para a montagem dentro do gabinete. Use os parafusos M3x10 para montar os motores no alojamento inferior.


Instale sensores infravermelhos no lado direito e esquerdo.


Aperte o aro da roda com o parafuso M4 e, em seguida, coloque a fita de silicone.

O parafuso de ajuste deve ser preso à parte plana do eixo do motor redondo.


Em seguida, usando um parafuso autorroscante, instale o sensor de borda na parte inferior da lâmina.


Na parte frontal da caixa inferior, você verá dois orifícios destinados a colocar os fios dos sensores de borda.


Monte a lâmina com a carcaça inferior usando os parafusos e porcas M6x20.


Instale sensores infravermelhos no suporte frontal antes de conectá-lo à minúscula.


Depois de montar todos os sensores e motores, recomendamos marcar cada fio para que seja mais fácil solucionar problemas no futuro.


Corrija o suporte da placa de circuito.


Verifique a polaridade da bateria e dos sensores antes de conectar à placa e lembre-se de remover a bateria antes de continuar conectando outros componentes à placa.


Como este é um robô com tração nas quatro rodas, dois motores de um lado devem ser conectados para controlá-los simultaneamente.


Ao usar um exemplo de código pronto , é melhor conectar todos os motores e sensores às mesmas portas, mostradas nas ilustrações.


Finalmente, conecte a bateria.


O robô Sumo está pronto!

8. Calibração do sensor


Um passo importante é a calibração antes da programação. Infelizmente, a maioria dos recém-chegados não presta a devida atenção a isso ao configurar o robô.

Verifique se os sensores estão operando dentro da faixa de sensibilidade necessária.

O alcance máximo de sensibilidade do sensor de busca inimigo é de 80 cm. Neste projeto, o robô não deve responder a um objeto localizado a uma distância de 60 a 80 cm, portanto, o alcance de sensibilidade é reduzido em 20 cm.


Para fazer isso, coloque o robô "voltado" para uma superfície branca e plana a uma distância de 60 cm e ajuste o sensor até que o indicador LED se apague. O procedimento é mostrado em mais detalhes no vídeo.


Os sensores de borda são ajustados usando uma chave de fenda através do orifício na lâmina.

Usando o software, você pode exibir os sinais de dois sensores de borda nos LEDs D0 e D1.


Isso é necessário para garantir que o sensor emita um sinal de saída alto quando detectar uma superfície branca e um baixo em uma superfície preta (preste atenção aos LEDs em D0 e D1 no vídeo acima).

9. Programação


Como o controlador do robô URC10 é compatível com o Arduino UNO, o Arduino IDE é usado para programação. Você pode dar um exemplo de código pronto .

A única biblioteca usada no projeto é CytronMotorDrivers .

Se você não sabe como habilitar a biblioteca ou baixar o código de amostra, consulte o manual do URC10 .

O programa de robô de sumô pode ser basicamente dividido em quatro partes:

  • início de performance;
  • Procurar;
  • ataque;
  • retiro.

void loop() {
  //   .
  if (!digitalRead(EDGE_L)) {
    //     .
    backoff(RIGHT);
 
    //   .
    searchDir ^= 1;
  }
 
  //   .
  else if (!digitalRead(EDGE_R)) {
    //     .
    backoff(LEFT);
 
    //   .
    searchDir ^= 1;
  }
 
  //   .
  else {
    //  ,    .
    if ( digitalRead(OPPONENT_FC) &&
         digitalRead(OPPONENT_FL) &&
         digitalRead(OPPONENT_FR) &&
         digitalRead(OPPONENT_L) &&
         digitalRead(OPPONENT_R) ) {
      search();
    }
 
    // ,      .
    else {
      attack();
    }
  }
 
 
  //     .
  if (!digitalRead(BUTTON)) {
    //  .
    motorL.setSpeed(0);
    motorR.setSpeed(0);
 
    // .
    while (1);
  }
}

Início do desempenho


A estratégia inicial depende das regras da competição. Um robô só pode começar a se mover após 5 segundos e às vezes em 1 segundo.

Acontece que as regras permitem que você coloque o robô em qualquer lugar do ringue. Em outros casos, o robô deve estar em uma determinada "zona inicial".

Neste exemplo, o robô está programado para se movimentar e atacar o oponente pelo lado assim que o jogo começa.

void startRoutine() {
  // .
  delay(1000);
 
  //    45 .
  motorL.setSpeed(255);
  motorR.setSpeed(0);
  delay(180);
 
  //  .
  motorL.setSpeed(255);
  motorR.setSpeed(255);
  delay(450);
 
  //  ,     .
  motorL.setSpeed(-0);
  motorR.setSpeed(255);
  uint32_t startTimestamp = millis();
  while (digitalRead(OPPONENT_FC)) {
    // ,        .
    if (millis() - startTimestamp > 400) {
      break;
    }
  }
 
}


Procurar


Se, imediatamente após o início, não foi possível atacar o inimigo, o robô contornará o anel em círculo para encontrar o oponente. Uma vez detectado, o modo de busca será interrompido e o robô continuará atacando.

void search() {
  //   .
  if (searchDir == LEFT) {
    motorL.setSpeed(100);
    motorR.setSpeed(255);
  } else {
    motorL.setSpeed(255);
    motorR.setSpeed(100);
  }
}


Ataque


Quando um inimigo é detectado por um dos cinco sensores, o robô vira em sua direção e ataca a toda velocidade.

A precisão do ataque depende de quão claramente seu robô pode rastrear o inimigo ao avançar a toda velocidade. Se o inimigo conseguir escapar, o programa retomará o trabalho no modo de busca.

void attack() {
  uint32_t attackTimestamp = millis();
  //    .
  //     .
  if (!digitalRead(OPPONENT_FC)) {
    motorL.setSpeed(255);
    motorR.setSpeed(255);
  }
 
  //   .
  //  .
  else if (!digitalRead(OPPONENT_FL)) {
    motorL.setSpeed(0);
    motorR.setSpeed(255);
  }
 
  //   .
  //  .
  else if (!digitalRead(OPPONENT_FR)) {
    motorL.setSpeed(255);
    motorR.setSpeed(0);
  }
 
  //   .
  //     ,     .
  else if (!digitalRead(OPPONENT_L)) {
    motorL.setSpeed(-150);
    motorR.setSpeed(150);
    while (digitalRead(OPPONENT_FC)) {
      // ,    .
      if (millis() - attackTimestamp > 400) {
        break;
      }
    }
  }
 
  //   .
  //     ,     .
  else if (digitalRead(OPPONENT_R) == 0) {
    motorL.setSpeed(150);
    motorR.setSpeed(-150);
    while (digitalRead(OPPONENT_FC)) {
      // ,    .
      if (millis() - attackTimestamp > 400) {
        break;
      }
    }
  }
}


Retiro


Quando um dos sensores de borda detecta uma linha branca, o robô precisa dar um passo atrás e se virar. Durante a rotação, o robô continuará procurando o inimigo. Se aparecer, será atacado.

void backoff(uint8_t dir) {
  //  .
  motorL.setSpeed(0);
  motorR.setSpeed(0);
  delay(100);
 
  // .
  motorL.setSpeed(-255);
  motorR.setSpeed(-255);
  delay(200);
 
  //  .
  motorL.setSpeed(0);
  motorR.setSpeed(0);
  delay(100);
 
  // .
  if (dir == LEFT) {
    motorL.setSpeed(-150);
    motorR.setSpeed(150);
  } else {
    motorL.setSpeed(150);
    motorR.setSpeed(-150);
  }
  delay(100);
 
  //   
  //  -   .
  uint32_t uTurnTimestamp = millis();
  while (millis() - uTurnTimestamp < 300) {
    //   ,     .
    if ( !digitalRead(OPPONENT_FC) ||
         !digitalRead(OPPONENT_FL) ||
         !digitalRead(OPPONENT_FR) ||
         !digitalRead(OPPONENT_L) ||
         !digitalRead(OPPONENT_R) ) {
      //  .
      motorL.setSpeed(0);
      motorR.setSpeed(0);
      delay(100);
 
      //    .
      return;
    }
  }
 
  //    ,         .
  motorL.setSpeed(255);
  motorR.setSpeed(255);
  delay(200);
}


Isso é tudo. Agora você pode assistir a um vídeo que demonstra como o robô se move a partir desta lição.


Você já tem experiência na construção de um robô para competições semelhantes? Compartilhe estratégias vencedoras nos comentários.

Fontes


Montagem de robôs DIY: https://www.hackster.io/cytron-technologies/building-a-sumo-robot-45d703

Competição nacional de robôs de sumô no Japão: http://www.fsi.co.jp/sumo/en /index.html Conjunto de regras

ilustrado: http://www.robotroom.com/SumoRules.html

All Articles