Tags:
Teste pressionando o botão de reset do Arduino, após reconectar o cabo USB.
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.
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.
Isto pode ser um problema de tensão. Fez as medições sugeridas por mim?
Meça a tensão do 5V no Arduino, quando desconecta o cabo USB.
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);
}
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por