MPU6050 İvme ve Gyro Sensörü ile NRF24L01 Üzerinden Servo Kontrolü

7 9.914

Merhaba arkadaşlar, bu projemizde MPU6050 NRF24L01 RF modül ile açı verilerini kablosuz olarak servo motora gönderip, eş zamanlı olarak ivme ölçerin eğimine göre servo motorda hareket edecek. Bildiğiniz üzere NRF24L01 modülü rf projelerinde en çok kullanılan modüllerden biri. Modülün kullanımı ve yazılım fonksiyonları hakkında bilgi almak isterseniz buradaki linkten ulaşabilirsiniz. Şimdi projemize geçebiliriz.

Malzemeler:

Verici Devresi : 

  1. Arduino Uno
  2. NRF24L01 Modül
  3. MPU6050 ivme ve gyro sensörü
  4. Batarya ( 9v pil yeterli)

Alıcı Devresi:

  1. Arduino Uno
  2. NRF24L01 Modül
  3. Servo Motor
  4. Batarya (9v pil yeterli)

Verici Devre Şeması:

Alıcı Devre Şeması:

NRF24L01 modülü SPI pinleri üzerinden haberleştiği için her arduino modelinde bu pinler değişiklik gösterebilir. Şemalarda uno modeline göre bağlantılar yapılmıştır. Sizdeki farklı model ise onun SPI pinlerine göre bağlantılarını yapabilirsiniz.

Verici Devre Arduino Kodu:

// Robimek - Robotik Sistemler
// Coder: Sezgin Gül
//MPU6050 SERVO VERİCİ DEVRE KODU
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
#include <SPI.h>
#include "RF24.h"
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
int derece[1];
 
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
void setup(void){ 
Wire.begin();
mpu.initialize();
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}
void loop(void){ 
 mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
derece[0] = map(ax, 0, 17000, 0,179);
 radio.write(derece, 1);
}

 

Alıcı Devre Arduino Kodu:

// Robimek - Robotik Sistemler
// Coder: Sezgin Gül
//MPU6050 SERVO ALICI DEVRE KODU
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
#include <Servo.h> 
 #include <SPI.h>
 #include "RF24.h"
 Servo Servo_motor; 
RF24 radio(9,10);
 const uint64_t pipe = 0xE8E8F0F0E1LL; 
 int derece[1];
 void setup() 
 { 
 Serial.begin(9600);
 Servo_motor.attach(6); 
 radio.begin();
 radio.openReadingPipe(1,pipe);
 radio.startListening(); 
 } 
 void loop() 
 { 
 if (radio.available()){
 bool done = false;
 while (!done){
 done = radio.read(derece, 1); 
 Servo_motor.write (derece[0]);
 
 }
 }
 }

 mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); bu fonksiyon ile eksenlerin ivme ve gyro değerleri alınır. Servoyu farklı eksende kontrol etmek isterseniz map komutu içindeki eksen adını değiştirebilirsiniz.

2 Servo Kontrolü İçin:

Verici Devre Arduino Kodu:

// Robimek - Robotik Sistemler
// Coder: Sezgin Gül
//MPU6050 SERVO VERİCİ DEVRE KODU
// 2 servo kontrolü
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
#include <SPI.h>
#include "RF24.h"
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
int derece[2];
 
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void){
Wire.begin();
mpu.initialize();
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}
void loop(void){
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
derece[0] = map(ax, 0, 17000, 0,179); // x ekseni ivmesi
derece[1] = map(ay, 0, 17000, 0,179); // y ekseni ivmesi
radio.write(derece,sizeof(derece));
 
}

Alıcı Devre Arduino Kodu:

// Robimek - Robotik Sistemler
// Coder: Sezgin Gül
//MPU6050 SERVO ALICI DEVRE KODU
// 2 servo kontrolü
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo Servo_motor_x,Servo_motor_y;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int derece[2];
void setup()
{
Serial.begin(9600);
Servo_motor_x.attach(6);
Servo_motor_y.attach(5);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop()
{
if (radio.available()){
bool done = false;
while (!done){
done = radio.read(derece, sizeof(derece));
Servo_motor_x.write (derece[0]);
Servo_motor_y.write (derece[1]);
 
}
}
}

2 servo kontrolünde mpu6050 nin x ekseni hareketi bir servoyu, y ekseni hareketi ise diğer servo motoru hareket ettirmektedir. Yukarıdaki devre şemalarına ek olarak verici devrede hiçbir değişiklik yok. Alıcı devrede ise ikinci servoyu ekleyip sinyal pinini 5.dijital pine takınız. Diğer bağlantılar aynıdır.

 

Bunlar da İlgini Çekebilir
Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

7 Yorum
  1. ibrahim bilici

    z ekseni kontrolünü nasıl yapabilirzi

  2. mahmut

    done = radio.read(derece, sizeof(derece)); bu kod satırı hata veriyor neden acaba

    1. ahmet

      bu hatanın çözümünü bulan var mı?

      1. ahmet

        done çözümü yok mu hala??

  3. Ömer

    Merhaba I2C dev kütüphanesini indiremiyorum . Yardım edin lütfen TUBITAK projem var lütfen yardim edin

  4. Ahmet SAĞIR

    Merhaba

    Bu projeyi ivme sensörü yerine joystick koyarak nasıl yapabiliriz.

    1. Sezgin GÜL

      joystick den okunan değeri map içine aktarıp yapabilirsiniz.