Boa noite, estou a utilizar o giroscópio e o Arduíno para indicar ângulos num LCD. O problema e o seguinte eu envio o código para o Arduíno mas quando desconecto do PC e volto a Connectar não volta a mostrar os ângulos no LCD. Alguem já teve este problema que me possa ajudar?

Exibições: 614

Responder esta

Respostas a este tópico

Teste pressionando o botão de reset do Arduino, após reconectar o cabo USB.

Fica igual, ao voltar a conectar o Arduíno ao pc, no LCD devia de aparecer os ângulos mas em vez dos ângulos aparece "nan"

Meça a tensão da fonte e do 5V no Arduino, quando desconecta o cabo USB.

Pode ser que a sua fonte não esta adequada.

Mas eu nao tenho nenhuma fonte conectada, apenas o computador é que esta conectado.

A alimentação do cabo USB aguenta um Arduino + Giroscópio + LCD ?

Já calculou qual é o total de corrente consumida?

Teste com uma fonte externa. Assim o Arduino não desligará quando soltar o cabo.

Eu ligo uma fonte externa e envio o código para o arduino, depois retiro o cabo do computador e fica a funcionar. Mas quando desligo a fonte externa e volto a ligar já não volta a aparecer os ângulos, aparece "nan"

Isto pode ser um problema de tensão. Fez as medições sugeridas por mim?

A minha fonte de alimentação é de 10v, está ligada no Vin do Arduino

Meça a tensão  do 5V no Arduino, quando desconecta o cabo USB.

Sim, quando desconecto faço a medição com um multímetro e o arduino fica com uma tensão de 4,99v.

Tensão OK ! Envie diagrama, sketch e fotos da sua montagem. 

#include <Wire.h>
#include <LiquidCrystal.h>

const int ledPin = 13;
int ledState = LOW; // ledState usado para o estado do LED
long previousMillis = 0; // will Guardará a última mudança do LED
long interval = 500;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Direccion I2C de la IMU
#define MPU 0x68
#define MPU2 0x69
//Ratios de conversion
#define A_R 16384.0
#define G_R 131.0

//Conversion de radianes a grados 180/PI
#define RAD_A_DEG = 57.295779

//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;
int16_t AcX2, AcY2, AcZ2, GyX2, GyY2, GyZ2;
//Angulos
float Acc[2];
float Gy[2];
float Angle[2];
float Acc2[2];
float Gy2[2];
float Angle2[2];

void setup()
{
digitalWrite(0,OUTPUT);
digitalWrite(0,LOW);
digitalWrite(13,OUTPUT);
digitalWrite(13,LOW);
analogWrite(6,80);

pinMode(ledPin, OUTPUT);

lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("3D Cake");

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

Wire.begin();
Wire.beginTransmission(MPU2);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);

}
void loop()
{
lcd.setCursor(0,0);
lcd.print("3D Cake");

//Leer los valores del Acelerometro de la IMU
Wire.beginTransmission(MPU);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
AcX=Wire.read()8|Wire.read(); //Cada valor ocupa 2 registros
AcY=Wire.read()8|Wire.read();
AcZ=Wire.read()8|Wire.read();

//Se calculan los angulos Y, X respectivamente. (primer IMU)
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;


Wire.beginTransmission(MPU2);
Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU2,6,true); //A partir del 0x3B, se piden 6 registros
AcX2=Wire.read()8|Wire.read(); //Cada valor ocupa 2 registros
AcY2=Wire.read()8|Wire.read();
AcZ2=Wire.read()8|Wire.read();

//Se calculan los angulos Y, X respectivamente.(segundo IMU)
Acc2[1] = atan(-1*(AcX2/A_R)/sqrt(pow((AcY2/A_R),2) + pow((AcZ2/A_R),2)))*RAD_TO_DEG;
Acc2[0] = atan((AcY2/A_R)/sqrt(pow((AcX2/A_R),2) + pow((AcZ2/A_R),2)))*RAD_TO_DEG;

//Leer los valores del Giroscopio
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
GyX=Wire.read()8|Wire.read();
GyY=Wire.read()8|Wire.read();

//Calculo del angulo del Giroscopio
Gy[0] = GyX/G_R;
Gy[1] = GyY/G_R;

//Aplicar el Filtro Complementario
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];

//Mostrar los valores por consola
//Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("\n");
//Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("\n------------\n");

lcd.setCursor(0,0);
lcd.print("3D Cake");
lcd.setCursor(0,1);
lcd.print("X:"); lcd.print(Angle[0]);
lcd.setCursor(8,1);
lcd.print("Y:"); lcd.print(Angle[1]);
delay(1); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida

Wire.beginTransmission(MPU2);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU2,4,true); //A diferencia del Acelerometro, solo se piden 4 registros

unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// salva a última vez que você piscou o LED
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;


if (Angle[0] >-0.10 && Angle[0]<0 && Angle[1]>-1 && Angle[1]<-0.25)
{
// Serial.print("impressao");

//lcd.print("3D Cake");
//lcd.setCursor(0, 1);
//lcd.print("Pronta");
digitalWrite(ledPin, HIGH);

}else{

//lcd.print("3D Cake");
//lcd.setCursor(0, 1);
// lcd.print("desnivelada");
digitalWrite(ledPin, ledState);



}
delay(4000); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida
lcd.clear();
delay(10);


}

}

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço