sábado, 11 de fevereiro de 2017

Controle de 2 eixos com acelerômetro

Controle de 2 eixos com acelerômetro e Arduino UNO



Nesse tutorial vamos demostrar o controle de dois eixos simulados por servo motores que vão simular o X e Y.
A novidade nessa postagem é que vamos fazer uso de um acelerômetro com giroscópio MPU - 6050, que é facilmente encontrado para compra em sites da internet e casas especializadas em eletrônicos.

MPU - 6050


Essa placa contém um conversor analógico de 16 bits por canal, estabelecendo alta precisão na captura dos eixos X, Y e Z, mesmo quando acionados ao mesmo tempo. As características de um acelerômetro e giroscópio, proporciona ao usuário trabalhar com projetos que incluem 6 eixos de liberdade (3 para acelerômetro e 3 
para giroscópio). Além do mais o sensor MPU - 6050 conta com um sensor de temperatura que variam medições em torno de -40°C até +85°C. 
fonte: https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf 

Pinagem do MPU - 6050

De uma maneira geral, as funções dos pinos do MPU - 6050 pode ser dada conforme abaixo:

  • Vcc: Alimentação (3,3V à 5V);
  • GND: 0V;
  • SCL: I2C Serial Clock (SCL);
  • SDA (Slave_Data): I2C Serial Data (SDA);
  • XDA: I2C Master Serial Data, para conexão de sensor auxiliar;
  • XCL: I2C Master Serial Clock, para conexão de sensor auxiliar;
  • AD0: Define o endereço da I2C;
  • INT: pino para interrupção.

fonte: próprio autor

O pino ADO (endereço) define como endereço 12C do sensor como 0x68, conectando-o à tensão de 3,3v da placa o endereço é alterado para 0x69, permitindo o uso de dois módulos acelerômetro/ giroscópio MPU - 6050 em um mesmo circuito.

Servo motores

Os servos motores já foram abordados anteriormente aqui no site, pra quem ainda tem dúvidas, acesse o link e leia sobre o assunto.

Esquema de ligação

Para o projeto pode-se começar realizando a ligação do circuito conforme o esquema abaixo com os componentes:

Arduino UNO (ou similar)
Acelerômetro/giroscópio GY521 MPU - 6050
Servos motores
Protoboard (matriz de contatos)
Cabos jumpers
Fonte externa 5v 1A
fonte: próprio autor

O código fonte

Copie e cole o código fonte na IDE do seu Arduino para o funcionamento correto do seu projeto.

/* 
 /** Código **/
// Elaborado por Tony Emerson Marim em 10/02/2017.
/** mecatronizando@gmail.com **/
  /*www.mecatronizando.com.br */ 
/** Controle de eixo X e Y com acelerometro/giroscopio**/
/*Baseado no original de www.giuseppecaccavale.it
*/

#include <Wire.h>
#include <Servo.h>

const int MPU=0x68;  // I2C endereço do MPU-6050
int16_t GyX, GyY; //Variavel int a 16bit

Servo ServoMot_X;
Servo ServoMot_Y;

void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  
  ServoMot_X.attach(8);
  ServoMot_Y.attach(9);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);                // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)

  int PosServo_X = map(GyX, -16000, 16000, 0, 179);
  int PosServo_Y = map(GyY, -16000, 16000, 0, 179);
  ServoMot_X.write(PosServo_X);
  ServoMot_Y.write(PosServo_Y);

  Serial.println("Giroscopio");
  Serial.print("Acelerometro X : "); Serial.println(PosServo_X);
  Serial.print("Acelerometro Y : "); Serial.println(PosServo_Y);
  Serial.println(" ");
  delay(100);
}

No vídeo abaixo é possível ver o funcionamento do circuito.


Caso seja necessário o material do tutorial pode ser baixado por meio desse LINK!
Gostou? Curta nossa FanPage!
Assine o nosso canal!

Não deixe de acompanhar a nova Seção <<<NOTAS DE AULA>>>


Bons Estudos!

2 comentários: