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);
}
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por