Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
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?
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?
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
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?
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
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.