Índice:

Uma maneira de usar uma unidade de medição inercial?: 6 etapas
Uma maneira de usar uma unidade de medição inercial?: 6 etapas
Anonim
Uma maneira de usar uma unidade de medição inercial?
Uma maneira de usar uma unidade de medição inercial?

O contexto:

Estou construindo para me divertir um robô que quero mover autonomamente dentro de uma casa.

É um trabalho longo e estou fazendo passo a passo.

Já publiquei 2 instructables sobre esse assunto:

  • um sobre como fazer um codificador de roda
  • um sobre conexão wi-fi

Meu robô é acionado por 2 motores CC com a ajuda do meu codificador de roda feito em casa.

Atualmente, estou melhorando o controle de movimento e passei algum tempo com giroscópio, acelerômetro e IMU. Terei prazer em compartilhar essa experiência.

Você quer saber mais sobre localização? Aqui está um artigo sobre como combinar inteligência artificial e ultrassom para localizar o robô

Etapa 1: Por que usar uma unidade de medição inercial?

Por que usar uma unidade de medição inercial?
Por que usar uma unidade de medição inercial?

Então, por que usei uma IMU?

A primeira razão é que se o codificador de roda é preciso o suficiente para controlar o movimento reto, mesmo após o ajuste, eu não fui capaz de obter uma precisão de rotação inferior a + - 5 graus e isso não é suficiente.

Tentei 2 sensores diferentes. Primeiramente eu uso um magnetômetro (LSM303D). O princípio era simples: antes da rotação, obtenha a orientação norte, calcule o alvo e ajuste o movimento até que o alvo seja alcançado. Foi um pouco melhor do que com o codificador, mas com muita dispersão. Depois disso, tentei usar um giroscópio (L3GD20). O princípio era apenas integrar a velocidade de rotação fornecida pelo sensor para computar a rotação. E funcionou bem. Consegui controlar a rotação a + - 1 grau.

Mesmo assim, estava curioso para experimentar alguns IMU. Eu escolho um componente BNO055. Passei algum tempo entendendo e testando esta IMU. No final decidi selecionar este sensor pelos seguintes motivos

  • Posso controlar a rotação tão bem quanto com o L3GD20
  • Posso detectar uma ligeira rotação ao mover em linha reta
  • Preciso obter a orientação norte para a localização do robô e a calibração da bússola do BNO055 é muito simples

Etapa 2: como usar o BNO055 para localização 2D?

Como usar o BNO055 para localização 2D?
Como usar o BNO055 para localização 2D?

BNO055 IMU é um sensor inteligente de 9 eixos da Bosch que pode fornecer orientação absoluta.

A folha de dados fornece uma documentação completa. É um componente de alta tecnologia, é um produto bastante complexo e passei algumas horas aprendendo como funciona e experimentando diferentes formas de utilizá-lo.

Acho que pode ser útil compartilhar essa experiência.

Em primeiro lugar, usei a biblioteca Adafruit, que fornece uma boa ferramenta para calibrar e descobrir o sensor.

No final e depois de muitos testes, decidi

  • use a biblioteca Adafruit apenas para salvar a calibração
  • use 3 de todos os modos possíveis de BNO055 (NDOF, IMU, Compss)
  • dedicar um Arduino Nano para calcular a localização com base em medições BNO055

Etapa 3: Ponto de Vista do Hardware

Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue

BNO055 é um componente I2C. Portanto, ele precisa de fonte de alimentação, SDA e SCL para se comunicar.

Apenas tome cuidado com a tensão Vdd de acordo com o produto que você comprou. O chip da Bosch funciona na faixa: 2,4 V a 3,6 V e você pode encontrar componentes de 3,3 V e 5 V.

Não há dificuldades para conectar o Nano e o BNO055.

  • O BNO055 é movido pelo Nano
  • SDA e SCL são conectados com 2 resistores pull-up de 2k.
  • 3 LEDs conectados ao Nano para diagnóstico (com resistores)
  • 2 conectores usados para definir o modo após a inicialização
  • 1 conector em direção ao BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 conector em direção ao Robô / Mega (+ 9V, Gnd, sda, Scl, Pin11, Pin12)

Um pouco de solda e pronto!

Etapa 4: Como funciona?

Como funciona ?
Como funciona ?

Do ponto de vista da comunicação:

  • O Nano é o barramento mestre I2C
  • O Robot / Mega e o BNO055 são escravos I2C
  • O Nano lê os registros BNO055 permanentemente
  • O Robot / Mega sobe um sinal numérico para solicitar a palavra do Nano

Do ponto de vista do cálculo: O Nano combinado com o BNO055 oferece

  • O título da bússola (usado para localização)
  • Um rumo relativo (usado para controlar as rotações)
  • O rumo e a posição absolutos (usados para controlar os movimentos)

Do ponto de vista funcional: The Nano:

  • gerencia a calibração BNO055
  • gerencia os parâmetros e comandos BNO055

O subsistema Nano e BNO055:

  • calcular para cada roda do robô o rumo absoluto e a localização (com um fator de escala)
  • calcular o rumo relativo durante a rotação do robô

Etapa 5: a arquitetura e o software

A Arquitetura e Software
A Arquitetura e Software

O software principal está rodando em um Arduino Nano

  • A arquitetura é baseada na comunicação I2C.
  • Optei por dedicar um Nano devido ao fato de que o Atmega que roda o robô já estava carregado e essa arquitetura torna mais fácil reutilizá-lo em outro lugar.
  • O Nano lê os registros BNO055, calcula e armazena o cabeçalho e a localização em seus próprios registros.
  • O Arduino Atmega que executa o código do robô, envia informações dos codificadores de rodas para o Nano e lê os cabeçalhos e a localização dentro dos registradores do Nano.

O código de subsistema (Nano) está disponível aqui no GitHub

A ferramenta de calibração Adafruit se aqui no GitHub (a calibração será armazenada no eeproom)

Etapa 6: O que eu aprendi?

Em relação a I2C

Primeiramente tentei ter 2 mestres (Arduino) e 1 escravo (sensor) no mesmo barramento, mas no final é possível e mais fácil configurar apenas o Nano como mestre e usar a conexão GPIO entre os 2 Arduinos para "solicitar o token".

Em relação ao BNO055 para orientação 2D

Posso me concentrar em 3 modos de execução diferentes: NDOF (combinar giroscópio, acelerômetro e Compas) quando o robô está ocioso, IMU (combinar giroscópio, acelerômetro) quando o robô está se movendo e Bússola durante a fase de localização. Alternar entre esses modos é fácil e rápido.

Para reduzir o tamanho do código e manter a possibilidade de usar a interrupção BNO055 para detectar colisão, prefiro não usar a biblioteca Adafruit e fazê-lo por conta própria.

Recomendado: