Ardunio MPU6050 Örnek kullanımı:
Okulda klüpte yarışmalara katılmak için Murat arkadşımla Kendini dengeleyen robot yapmaya karar verdik. Malzeme ve robot için neler gerekli araştırdık sonuç olarak, MPU6050 Gyroscope ve Accelerometer sensörünü kullanmaya karar verdik. Şu an şase tasarımı yapıyoruz bu arada da ilk önce MPU6050 sensörünü denedik. Gelen açı ve ivme değerlerini okuduk ve motorlara pwm değerini gönderdik.
Sensörün kullanımına yönelik örnek kod araştırması yapınca birçok sitede yabancı kaynaklardan alınmış örnekler bulduk açıklayıcı ve çalışan kod örneği çok azdı, biz de bu çalıştırdığımız kodların hepsine açıklama satırı yazarak paylaşma gereği duyduk.
Sadece x ekseninde açı değerini ve x ekseninde ivme değerini okuduk.
Motorlara gelen 0-17000 aralığındaki değerleri 0-255 arasında oranlayıp motora pwm değeri gönderdik.
Şu an yapım aşamasındayız eksiklerimiz var fakat çalışmalarımız devam ediyor.
Örnek kodlar:
//**************Harun Doğan********\\\\
//**************Murat Yazar ********\\\\
#include "Wire.h"
#include "I2Cdev.h" // kütüphaneler eklendi
#include "MPU6050.h"
MPU6050 mpu;
int16_t ax, ay, az; // açı ve ivme değişkendleri tanımlanıyor
int16_t gx, gy, gz;
int motorA9 = 9; //9 pin alarlandı motor pwm çıkışı
int motorB10 = 10; // motor b 10. pin pwm
int olcmesikligi = 10;
int aci, ivme; //gyro ve motor değişkenleri tanımlanıyor
int motoraaci, motoraivme; // motora gidecek pwm değişkenleri
int motorA1pin2 = 2;
int motorA2pin3 = 3; //************
int motorB1pin4 = 4; // motor yön kontrolu için pinler
int motorB2pin7 = 7;
void setup()
{
pinMode(motorA1pin2, OUTPUT); // pinler çıkış olarak belirlendi
pinMode(motorA2pin3, OUTPUT); //motoru bu pinlerden sürüyorum
pinMode(motorB1pin4, OUTPUT);
pinMode(motorB2pin7, OUTPUT);
Wire.begin();
Serial.begin(38400); // haberleşme başlatma bautrate hızı
Serial.println("****BAUDRATE=38400*** ");
Serial.println("****Initialize MPU****");
mpu.initialize();
Serial.println(mpu.testConnection() ? "****Baglandi" : "****Baglanmadi");
delay(10);
}
void loop()
{
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
aci = map(ax, 0, 17000, 0, 255);
ivme = map(gx, 0, 17000, 0, 255) ;
// açı ve ivme değeleri 0-255 skalasına göre ayarlandı
//son değerler 0 ile 90 derece arasını gösteriyor
// burdaki değerlerin 255 olması motora
// 0-255 arası değerler göndermek için (pwm 0-255 aralığında 8 bit)
if(aci<0)
{
geri(); // gelen açı negatifse geri git
}
if(aci>0)
{
ileri();// gelen açı pozitifse ileri git
}
if(aci==0)
{
sabit_dur(); // buraya gerek yok ama yine de yazmak istedik:)
}
motoraaci = abs(aci); // mutlak değer almasını sebebi
motoraivme = abs(ivme); //PWMde motora -eksi değer gidemez
// serial monitor de yazı kısmı*****
Serial.print(" ");
Serial.println("ivme aci");
Serial.print(" ");
Serial.print(ivme);
Serial.print(" ");
Serial.println(aci);
//***********
motoraaci=motoraaci*5; //çok küçük açı değerlerinde motora gelen
// PWM değerleri az geliyordu biz de
// motorun daha iyi tepki vermesi için 5 ile çarptık
analogWrite(motorA9, motoraaci);
analogWrite(motorB10, motoraivme);
delay(olcmesikligi); // motora açı ve ivmeler den gelen 0-255 arası değerler
//motora gönderildi
}
//*********** FONKSİYONLAR*****
void ileri()
{
// motorun İLERİ yönü için pin2 ve pin 4 HİGH oldu
//pin 3 ve pin 7 LOW oldu
digitalWrite(motorA1pin2, HIGH);
digitalWrite(motorA2pin3, LOW);
digitalWrite(motorB1pin4, HIGH);
digitalWrite(motorB2pin7, LOW);
}
void geri()
{
// motorun GERİ yönü için pin3 ve pin 7 HİGH oldu
//pin 2 ve pin 4 LOW oldu
digitalWrite(motorA1pin2, LOW);
digitalWrite(motorA2pin3, HIGH);
digitalWrite(motorB1pin4, LOW);
digitalWrite(motorB2pin7, HIGH);
}
void sabit_dur()
{
// motorun GERİ yönü için pin3 ve pin 7 HİGH oldu
//pin 2 ve pin 4 LOW oldu
digitalWrite(motorA1pin2, LOW);
digitalWrite(motorA2pin3, LOW);
digitalWrite(motorB1pin4, LOW);
digitalWrite(motorB2pin7, LOW);
}
/*
//********denemek için motorlara pwm gönderiliyor**********
analogWrite(motorA9, 5);
delay(300);
analogWrite(motorA9, 50);
delay(300);
analogWrite(motorA9, 150);
delay(300);
analogWrite(motorA9, 250);
delay(300);
//**********************
*/
//*********************************
//**********************************Kodlar bu kadar olabildiğince az satırda kod yazmaya çalıştık.
Arduino ve MPU6050 donanımsal bağlantı şeması:
Arduino MPU6050 connection |
Herhangi bir soruda yazabilirsiniz veya mail atabilirsiniz.
Murat Yazar & Harun Doğan
yazılımınızı denedim cok kararlı ve güzel calışıyor selamlar
YanıtlaSil