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

Oi MRM, boa noite.

A compilar o seu código deu erro  de compilação nestas linhas:

  AcX = Wire.read() 8 | Wire.read();
  AcY = Wire.read() 8 | Wire.read();
  AcZ = Wire.read() 8 | Wire.read();

  GyX = Wire.read() 8 | Wire.read();
  GyY = Wire.read() 8 | Wire.read();

Está faltando algo entre os () e os 8.

Eu até imagino o que é. 

Então pra que os amigos entendam quando eu digo que postar code na área de texto não é recomendado,

aqui está um caso prático.

MRM, recomendo você ler o tópico :   http://labdegaragem.com/forum/topics/sugest-o-de-como-postar,

e entenderá o que ocorre.

Uma pergunta:  O que você quis dizer com "só funciona com o Serial monitor conectado"?

Quis dizer que usando a alimentação da USB funciona, mas usando uma fonte externa não funciona?

Rui

Rui

Boa noite Rui.

Exatamente, o arduino so executa a função de acionar um relé quando esta conectado via USB no computador. Porém não basta estar conectado ao PC, é necessario que abra o programa Arduino e clique no "Monitor Serial" se não realizar este procedimento, o Arduino não aciona o Relé.

O objetivo deste programa, é fazer a leitura em graus, usando um acelerometro MPU6050 e acionar um relé quando o angulo de 5 graus for atingido. Algumas partes do codigo nao estão comentadas, pois nao criei todo o codigo, adaptei para a minha necessidade, segue abaixo o código.

Tentei copiar o codigo HTML aqui como você recomendou, porém não objetive sucesso. Entao resolvi carregar o arquivo .INO

Agradeço desde já a atenção, 

Obrigado!!!

Anexos

Rui, alguns caracteres somem ao serem postados como texto:

Minha sugestão  para teste. Modifique isso para comentários com //

Correto José.

Esta foi a primeira coisa que eu pensei também, comentei esta linha, sem sucesso, na sequencia comentei também as 2 linhas que iniciam o Serial Monitor porém ainda sem sucesso. Estou usando um Arduino Nano, não sei o que pode ser, agora vou testar em um arduino Uno, em outro Nano, porém isto não faz sentido para mim.

Obrigado!

Desabilitou a serial também, não é  ?

//Serial.begin(9600);

Como esta alimentando o Arduino, quando desconecta o cabo USB ?

Mostre o diagrama das suas ligações. 

Oi MRM, bom dia.

Uma dúvida:

qdo esta condição é atendida?

     if ((Angle[0] < 5) && (Angle[0] > -5))

Rui

Bom dia!

Quando o angulo esta entre o valor 5 e -5. 

<5 (menor que 5) 

>-5 (maior que -5)

Obrigado!

Ok, voce está certo, eu que me confundi.

Acabei de carregar o código em um Arduino Uno, porém o problema continua, ele só funciona após abrir o Serial Monitor.

Tenho uma boa notícia, não sei por qual motivo, mas quando conecto ele, e aperto o botão reset, o arduino funciona perfeitamente, existe alguma maneira de inserir um reset no código?

Obrigado!

MRM,

voce pode postar o desenho com esquema como ligou ele, o arduino e o PC?

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço