İvmeölçer İle Bluetooth Üzerinden Servo Kontrol
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(); }
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..
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
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ı
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=””;
}
}
Buradaki projeye bakın yardımcı olacaktır. http://www.robimek.com/arduino-tabanli-quadcopter-kontrol-projesi/