Deprem-Sarsıntı Algılayıcı Yapımı! MPU6050 ve Arduino

selamlar youtobe deki deprem projede bazı sorunlarla karşılaştım yardımcı olur musunuz bana

Merhaba. Tinympu6050 kütüphanesinin 0.4.0 sürümünü kullanarak derledim ve ProMini’ye yükleyip devreyi çalıştırdım. Kodlarda 76. satırı LOW yerine HIGH olarak değiştirdim. Devre sarsılınca LEDler yanıp sönmeye başlıyor ve uzun süre boyunca kodlardaki 5 saniyelik gecikme dışında sürekli yanıp sönüyorlar. Sarsıntı geçse bile devre tekrar tekrar alarm vermeye devam ediyor. bir yerde bir hata var ama bulamadım yardımcı olur musunuz?

Merhabalar…

Mpu6050 ve SW-420 robotistanda satılmıyor… Bu konuda robotistan satış temsilcilerine bilgilendirme yapmış olayım…

Ayrıca forumlarda fazla destek sunanlara puan verilmesini ve puanlarla alışveriş yapabilmeyi sağlamak gerek… Forum uyuyor…

Probleme yönelik olarak;
Kodları göremiyorum fakat, sensör algıladığında while(x<5) döngüsü başlatıp , bittiğinde de LOW a döndürmek veya sistemi oto resetlemek gerek…

void(* resetFunc) (void) = 0;
resetFunc();

#include <Arduino.h>
#include <TinyMPU6050.h>

float pos_offset = 10;
float neg_offset = -10;
long angle_x, angle_y, angle_z, offset_x, offset_y, offset_z;
MPU6050 mpu (Wire);

void setup() {

// Initialization
mpu.Initialize();

// Calibration
Serial.begin(9600);
Serial.println(“=====================================”);
Serial.println(“Starting calibration…”);
Serial.println(“Calibration complete!”);
Serial.println(“Offsets:”);
Serial.print("AccX Offset = ");
Serial.println(mpu.GetAccXOffset());
Serial.print("AccY Offset = ");
Serial.println(mpu.GetAccYOffset());
Serial.print("AccZ Offset = ");
Serial.println(mpu.GetAccZOffset());
Serial.print("GyroX Offset = ");
Serial.println(mpu.GetGyroXOffset());
Serial.print("GyroY Offset = ");
Serial.println(mpu.GetGyroYOffset());
Serial.print("GyroZ Offset = ");
Serial.println(mpu.GetGyroZOffset());
pinMode(14,OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(14, LOW);
digitalWrite(9, LOW);

delay(1000);
for(int i=0; i<200;i++){
mpu.Execute();
offset_x = mpu.GetAngX();
offset_y = mpu.GetAngY();
offset_z = mpu.GetAngZ();
}
Serial.print("offset_x = “);
Serial.print(offset_x);
Serial.print(” / offsetY = “);
Serial.print(offset_y);
Serial.print(” / offsetZ = ");
Serial.println(offset_z);

}

void loop() {

for(int i=0; i<5;i++){
mpu.Execute();
angle_x = mpu.GetAngX();
angle_y = mpu.GetAngY();
angle_z = mpu.GetAngZ();
}

Serial.print("AngX = “);
Serial.print(angle_x - offset_x);
Serial.print(” / AngY = “);
Serial.print(angle_y - offset_y);
Serial.print(” / AngZ = ");
Serial.println(angle_z - offset_z);

if ( pos_offset < angle_x - offset_x || neg_offset > angle_x - offset_x || pos_offset < angle_y - offset_y || neg_offset > angle_y - offset_y || pos_offset < angle_z - offset_z || neg_offset > angle_z - offset_z){

for(int i=0; i<50; i++){
digitalWrite(14,HIGH);
digitalWrite(9,LOW);
delay(50);
digitalWrite(14,LOW);
digitalWrite(9,LOW);
delay(50);
}
delay(5000);
mpu.Execute();
offset_x = mpu.GetAngX();
offset_y = mpu.GetAngY();
offset_z = mpu.GetAngZ();

}
}

Merhabalar, void loop() içerisindeki kodu aşağıdaki şekilde değiştirdiğimde çalıştı ayrıca pro micro dışında başka bir kart kullanıyorsanız kartın scl sda pinleri farklı pinlerde olabilir kartın pin çıkışlarını internetten bakınız
Arduino Mega 2560 için pin:
scl:21
sda:20

Arduino Uno için pin:
scl:D19
sda:D18

void loop() {
for(int i=0; i<5;i++){
mpu.Execute();
angle_x = mpu.GetAngX();
angle_y = mpu.GetAngY();
angle_z = mpu.GetAngZ();
}

Serial.print("AngX = “);
Serial.print(angle_x - offset_x);
Serial.print(” / AngY = “);
Serial.print(angle_y - offset_y);
Serial.print(” / AngZ = ");
Serial.println(angle_z - offset_z);

if ( pos_offset < angle_x - offset_x || neg_offset > angle_x - offset_x || pos_offset < angle_y - offset_y || neg_offset > angle_y - offset_y || pos_offset < angle_z - offset_z || neg_offset > angle_z - offset_z){
for(int i=0; i<50; i++){
digitalWrite(14,HIGH);
digitalWrite(9,HIGH);
delay(50);
digitalWrite(14,LOW);
digitalWrite(9,LOW);
delay(50);
}
delay(5000);
setup();
}
}

yardım ıcın arkadaş bu kodlardada hata var olmuyorrr

kodun orjinalııı

#include <Arduino.h>
#include <TinyMPU6050.h>

float pos_offset = 10;
float neg_offset = -10;
long angle_x, angle_y, angle_z, offset_x, offset_y, offset_z;
MPU6050 mpu (Wire);

void setup() {

// Initialization
mpu.Initialize();

// Calibration
Serial.begin(9600);
Serial.println(“=====================================”);
Serial.println(“Starting calibration…”);
Serial.println(“Calibration complete!”);
Serial.println(“Offsets:”);
Serial.print("AccX Offset = ");
Serial.println(mpu.GetAccXOffset());
Serial.print("AccY Offset = ");
Serial.println(mpu.GetAccYOffset());
Serial.print("AccZ Offset = ");
Serial.println(mpu.GetAccZOffset());
Serial.print("GyroX Offset = ");
Serial.println(mpu.GetGyroXOffset());
Serial.print("GyroY Offset = ");
Serial.println(mpu.GetGyroYOffset());
Serial.print("GyroZ Offset = ");
Serial.println(mpu.GetGyroZOffset());
pinMode(14,OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(14, LOW);
digitalWrite(9, LOW);

delay(1000);
for(int i=0; i<200;i++){
mpu.Execute();
offset_x = mpu.GetAngX();
offset_y = mpu.GetAngY();
offset_z = mpu.GetAngZ();
}
Serial.print("offset_x = “);
Serial.print(offset_x);
Serial.print(” / offsetY = “);
Serial.print(offset_y);
Serial.print(” / offsetZ = ");
Serial.println(offset_z);

}

void loop() {

for(int i=0; i<5;i++){
mpu.Execute();
angle_x = mpu.GetAngX();
angle_y = mpu.GetAngY();
angle_z = mpu.GetAngZ();
}

Serial.print("AngX = “);
Serial.print(angle_x - offset_x);
Serial.print(” / AngY = “);
Serial.print(angle_y - offset_y);
Serial.print(” / AngZ = ");
Serial.println(angle_z - offset_z);

if ( pos_offset < angle_x - offset_x || neg_offset > angle_x - offset_x || pos_offset < angle_y - offset_y || neg_offset > angle_y - offset_y || pos_offset < angle_z - offset_z || neg_offset > angle_z - offset_z){

for(int i=0; i<50; i++){
digitalWrite(14,HIGH);
digitalWrite(9,LOW);
delay(50);
digitalWrite(14,LOW);
digitalWrite(9,LOW);
delay(50);
}
delay(5000);
mpu.Execute();
offset_x = mpu.GetAngX();
offset_y = mpu.GetAngY();
offset_z = mpu.GetAngZ();

}
}

Selamlar,ben de aynı sorunları yaşadım,76.satırdaki kodu değiştirdim devre çalışmaya başladı,ancak akım verince alarm sarsıntı olmadan çalışmaya başlıyor ve sürekli çalışıyor.
Orijinal kodu olması gerektiği gibi düzenleyip paylaşırsanız sevinirim.
Evet tekrar birkaö deneme yaptım ancak sistem çok güzel çalıştığı için sanırım açar açmaz çalışıyor yani çok hassas.Sert bir yapıştırıcı ile duvara yapıştırmıştım bu da titreşimlere karşı oldukça hassas hale getirmiş.Yatay olarak yumuşak bir zemine koyduğumda o kadar hassassiyet göstermiyor.mpu6050 yi videoda gösterildiği gibi board a yatay değil dik gelecek şekilde monte etmiştim belki bu sebeple çok hassas hale gelmiştir.Hassasiyet ile ilgili yapabileceğimiz bir ayar var mı acaba ya da kodda değiştirebileceğimiz bir kısım?

Merhaba;

Kodlarınızdaki

float pos_offset = 10;
float neg_offset = -10;

Kısmını artırabilirsiniz.

float pos_offset = 30;
float neg_offset = -30;

gibi.

1 Beğeni

Merhabalar ben bu projede arduino uno kullanıyorum ve sitedeki şema ya göre yaptım kodlarda hata yok diye gözüküyor ve Serial plotter kısmına tıkladığımda board disconnected hatası veriyor ne led yanıyor nede buzzer ötüyor kodları düzgün bir şekilde atabilirmisiniz

Bende düzgün çalışan kod budur:

#include <Arduino.h>
#include <TinyMPU6050.h>

float pos_offset = 15;
float neg_offset = -15;
long angle_x, angle_y, angle_z, offset_x, offset_y, offset_z;
MPU6050 mpu (Wire);

void setup() {

// Initialization
mpu.Initialize();

// Calibration
Serial.begin(9600);
Serial.println(“=====================================”);
Serial.println(“Starting calibration…”);
Serial.println(“Calibration complete!”);
Serial.println(“Offsets:”);
Serial.print("AccX Offset = ");
Serial.println(mpu.GetAccXOffset());
Serial.print("AccY Offset = ");
Serial.println(mpu.GetAccYOffset());
Serial.print("AccZ Offset = ");
Serial.println(mpu.GetAccZOffset());
Serial.print("GyroX Offset = ");
Serial.println(mpu.GetGyroXOffset());
Serial.print("GyroY Offset = ");
Serial.println(mpu.GetGyroYOffset());
Serial.print("GyroZ Offset = ");
Serial.println(mpu.GetGyroZOffset());
pinMode(14,OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(14, LOW);
digitalWrite(9, LOW);

delay(1000);
for(int i=0; i<200;i++){
mpu.Execute();
offset_x = mpu.GetAngX();
offset_y = mpu.GetAngY();
offset_z = mpu.GetAngZ();
}
Serial.print("offset_x = “);
Serial.print(offset_x);
Serial.print(” / offsetY = “);
Serial.print(offset_y);
Serial.print(” / offsetZ = ");
Serial.println(offset_z);

}

void loop() {
for(int i=0; i<5;i++){
mpu.Execute();
angle_x = mpu.GetAngX();
angle_y = mpu.GetAngY();
angle_z = mpu.GetAngZ();
}

Serial.print("GetAngX = “);
Serial.print(angle_x - offset_x);
Serial.print(” / AngY = “);
Serial.print(angle_y - offset_y);
Serial.print(” / AngZ = ");
Serial.println(angle_z - offset_z);

if ( pos_offset < angle_x - offset_x || neg_offset > angle_x - offset_x || pos_offset < angle_y - offset_y || neg_offset > angle_y - offset_y || pos_offset < angle_z - offset_z || neg_offset > angle_z - offset_z){
for(int i=0; i<50; i++){
digitalWrite(14,HIGH);
digitalWrite(9,HIGH);
delay(50);
digitalWrite(14,LOW);
digitalWrite(9,LOW);
delay(50);
}
delay(5000);
setup();
}
}