Merhaba, bu yazımızda sizlerle Arduino Adım Sayar projesi yapacağız. Projeye geçmeden önce size biraz bilgi vermek istiyorum. Pedometre (Adım Sayar) yalnızca Adım Saymak için kullanılan bir cihazdır ve bu aletler günümüzde sıklıkla kullanılmaktadır. Mekanik harekete duyarlı sensöre sahip olması Adım saymasını sağlamaktadır ve sensörün duyarlılığına göre hassasiyet değişmektedir.
Arduino ile Adım Sayar Nasıl Çalışır?
MPU9255 şu anda mevcut olan en gelişmiş küçük boyutlu bileşik sensördür. ivme ölçer, jiroskop ve manyetometre özellikleri mevcuttur fakat bu projede yalnızca sensörün Jiroskop ve Manyetometre özelliğini kullanacağız.
Jiroskop
Yön ve açısal hızı ölçmek veya korumak için kullanılan bir cihazdır. Saniyede derece (veya radyan) olarak ölçülen açısal hız, nesnenin birim zamanda dönme açısındaki değişikliktir.
Yöne bağlı olarak üç tür açısal hız ölçümü vardır.
- Pitch (Yatay Eksen, X) = Nesneye önden bakıldığında yatay rotasyon.
- Yaw (Dikey Eksen, Y) = Nesneye yukarıdan bakıldığında düz yüzey üzerindeki dikey rotasyon.
- Roll (Boylamsal Eksen, Z) = Nesneye önden bakıldığında dikey rotasyon.
Manyetometre
Sensör tarafından algılanan manyetik alan hakkında bilgi sağlar ve teorik olarak kullanıcının lokasyonunu açığa çıkarabilir. Manyetometre sensörü bütün üç fiziksel eksenler (X, Y, Z) için manyetik alan ölçümü yapabilir.
Arduino ile Adım Sayar için Gerekli Malzemeler
- Arduino Nano
- MPU9255 veya MPU6050 İvme Ölçer
- 16×2 LCD Ekran
- 9V Pil
- Jumper Kablo
Arduino ile Adım Sayar Devre Şeması
Arduino ile Adım Sayar Kütüphane Kurulumu
Dervemizi kurulum şemasındaki gibi oluşturduktan sonra kütüphane kurulumunu yapmamız gerekiyor. Bunun için GitHub – tockn/MPU6050_tockn: Arduino library for easy communication with MPU6050 linkine tıklayıp gerekli kütüphaneyi indirdikten sonra sıkıştırılmış RAR dosyasındaki klasörü Belgelerim/Arduino/Libraries klasörünün içine atabilirsiniz.
Arduino ile Adım Sayar Kodları
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire, 0.5, 0.5);
int counter = 0;
float preAccX = mpu6050.getAccX();
float preAccY = mpu6050.getAccY();
float preAccZ = mpu6050.getAccZ();
float preGyroX = mpu6050.getGyroX();
float preGyroY = mpu6050.getGyroY();
float preGyroZ = mpu6050.getGyroZ();
#include <LiquidCrystal.h>
#include <SPI.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int steps = 0;
float distanceinonestep = 71;
float distance;
void setup() {
pinMode(9, HIGH);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(3, 0);
lcd.print("ROBOTISTAN");
lcd.setCursor(3, 1);
lcd.print("ADIM SAYAR");
delay(1500);
lcd.clear();
lcd.print("Jiroskop Ofseti");
lcd.setCursor(0, 1);
lcd.print("Hesaplaniyor");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Devreyi");
lcd.setCursor(0, 1);
lcd.print("Oynatmayiniz");
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ADIM = ");
lcd.setCursor(7, 0);
lcd.print(steps);
lcd.setCursor(0, 1);
lcd.print("MESAFE = ");
lcd.setCursor(9, 1);
lcd.print(distance);
lcd.setCursor(13, 1);
lcd.print("m");
}
void loop() {
preAccX = mpu6050.getAccX();
preAccY = mpu6050.getAccY();
preAccZ = mpu6050.getAccZ();
preGyroX = mpu6050.getGyroX();
preGyroY = mpu6050.getGyroY();
preGyroZ = mpu6050.getGyroZ();
mpu6050.update();
Serial.println("=======================================================");
Serial.print("accX : "); Serial.print(mpu6050.getAccX());
Serial.print("\taccY : "); Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : "); Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : "); Serial.print(mpu6050.getGyroX());
Serial.print("\tgyroY : "); Serial.print(mpu6050.getGyroY());
Serial.print("\tgyroZ : "); Serial.println(mpu6050.getGyroZ());
Serial.println("=======================================================\n");
if (counter % 2 == 0 &&
((preAccX - 0.25 < mpu6050.getAccX() && mpu6050.getAccX() < preAccX + 0.25) and
(preAccY - 0.25 < mpu6050.getAccY() && mpu6050.getAccY() < preAccY + 0.25) and
(preAccZ - 0.25 < mpu6050.getAccZ() && mpu6050.getAccZ() < preAccZ + 0.25)))
{
if ((!((preAccX - 0.18 < mpu6050.getAccX() && mpu6050.getAccX() < preAccX + 0.18) and
(preAccY - 0.18 < mpu6050.getAccY() && mpu6050.getAccY() < preAccY + 0.18) and
(preAccZ - 0.18 < mpu6050.getAccZ() && mpu6050.getAccZ() < preAccZ + 0.18))) and
(preGyroX - 40 < mpu6050.getGyroX() && mpu6050.getGyroX() < preGyroX + 40) and
(preGyroY - 40 < mpu6050.getGyroY() && mpu6050.getGyroY() < preGyroY + 40) and
(preGyroZ - 40 < mpu6050.getGyroZ() && mpu6050.getGyroZ() < preGyroZ + 40))
{
steps += 1;
counter++;
distance = steps * distanceinonestep / 100;
lcd.setCursor(0, 0);
lcd.print("ADIM = ");
lcd.setCursor(7, 0);
lcd.print(steps);
lcd.setCursor(0, 1);
lcd.print("MESAFE = ");
lcd.setCursor(9, 1);
lcd.print(distance);
lcd.setCursor(13, 1);
lcd.print("m");
delay(200);
counter++;
}
}
else
counter++;
}
Arduino ile Adım Sayar Proje Videosu
Arduino ile Adım Sayar projemizi tamamladık. Siz de kendi Adım Sayarınızı yapmak isterseniz hemen bizimle bu projeyi yapmaya başlayabilirsiniz. İhtiyacınız olan ürünler Arduino Nano, MPU9255 veya MPU6050, 16×2 LCD Ekran ve 9V Pil’dir. Tüm bu ürünleri web sitemizden hızlı ve kolay bir şekilde ulaşabilirsiniz. Bir sonraki projemizde görüşmek üzere.
Merhaba bu devreyi aynı şekilde kurdum ve kodları aynı şekilde yazdım. Devre çalışıyor ama devreyi hareket ettirmediğim halde yani adım atmadığım halde sayıyor ne yapmam gerekiyor lütfen cevap verin bu projeyi bitirmem gerekiyor?
Merhabalar, Proje kodu güncellendi. Tekrar deneyerek projeyi sorunsuz bir şekilde çalıştırabilirsiniz. Devredeki herhangi bir olası kalibrasyon sorununda ise mpu6050.getGyro-getAcc değişkenlerinin bulunduğu koşul içerisindeki eşik değerlerini değiştirerek sorunu çözebilirsiniz.
Kodlamayı guncellediginiz şekilde arduino’a ekledim ama bu defa LCD ekranda devreyi oynatmayınız kısmında duruyor ve hareket etsemde adım mesafe yazısı gelmiyor ve adım saymıyor
Merhaba proje kodu tekrar düzeltildi, devre hareket ettirildiğinde sayaç artmıyorsa serial monitor üzerinden ivme ölçerin okuma değerlerine (acc, gyro) göz atarak kullandığınız sensörün doğru değerler verdiğine ve devre bağlantısının doğru yapıldığına emin olunuz.
Sayaç artmıyor. Devre bağlantısını doğru yaptım ama seri monitorde acc ve gyro -0.00 değerini veriyor
İvme ölçer üzerindeki SDA ve SCL pinlerinin bağlantılarını doğru yaptğınız halde acc ve gyro değerlerini okumuyorsa muhtemelen sensörle ilgili bir problem vardır. Ürünü Robotistan üzerinden aldıysanız Teknik ekibimiz ile iletişim kurabilirsiniz. İyi günler dilerim.
Şimdi oldu teşekkürler ama adım atarken çok geç algılıyor neden böyle oluyor