IMU ile Kamera Gimbalı Kontrolü

Herkese Merhabalar!
Bu projemin amacı MPU6050 ile hesaplanan pitch ve roll açıları ile 2 eksenli bir gimbalı kontrol etmek. MPU6050 açılarını hesaplamak için FreeIMU kütüphanesini kullandım. Buradan indirebilirsiniz. Aldığım açılar belli bir değerden büyükse servoların açılarını kademeli olarak azalttım veya artırdım.Bu sayede gimbal, MPU6050yi eğdiğim yönde dönmüş oldu. Projemin tanıtım videosunu aşağıdan izleyebilirsiniz.

Arkadaşlar projemin Arduino kodunu da paylaşıyorum.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <I2Cdev.h>
#include <MPU60X0.h>
#include <EEPROM.h>
//#define DEBUG
#include “DebugUtils.h”
#include “CommunicationUtils.h”
#include “FreeIMU.h”
#include <Wire.h>
#include <SPI.h>
#include <Servo.h>
int raw_values[9];
Servo myservo1;
int pos1 = 90;
Servo myservo2;
int pos2 = 90;
float ypr[3]; // yaw pitch roll
float val[9];
// Set the FreeIMU object
FreeIMU my3IMU = FreeIMU();
void setup() {
Serial.begin(115200);
Wire.begin();
myservo1.attach(9);
myservo2.attach(8);
delay(5);
my3IMU.init(); // the parameter enable or disable fast mode
delay(5);
}
void loop(){
my3IMU.getYawPitchRoll(ypr);
Serial.print(“Yaw: “);
Serial.print(ypr[0]);
Serial.print(“ Pitch: “);
Serial.print(ypr[1]);
Serial.print(“ Roll: “);
Serial.print(ypr[2]);
Serial.println(“”);
if(ypr[1]>20)
{
if(pos1<150)
{
pos1=pos1+2;
myservo1.write(pos1);
delay(15);
}
}
else if(ypr[1]<-20)
{
if(pos1>30)
{
pos1=pos1-2;
myservo1.write(pos1);
delay(15);
}
}
if(ypr[2]>20)
{
if(pos2>30)
{
pos2=pos2-2;
myservo2.write(pos2);
delay(15);
}
}
if(ypr[2]<-20)
{
if(pos2<150)
{
pos2=pos2+2;
myservo2.write(pos2);
delay(15);
}
}
delay(15);
}
Paylaş