İvmeölçer İle Bluetooth Üzerinden Servo Kontrol

5 2.749

Bu projemizde ivmeölçer ile bluetooth üzerinden servo motorun kontrolünü sağlayacağız.Videoda bluetooth olamdan örnek uygulama gösterilmiştir.Daha önceki projelerde ivmeölçer ile robot kol kontrolünü yapmıştık.

Buradan bakabilirsiniz >> robot kol kontrol

O projemize ek olarak kablosuz kontrol ekleyerek daha kullanışlı olmasını sağlayacağız.

Malzemeler:

  • Arduino (2 adet)
  • MPU6050 eksen ivmeölçer
  • Hc-05 ve Hc-06 bluetooth modül
  • Servo motor ( örnek uygulamada 1 adet kullanacağız.)

Elektronik Kısım:

Verici Devresi:

Alıcı Devresi:

Alıcı ve verici devre bağlantıları şekilde gösterilmiştir.İvmeölçerin scl pini A5, sda pini A4 e bağlanacaktır.Eğer mega kullanırsanız bu pinlerin adında pinleri megada mevcuttur.Direk o pinlere takınız.

Yazılım Kısmı:

Verici Yazılımı:

//Yazılım Geliştirme By Robimek – 2015
//Yazılım Lisans By Robimek
//www.robimek.com
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
#include <SoftwareSerial.h>
#define BT_SERIAL_TX 4
#define BT_SERIAL_RX 3
SoftwareSerial BluetoothSerial(BT_SERIAL_TX, BT_SERIAL_RX);
int servoValue1;
int gyro_value = 0;
void setup()
{
Wire.begin();
mpu.initialize();
Serial.begin(9600);
BluetoothSerial.begin(9600);
}
void loop()
{
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
gyro_value = map(ax, 0, 17000, 0,9);
switch(gyro_value){
 
case 0: BluetoothSerial.print("0");break;
case 1: BluetoothSerial.print("1");break;
case 2: BluetoothSerial.print("2");break;
case 3: BluetoothSerial.print("3");break;
case 4: BluetoothSerial.print("4");break;
case 5: BluetoothSerial.print("5");break;
case 6: BluetoothSerial.print("6");break;
case 7: BluetoothSerial.print("7");break;
case 8: BluetoothSerial.print("8");break;
case 9: BluetoothSerial.print("9");break;
default: BluetoothSerial.print("0");break;
}
 
delay(100);
}

Alıcı Yazılımı:

//Yazılım Geliştirme By Robimek – 2015
//Yazılım Lisans By Robimek
//www.robimek.com
#include <SoftwareSerial.h>
#define BT_SERIAL_TX 4
#define BT_SERIAL_RX 3
SoftwareSerial BluetoothSerial(BT_SERIAL_TX, BT_SERIAL_RX);
#include <Servo.h>
Servo myservo;
char servo_val = ' ';
void setup()
{
Serial.begin(9600);
BluetoothSerial.begin(9600);
myservo.attach(10);
}
void loop()
{
if (BluetoothSerial.available()>0){
servo_val = BluetoothSerial.read();
int servo_deger = servo_val - '0';
servo_deger=servo_deger*20;
if(servo_deger>180){servo_deger=180;}
myservo.write(servo_deger);
}
 
}

Hc-05 ve Hc-06 haberleşmesi için gerekli ayarlara buradan bakabilirsiniz. >> https://www.robimek.com/hc-05-ile-hc-06-bluetooth-modullerin-haberlesmesi/

Yazılımları yükledikten sonra verici kısımdaki arduino kartınızı resetleyin aksi halde ivmeölçer çalışmaz.Çünkü resetledikten sonra setup kısmında bulunan I2C iletişim protokolü kodu aktif hale gelir.

İvmeölçerle servonun hareketinin hassasiyetini artırmak isterseniz gönderilen verileri ve map komutu içindeki aralığı arttırak alıcı kısımdaki çarpım katsayısını düşürürseniz daha hassas kontrol sağlarsınız.

Videodaki uygulamanın koduna aşağıdan bakabilirsiniz.

// ADXL345 accelerometer 2 servo motor control
 
#include 
 
#include 
 
Servo myservox;
 
Servo myservoy;
 
#define DEVICE (0x53)
 
#define TO_READ (6)
 
#define TRIGGER 16 byte buff[TO_READ] ;
 
int i;
 
void setup()
 
{ pinMode(TRIGGER,OUTPUT);
 
digitalWrite(TRIGGER,HIGH);
 
Wire.begin();
 
myservox.attach(9);
 
myservoy.attach(10);
 
myservox.write(90);
 
delay(25);
 
myservoy.write(90);
 
delay(25);
 
writeTo(DEVICE, 0x2D, 0);
 
writeTo(DEVICE, 0x2D, 16);
 
writeTo(DEVICE, 0x2D, 8);}
 
void loop()
 
{ int regAddress = 0x32;
 
int x, y, z; digitalWrite(TRIGGER,LOW);
 
delay(10); digitalWrite(TRIGGER,HIGH);
 
readFrom(DEVICE, regAddress, TO_READ, buff);
 
x=0; y=0; z=0;
 
for(i=1;i<=5;i++)
 
{ x += (((int)buff[1]) << 8) | buff[0];
 
y += (((int)buff[3])<< 8) | buff[2];
 
z += (((int)buff[5]) << 8) | buff[4];
 
delay(10);
 
}
 
x/=5;
 
y/=5;
 
z/=5;
 
if(x<-255)x= -255; else if (x>255)x=255;
 
if(y<-255)y= -255; else if (y>255)y=255;
 
x=map(x, -255, 255, 0, 180);
 
y=map(y, -255, 255, 0, 180);
 
myservox.write(x);
 
delay(25);
 
myservoy.write(180-y);
 
delay(25);
 
delay(200);}
 
void writeTo(int device, byte address, byte val)
 
{ Wire.beginTransmission(device);
 
Wire.write(address); Wire.write(val);
 
Wire.endTransmission(); }
 
void readFrom(int device, byte address, int num, byte buff[])
 
{ Wire.beginTransmission(device);
 
Wire.write(address);
 
Wire.endTransmission();
 
Wire.beginTransmission(device);
 
Wire.requestFrom(device, num);
 
int i = 0;
 
while(Wire.available())
 
{
 
buff[i] = Wire.read(); i++;
 
}
 
Wire.endTransmission();
 
}

 

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.

5 Yorum
  1. Zade

    Usta ben bu bluetooth olanı 2 servoya çıkartmak istiyorum fakat bi türlü başaramadım kodda yardım edebilecek biri varmı..Ayrıca tasarım çalışıyor biyerde bi eksiğiniz vardır kesin..

  2. EZel

    Kardeşim bu iki bluetooth lu modeli uyguladım fakat herhangi bi etkileşim almadım eşleşmeyi ve sensörü kontrol ettim herhangi bi sıkıntı yokdur

  3. oğuzhan baygül

    proje çok güezl ama dikkatimi çeken sensor ile motorlar arasındaki gecikmenin fazla olması bu gecikme sensor den dolayımı yoksa motorlardan dolayımı

  4. enes

    Mpu6050 ile quadcopter yapıyoruz bluettoth hc06 ama motorları nasıl kontrol edeceğiz.bunlar bizim esc kontrol kodlarımız biz android cihazla kontrol ediyoruz .Bu kodlara mpu değerleri nasıl ekliycez
    #include

    String readString;
    Servo esc;
    Servo esc2;
    Servo esc3;
    Servo esc4;
    float sayac=750;

    //int val=50;
    void setup() {
    esc.attach(8); //Specify the esc signal pin,Here as D8
    esc.write(700);
    esc2.attach(9); //Specify the esc signal pin,Here as D8
    esc2.write(700);
    esc3.attach(10); //Specify the esc signal pin,Here as D8
    esc3.write(700);
    esc4.attach(11); //Specify the esc signal pin,Here as 11
    esc4.write(700);

    Serial1.begin(9600);
    Serial.begin(9600);
    // pinMode(0, OUTPUT);
    /*// pinMode(kirmizipin, OUTPUT);
    // pinMode(mavipin, OUTPUT);
    // pinMode(yesilpin, OUTPUT); */
    }

    void loop() {

    while (Serial1.available()) {
    delay(3);
    char c = Serial1.read();
    readString += c;
    }
    if (readString.length() >0) {

    Serial1.println(readString);
    /* int a=readString.toInt();*/

    if (readString== “mavi”) //mavi butona basınca gaz veriyor
    {

    sayac=sayac+1;
    // sayac1=sayac1+3;
    // sayac2=sayac2+3;

    Serial.println(readString);
    Serial.println(sayac);
    // Serial.println(sayac1);
    // Serial.println(sayac2);
    //Creating a variable val

    //mapping the val to minimum and maximum input*/
    // sayac= map(sayac, 0, 1023,1000,2000);

    esc.write(sayac);
    esc2.write(sayac);
    esc3.write(sayac);

    esc4.write(sayac);

    }
    if (readString == “yesil”) //gaz azalt
    {

    sayac=sayac-5;
    Serial.println(readString);
    Serial.println(sayac);
    Serial.println(sayac);
    //Creating a variable val

    //mapping the val to minimum and maximum input*/
    //sayac= map(sayac, 0, 1023,1000,2000);
    esc.write(sayac);
    esc2.write(sayac);
    esc3.write(sayac);

    esc4.write(sayac);
    Serial.println(sayac);
    }
    if (readString == “beyaz”) //motorları durdur
    {
    sayac=700;

    // sayac= map(sayac, 0, 1023,1000,2000);
    Serial.println(readString);
    Serial.println(sayac);
    Serial.println(sayac);
    esc.write(sayac);
    esc2.write(sayac);
    esc3.write(sayac);

    esc4.write(sayac);

    }
    /* if (readString == “kirmizi”) //başlama
    {

    Serial.println(readString);
    Serial.println(sayac);
    sayac=45;
    esc.write(sayac);
    }*/

    /* if (readString == “pembe”)
    {
    analogWrite(mavipin, 0);
    analogWrite(kirmizipin, 0);
    analogWrite(yesilpin, 175);
    }
    if (readString == “mor”)
    {
    analogWrite(mavipin, 150);
    analogWrite(kirmizipin, 155);
    analogWrite(yesilpin, 255);
    }
    if (readString == “sari”)
    {
    analogWrite(mavipin, 255);
    analogWrite(kirmizipin, 0);
    analogWrite(yesilpin, 0);
    }
    if (readString == “turuncu”)
    {
    analogWrite(mavipin, 255);
    analogWrite(kirmizipin, 0);
    analogWrite(yesilpin, 150);
    }
    if (readString == “turkuvaz”)
    {
    analogWrite(mavipin, 0);
    analogWrite(kirmizipin, 255);
    analogWrite(yesilpin, 0);
    }*/
    readString=””;
    }
    }

    1. Sezgin GÜL

      Buradaki projeye bakın yardımcı olacaktır. http://www.robimek.com/arduino-tabanli-quadcopter-kontrol-projesi/