Gimbal'ı 3B modelleme yazılımı kullanarak tasarladık. 3D çıktı alacağımız parçalar içerisinde 3 eksenli kontrol için MG996R servo motor
"L" dirsekleri,
MPU6050 6 eksen ivme ve gyro sensörü, Arduino ve pilin yerleştirileceği bir tabandan oluşur.
Arduino Gimbal Yapımı - Birleştirme
Arduino gimbal yapımı projemiz de gimbal'ı monte etmek oldukça kolaydır. Servoyu kurmaya başlayalım.
M3 cıvata ve somun kullanarak tabana sabitleyelim.
Sonra, aynı yöntemi kullanarak diğer servo motorun güvenliğini sağlayalım. Parçalar, MG996R servolarına kolayca uyacak şekilde özel olarak tasarlanmıştır.
Parçaları birbirine bağlamak için servo aksesuarı yuvarlak mili takalım. İlk önce mili tabana iki cıvatayla tutturmamız ve daha sonra başka bir cıvata kullanarak önceki servoya takmamız gerekiyor. Kalan bileşenler için servo'nun ve üst platformun montajı bu işlemini tekrarlayalım. Daha sonra, düzenli tutmak için servo kablolarını tutucu açıklıklarından geçirelim. MPU6050 sensörünü taktıktan sonra bir cıvata ve somun ile tabana sabitleyelim. Arduino gimbal yapımı projesine güç vermek için, pil yuvasına 2 adet pil yerleştirelim. Pil yuvasını tabana iki cıvata ve somun kullanarak sabitleyelim. 2 Li-ion pil yaklaşık 7.4V üretecektir, ancak Arduino ve servoları çalıştırmak için 5V'a ihtiyacımız var. Bu yüzden 7.4V ile 5V arasında dengeyi sağlayan bir çevirici kullanalım.
Arduino Gimbal Devre Şeması
Şimdi geriye, her şeyi birbirine bağlamak kaldı. İşte bu projenin devre şeması ve her şeyin nasıl bağlanması gerektiğini aşağıdan görebilirsiniz. Arduino Gimbal Yapımı Projesi için gerekli malzemeleri aşağıdaki linklerden satın alabilirsiniz:
Sonunda elektronik bileşenleri ve telleri taban içerisine yerleştirip kapağı kullanarak kapatalım.
Kod açıklaması:
// Get Yaw, Pitch and Roll values
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
#endif
Kod açıklaması 2:
Değerleri aldıktan sonra, ilk önce radyandan dereceye çevirip düzenleyelim.
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
Daha sonra bekleyip 300 okuma yaparız, çünkü sensör bu süre zarfında hala kendi kendine kalibrasyon sürecindedir. Ayrıca, başlangıçta Pitch and Roll değerleri gibi "0"(sıfır) olmayan Yaw değerini yakalarız.
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
300 okumadan sonra, yukarıdaki yakalanan rastgele değeri çıkartarak önce Yawdeğerini "0"a ayarlarız. Daha sonra Yaw, Pitch ve Rolldeğerlerini - 90 - +90 derece arasında, servoları sürmek için kullanılan 0 - 180 değerlerine eşleriz.
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}