🚁 Arduino Drone Kontrol Devreleri Projesi: Uçuş Kontrol Sistemi Nasıl Yapılır?
Arduino ile drone yapmak, elektronik, robotik, programlama, sensör teknolojileri ve kontrol sistemlerini tek bir projede bir araya getiren oldukça kapsamlı bir STEM projesidir. Basit bir Arduino projesinden farklı olarak drone sistemlerinde uçuş dengesi, motor kontrolü, sensör verilerinin işlenmesi, kablosuz haberleşme ve güç yönetimi birlikte çalışmak zorundadır.
Bu nedenle Arduino tabanlı drone projesi; öğrenciler, maker toplulukları, robotik kodlama atölyeleri ve elektronik meraklıları için oldukça öğretici bir uygulamadır.
Bu projede temel amaç, Arduino veya Arduino uyumlu bir mikrodenetleyici kullanarak drone’un motorlarını kontrol etmek, IMU sensöründen alınan verilerle aracın yönelimini belirlemek ve gerekli motor hızlarını değiştirerek drone’un dengede kalmasını sağlamaktır.
Önemli: Gerçek bir drone uçuş sistemi geliştirirken yalnızca motorları Arduino üzerinden açıp kapatmak yeterli değildir. Stabil uçuş için hızlı sensör okuma, uygun PID kontrolü, ESC yönetimi, güç dağıtımı ve güvenlik mekanizmaları gerekir. Bu nedenle proje, öncelikle pervaneler çıkarılmış şekilde test edilmelidir.
🎯 Arduino Drone Projesinin Amacı
Arduino drone kontrol devresinin temel amacı, bir quadcopter üzerindeki dört motorun hızlarını birbirinden bağımsız şekilde kontrol ederek aracın:
- Yukarı ve aşağı hareket etmesini,
- Sağa ve sola yatmasını,
- Öne ve arkaya eğilmesini,
- Saat yönünde ve saat yönünün tersine dönmesini,
- Dengeli şekilde havada kalmasını
sağlamaktır.
Drone’un uçuş kontrol sistemi temelde şu mantıkla çalışır:
Sensör → Mikrodenetleyici → Uçuş algoritması → ESC → Motor → Pervane
Drone hareket ettiğinde IMU sensörü aracın açısal hareketlerini algılar. Mikrodenetleyici bu verileri işler ve aracın istenen konumdan ne kadar saptığını hesaplar.
Daha sonra PID gibi kontrol algoritmaları kullanılarak dört motor için gerekli düzeltmeler hesaplanır.
🧠 Arduino Drone Nasıl Çalışır?
Bir quadcopter’ın dört motoru vardır.
Motorların çalışma hızları eşit olduğunda drone dengede kalmaya çalışır. Ancak motorlardan bir veya birkaçının hızı değiştirildiğinde drone’un gövdesinde bir tork oluşur.
Örneğin drone’un ön tarafının aşağı doğru eğilmesi isteniyorsa ön ve arka motorların hızları farklı oranlarda değiştirilir.
Benzer şekilde drone’un kendi ekseni etrafında dönmesi için saat yönünde ve saat yönünün tersinde dönen motorların hızları değiştirilir.
Basitleştirilmiş kontrol mantığı şöyledir:
ÖN
M1 M2
↖ ↗
\ /
\ DRONE/
/ \
/ \
↙ ↘
M3 M4
ARKA
Motorların dönüş yönleri ve pervane yönleri doğru ayarlanmalıdır. Aksi durumda drone dengeli uçmak yerine kendi ekseni etrafında dönmeye veya devrilmeye başlayabilir.
🔩 Arduino Drone İçin Gerekli Malzemeler
Temel bir quadcopter prototipi için aşağıdaki bileşenler kullanılabilir:
| Malzeme | Adet | Görevi |
|---|---|---|
| Arduino Nano / Pro Mini | 1 | Uçuş kontrolü |
| MPU6050 | 1 | Jiroskop + ivmeölçer |
| Brushless Motor | 4 | İtki üretimi |
| ESC | 4 | Motor hız kontrolü |
| Pervane | 4 | İtki üretimi |
| Li-Po Batarya | 1 | Güç kaynağı |
| Quadcopter Frame | 1 | Mekanik gövde |
| RC Alıcı | 1 | Kumanda komutlarını almak |
| RC Kumanda | 1 | Pilot kontrolü |
| Güç Dağıtım Kartı | 1 | ESC’lere enerji dağıtımı |
| 5V Regülatör / BEC | 1 | Arduino beslemesi |
| Kondansatörler | İhtiyaca göre | Güç filtreleme |
| Jumper kablolar | Çeşitli | Bağlantılar |
Daha gelişmiş bir sistemde GPS, barometre, manyetometre, telemetri modülü ve akım sensörü gibi bileşenler de eklenebilir.
⚙️ Arduino Drone Elektronik Mimarisi
Drone’un elektronik yapısını beş ana bölümde inceleyebiliriz.
1. Uçuş Kontrolcüsü
Arduino, sistemin merkezi işlem birimidir.
Sensörlerden gelen verileri okur, kumanda komutlarını değerlendirir ve ESC’lere gönderilecek motor sinyallerini hesaplar.
2. IMU Sensörü
MPU6050 gibi bir IMU sensörü içerisinde:
- 3 eksenli ivmeölçer
- 3 eksenli jiroskop
bulunur.
Böylece drone’un hareketleri hakkında bilgi elde edilir.
3. ESC’ler
ESC, yani Electronic Speed Controller, brushless motorların hızını kontrol eder.
Arduino doğrudan brushless motoru çalıştırmaz.
Kontrol zinciri:
Arduino → ESC → Brushless Motor
şeklindedir.
4. Brushless Motorlar
Quadcopter sistemlerinde genellikle dört adet brushless motor kullanılır.
Motorlar iki farklı dönüş grubuna ayrılır:
- Saat yönünde dönen motorlar
- Saat yönünün tersine dönen motorlar
Bu düzenleme drone’un kendi ekseni etrafında kontrol edilebilmesini sağlar.
5. Güç Sistemi
Li-Po batarya, ESC’leri ve motorları besler.
Arduino’nun beslemesi ise uygun bir regülatör veya BEC üzerinden sağlanmalıdır.
Arduino’yu yüksek voltajlı Li-Po bataryaya doğrudan bağlamak doğru değildir.
⚙️ Arduino Drone Kontrol Devreleri Projesi Devre Şeması

Arduino Drone Kontrol Devreleri Projesi Devre Şeması
🔌 Arduino – MPU6050 Bağlantısı
MPU6050 genellikle I²C haberleşmesi kullanır.
Arduino Nano ile örnek bağlantı:
| MPU6050 | Arduino Nano |
|---|---|
| VCC | 5V veya uygun besleme |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
Ancak kullanılacak MPU6050 kartının besleme özellikleri mutlaka kontrol edilmelidir.
Sensörün amacı drone’un:
- Roll
- Pitch
- Yaw hareketleri
hakkında bilgi sağlamaktır.
🔌 Arduino – ESC Bağlantısı
Dört ESC’nin sinyal kabloları Arduino’nun dijital/PWM destekli pinlerine bağlanabilir.
Örnek pin dağılımı:
| Motor | ESC Sinyal | Arduino |
|---|---|---|
| Motor 1 | Signal | D3 |
| Motor 2 | Signal | D5 |
| Motor 3 | Signal | D6 |
| Motor 4 | Signal | D9 |
ESC’nin güç tarafı ise batarya/güç dağıtım sistemine bağlanır.
Önemli nokta:
Motorlar Arduino’dan beslenmez.
Arduino yalnızca ESC’lere kontrol sinyali gönderir.
🔌Arduino Drone Kontrol Devreleri Projesi Motor Bağlantı Şeması

Arduino Drone Kontrol Devreleri Projesi Motor Bağlantı Şeması
🔋 Drone Güç Dağıtım Sistemi
Drone projelerinde güç yönetimi kritik öneme sahiptir.
Örnek mimari:
Li-Po BATARYA
│
▼
GÜÇ DAĞITIM KARTI
┌────┬────┬────┐
│ │ │ │
▼ ▼ ▼ ▼
ESC1 ESC2 ESC3 ESC4
│ │ │ │
▼ ▼ ▼ ▼
M1 M2 M3 M4
│
▼
BEC
│
▼
Arduino
│
▼
MPU6050
Bu yapı sayesinde yüksek akım gerektiren motor sistemi ile düşük güç tüketen kontrol elektroniği birbirinden ayrılmış olur.
🛩️ Quadcopter Motor Yerleşimi
Quadcopter sistemlerinde motorların yerleşimi genellikle X veya + geometrisinde yapılabilir.
X konfigürasyonunda:
M1
↖
\
\
M4 ----+---- M2
/
/
↙
M3
Motorların dönüş yönleri birbirini dengeleyecek şekilde seçilir.
Örneğin:
- M1 → CW
- M2 → CCW
- M3 → CCW
- M4 → CW
gibi bir yapı kullanılabilir.
Buradaki temel amaç, karşılıklı motorların oluşturduğu torkların dengelenmesidir.
Motor ve pervane yönleri, kullanılan frame ve uçuş yazılımına göre doğrulanmalıdır.
🎮 Drone Kumanda Sistemi
Drone’u kontrol etmek için RC kumanda ve alıcı kullanılabilir.
Kumandadan genellikle dört temel kontrol bilgisi gelir:
Throttle
Motorların genel hızını belirler.
Throttle artırıldığında bütün motorların hızı artırılarak drone’un yükselmesi sağlanır.
Roll
Drone’un sağa veya sola yatmasını sağlar.
Pitch
Drone’un öne veya arkaya eğilmesini sağlar.
Yaw
Drone’un kendi ekseni etrafında dönmesini sağlar.
Kontrol sistemi:
RC Kumanda
│
▼
RC Alıcı
│
▼
Arduino
│
▼
Uçuş Kontrol Algoritması
│
▼
ESC'ler
│
▼
Motorlar
Arduino + MPU6050 + 4 ESC + 4 brushless motor + 4 kanallı RC alıcı mimarisine uygun, eğitim amaçlı anlaşılır bir temel uçuş kontrol yazılımı olarak hazırladım.
⚠️ Önemli: Bu kod doğrudan uçuşa hazır profesyonel bir flight controller değildir. İlk testler pervaneler sökülmüş halde yapılmalıdır. Özellikle PID katsayıları, motor yönleri, RC kanal sıralaması ve IMU eksenleri kullanılan mekanik yapıya göre ayarlanmalıdır.
🚁 Arduino Drone Uçuş Kontrol Kodu – Satır Satır Açıklamalı
Bu örnekte kullanılan sistem:
- Arduino Nano
- MPU6050 IMU
- 4 adet ESC
- 4 adet brushless motor
- 4 kanallı RC alıcı
- Li-Po batarya
- Roll / Pitch PID kontrolü
- Yaw gyro kontrolü
- Complementary Filter
- Motor mixing
- Arm / Disarm güvenliği
- Kumanda bağlantısı kesilirse motor durdurma
🔌 Pin Bağlantıları
Motor / ESC
| Motor | Arduino pini |
|---|---|
| Motor 1 | D3 |
| Motor 2 | D5 |
| Motor 3 | D6 |
| Motor 4 | D9 |
MPU6050
| MPU6050 | Arduino Nano |
|---|---|
| SDA | A4 |
| SCL | A5 |
| GND | GND |
| VCC | Uygun besleme |
RC Alıcı
| Kanal | Arduino |
|---|---|
| CH1 – Roll | D2 |
| CH2 – Pitch | D4 |
| CH3 – Throttle | D7 |
| CH4 – Yaw | D8 |
🧑💻 Arduino Kodu
#include <Wire.h>
#include <Servo.h>
/*
=========================================================
ARDUINO DRONE FLIGHT CONTROLLER
=========================================================
Arduino Nano
MPU6050
4 x ESC
4 x Brushless Motor
4 Channel RC Receiver
MOTOR PINLERI:
M1 -> D3
M2 -> D5
M3 -> D6
M4 -> D9
RC PINLERI:
CH1 -> D2 : Roll
CH2 -> D4 : Pitch
CH3 -> D7 : Throttle
CH4 -> D8 : Yaw
*/
// ---------------------------------------------------------
// 1. ESC NESNELERİ
// ---------------------------------------------------------
Servo esc1; // Motor 1 için ESC nesnesi
Servo esc2; // Motor 2 için ESC nesnesi
Servo esc3; // Motor 3 için ESC nesnesi
Servo esc4; // Motor 4 için ESC nesnesi
// ---------------------------------------------------------
// 2. MOTOR PINLERİ
// ---------------------------------------------------------
const byte MOTOR1_PIN = 3; // ESC 1 sinyal pini
const byte MOTOR2_PIN = 5; // ESC 2 sinyal pini
const byte MOTOR3_PIN = 6; // ESC 3 sinyal pini
const byte MOTOR4_PIN = 9; // ESC 4 sinyal pini
// ---------------------------------------------------------
// 3. RC ALICI PINLERİ
// ---------------------------------------------------------
const byte RC_ROLL_PIN = 2; // CH1
const byte RC_PITCH_PIN = 4; // CH2
const byte RC_THROTTLE_PIN = 7; // CH3
const byte RC_YAW_PIN = 8; // CH4
// ---------------------------------------------------------
// 4. MPU6050 ADRESİ
// ---------------------------------------------------------
const byte MPU_ADDR = 0x68;
// ---------------------------------------------------------
// 5. MPU6050 HAM VERİ DEĞİŞKENLERİ
// ---------------------------------------------------------
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
// ---------------------------------------------------------
// 6. GYRO OFFSET DEĞERLERİ
// ---------------------------------------------------------
float gyroOffsetX = 0;
float gyroOffsetY = 0;
float gyroOffsetZ = 0;
// ---------------------------------------------------------
// 7. AÇI DEĞİŞKENLERİ
// ---------------------------------------------------------
float rollAngle = 0;
float pitchAngle = 0;
float yawAngle = 0;
// ---------------------------------------------------------
// 8. RC KUMANDA DEĞİŞKENLERİ
// ---------------------------------------------------------
int rcRoll = 1500;
int rcPitch = 1500;
int rcThrottle = 1000;
int rcYaw = 1500;
// ---------------------------------------------------------
// 9. PID DEĞİŞKENLERİ
// ---------------------------------------------------------
float rollError;
float pitchError;
float yawError;
float rollIntegral = 0;
float pitchIntegral = 0;
float yawIntegral = 0;
float previousRollError = 0;
float previousPitchError = 0;
float previousYawError = 0;
// ---------------------------------------------------------
// 10. PID KATSAYILARI
// ---------------------------------------------------------
// Başlangıç değerleridir.
// Gerçek drone üzerinde mutlaka ayarlanmalıdır.
float KpRoll = 1.5;
float KiRoll = 0.02;
float KdRoll = 0.8;
float KpPitch = 1.5;
float KiPitch = 0.02;
float KdPitch = 0.8;
float KpYaw = 1.2;
float KiYaw = 0.01;
float KdYaw = 0.0;
// ---------------------------------------------------------
// 11. PID ÇIKIŞLARI
// ---------------------------------------------------------
float rollPID = 0;
float pitchPID = 0;
float yawPID = 0;
// ---------------------------------------------------------
// 12. MOTOR ÇIKIŞLARI
// ---------------------------------------------------------
int motor1 = 1000;
int motor2 = 1000;
int motor3 = 1000;
int motor4 = 1000;
// ---------------------------------------------------------
// 13. UÇUŞ DURUMU
// ---------------------------------------------------------
bool armed = false;
// ---------------------------------------------------------
// 14. ZAMAN DEĞİŞKENLERİ
// ---------------------------------------------------------
unsigned long previousTime = 0;
float dt = 0;
// =========================================================
// 15. SETUP
// =========================================================
void setup()
{
// Seri haberleşmeyi başlatıyoruz.
Serial.begin(115200);
// I2C haberleşmesini başlatıyoruz.
Wire.begin();
// MPU6050'yi başlatıyoruz.
initMPU6050();
// ESC nesnelerini Arduino pinlerine bağlıyoruz.
esc1.attach(MOTOR1_PIN);
esc2.attach(MOTOR2_PIN);
esc3.attach(MOTOR3_PIN);
esc4.attach(MOTOR4_PIN);
// Motorları minimum gaz seviyesine getiriyoruz.
stopMotors();
// Gyro kalibrasyonu yapıyoruz.
calibrateGyro();
// İlk zaman bilgisini kaydediyoruz.
previousTime = micros();
// Seri monitöre bilgi yazıyoruz.
Serial.println("Arduino Drone Flight Controller");
Serial.println("Sistem hazir.");
}
// =========================================================
// 16. LOOP
// =========================================================
void loop()
{
// Geçen zamanı hesaplıyoruz.
unsigned long currentTime = micros();
dt = (currentTime - previousTime) / 1000000.0;
previousTime = currentTime;
// Aşırı büyük zaman değerlerini engelliyoruz.
if (dt <= 0 || dt > 0.1)
{
dt = 0.01;
}
// MPU6050 verilerini okuyoruz.
readMPU6050();
// Sensör verilerinden açı hesaplıyoruz.
calculateAngles(dt);
// RC kumanda değerlerini okuyoruz.
readReceiver();
// Kumanda bağlantısı güvenilir değilse motorları kapatıyoruz.
if (!receiverIsValid())
{
armed = false;
stopMotors();
return;
}
// Arm / disarm kontrolü.
checkArm();
// Drone arm edilmemişse motorları durduruyoruz.
if (!armed)
{
stopMotors();
resetPID();
return;
}
// PID hesaplamalarını yapıyoruz.
calculatePID(dt);
// PID sonuçlarını motorlara dağıtıyoruz.
mixMotors();
// Motor komutlarını ESC'lere gönderiyoruz.
writeMotors();
// Yaklaşık 100 Hz kontrol döngüsü oluşturuyoruz.
delay(10);
}
// =========================================================
// 17. MPU6050 BAŞLATMA
// =========================================================
void initMPU6050()
{
// MPU6050'nin güç yönetim register'ına gidiyoruz.
Wire.beginTransmission(MPU_ADDR);
// Power Management register.
Wire.write(0x6B);
// 0 göndererek MPU6050'yi uyandırıyoruz.
Wire.write(0);
// Haberleşmeyi sonlandırıyoruz.
Wire.endTransmission();
// Gyroscope ayar register'ı.
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x1B);
// ±250 derece/saniye aralığı.
Wire.write(0x00);
Wire.endTransmission();
// Accelerometer ayar register'ı.
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x1C);
// ±2g aralığı.
Wire.write(0x00);
Wire.endTransmission();
}
// =========================================================
// 18. MPU6050 VERİLERİNİ OKUMA
// =========================================================
void readMPU6050()
{
// Accelerometer ve gyro verilerinin başlangıç adresi.
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B);
Wire.endTransmission(false);
// 14 byte veri istiyoruz.
Wire.requestFrom(MPU_ADDR, 14, true);
// Accelerometer X.
accX = Wire.read() << 8 | Wire.read();
// Accelerometer Y.
accY = Wire.read() << 8 | Wire.read();
// Accelerometer Z.
accZ = Wire.read() << 8 | Wire.read();
// Sıcaklık verisini atlıyoruz.
Wire.read();
Wire.read();
// Gyroscope X.
gyroX = Wire.read() << 8 | Wire.read();
// Gyroscope Y.
gyroY = Wire.read() << 8 | Wire.read();
// Gyroscope Z.
gyroZ = Wire.read() << 8 | Wire.read();
}
// =========================================================
// 19. GYRO KALİBRASYONU
// =========================================================
void calibrateGyro()
{
long sumX = 0;
long sumY = 0;
long sumZ = 0;
Serial.println("Gyro kalibrasyonu basliyor...");
// Drone sabit tutulmalıdır.
for (int i = 0; i < 1000; i++)
{
readMPU6050();
sumX += gyroX;
sumY += gyroY;
sumZ += gyroZ;
delay(2);
}
// Ortalama offset değerlerini hesaplıyoruz.
gyroOffsetX = sumX / 1000.0;
gyroOffsetY = sumY / 1000.0;
gyroOffsetZ = sumZ / 1000.0;
Serial.println("Gyro kalibrasyonu tamamlandi.");
}
// =========================================================
// 20. AÇI HESAPLAMA
// =========================================================
void calculateAngles(float deltaTime)
{
// Accelerometer verilerinden yaklaşık Roll açısı.
float accRoll = atan2(accY, accZ) * 57.2958;
// Accelerometer verilerinden yaklaşık Pitch açısı.
float accPitch =
atan2(-accX, sqrt((float)accY * accY +
(float)accZ * accZ)) * 57.2958;
// Gyroscope değerlerini derece/saniyeye çeviriyoruz.
float gyroRateX =
(gyroX - gyroOffsetX) / 131.0;
float gyroRateY =
(gyroY - gyroOffsetY) / 131.0;
float gyroRateZ =
(gyroZ - gyroOffsetZ) / 131.0;
// Gyroscope ile açıyı entegre ediyoruz.
rollAngle += gyroRateX * deltaTime;
pitchAngle += gyroRateY * deltaTime;
yawAngle += gyroRateZ * deltaTime;
// Complementary Filter.
rollAngle =
0.98 * rollAngle +
0.02 * accRoll;
pitchAngle =
0.98 * pitchAngle +
0.02 * accPitch;
}
// =========================================================
// 21. RC ALICI OKUMA
// =========================================================
void readReceiver()
{
// pulseIn RC PWM sinyalinin genişliğini mikro saniye
// cinsinden ölçer.
rcRoll =
pulseIn(RC_ROLL_PIN, HIGH, 25000);
rcPitch =
pulseIn(RC_PITCH_PIN, HIGH, 25000);
rcThrottle =
pulseIn(RC_THROTTLE_PIN, HIGH, 25000);
rcYaw =
pulseIn(RC_YAW_PIN, HIGH, 25000);
// Geçersiz değerleri güvenli değerlere çekiyoruz.
if (rcRoll < 1000 || rcRoll > 2000)
rcRoll = 1500;
if (rcPitch < 1000 || rcPitch > 2000)
rcPitch = 1500;
if (rcThrottle < 1000 || rcThrottle > 2000)
rcThrottle = 1000;
if (rcYaw < 1000 || rcYaw > 2000)
rcYaw = 1500;
}
// =========================================================
// 22. RC SİNYAL KONTROLÜ
// =========================================================
bool receiverIsValid()
{
// Throttle değerinin mantıklı aralıkta olup
// olmadığını kontrol ediyoruz.
if (rcThrottle < 900 || rcThrottle > 2100)
return false;
return true;
}
// =========================================================
// 23. ARM / DISARM
// =========================================================
void checkArm()
{
/*
Basit güvenlik mantığı:
Throttle minimumda
Yaw minimumda ise ARM.
Throttle minimumda
Yaw maksimumda ise DISARM.
*/
if (rcThrottle < 1050 && rcYaw < 1100)
{
armed = true;
}
if (rcThrottle < 1050 && rcYaw > 1900)
{
armed = false;
}
}
// =========================================================
// 24. PID HESAPLAMA
// =========================================================
void calculatePID(float deltaTime)
{
// Kumanda merkezini hedef açı olarak kullanıyoruz.
float targetRoll =
map(rcRoll, 1000, 2000, -30, 30);
float targetPitch =
map(rcPitch, 1000, 2000, -30, 30);
/*
Yaw için doğrudan açı yerine
gyro hızı kullanılabilir.
Kumandanın merkez noktası:
yaklaşık 1500 µs.
*/
float targetYawRate =
map(rcYaw, 1000, 2000, -150, 150);
// Roll hatası.
rollError =
targetRoll - rollAngle;
// Pitch hatası.
pitchError =
targetPitch - pitchAngle;
// Yaw için gyro hızını tekrar hesaplıyoruz.
float currentYawRate =
(gyroZ - gyroOffsetZ) / 131.0;
yawError =
targetYawRate - currentYawRate;
// -------------------------------------------------------
// ROLL PID
// -------------------------------------------------------
rollIntegral +=
rollError * deltaTime;
rollIntegral =
constrain(rollIntegral, -100, 100);
float rollDerivative =
(rollError - previousRollError) /
deltaTime;
rollPID =
KpRoll * rollError +
KiRoll * rollIntegral +
KdRoll * rollDerivative;
previousRollError =
rollError;
// -------------------------------------------------------
// PITCH PID
// -------------------------------------------------------
pitchIntegral +=
pitchError * deltaTime;
pitchIntegral =
constrain(pitchIntegral, -100, 100);
float pitchDerivative =
(pitchError - previousPitchError) /
deltaTime;
pitchPID =
KpPitch * pitchError +
KiPitch * pitchIntegral +
KdPitch * pitchDerivative;
previousPitchError =
pitchError;
// -------------------------------------------------------
// YAW PID
// -------------------------------------------------------
yawIntegral +=
yawError * deltaTime;
yawIntegral =
constrain(yawIntegral, -100, 100);
float yawDerivative =
(yawError - previousYawError) /
deltaTime;
yawPID =
KpYaw * yawError +
KiYaw * yawIntegral +
KdYaw * yawDerivative;
previousYawError =
yawError;
// PID çıkışlarını sınırlandırıyoruz.
rollPID =
constrain(rollPID, -400, 400);
pitchPID =
constrain(pitchPID, -400, 400);
yawPID =
constrain(yawPID, -300, 300);
}
// =========================================================
// 25. MOTOR MIXING
// =========================================================
void mixMotors()
{
// Throttle değerini motor çalışma aralığına
// dönüştürüyoruz.
int throttle =
constrain(rcThrottle, 1000, 2000);
/*
MOTOR YERLEŞİMİ:
ÖN
M1 M2
\ /
DRONE
/ \
M3 M4
M1 = CW
M2 = CCW
M3 = CCW
M4 = CW
*/
motor1 =
throttle
+ pitchPID
+ rollPID
- yawPID;
motor2 =
throttle
+ pitchPID
- rollPID
+ yawPID;
motor3 =
throttle
- pitchPID
- rollPID
- yawPID;
motor4 =
throttle
- pitchPID
+ rollPID
+ yawPID;
// Motor değerlerini güvenli aralıkta tutuyoruz.
motor1 =
constrain(motor1, 1000, 2000);
motor2 =
constrain(motor2, 1000, 2000);
motor3 =
constrain(motor3, 1000, 2000);
motor4 =
constrain(motor4, 1000, 2000);
}
// =========================================================
// 26. MOTORLARA SİNYAL GÖNDERME
// =========================================================
void writeMotors()
{
// ESC 1'e sinyal.
esc1.writeMicroseconds(motor1);
// ESC 2'ye sinyal.
esc2.writeMicroseconds(motor2);
// ESC 3'e sinyal.
esc3.writeMicroseconds(motor3);
// ESC 4'e sinyal.
esc4.writeMicroseconds(motor4);
}
// =========================================================
// 27. MOTORLARI DURDURMA
// =========================================================
void stopMotors()
{
motor1 = 1000;
motor2 = 1000;
motor3 = 1000;
motor4 = 1000;
esc1.writeMicroseconds(1000);
esc2.writeMicroseconds(1000);
esc3.writeMicroseconds(1000);
esc4.writeMicroseconds(1000);
}
// =========================================================
// 28. PID SIFIRLAMA
// =========================================================
void resetPID()
{
rollIntegral = 0;
pitchIntegral = 0;
yawIntegral = 0;
previousRollError = 0;
previousPitchError = 0;
previousYawError = 0;
}
🔍 Kodun Çalışma Mantığı
Kodun tamamını tek bir sistem olarak düşündüğümüzde çalışma sırası şöyledir:
RC KUMANDA
│
▼
RC ALICI
│
┌──────────┴──────────┐
│ │
▼ ▼
Roll/Pitch/Yaw Throttle
│ │
└──────────┬──────────┘
▼
ARDUINO
▲
│
MPU6050
│
▼
Sensör Füzyonu
│
▼
PID KONTROL
│
▼
MOTOR MIXING
│
┌──────────┼──────────┐
▼ ▼ ▼
ESC ESC ESC ...
│ │
▼ ▼
MOTOR MOTOR
│
▼
QUADCOPTER
🧭 1. MPU6050 Veriyi Okuyor
readMPU6050() fonksiyonu sensörden:
- X ivme
- Y ivme
- Z ivme
- X gyro
- Y gyro
- Z gyro
verilerini okuyor.
MPU6050 ham değerler üretir.
Örneğin gyro X ekseninin ham değeri doğrudan derece değildir.
Bu nedenle:
float gyroRateX =
(gyroX - gyroOffsetX) / 131.0;
ile yaklaşık olarak derece/saniye değerine dönüştürülür.
🧭 2. Gyro Kalibrasyonu
Drone sabit dururken gyro tamamen sıfır göstermeyebilir.
Örneğin drone hareket etmiyorken:
X = +4
Y = -7
Z = +3
gibi değerler okunabilir.
Bunlara bias/offset denir.
Kod başlangıçta 1000 ölçüm alarak ortalama offset hesaplar:
gyroOffsetX = sumX / 1000.0;
Sonraki ölçümlerde bu hata çıkarılır.
📐 3. Açı Hesaplama
Accelerometer kısa vadede çok hassas değildir ancak yerçekimi vektöründen drone’un eğimini tahmin edebilir.
Gyroscope ise hareket değişimlerini hızlı şekilde algılar ancak zamanla drift oluşturur.
Bu iki sensörün avantajlarını birleştirmek için:
Complementary Filter
kullanıyoruz.
Kod:
rollAngle =
0.98 * rollAngle +
0.02 * accRoll;
anlam olarak:
“Gyroscope bilgisinin %98’ini, accelerometer bilgisinin %2’sini kullan.”
demektir.
Gerçek bir flight controller’da daha gelişmiş sensör füzyon yöntemleri tercih edilebilir.
🎮 4. Kumanda Değerleri
RC alıcı genellikle yaklaşık olarak:
1000 µs → Minimum
1500 µs → Merkez
2000 µs → Maksimum
aralığında PWM sinyali üretir.
Örneğin:
ROLL
1000 ───── 1500 ───── 2000
SOL MERKEZ SAĞ
Pitch için:
1000 ───── 1500 ───── 2000
ÖN MERKEZ ARKA
Throttle için:
1000 ───── 1500 ───── 2000
MIN ORTA MAX
şeklinde yorumlanabilir.
Ancak gerçek kumanda kanal yönleri kumanda ayarlarına göre değişebilir.
🧠 5. Hedef Açı Belirleniyor
Kodda:
float targetRoll =
map(rcRoll, 1000, 2000, -30, 30);
kullanılıyor.
Bunun anlamı:
RC 1000 → -30°
RC 1500 → 0°
RC 2000 → +30°
şeklinde hedef roll açısı oluşturmaktır.
Pitch için de aynı yöntem kullanılır.
Bu sayede pilot kumandayı hareket ettirdiğinde drone’un hedef eğim açısı değişir.
⚙️ 6. PID Hatası Hesaplanıyor
Örneğin pilot drone’un 10° sağa yatmasını istiyor:
Hedef açı = +10°
Mevcut açı = +4°
Hata = +6°
Kod:
rollError =
targetRoll - rollAngle;
ile bu farkı hesaplar.
PID kontrolcüsü daha sonra bu hatayı düzeltmeye çalışır.
📈 7. P – Oransal Kontrol
rollPID =
KpRoll * rollError;
Hata büyüdükçe P etkisi büyür.
Örneğin:
Hata = 2° → küçük düzeltme
Hata = 10° → daha büyük düzeltme
Bu yüzden P katsayısı drone’un tepki karakterini ciddi şekilde etkiler.
⏱️ 8. I – Integral Kontrol
Integral bölüm:
rollIntegral +=
rollError * deltaTime;
şeklinde hesaplanır.
Drone uzun süre küçük bir hata ile uçuyorsa integral bölüm bu hatayı gidermeye yardımcı olur.
Ancak I değeri fazla artırılırsa sistemde:
- Salınım
- Aşırı tepki
- Kararsızlık
oluşabilir.
Bu nedenle integral sınırlandırılmıştır:
rollIntegral =
constrain(rollIntegral, -100, 100);
⚡ 9. D – Türev Kontrolü
D bölümü hatanın değişim hızını takip eder:
float rollDerivative =
(rollError - previousRollError) /
deltaTime;
Drone çok hızlı bir şekilde hedef açıya yaklaşıyorsa D bileşeni sistemi frenlemeye yardımcı olur.
Basitçe:
P “Ne kadar hata var?”
I “Bu hata ne kadar süredir var?”
D “Hata ne kadar hızlı değişiyor?”
sorusuna cevap verir.
🔄 10. Motor Mixing
Burası drone kodunun en önemli bölümlerinden biridir.
PID sonucu tek bir motora gönderilmez.
Örneğin Roll düzeltmesi:
motor1 =
throttle
+ pitchPID
+ rollPID
- yawPID;
şeklinde Motor 1’e dağıtılır.
Diğer motorlara da farklı işaretlerle uygulanır.
Böylece dört motor birlikte çalışarak drone’un hareketini kontrol eder.
🛩️ 11. Dört Motorun Görevi
Örneğin drone sağa doğru yatarsa:
SOL SAĞ
↑ ↓
MOTORLAR MOTORLAR
ARTIRILIR AZALTILIR
şeklinde düzeltme yapılabilir.
Fakat burada çok önemli bir nokta vardır:
Motor yönleri veya frame geometrisi değişirse motor mixing formülleri de değişebilir.
Bu nedenle gerçek drone üzerinde motor yönü mutlaka test edilmelidir.
🔄 12. Yaw Kontrolü
Yaw, drone’un kendi ekseni etrafında dönmesidir.
Kodda yaw için doğrudan açı yerine gyro Z hızı kullanılmaktadır:
float currentYawRate =
(gyroZ - gyroOffsetZ) / 131.0;
Bu yaklaşım manuel uçuşta daha kullanışlıdır.
Ancak MPU6050’nin manyetometresi olmadığı için yaw açısı uzun süreli uçuşta drift yapabilir.
Daha gelişmiş sistemlerde:
Manyetometre + IMU + sensör füzyonu
kullanılabilir.
🛑 13. Arm / Disarm
Kodda motorların kontrolsüz çalışmasını önlemek için basit arm sistemi bulunuyor.
Arm:
Throttle minimum
+
Yaw minimum
Disarm:
Throttle minimum
+
Yaw maksimum
şeklinde düşünülmüştür.
Gerçek sistemlerde bunun daha gelişmiş bir güvenlik durum makinesiyle uygulanması tavsiye edilir.
🚨 14. Kumanda Kesilirse Ne Oluyor?
Kod:
if (!receiverIsValid())
{
armed = false;
stopMotors();
return;
}
ile geçersiz alıcı verisinde motorları durduruyor.
Bu, temel bir failsafe yaklaşımıdır.
Ancak gerçek bir uçuş sisteminde yalnızca pulseIn() ile bağlantı kontrolü yapmak yeterli değildir. Alıcının kendi failsafe özelliklerinin de doğru yapılandırılması gerekir.
🔧 PID Ayarı Nasıl Yapılır?
PID ayarı drone projesinin en zor bölümlerinden biridir.
Başlangıçta:
Kp = düşük
Ki = çok düşük
Kd = düşük/orta
şeklinde başlanabilir.
Drone tepki vermiyorsa:
Kp artırılır.
Drone çok fazla salınıyorsa:
Kp azaltılır veya D artırılır.
Drone sürekli küçük bir açı hatası bırakıyorsa:
Ki kontrollü şekilde artırılabilir.
Ancak PID değerleri motor, pervane, frame, ağırlık, batarya ve uçuş kontrol döngüsüne bağlı olduğundan başka bir drone’un PID değerlerini doğrudan kopyalamak doğru değildir.
🧪 Test Sırası
Bu kodla çalışırken aşağıdaki sıra izlenmelidir:
Test 1
Arduino + MPU6050.
Test 2
MPU6050 sensör verilerini Serial Monitor’de izleme.
Test 3
Gyro kalibrasyonu.
Test 4
RC kumanda değerlerini izleme.
Test 5
Tek ESC bağlantısı.
Test 6
Dört ESC’nin minimum gaz sinyalini test etme.
Test 7
Motor yönlerini pervaneler sökülmüş halde kontrol etme.
Test 8
PID çıkışlarını Serial Monitor’de izleme.
Test 9
Motor mixing kontrolü.
Test 10
Drone’u sabit bir test düzeneğinde kontrol etme.
Test 11
Çok kısa ve kontrollü ilk uçuş.
🚀 Bu Kodu Nasıl Geliştirebiliriz?
Bu temel yazılımı daha profesyonel bir Arduino/ESP32 drone projesine dönüştürmek için sonraki aşamalarda:
- MPU6050 yerine daha gelişmiş IMU
- Kalman Filter
- Mahony/Madgwick sensör füzyonu
- GPS
- BMP280 barometre
- Manyetometre
- Batarya voltaj ölçümü
- Akım sensörü
- Telemetri
- OLED ekran
- SD kart uçuş kaydı
- Bluetooth/Wi-Fi
- Otonom uçuş
- Waypoint sistemi
- Geofence
- Daha gelişmiş failsafe
- Daha yüksek frekanslı kontrol döngüsü
eklenebilir.
Özellikle eğitim amaçlı bir Arduino Drone Atölyesi hazırlanacaksa projeyi tek seferde uçan drone olarak değil, öğrencilerin önce ESC → motor → IMU → RC → PID → motor mixing → stabilizasyon adımlarını ayrı ayrı öğrenebileceği modüler bir sistem olarak tasarlamak çok daha doğru olur.
🧭 MPU6050 ile Drone Dengeleme
Drone’un en önemli problemlerinden biri dengede kalmaktır.
Örneğin drone sağ tarafa doğru eğildiğinde MPU6050 bunu algılar.
Arduino daha sonra:
- Sensör verisini okur.
- Drone’un mevcut açısını hesaplar.
- Hedef açıyla karşılaştırır.
- Hata değerini bulur.
- PID algoritmasını çalıştırır.
- Motor hızlarını düzeltir.
Bu işlem saniyede birçok kez tekrarlanır.
Böylece drone sürekli olarak kendisini düzeltmeye çalışır.
📐 Roll, Pitch ve Yaw Nedir?
Drone kontrolünü anlayabilmek için üç temel ekseni bilmek gerekir.
Roll – X Ekseni
Drone’un sağa veya sola yatmasıdır.
SOL ←──────→ SAĞ
ROLL
Pitch – Y Ekseni
Drone’un önünün yukarı veya aşağı hareketidir.
ÖN
↑
PITCH
↓
ARKA
Yaw – Z Ekseni
Drone’un kendi merkezi etrafında dönmesidir.
↺ YAW ↻
Uçuş kontrol algoritması bu üç hareketi aynı anda yönetebilir.
🧮 PID Kontrol Algoritması
Arduino drone projesinin en önemli yazılım bölümlerinden biri PID kontrolüdür.
PID:
P = Proportional
I = Integral
D = Derivative
kelimelerinin baş harflerinden oluşur.
Temel PID formülü:
Çıkış = Kp × Hata
+ Ki × Hata Toplamı
+ Kd × Hata Değişimi
P – Proportional
Mevcut hataya tepki verir.
Drone çok fazla eğilmişse P bileşeni güçlü bir düzeltme uygulanmasını sağlar.
I – Integral
Uzun süre devam eden küçük hataları düzeltmeye yardımcı olur.
D – Derivative
Hatanın ne kadar hızlı değiştiğine bakar.
Bu bileşen, sistemin aşırı tepki vermesini azaltmaya yardımcı olur.
Drone gibi hızlı tepki vermesi gereken sistemlerde PID ayarlarının doğru yapılması son derece önemlidir.
💻 Arduino Drone Kontrol Yazılımının Temel Mantığı
Basitleştirilmiş yazılım akışı aşağıdaki gibidir:
BAŞLA
│
▼
Sensörleri başlat
│
▼
MPU6050 verilerini oku
│
▼
RC kumanda verilerini oku
│
▼
Roll / Pitch / Yaw hesapla
│
▼
Hedef değerleri belirle
│
▼
PID hesapla
│
▼
Motor çıkışlarını hesapla
│
▼
ESC'lere sinyal gönder
│
▼
Güvenlik kontrolü
│
└──────────────► Döngüyü tekrarla
🧑💻 Örnek Arduino Kod Yapısı
Aşağıdaki kod, gerçek uçuş için doğrudan kullanılacak tamamlanmış bir flight controller değildir. Arduino drone yazılımının temel mimarisini göstermek amacıyla hazırlanmış örnek bir iskelettir.
#include <Wire.h>
#include <Servo.h>
Servo esc1;
Servo esc2;
Servo esc3;
Servo esc4;
const int motor1Pin = 3;
const int motor2Pin = 5;
const int motor3Pin = 6;
const int motor4Pin = 9;
int throttle = 1000;
void setup() {
Serial.begin(115200);
Wire.begin();
esc1.attach(motor1Pin);
esc2.attach(motor2Pin);
esc3.attach(motor3Pin);
esc4.attach(motor4Pin);
// Minimum gaz
esc1.writeMicroseconds(1000);
esc2.writeMicroseconds(1000);
esc3.writeMicroseconds(1000);
esc4.writeMicroseconds(1000);
delay(3000);
}
void loop() {
// Sensör verileri burada okunacak
// Roll hesaplama
// Pitch hesaplama
// Yaw hesaplama
// PID hesaplamaları
// Motor miksajı
esc1.writeMicroseconds(throttle);
esc2.writeMicroseconds(throttle);
esc3.writeMicroseconds(throttle);
esc4.writeMicroseconds(throttle);
delay(5);
}
Bu kodun amacı, ESC’lerin Arduino üzerinden nasıl kontrol edilebileceğini göstermektir.
Gerçek uçuş kontrolünde bunun üzerine:
- MPU6050 okuma,
- Sensör füzyonu,
- Gyro kalibrasyonu,
- Accelerometer kalibrasyonu,
- RC input,
- PID,
- Motor mixing,
- Arming/disarming,
- Failsafe,
- Battery monitoring
gibi bölümler eklenmelidir.
🔄 Motor Mixing Mantığı
Drone’un uçuş kontrolcüsü PID çıktısını doğrudan tek bir motora göndermez.
Bunun yerine Roll, Pitch ve Yaw düzeltmeleri motorlara dağıtılır.
Basitleştirilmiş bir yapı:
Throttle
+
Roll
+
Pitch
+
Yaw
│
▼
MOTOR MIXER
│
┌─┼─┬─┐
▼ ▼ ▼ ▼
M1 M2 M3 M4
Örneğin drone sağa doğru yatıyorsa sistem sol taraftaki motorların itişini artırırken sağ taraftaki motorların itişini azaltabilir.
Bu değişiklik sonucunda gövde tekrar yatay konuma getirilmeye çalışılır.
📡 Arduino Drone İçin Haberleşme Seçenekleri
Drone projesinde kumanda haberleşmesi için farklı teknolojiler kullanılabilir.
RC Alıcı
Gerçek uçuş için en uygun seçeneklerden biridir.
Avantajları:
- Düşük gecikme
- Uzun menzil
- Güvenilir bağlantı
- Çok kanallı kontrol
Bluetooth
Eğitim ve masaüstü deneyleri için kullanılabilir.
Ancak gerçek uçuş için menzil ve bağlantı güvenilirliği açısından uygun birincil kontrol sistemi değildir.
Wi-Fi
ESP32 gibi kartlarla kullanılabilir.
Özellikle:
- Telemetri
- Web arayüzü
- Kamera
- Mobil kontrol
- Yer istasyonu
gibi uygulamalarda değerlendirilebilir.
📊 Telemetri Sistemi
Gelişmiş bir Arduino drone projesine telemetri sistemi eklenebilir.
Yer istasyonuna şu bilgiler gönderilebilir:
- Batarya voltajı
- Motor durumu
- Uçuş süresi
- Roll
- Pitch
- Yaw
- GPS koordinatları
- İrtifa
- Uydu sayısı
- Sinyal durumu
Örneğin:
-----------------------------
DRONE TELEMETRİ
-----------------------------
Batarya : 15.2 V
İrtifa : 12.4 m
Roll : +1.8°
Pitch : -0.7°
Yaw : 134°
GPS : 10 Uydu
Süre : 04:32
Durum : ARMED
-----------------------------
Bu yapı projeyi basit bir Arduino uygulamasından profesyonel bir robotik sisteme dönüştürür.
🛰️ GPS Eklenmesi
Drone’a GPS modülü eklenerek konum bilgisi alınabilir.
GPS sayesinde:
- Konum takibi
- Waypoint sistemi
- Eve dönüş
- Geofence
- Harita üzerinde izleme
gibi daha gelişmiş fonksiyonlar geliştirilebilir.
Ancak GPS tek başına drone’u dengede tutmaz.
GPS daha çok konum kontrolü için kullanılır.
Uçuş stabilizasyonunda IMU, barometre ve gerektiğinde manyetometre gibi sensörler birlikte değerlendirilebilir.
📏 Barometre ile İrtifa Kontrolü
BMP280 veya benzeri bir barometrik sensör kullanılarak atmosfer basıncından yaklaşık irtifa bilgisi elde edilebilir.
Bu sistem sayesinde drone’un belirli bir irtifayı koruması hedeflenebilir.
Örneğin:
Hedef irtifa: 5 metre
Mevcut irtifa: 4.2 metre
Hata: +0.8 metre
↓
Kontrol algoritması
↓
Motor itişinde düzeltme
Bu sistem özellikle otonom drone projelerinde önemlidir.
🧭 Manyetometre Kullanımı
Manyetometre, drone’un manyetik kuzeye göre yönünü belirlemeye yardımcı olabilir.
Örneğin MPU9250/ICM serisi gibi daha gelişmiş IMU çözümleri veya ayrı bir manyetometre kullanılabilir.
GPS + IMU + barometre + manyetometre birlikte kullanıldığında drone’un çevresini ve hareketini daha kapsamlı şekilde algılaması mümkün olur.
🔋 Li-Po Batarya Seçimi
Drone sistemlerinde Li-Po bataryalar yaygın olarak kullanılır.
Örneğin:
3S Li-Po
yaklaşık:
3 × 3.7 V = 11.1 V nominal
gerilime sahiptir.
4S Li-Po
yaklaşık:
4 × 3.7 V = 14.8 V nominal
gerilime sahiptir.
Ancak batarya seçimi yalnızca voltaja göre yapılmaz.
Motorların:
- KV değeri,
- Maksimum akımı,
- Pervane çapı,
- ESC kapasitesi,
- Drone ağırlığı
birlikte değerlendirilmelidir.
⚡ ESC Seçimi
ESC’nin sürekli taşıyabileceği akım, motorun maksimum akımından yeterli güvenlik payıyla yüksek olmalıdır.
Örneğin motor maksimum 18 A çekiyorsa, 20 A’lık bir ESC sınırda kalabilir. Uygun sistem tasarımında daha yüksek kapasiteli bir ESC tercih edilir.
ESC seçerken:
- Maksimum akım
- Batarya hücre sayısı
- Motor uyumluluğu
- Protokol desteği
- Soğutma
- Ağırlık
dikkate alınmalıdır.
🌀 Brushless Motor Seçimi
Motor seçimi drone’un performansını doğrudan etkiler.
Motor üzerinde örneğin:
2205 – 2300KV
gibi ifadeler görülebilir.
KV değeri kabaca motorun yüksüz durumda volt başına dönme hızını ifade eder.
Ancak:
Daha yüksek KV her zaman daha güçlü drone anlamına gelmez.
Motor, batarya ve pervane birlikte değerlendirilmelidir.
Yanlış motor-pervane kombinasyonu:
- Aşırı akım,
- Motor ısınması,
- ESC ısınması,
- Düşük uçuş süresi,
- Kararsız uçuş
gibi problemlere neden olabilir.
🛡️ Güvenlik Sistemi
Drone projesinde güvenlik sistemi mutlaka bulunmalıdır.
Önerilen güvenlik özellikleri:
Arm / Disarm
Motorların yanlışlıkla çalışmasını önler.
Failsafe
Kumanda bağlantısı kesildiğinde önceden belirlenmiş güvenli davranışı uygular.
Low Battery
Batarya voltajı kritik seviyeye düştüğünde uyarı veya uygun güvenli davranış uygulanabilir.
Motor Stop
Kontrol sistemi hata algıladığında motorların güvenli şekilde durdurulmasını sağlar.
Sensör Hatası
IMU verisi mantıksız hale geldiğinde sistem uçuşa geçmemeli veya güvenli moda geçmelidir.
🧪 İlk Testler Nasıl Yapılmalı?
Drone’un ilk testi pervaneler takılı şekilde yapılmamalıdır.
Güvenli test sırası:
1. Elektronik bağlantıları kontrol edin
Kısa devre veya ters bağlantı olup olmadığını kontrol edin.
2. Sensörü test edin
MPU6050’nin X, Y ve Z değerlerinin doğru değiştiğini gözlemleyin.
3. Kumandayı test edin
Throttle, Roll, Pitch ve Yaw değerlerinin doğru okunduğunu kontrol edin.
4. ESC kalibrasyonunu kontrol edin
Kullanılan ESC’nin üretici prosedürüne uygun şekilde kalibrasyonunu yapın.
5. Motor yönlerini kontrol edin
Motorların doğru yönde döndüğünden emin olun.
6. Pervaneleri kontrol edin
Pervanelerin motor yönlerine uygun takıldığını doğrulayın.
7. İlk uçuş
İlk uçuşlar açık ve güvenli bir alanda, çevrede insan ve engel bulunmadan gerçekleştirilmelidir.
🧰 Arduino Drone’da Sık Karşılaşılan Problemler
Drone havalanınca kendi etrafında dönüyor
Muhtemel nedenler:
- Motor dönüş yönleri yanlış.
- Pervane yönleri yanlış.
- Motor mixing hatalı.
- Yaw PID ayarı hatalı.
Drone bir tarafa yatıyor
Muhtemel nedenler:
- Motorlardan biri farklı güç üretiyor.
- Frame dengeli değil.
- IMU kalibrasyonu hatalı.
- PID ayarları uygun değil.
- Pervanelerden biri hasarlı.
Motorlardan biri çalışmıyor
Kontrol edilmesi gerekenler:
- ESC bağlantısı
- ESC güç bağlantısı
- Arduino sinyal pini
- Motor kabloları
- ESC arızası
- Motor arızası
Arduino reset atıyor
Bunun önemli nedenlerinden biri güç sistemidir.
Motorların oluşturduğu yüksek akım değişimleri kontrol elektroniğinde gerilim düşüşlerine ve parazite neden olabilir.
Çözüm olarak:
- Uygun BEC/regülatör
- Uygun güç dağıtımı
- Filtreleme
- Doğru topraklama
- Yeterli akım kapasitesi
değerlendirilmelidir.
🧑🏫 Eğitim Amaçlı Arduino Drone Projesi
Bu proje eğitim kurumlarında oldukça kapsamlı bir STEM çalışmasına dönüştürülebilir.
Öğrenciler proje sırasında:
Elektronik
- Arduino
- Sensörler
- ESC
- Motor
- Batarya
- PWM
öğrenir.
Programlama
- C/C++
- Değişkenler
- Fonksiyonlar
- Döngüler
- Sensör verisi
- PID algoritması
üzerinde çalışırlar.
Matematik
- Açılar
- Hata hesabı
- Oranlar
- Trigonometri
- Kontrol algoritmaları
gibi konular projeye dahil edilebilir.
Mekanik
- Drone frame tasarımı
- Ağırlık merkezi
- Motor yerleşimi
- Pervane seçimi
incelenebilir.
Bu nedenle Arduino drone projesi, robotik kodlama ve STEM atölyelerinde oldukça güçlü bir uygulama alanına sahiptir.
🚀 Projeyi Geliştirme Fikirleri
Temel drone kontrol sisteminden sonra proje kademeli olarak geliştirilebilir.
Seviye 1 – Manuel Drone
Arduino + MPU6050 + ESC + motor + RC kumanda.
Seviye 2 – Stabilizasyon
PID kontrollü Roll, Pitch ve Yaw sistemi.
Seviye 3 – Telemetri
Kablosuz veri aktarımı.
Seviye 4 – GPS
Konum ve hız bilgisi.
Seviye 5 – İrtifa Kontrolü
Barometre ile yükseklik kontrolü.
Seviye 6 – Otonom Uçuş
Waypoint ve otomatik rota sistemi.
Seviye 7 – Görüntü İşleme
Kamera ve yapay zekâ destekli nesne/işaret algılama.
Seviye 8 – Yer İstasyonu
Bilgisayar üzerinden:
- Harita
- Telemetri
- Uçuş verileri
- Batarya
- GPS
- Sensör bilgileri
izlenebilir.
🤖 Arduino mu, ESP32 mi?
Eğitim amaçlı temel bir drone projesinde Arduino Nano gibi kartlar oldukça öğreticidir.
Ancak daha gelişmiş bir sistem için ESP32 gibi daha güçlü mikrodenetleyiciler değerlendirilebilir.
| Özellik | Arduino Nano | ESP32 |
|---|---|---|
| İşlem gücü | Temel | Yüksek |
| Wi-Fi | Yok | Var |
| Bluetooth | Yok | Var |
| GPIO | Yeterli | Çok sayıda |
| Eğitim kolaylığı | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Gelişmiş proje | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
Ancak gerçek bir uçuş kontrolcüsünde mikrodenetleyici seçimi yapılırken yalnızca işlem gücü değil; gerçek zamanlı çalışma, zamanlayıcılar, PWM çıkışları, sensör okuma hızı, yazılım ekosistemi ve güvenilirlik birlikte değerlendirilmelidir.
📋 Örnek Proje Mimarisi
Eğitim amaçlı geliştirilebilecek sistemin genel mimarisi:
┌─────────────────┐
│ RC KUMANDA │
└────────┬────────┘
│
▼
┌─────────────────┐
│ RC ALICI │
└────────┬────────┘
│
▼
┌──────────────┐ ┌─────────────────┐
│ MPU6050 │──►│ ARDUINO │
└──────────────┘ │ FLIGHT CONTROL │
└────────┬────────┘
│
┌────────┴────────┐
│ PID + MIXER │
└────────┬────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
ESC 1 ESC 2 ESC 3
│ │ │
▼ ▼ ▼
MOTOR 1 MOTOR 2 MOTOR 3
┌─────────┐
│ ESC 4 │
└────┬────┘
▼
MOTOR 4
📈 Proje İçin Önerilen Geliştirme Yol Haritası
Arduino drone projesini tek seferde yapmak yerine aşamalı geliştirmek çok daha sağlıklı olacaktır.
Aşama 1: Arduino ile PWM çıkışı
↓
Aşama 2: Tek ESC + tek motor testi
↓
Aşama 3: Dört ESC + dört motor
↓
Aşama 4: MPU6050 sensör okuma
↓
Aşama 5: IMU kalibrasyonu
↓
Aşama 6: Roll/Pitch/Yaw hesaplama
↓
Aşama 7: PID kontrol
↓
Aşama 8: Motor mixing
↓
Aşama 9: RC kumanda
↓
Aşama 10: Failsafe ve batarya kontrolü
↓
Aşama 11: GPS ve telemetri
↓
Aşama 12: Otonom uçuş
Bu yaklaşım, özellikle öğrencilerle yürütülen projelerde hata ayıklamayı ciddi şekilde kolaylaştırır.
🏁 Sonuç
Arduino Drone Kontrol Devreleri Projesi, yalnızca dört motoru çalıştırmaktan ibaret olmayan, elektronik ve yazılımın birlikte kullanıldığı ileri seviye bir robotik uygulamadır.
Projede Arduino; sensörlerden gelen bilgileri işler, RC kumandadan gelen komutları değerlendirir, PID kontrol algoritmasıyla gerekli düzeltmeleri hesaplar ve ESC’ler üzerinden dört motorun hızlarını yönetir.
Temel sistem:
Arduino + MPU6050 + ESC + Brushless Motor + RC Kumanda
şeklinde kurulabilir.
Daha gelişmiş bir sistem ise:
IMU + GPS + Barometre + Manyetometre + Telemetri + PID + Otonom Uçuş + Yer İstasyonu
gibi teknolojilerle geliştirilebilir.
Bu nedenle proje; Arduino eğitimi, robotik kodlama, STEM/STEAM çalışmaları, maker atölyeleri, üniversite projeleri ve İHA teknolojilerine giriş için oldukça güçlü bir örnektir.
Özellikle eğitim ortamında projenin doğrudan uçurulabilir bir drone olarak değil, önce motor kontrolü → sensör → stabilizasyon → PID → uçuş kontrolü şeklinde aşamalı olarak geliştirilmesi hem daha güvenli hem de çok daha öğretici olacaktır.
İstanbul İz Atölye Eğitim Çözümleri San. ve Tic. Ltd. Şti., eğitim kurumlarına yönelik yenilikçi atölye kurulumlarıyla öne çıkan, proje geliştirme ve uygulama süreçlerinde uçtan uca destek sunan bir çözüm ortağıdır. Robotik kodlama, yazılım, ahşap tasarım, STEM ve sanal gerçeklik gibi farklı alanlarda modern, sürdürülebilir ve eğitim odaklı atölye ortamları tasarlar. Kurumların ihtiyaçlarına özel analizler yaparak en uygun ekipman, içerik ve altyapıyı belirler; kurulum sürecinden eğitmen eğitimine kadar tüm aşamalarda aktif rol alır. Ayrıca ulusal ve uluslararası hibe programlarına yönelik proje yazımı, danışmanlık ve uygulama desteği sağlayarak kurumların hem teknik hem de finansal açıdan güçlenmesine katkıda bulunur.
📞 Proje Desteği İçin Bize Ulaşın ( 0850 840 4783 )
🚀 Projeni Hayata Geçir! ( WhatsApp )
İz Atölye olarak sadece atölye kurmuyor, kurumunuza özel sürdürülebilir eğitim ekosistemleri tasarlıyor; doğru ekipman, güçlü içerik ve uçtan uca proje desteğiyle süreci zahmetsiz ve verimli hale getiriyoruz.
Deneyim, hız ve sonuç odaklı yaklaşımımızla yatırımınızı kısa sürede somut çıktılara dönüştürüyoruz.

Yorum ekle