[Duvida] giro de 90º com auxilio do HMC5883L

Blz pessoal, estou fazendo um projeto e nele meu robo tem que fazer um giro de 90º, estou usando um magnetômetro HMC5883L que me da o polo magnetico, (não tenho encoder) estou fazendo um codigo bem simples so para realizar a curva mas estou com problema, a função para salvar o angulo atual enta relacionada ao calculo do angulo e esta sempre se atualizando, como salvo um valor momentâneo sem que ele seja subscrito ate segunda ordem?

no momento o setGraus esta sempre se atualizando nunca chegando ao valor desejado


codigo usado:

‪#‎include‬ <Wire.h> //Include a biblioteca Wire.h
#include <HMC5883L.h>

HMC5883L bussola; 
//controle motores
‪#‎define‬ E1 8
#define ME2 9
#define ME1 10
#define E2 13
#define MD2 12
#define MD1 11

float graus; //Variável para armazenar o valor aferido
float precisao; //Variável parar o melhorar a precisao do valor aferido

int setGraus = 0;
int lastSetGraus = 0;

void setup() {
Serial.begin(9600);

pinMode(E1, OUTPUT);
pinMode(ME1, OUTPUT);
pinMode(ME2, OUTPUT);
pinMode(E2, OUTPUT);
pinMode(MD1, OUTPUT);
pinMode(MD2, OUTPUT);

Wire.begin(); //Inicia a comunicação o I2C
//Configura a bússola
bussola = HMC5883L();
bussola.SetScale(1.3);
bussola.SetMeasurementMode(Measurement_Continuous);
//===================


}

void angulos(){
precisao = 0; //Zera a variável para uma nova leitura

for(int i=0;i<100;i++) //Faz a leitura 100 e armazenar a somatória
{

//Pega os dados necessários para o cálculo da bússola digital
MagnetometerScaled scaled = bussola.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = 0.3339; //Compensação dos polos (São Paulo)
heading += declinationAngle;
//===========================================================
//Converte o valor aferido para angulo
if(heading < 0)
{
heading += 2*PI;

if(heading > 2*PI)
{
heading -= 2*PI;

graus = heading * 180/M_PI;
//===================================

precisao = precisao + graus;
delay(1);

}

graus = precisao/100; //Pega a somatória e tira a média dos valores aferidos

}

void loop() {
angulos();
setGraus = graus;

if ( graus > lastSetGraus - 90){ // para este sentido (esquerda) o angulo sempre diminui
digitalWrite(E1, HIGH);
digitalWrite(ME1, LOW);
digitalWrite(ME2,HIGH);
digitalWrite(E2, HIGH);
digitalWrite(MD1, HIGH);
digitalWrite(MD2, LOW);
}

lastSetGraus = setGraus;
delay(1000);
}

Exibições: 402

Responder esta

Respostas a este tópico

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço