Olá,

Estou com um problema em um código, eu necessito que o arduino funcione sem uma conexão com o computador, porém o código só funciona à partir do momento que eu abro o serial monitor. Estou utilizando um Sensor MPU6050 para fazer a leitura em ângulos, e quando ele verificar o ângulo ajustado, ele irá acionar um relé. Porém so funciona com o Serial monitor conectado.

Agradeço pela ajuda!!

#include <Wire.h>

//Direcionamento de leitura
const int MPU=0x68;

//Conversão de valores
#define A_R 16384.0
#define G_R 131.0

//Conversão de radianos para graus 180/PI
#define RAD_A_DEG = 57.295779

int AcX, AcY, AcZ, GyX, GyY, GyZ;

int relep = 7;
int relen = 8;

//Angulos
float Acc[2];
float Gy[2];
float Angle[2];

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
 

  pinMode(relep, OUTPUT);   //saida dos reles
  pinMode(relen, OUTPUT);
}

void loop()
{
  //Leitura dos valores do acelerometro.
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true);
  AcX = Wire.read() 8 | Wire.read();
  AcY = Wire.read() 8 | Wire.read();
  AcZ = Wire.read() 8 | Wire.read();

  //A partir dos valores brutos do acelerômetro, calcula-se os Ângulos X e Y.
  Acc[1] = atan(-1 * (AcX / A_R) / sqrt(pow((AcY / A_R), 2) + pow((AcZ / A_R), 2))) * RAD_TO_DEG;
  Acc[0] = atan((AcY / A_R) / sqrt(pow((AcX / A_R), 2) + pow((AcZ / A_R), 2))) * RAD_TO_DEG;

  //Leitura dos valores do giroscópio.
  Wire.beginTransmission(MPU);
  Wire.write(0x43);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 4, true);
  GyX = Wire.read() 8 | Wire.read();
  GyY = Wire.read() 8 | Wire.read();

  //Calculo do angulo do giroscópio
  Gy[0] = GyX / G_R;
  Gy[1] = GyY / G_R;

  //Aplicação do filtro complementar
  Angle[0] = 0.98 * (Angle[0] + Gy[0] * 0.010) + 0.02 * Acc[0];
  Angle[1] = 0.98 * (Angle[1] + Gy[1] * 0.010) + 0.02 * Acc[1];

  //Serial mostra os ângulos medidos.
 // Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("\n");
 // Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("\n------------\n");

  //Malha de controle de acionamento
  if (Angle[0] > 5) {

    digitalWrite(relen, LOW);
      digitalWrite(relep, HIGH);
  }
  if ((Angle[0] < 5) && (Angle[0] > -5)) {   
      digitalWrite(relep, LOW);
      digitalWrite(relen, LOW);
    }
  
  if (Angle[0] < -5) {
    
    digitalWrite(relep, LOW);
digitalWrite(relen, HIGH);
    }
 
  delay(10);
}

Exibições: 1393

Responder esta

Respostas a este tópico

Possuo também um módulo relé duplo, que estao ligados nas portas digitais 7 e 8.

Bom dia!

Desculpem me intrometer, mas nada disso faz sentido. Acho que as ligações estão erradas.

A library wire no arduino UNO usa os pinos analógicos A4 e A5 e a Serial usa os pinos 0 e 1.

A menos que exista uma conexão nesses pinos (0 e 1), a Serial não teria nenhuma participação nesse processo, a não ser exibir os dados pelo monitor serial

No Arduino Mega, os pinos que devem ser usados são 20 e 21.

O relê não funciona ou os dados não são exibidos?

Boa tarde!

Exatamente, porém o arduino não esta conseguindo entregar os calculos dos angulos. Ele esta travando na hora das condições, porém à partir do momento em que ele reinicia, via botão, ou abertura do Serial Monitor ele executa a função de maneira correta.

Ele trava nas verificações 

if (Angulo[0]>5){

xxxx;

}

Obrigado!

Isso é um mistério realmente, pois as ligações estão corretas.
Quanto ao programa, um ponto que pode ser revisto é a comparação com floats que não é exata como com ints.

Procure usar pontos nas constantes float:

if (Angulo[0]>5.0){

xxxx;

}

Ou use abs:

if (abs(Angulo[0] - 5.0) > 0.0001){

xxxx;

}

Matheus, boa tarde!

Outra coisa que pode ser feita é dar um pequeno delay no setup antes de iniciar o wire.

Isso dará tempo aos dispositivos para se estabilizarem eletricamente.

Isso talvez substitua o reset.

delay(3000);

Oi MRM, boa tarde.

este seu caso está deveras estranho.

Mas estava relendo o seu tópico e me veio à cabeça uma interrogação.

Qual é o modelo do modulo que você está usando?

Ele é para +5V ou para 3.3V de alimentação.

Ele tem a interface de +5V <--> 3.3 V  para SDA e SCL ?

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço