[DIY]: Arduino ile Rectract - Iniş Takımı Uygulaması

Zafer ŞAHİN

Mahna Mahna ...
Katılım
29 Ağu 2013
Mesajlar
1,313
Tepkime puanı
2,193
Yaş
47
Konum
İstanbul
İlgi Alanı
Multikopter
Adı üstünde, proje Arduino kullanarak, kumanda kontrollü bir iniş takımı yapmak. Fakat burada motor ve servo ekipmanlarından ziyade Arduino ve yazılımı üzerinden gidiyor olacağız. 12.01.2015 tarihi itibarı ile amaç şu şekilde :

- İniş takımınının elektroniğini, Arduino kullanarak kodu ile beraber gerçekleştirmek.
- Mekanik ve elektriksel kısım olarak (genelde) hazır sistemleri kullanmak.
- İniş takımını kumanda üzürinden açmak ve kapatmak.
- Ek olarak bir kapak mekanizması kullanamak.

Mevcut olan en yeni kod, bu ilk mesajda düzenli olarak güncelleniyor olacak. Kodun hangi aşamalardan geçtiğini görmek isteyenlerin konuyu okumaları gerekiyor çunkü burada tekrar yazılamayacak kadar karışık ve uzun.

Güncel Durum
- 12.01.2015 : Servo kontrolü yok. İniş takımı motorları, ACS712 vasıtası akım kontrollü olarak durduruluyor. Belirli bir süre bekleyip işlem yaptıracak olan zamanlayıcı tipi kod öbekleri de koda dahil değil. İniş takımının sadece bir yarısı kodda mevcut.

Retract Project for RCKolik - Version 0.23.4h - Codename "Half of the apple"

Kod:
/* Retract Project for RCKolik
 by Zafer SAHIN 
 License of this example code is TEA-WARE.
 modified 11/01/2015 by Zafer SAHIN
 Version 0.23.4h - Codename "Half of the apple"
 */

int motor_left[] = {3, 11};    // Arduino pins for controlling left retract motor
int rxPin = 12;                // Arduino pin for receiver pin

int curentSensorLeft = 2;      // Arduino analog pin for left motor current sensor

int curretValLeft = 512;       // Analog reading for 0A current reading from ACS712 sensor

// These values are purely dependent on the current sensor and the load. Tweaked for ACS712 bidirectional current sensor
// and L293D motor drives. Further tweak might be necessary.
int currentLimitLOW = 409;     // Current values bigger than 1000mA to the negative direction.
int currentLimitHIGH = 614;    // Current values bigger than 1000mA to the positive direction.

int retractLeftState = 0 ;     // Variable to hold left retract position, open = 1, closed = -1

unsigned long rxPWMduration;  // Variable for reading receiver

void setup() {
  pinMode(motor_left[0], OUTPUT);
  pinMode(motor_left[1], OUTPUT);
  retractLeftStop();
  delay(5000);
  rxPWMduration = pulseIn(rxPin, HIGH);
  while (rxPWMduration < 800) {
    delay(1000);
    rxPWMduration = pulseIn(rxPin, HIGH);
  }
  delay(1000);
  if (rxPWMduration > 1500) {
    retractLeftState = 1;
  } else {
    retractLeftState = -1;
  }
}

void loop() {
  rxPWMduration = pulseIn(rxPin, HIGH);
  curretValLeft = analogRead(curentSensorLeft);
  
// This switch position is for opening the retracts
  if (rxPWMduration > 1500) {
// Left Retract Operations
    if (retractLeftState == 1) {         // If we are already in retractState = 1, do NOTHING, stop retract motor.
      retractLeftStop();
    } else {                             // If we are not in retractState = 1, because we are switched from another state just yet, open retracts, and sense current to stop.
      retractLeftOpen();
      if ((curretValLeft < currentLimitLOW) || (curretValLeft > currentLimitHIGH)) { 
        retractLeftState = 1;
      }
    }
// This switch position is for closing the retracts
  } else {
// Left Retract Operations
    if (retractLeftState == -1) {       // If we are already in retractState = -1, do NOTHING, stop retract motor.
      retractLeftStop();
    } else {                             // If we are not in retractState = -1, because we are switched from another state just yet, open retracts, and sense current to stop.
      retractLeftClose();
      if ((curretValLeft < currentLimitLOW) || (curretValLeft > currentLimitHIGH)) {
        retractLeftState = -1;
      }
    }
  }
}

void retractLeftOpen(){             // Function for opening Left Retract
  digitalWrite(motor_left[0], HIGH);
  digitalWrite(motor_left[1], LOW);
}
void retractLeftClose(){            // Function for closing Left Retract
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], HIGH);
}
void retractLeftStop(){            // Function for stopping Left Retract
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], LOW);
}
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Yavaş yavaş üzerinde düşünmek gerektiren bir şeyler yazmakta fayda var. Retract Project for RCKolik v0.22 alfa :).

Retract motorları ve iniş takımı kapakları kumanda ile kontrol ediliyor. Şimdili akım sensörü kodda yok. 3 pozisyonlu kumanda anahtarı, AÇMA - DURDURMA - KAPAMA modunda çalışıyor. Varsayılan olarak iniş takımları açık kabul ediliyor. AÇMA veya KAPAMA pozisyonlarında 1000milisaniye(servolar) + 4000milisaniye sonra, motorlar durduruluyor. Sonsuz döngü içerisinde, 3 farklı pozisyon için zamanı kontrol edebilmek, kodu bir öncekine göre belirgin bir şekilde karıştırıyor...

Kod:
/* Retract Project for RCKolik
 by Zafer SAHIN 
 This example code is in the public domain.

 modified 09/01/2015
 by Zafer SAHIN
 Version 0.22
 */

#include <Servo.h>

Servo lid_servo_left;          // Servo object for left retract lid
Servo lid_servo_right;         // Servo object for right retract lid

int motor_left[] = {3, 11};    // Arduino pins for controlling left retract motor
int motor_right[] = {5, 6};    // Arduino pins for controlling right retract motor
int lid_servo[] = {9, 10};     // Arduino pins for controlling lid servos
int rxPin = 12;                // Arduino pin for receiver pin

int servoPosClose = 180;       // Degree type value for positioning the lid servos closed
int servoPosOpen = 0;          // Degree type value for positioning the lid servos open

int retractState = 1 ;         // Variable to hold retract position, open = 1, stopped = 0, closed = -1

unsigned long previousMillis = 0;        // Timer variables
unsigned long retractStopDelay = 4000;   // Timer variables
unsigned long currentMillis = 0;         // Timer variables
boolean initMillis = true;               // Timer variables

unsigned long rxPWMduration;  // Variable for reading receiver

void setup() {
  pinMode(motor_left[0], OUTPUT);
  pinMode(motor_left[1], OUTPUT);
  pinMode(motor_right[0], OUTPUT);
  pinMode(motor_right[1], OUTPUT);
  lid_servo_left.attach(lid_servo[0]);
  lid_servo_right.attach(lid_servo[1]);
  previousMillis = millis();
}

void loop() {
  rxPWMduration = pulseIn(sensePin, HIGH);
  if (rxPWMduration > 1600) {  // This switch position is for opening the retracts
    if (retractState == 1) {   // If we are already in retractState = 1, do NOTHING, stop retract motor.
      retractStop();
    } else {                   // If we are not in retractState = 1, because we are switched from another state just yet, use a timed action to set state to 1, meanwhile open retracts.
      if (initMillis) {
        lidMove(servoPosOpen);
        previousMillis = millis();
        initMillis = false;
      }
      retractOpen();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {  
        retractState = 1;
        initMillis = true;
      }
    }
  } else if (rxPWMduration > 1400) {   // This switch position is for stopping the retracts
    if (retractState == 0) {  // If we are already in retractState = 0, do NOTHING, stop retract motor.
      retractStop();
    } else {                   // If we are already in retractState = 0, do NOTHING, stop retract motor. Timed action is for future use...
      retractStop();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {
        retractState = 0;
        initMillis = true;
      }
    }
  } else {                              // This switch position is for closing the retracts
    if (retractState == -1) {   // If we are already in retractState = -1, do NOTHING, stop retract motor.
      retractStop();
    } else {                    // If we are not in retractState = -1, because we are switched from another state just yet, use a timed action to set state to -1, meanwhile close retracts.
      if (initMillis) {
        previousMillis = millis();
        initMillis = false;
      }
      retractClose();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {  
        retractState = -1;
        lidMove(servoPosClose);
        initMillis = true;
      }
    }
  }
}

void lidMove(int servoPos){     // Function name says all
  lid_servo_left.write(servoPos);
  lid_servo_right.write(servoPos);
  delay(1000);
}
void retractOpen(){            // Function name says all
  digitalWrite(motor_left[0], HIGH);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], HIGH);
  digitalWrite(motor_right[1], LOW);
}
void retractClose(){            // Function name says all
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], HIGH);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], HIGH);
}
void retractStop(){            // Function name says all
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], LOW);
  delay(100);
}
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Rezerve
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Bu arduıno ile yapılabilecek çok şey var. Zafer bey bu bilgileri yazarken bende bir ışık yandı. Arduıno kullanarak iniş takımı kontrol edebiliriz diye düşünüyorum. Başımın belası HK ürünü bir iniş takımım var planör için kullanacağım diye düşünüyorum ama yaktığım devresinin yerine koyabileceğim bir şeyler arıyorum. Daha önceki devrede başlangıç ve bitiş noktaları mikro sviçlerle kontrol ediliyordu. Yine benzer bir sistemle hareketin başına ve sonuna birer sviç ekleyip bu işi halledebilir miyiz? Ne dersiniz? Olursa elimdeki Arduıno Mini de bir işe yarar.

 
Arduino Quick Start Guide ve Uygulama Örnekleri

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Üstte görülen motor, tekerleği içeri veya dışarı harekett ettiriyor, yandaki servo kapakları açıyor, bu resimlerden gözükmeyen iki tane anahtar ise, tekerleğin yuvaya girdiğini yada tamamen açıldığını anlamayı sağlayan sensörler olarak çalışıyor. Doğru mudur ?

Eğer doğru ise buradaki tek sorun motoru sürecek devreyi yapmak çünkü arduino sadece 500mW ve 5V sağlayabilir.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Neyi nereye yazıyordum bende şaşırdım şimdi :).

Arduino'nun özelliklerine tekrar bir baktım. Her bir pin maksimum 40mA verebiliyormuş. O motoru aslında Arduino ile ileri - geri yapacak şekilde sürmek çok kolay olsa da 40mA o motora yetmeyecek ve Arduino'yu yakacaktır. Dolayısı ile daha yüksek akım verebilen bir motor sürücüsünü( ) kullanmak, Arduino'yu da motor sürücüsünü kontrol etmek için kullanmak daha uygun olacak...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
Neyi nereye yazıyordum bende şaşırdım şimdi :).

Arduino'nun özelliklerine tekrar bir baktım. Her bir pin maksimum 40mA verebiliyormuş. O motoru aslında Arduino ile ileri - geri yapacak şekilde sürmek çok kolay olsa da 40mA o motora yetmeyecek ve Arduino'yu yakacaktır. Dolayısı ile daha yüksek akım verebilen bir motor sürücüsünü( ) kullanmak, Arduino'yu da motor sürücüsünü kontrol etmek için kullanmak daha uygun olacak...

Bu servoların içinde kullanılan entegremidir bilmiyorum ama acaba servo içindeki entegreyi de kullanabilmek mümkün değil midir? Ya da asıl soru şu olmalıydı bu entegreyi kolayca bulabilir miyiz?
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Nesimi Sakmak' Alıntı:
Bu servoların içinde kullanılan entegremidir bilmiyorum ama acaba servo içindeki entegreyi de kullanabilmek mümkün değil midir? Ya da asıl soru şu olmalıydı bu entegreyi kolayca bulabilir miyiz?

Kendim cevap vereyim. Bulmam bir kaç dakikamı aldı ;D :thumbup:

 
Arduino Quick Start Guide ve Uygulama Örnekleri

Kumandadan kontrollü iniş takımlarının biraz daha modifiye edilmiş bir versiyonu şu şekilde olabilir.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Devrenin biraz kablo yığını gibi gözükmesinin sorumlusu burada L293D motor sürücüsü. Tek başına 11 pin ve 9 kablo kullanıyor. Devre de aslında karışık değil, sadece biraz fazla kablo var :).

Buradaki SWUP anahtarı, tekerlek yukarı çekilince tetiklenip sensör olarak görev yapan bir mikro anahtar. Böylece motor durduruluyor. SWDN anahtarı ise tam tersi bir görev görüyor. Tekerlek tam indirilince tetiklenip sensör olarak görev yapan bu mikro anahtar da ters yönde bir sensör olarak çalışıp, aksi istikametteki motor hareketinin durdurulmasını sağlıyor.

HC-SR04 ise bir sonar. Uçak 2 metre irtifanın altında 3 saniyeden fazla kalırsa(süre bana makul gözüktü, tabii ki değiştirilebilir), iniş takımlarının açılmasını tetikliyor. Uçak 2 metre irtifanın üstüne çıktığı anda iniş takımlarının kapatılmasından da, bu sonar sorumlu.

5.KANAL'a atanmış 3 pozisyonlu switch vasıtası ile OTOMATİK - MANUEL AÇIŞ - MANUEL KAPANIŞ sağlanabiliyor.

Arduino kodunu ise henüz yazmadım. Kodu yazınca da buradan paylaşırım.

Bu arada sistemin maliyeti Arduino dahil yaklaşık 20TL'yi bulmayacaktır, tabii ki elinizde kumanda, 5V verebilen bir BEC ve devresini kurmaya niyetlendiğiniz iniş takımı olduğunu varsayıyorum :).
 
Ynt: Arduino Quick Start Guide ve Uygulama Örnekleri

Ellerinize saglik Zafer bey. Ben istedim bir goz sizinki olmus iki goz. Sonar eklentisi balli ekmek olmus sanki. Tabi bunun kullanisliligini tartismak iyi olur kanimca.

Kablo yiginindan kurtulmak icin baski devre cizimi hazirlamak daha iyi olur bence. Gordugum kadariyla neredeyse sirf kablodan olusuyor.

Ne diyorsunuz ben parcalari toplayim mi? Yoksa akliniza baska seyler gelir mi?

Tek sorum sonar olacaktir. Turkiyede belki buluruz ama agirlik ve boyut bilgilerine de ulasmak lazim.

SM-N900 cihazımdan gönderildi
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Ben elektronik malzemeler için direnc.net'i kullanıyorum. Yanlış ürün gönderebilme ve ürünleri biraz yavaş hazırlama gibi huyları olsa da, yurtiçinde en geniş çevrimiçi elektronik malzeme kataloğu büyük ihtimalle onlarda.


Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol

: 45mm x 20mm x 15mm
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Sonar sadece bu cihazla yapılabilecekleri göstermek için bir örnekti aslında... Sonar yerine barometre de olabilir :).

Bu arada devrede L293D kullanmak gerekmeyseydi(maalesef gerekiyor) ve sonar olmasaydı, bu kadar basit görünümlü bir şey olacaktı.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer bey büyük bir merakla paylaşımlarınızı takip ediyorum, elimde yatan bir arduino uno vardı boş zamanımda led yakıp söndürerek işe başlayacağım. Böyle projelerde kullanmak için de bahsettiğiniz arduino kartından alacağım...

Takipdeyim:)
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Switchli sistemler çok güvenilir değil. Switchler kirlenip saçmalayabiliyor. İniş takımının sıkışıp motoru zorlayarak aşırı akım çekme riski de cabası. Güncel iniş takımları akım kontrollü çalışıyorlar. Yani akım belirli değerin üstüne çıktıysa iniş takımı açıldı ya da kapandı kararını verip akımı kesiyorlar. Acaba bir current sense sistemi oluşturmak mümkün olur mu diye düşünüyorum. Bu arada sonar konusu bence partikte uygun değil ama sistemin olanaklarını anlatma bakımından süper.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer bey, bu sihirli değnek (Arduino) ile uçağa navigasyon ışıkları yapmak mümkünmü?

Ortaokuldan sonra, sanat okulunun (şimdiki EML) elektronik bölümünü kazanmıştım. Ama, üniversite avantajı nedeniyle klasik liseye devam etmiştim. Eğer navigasyon ışıkları mümkünse, belki eski merakımı da biraz canlandırabilirim.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

O zaman sensör görevi gören anahtarları çıkaralım, sonarı da çıkaralım. Motora akım veren bacaklardan birine ACS712 akım sensörü ekleyelim.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


ACS712, okuduğu akım değerine karşılık bir analog çıkış voltajı oluşturacaktır. Arduino'nun analog girişleri de bu voltaj değerini okuyacaktır. Akım beklenen değerin üstüne çıkarsa(stall current), ACS712 buna uygun ve yüksek bir voltaj karşılığı(0V - 5V arası) üretecek, bunu okuyan Arduino'da motor hareketini durduracaktır.

ACS712'yi kendiniz arduino uyumlu bir sensöre dönüştürmek istemezseniz, hazır yapılmışı da var :).

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol