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

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Neste tutorial, vamos aprender como medir ângulo e rastrear orientação usando o Arduino e o sensor Acelerômetro ADXL345. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo para mais detalhes.

Visão Geral

Primeiro, explicarei como o sensor funciona e como ler os dados dele, e então, usando o ambiente de desenvolvimento Processing, faremos uma visualização 3D da orientação do acelerômetro.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Como Funciona o Acelerômetro ADXL345

Para começar, vamos ver como o sensor ADXL345 funciona. Este é um acelerômetro de 3 eixos que pode medir tanto forças de aceleração estáticas quanto dinâmicas. A força gravitacional da Terra é um exemplo típico de força estática, enquanto forças dinâmicas podem ser causadas por vibrações, movimentos e assim por diante.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

A unidade de medida para aceleração é metro por segundo quadrado (m/s²). No entanto, sensores acelerômetros geralmente expressam as medições em "g" ou gravidade. Um "g" é o valor da força gravitacional da Terra, que é igual a 9,8 metros por segundo quadrado.

Então, se tivermos um acelerômetro posicionado plano, com seu eixo Z apontando para cima, oposto à força gravitacional, a saída do eixo Z do sensor será 1g. Por outro lado, as saídas X e Y serão zero, porque a força gravitacional é perpendicular a estes eixos e não os afeta de forma alguma.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Se virarmos o sensor de cabeça para baixo, a saída do eixo Z será -1g. Isso significa que as saídas do sensor devido à sua orientação em relação à gravidade podem variar de -1g a +1g.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Então, de acordo com estes dados e usando alguma matemática trigonométrica, podemos calcular o ângulo em que o sensor está posicionado.

Como Ler Dados do Acelerômetro ADXL345 com Arduino

Ok, agora vamos ver como podemos ler os dados do acelerômetro ADXL345 usando o Arduino. Este sensor usa o protocolo I2C para comunicação com o Arduino, então precisamos apenas de dois fios para conectá-lo, mais os dois fios para alimentá-lo.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Você pode obter os componentes necessários para este Tutorial Arduino nos links abaixo:

  • Acelerômetro ADXL345 ………………. Amazon / Banggood / AliExpress
  • Placa Arduino ……………………………..
  • Protoboard e Fios Jumpers …………

Código Arduino para Acelerômetro ADXL345

Aqui está o código Arduino para leitura dos dados do acelerômetro ADXL345.

/* Arduino e Tutorial Acelerômetro ADXL345 por Dejan, https://howtomechatronics.com */ #include <Wire.h> // Biblioteca Wire - usada para comunicação I2C int ADXL345 = 0x53; // Endereço I2C do sensor ADXL345 float X_out, Y_out, Z_out; // Saídas void setup() { Serial.begin(9600); // Inicia comunicação serial para imprimir resultados no Monitor Serial Wire.begin(); // Inicia a biblioteca Wire // Coloca ADXL345 em modo de medição Wire.beginTransmission(ADXL345); // Inicia comunicação com o dispositivo Wire.write(0x2D); // Acessa/fala com Registrador POWER_CTL - 0x2D // Habilita medição Wire.write(8); // (8dec -> 0000 1000 binário) Bit D3 Alto para habilitar medição Wire.endTransmission(); delay(10); } void loop() { // === Ler dados do acelerômetro === // Wire.beginTransmission(ADXL345); Wire.write(0x32); // Inicia com registrador 0x32 (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(ADXL345, 6, true); // Lê 6 registradores total, cada valor de eixo armazenado em 2 registradores X_out = ( Wire.read() | Wire.read() << 8); // valor eixo X X_out = X_out / 256; // Para faixa de +-2g, dividimos valores brutos por 256, segundo datasheet Y_out = ( Wire.read() | Wire.read() << 8); // valor eixo Y Y_out = Y_out / 256; Z_out = ( Wire.read() | Wire.read() << 8); // valor eixo Z Z_out = Z_out / 256; Serial.print("Xa= "); Serial.print(X_out); Serial.print(" Ya= "); Serial.print(Y_out); Serial.print(" Za= "); Serial.println(Z_out); }

Descrição: Primeiro, precisamos incluir a biblioteca Wire.h que é usada para comunicação I2C. Se você quiser aprender mais sobre como a comunicação I2C funciona e como usá-la com Arduino, pode conferir meu outro tutorial detalhado para isso.

Cada dispositivo que usa comunicação I2C tem um endereço I2C único, e este endereço pode ser encontrado no datasheet do sensor (Datasheet ADXL345). Então, uma vez definidos o endereço e as variáveis para as três saídas, na seção setup, primeiro precisamos inicializar a biblioteca wire e depois colocar o acelerômetro em modo de medição. Para fazer isso, se dermos uma olhada no datasheet novamente, veremos que precisamos definir o bit D3 do registrador POWER_CTL como HIGH.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Então, usando a função beginTransmission(), iniciamos a comunicação, depois usando a função write() dizemos qual registrador queremos acessar, e novamente usando a função write() definimos o bit D3 como HIGH, escrevendo o número 8 em decimal que corresponde a definir o bit D3 HIGH.

// Coloca ADXL345 em modo de medição Wire.beginTransmission(ADXL345); // Inicia comunicação com o dispositivo Wire.write(0x2D); // Acessa/fala com Registrador POWER_CTL - 0x2D // Habilita medição Wire.write(8); // (8dec -> 0000 1000 binário) Bit D3 Alto para habilitar medição Wire.endTransmission();

Na seção loop, agora lemos os dados do sensor. Os dados para cada eixo são armazenados em dois bytes ou registradores. Podemos ver os endereços desses registradores no datasheet.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Para ler todos, começamos com o primeiro registrador, e usando a função requestFrom() pedimos para ler os 6 registradores. Então, usando a função read(), lemos os dados de cada registrador, e como as saídas são complemento de dois, as combinamos apropriadamente para obter os valores corretos.

// === Ler dados do acelerômetro === // Wire.beginTransmission(ADXL345); Wire.write(0x32); // Inicia com registrador 0x32 (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(ADXL345, 6, true); // Lê 6 registradores total, cada valor de eixo armazenado em 2 registradores X_out = ( Wire.read() | Wire.read() << 8); // valor eixo X X_out = X_out / 256; // Para faixa de +-2g, dividimos valores brutos por 256, segundo datasheet Y_out = ( Wire.read() | Wire.read() << 8); // valor eixo Y Y_out = Y_out / 256; Z_out = ( Wire.read() | Wire.read() << 8); // valor eixo Z Z_out = Z_out / 256;

Os valores de saída do sensor na verdade dependem da sensibilidade selecionada, que pode variar de +-2g a +-16g. A sensibilidade padrão é +-2g, por isso precisamos dividir a saída por 256 para obter valores de -1 a +1g. O 256 LSB/g significa que temos 256 contagens por g.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Dependendo da aplicação, podemos selecionar a sensibilidade apropriada. Neste caso, para rastreamento de orientação, sensibilidade +-2g é suficiente, mas para aplicações onde precisamos detectar força de aceleração maior de movimentos bruscos, choques e assim por diante, podemos escolher algumas das outras faixas de sensibilidade usando o registrador DATA_FORMAT e seus bits D1 e D0.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Calibração do Acelerômetro ADXL345

No entanto, uma vez que lemos os dados, podemos simplesmente imprimi-los no monitor serial para verificar se os valores são como esperado. No meu caso, os valores que estava obtendo não eram exatamente como deveriam ser, especialmente o eixo Z que tinha um erro perceptível de 0.1g.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Para resolver este problema, precisamos calibrar o acelerômetro usando os 3 registradores de calibração de offset, e aqui está como podemos fazer isso. Então, precisamos posicionar o sensor plano, e imprimir os valores BRUTOS sem dividi-los por 256.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Daqui, agora podemos notar o quanto as saídas estão fora. No meu caso, a saída Z estava em torno de 283. Isso é diferença de 27 no positivo. Agora precisamos dividir este valor por 4, e isso nos dará o número que precisamos escrever no registrador de offset do eixo Z. Se carregarmos o código agora, a saída do eixo Z será exatamente 256, ou 1g como deveria ser.

// Este código vai na seção SETUP // Calibração de Offset //Eixo X Wire.beginTransmission(ADXL345); Wire.write(0x1E); // Registrador de offset do eixo X Wire.write(1); Wire.endTransmission(); delay(10); //Eixo Y Wire.beginTransmission(ADXL345); Wire.write(0x1F); // Registrador de offset do eixo Y Wire.write(-2); Wire.endTransmission(); delay(10); //Eixo Z Wire.beginTransmission(ADXL345); Wire.write(0x20); // Registrador de offset do eixo Z Wire.write(-7); Wire.endTransmission(); delay(10);

Se necessário, devemos calibrar os outros eixos usando o mesmo método. E apenas uma nota rápida que esta calibração não é escrita permanentemente nos registradores. Precisamos escrever esses valores nos registradores a cada inicialização do sensor.

Uma vez terminada a calibração, agora podemos finalmente calcular o Roll e Pitch, ou a rotação em torno do eixo X e a rotação em torno do eixo Y em graus, usando estas duas fórmulas.

// Calcular Roll e Pitch (rotação em torno do eixo X, rotação em torno do eixo Y) roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI; pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI;

Para mais detalhes de como estas fórmulas funcionam, você pode conferir esta aplicação note da Freescale Semiconductor.

Arduino e Acelerômetro ADXL345 Rastreamento de Orientação – Visualização 3D

Ok, vamos fazer o exemplo de visualização 3D do acelerômetro agora.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Então, estamos usando o mesmo código, que envia os valores de Roll e Pitch pela porta serial. Aqui está o código Arduino completo:

/* Arduino e Acelerômetro ADXL345 - Exemplo de Visualização 3D por Dejan, https://howtomechatronics.com */ #include <Wire.h> // Biblioteca Wire - usada para comunicação I2C int ADXL345 = 0x53; // Endereço I2C do sensor ADXL345 float X_out, Y_out, Z_out; // Saídas float roll,pitch,rollF,pitchF=0; void setup() { Serial.begin(9600); // Inicia comunicação serial para imprimir resultados no Monitor Serial Wire.begin(); // Inicia a biblioteca Wire // Coloca ADXL345 em modo de medição Wire.beginTransmission(ADXL345); // Inicia comunicação com o dispositivo Wire.write(0x2D); // Acessa/fala com Registrador POWER_CTL - 0x2D // Habilita medição Wire.write(8); // Bit D3 Alto para habilitar medição (8dec -> 0000 1000 binário) Wire.endTransmission(); delay(10); //Calibração de Offset //Eixo X Wire.beginTransmission(ADXL345); Wire.write(0x1E); Wire.write(1); Wire.endTransmission(); delay(10); //Eixo Y Wire.beginTransmission(ADXL345); Wire.write(0x1F); Wire.write(-2); Wire.endTransmission(); delay(10); //Eixo Z Wire.beginTransmission(ADXL345); Wire.write(0x20); Wire.write(-9); Wire.endTransmission(); delay(10); } void loop() { // === Ler dados do acelerômetro === // Wire.beginTransmission(ADXL345); Wire.write(0x32); // Inicia com registrador 0x32 (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(ADXL345, 6, true); // Lê 6 registradores total, cada valor de eixo armazenado em 2 registradores X_out = ( Wire.read() | Wire.read() << 8); // valor eixo X X_out = X_out / 256; // Para faixa de +-2g, dividimos valores brutos por 256, segundo datasheet Y_out = ( Wire.read() | Wire.read() << 8); // valor eixo Y Y_out = Y_out / 256; Z_out = ( Wire.read() | Wire.read() << 8); // valor eixo Z Z_out = Z_out / 256; // Calcular Roll e Pitch (rotação em torno do eixo X, rotação em torno do eixo Y) roll = atan(Y_out / sqrt(pow(X_out, 2) + pow(Z_out, 2))) * 180 / PI; pitch = atan(-1 * X_out / sqrt(pow(Y_out, 2) + pow(Z_out, 2))) * 180 / PI; // Filtro passa-baixa rollF = 0.94 * rollF + 0.06 * roll; pitchF = 0.94 * pitchF + 0.06 * pitch; Serial.print(rollF); Serial.print("/"); Serial.println(pitchF); }

Agora, no ambiente de desenvolvimento Processing, precisamos receber esses valores e usá-los para rotacionar o objeto 3D que criaremos. Aqui está o código Processing completo:

/* Arduino e Acelerômetro ADXL345 - Exemplo de Visualização 3D por Dejan, https://howtomechatronics.com */ import processing.serial.*; import java.awt.event.KeyEvent; import java.io.IOException; Serial myPort; String data=""; float roll, pitch; void setup() { size (960, 640, P3D); myPort = new Serial(this, "COM8", 9600); // inicia comunicação serial myPort.bufferUntil('\n'); } void draw() { translate(width/2, height/2, 0); background(33); textSize(22); text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265); // Rotaciona o objeto rotateX(radians(roll)); rotateZ(radians(-pitch)); // Objeto 3D textSize(30); fill(0, 76, 153); box (386, 40, 200); // Desenha caixa textSize(25); fill(255, 255, 255); text("www.HowToMechatronics.com", -183, 10, 101); //delay(10); //println("ypr:\t" + angleX + "\t" + angleY); // Imprime valores para verificar se estamos obtendo valores adequados } // Ler dados da Porta Serial void serialEvent (Serial myPort) { // lê dados da Porta Serial até o caractere '.' e coloca na variável String "data" data = myPort.readStringUntil('\n'); // se obteve quaisquer bytes além do linefeed: if (data != null) { data = trim(data); // divide a string em "/" String items[] = split(data, '/'); if (items.length > 1) { //--- Roll,Pitch em graus roll = float(items[0]); pitch = float(items[1]); } } }

Descrição: Aqui, precisamos incluir a biblioteca serial, definir a porta serial e a taxa de baud que precisa corresponder à taxa de baud do sketch Arduino carregado. Então, lemos os dados recebidos e colocamos nas variáveis apropriadas roll e pitch. No loop principal draw, usamos esses valores para rotacionar o objeto 3D, e neste caso é uma caixa simples que tem uma cor particular e um texto nela.

Se rodarmos o sketch, o objeto 3D aparecerá e rastreará a orientação do sensor acelerômetro. Podemos notar aqui que o objeto na verdade treme um pouco e isso é porque o acelerômetro captura não apenas a força gravitacional, mas também pequenas forças geradas pelos movimentos de nossa mão. Para obter resultado mais suave, podemos usar um filtro passa-baixa simples. Aqui implementei tal filtro no código Arduino, que pega 94% do estado anterior e adiciona 6% do estado atual ou ângulo.

// Filtro passa-baixa rollF = 0.94 * rollF + 0.06 * roll; pitchF = 0.94 * pitchF + 0.06 * pitch;

Com este filtro, podemos notar que o objeto se move muito mais suave agora, mas há também um efeito colateral: responsividade mais lenta. Também podemos notar que estamos perdendo o Yaw, ou rotação em torno do eixo Z. Usando apenas os dados do acelerômetro de 3 eixos, não somos capazes de calcular o Yaw.

Para fazer isso e melhorar o desempenho geral do nosso sensor de rastreamento de orientação, na verdade precisamos incluir um sensor adicional, um giroscópio, e fundir seus dados com o acelerômetro.

Rastreie Orientação com Arduino e Acelerômetro ADXL345 – Guia Passo a Passo

Então, podemos usar o acelerômetro ADXL345 em combinação com algum sensor giroscópio, ou usar a IMU MPU6050 que tem tanto acelerômetro de 3 eixos quanto giroscópio de 3 eixos integrados em um único chip. Você pode encontrar um tutorial mais detalhado sobre este sensor no meu próximo vídeo.

Espero que tenha gostado deste tutorial e aprendido algo novo. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo e não se esqueça de conferir minha coleção de Projetos Arduino.

Processo de manufatura

  1. Arduino e MPU6050: Controle Preciso de Servomotores SG90 e MG996R
  2. Módulo GPS u-blox LEA‑6H 02: Guia de Integração com Arduino e Python
  3. Leitura de Temperatura e Umidade com DHT11 no Blynk – Tutorial Arduino Passo a Passo
  4. Dominando Reconhecimento e Síntese de Fala no Arduino Due
  5. Criar Tons Musicais com Arduino: Um Guia Passo a Passo
  6. Conectando Arduino ao NMEA‑0183: Guia Passo a Passo
  7. Dominando Modbus no Arduino: Guia Passo a Passo
  8. Cafeteira Inteligente com Arduino com Controle Bluetooth e Monitoramento de Temperatura
  9. Crie uma Fita LED Inteligente Animada Controlada por Alexa com Arduino
  10. Projeto LED Controlado por Voz: Arduino Micro + BitVoicer Server para Reconhecimento de Fala