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 :
- Arduino Uno
- NRF24L01 Modül
- MPU6050 ivme ve gyro sensörü
- Batarya ( 9v pil yeterli)
Alıcı Devresi:
- Arduino Uno
- NRF24L01 Modül
- Servo Motor
- 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.
z ekseni kontrolünü nasıl yapabilirzi
done = radio.read(derece, sizeof(derece)); bu kod satırı hata veriyor neden acaba
bu hatanın çözümünü bulan var mı?
done çözümü yok mu hala??
Merhaba I2C dev kütüphanesini indiremiyorum . Yardım edin lütfen TUBITAK projem var lütfen yardim edin
Merhaba
Bu projeyi ivme sensörü yerine joystick koyarak nasıl yapabiliriz.
joystick den okunan değeri map içine aktarıp yapabilirsiniz.