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

Arduino Quick Start Guide ve Uygulama Örnekleri

Eveettt... Ameliyatlar bitti. Gelelim retractlara.

Şimdi başlangıç durumunun belirlenmesi konusunda epey düşündüm. Ben olsam şöyle yapardım. Daha programın "void setup" aşamasında tüm motor çıkışlarını LOW yapar (ki bu zaten yapılıyor anladığım kadarıyla), sonra alıcıdan sinyal beklerdim. Alıcıdan gelen ilk sinyali başlangıç pozisyonu olarak kaydeder, motorları aktive etmeden "void loop" aşamasına girerdim.

Şimdi düşünelim...

İniş takımları açık. Alıcıdan gelen sinyal de açık sinyali. --> Herhangi bir sorun yok. Kapat sinyali geldiğinde kapatılacak.
İniş takımları kapalı. Alıcıdan gelen sinyal açık. --> Sistem iniş takımlarını açık sanıyor. Kapat sinyali gelince motorları aktive edecek. Aşırı akım nedeniyle motorlar hemen duracaklar. Daha sonra açık komutu gelince normal olarak açılacaklar.
İniş takımları açık. Alıcıdan gelen sinyal kapalı. --> Sistem iniş takımlarını kapalı sanıyor. Açık komutu geldiğinde motorlara akım verilecek ve hemen akabinde aşırı akım nedeniyle akım kesilecek. Bir sonraki kapalı komutu ile iniş takımları normal olarak kapanacak.
İniş takımları kapalı. Alıcıdan gelen sinyal kapalı. --> Sorun yok. Açık sinyali geldiğinde açılacak.

Kısca başlangıç pozisyonunu varsaymak yerine alıcıdan gelen sinyale göre belirlemiş olacağız. Ayrıca alıcıdan sinyal gelmeden sistem motorları aktive etmeyecek çünkü "void loop" aşamasına geçemeyecek. Bu da bir tür fail safe işlevi sağlayacak.


NOT: Tabii ki bunları akım geri beslemesini işin içine kattıktan sonra yapabileceğiz.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Kodu sadeleştirmek için sadece sol tarafın(ya da sağ tarafın, uçağı nereden tutuyorsanız :) ) kodunu yazdım. Ama anlaşılır kalmasını sağlamak için "Array" ve benzeri kısaltıcı ifadeler kullanamadım. Kodun lisansını da Teaware olarak değiştirdim :). Benzer örnek için bakınız;

Kod:
/*
 * ----------------------------------------------------------------------------
 * "THE TEA-WARE LICENSE" (Revision 01):
 * Zafer SAHIN wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can treat me a tea in return.   Zafer SAHIN
 * ----------------------------------------------------------------------------
 */

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

 modified 09/01/2015
 by Zafer SAHIN
 Version 0.23.1h - Codename "Half of the apple"
 */

#include <Servo.h>

Servo lid_servo_left;          // Servo object for left retract lid

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

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

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 curretValLeft = 511;       // 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 = 615;    // Current values bigger than 1000mA to the positive direction.

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

unsigned long previousSWMillis = 0;      // Timer variables for switch, required as a reference point for calculating time
unsigned long retractStopDelay = 6000;   // Timer variables for switch, the delay time to wait for...
unsigned long currentSWMillis = 0;       // Timer variables for switch, required for calculating the time since previousSWMillis
boolean initSWMillis = true;             // Timer variables for switch, required for setting previousSWMillis for once

unsigned long previousCSMillis = 0;      // Timer variables for current sensor, required as a referance point for calculating time
unsigned long currentStopDelay = 1000;   // Timer variables for current sensor, the delay time to wait for...
unsigned long currentCSMillis = 0;       // Timer variables for current sensor, required for calculating the time since previousCSMillis
boolean initCSMillis = true;             // Timer variables for current sensor, required for setting previousCSMillis for once

unsigned long rxPWMduration;  // Variable for reading receiver

void setup() {
  pinMode(motor_left[0], OUTPUT);
  pinMode(motor_left[1], OUTPUT);
  retractLeftStop();
  lid_servo_left.attach(lid_servo[0]);
  delay(5000);
  rxPWMduration = pulseIn(rxPin, HIGH);
  while (rxPWMduration < 800) {
    delay(1000);
    rxPWMduration = pulseIn(rxPin, HIGH);
  }
  delay(1000);
  if (rxPWMduration > 1600) {
    retractLeftState = 1;
  } else if (rxPWMduration > 1400) {
    retractLeftState = 0;
  } else {
    retractLeftState = -1;
  }
  previousSWMillis = millis();
}

void loop() {
  rxPWMduration = pulseIn(rxPin, HIGH);
  curretValLeft = analogRead(curentSensorLeft);
  
// This switch position is for opening the retracts
  if (rxPWMduration > 1600) {
// Left Retract Operations
    if (retractLeftState == 1) {         // If we are already in retractState = 1, do NOTHING, stop retract motor.
      retractLeftStop();
      initSWMillis = true;               // Reset switch timer boolean
      initCSMillis = true;               // Reset current sensor timer boolean
    } 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 (initSWMillis) {
        lidMoveLeft(servoPosOpen);
        delay(1000);
        previousSWMillis = millis();
        initSWMillis = false;
      }
      retractLeftOpen();
      currentSWMillis = millis();
      if(currentSWMillis - previousSWMillis >= retractStopDelay) {  
        retractLeftState = 1;
      }
      if ((curretValLeft < currentLimitLOW) || (curretValLeft > currentLimitHIGH)) {
        if (initCSMillis) {
          previousCSMillis = millis();
          initCSMillis = false;
        }
        currentCSMillis = millis();
        if(currentCSMillis - previousCSMillis >= currentStopDelay) {  
          retractLeftState = 1;
          initCSMillis = true;
        }
      } else {
        initCSMillis = true;
      }
    }

// This switch position is for stopping the retracts
  } else if (rxPWMduration > 1400) {
    if (retractLeftState == 0) {         // If we are already in retractState = 0, do NOTHING, stop retract motor.
      retractLeftStop();
      initSWMillis = true;               // Reset switch timer boolean
      initCSMillis = true;               // Reset current sensor timer boolean
    } else {                             // If we are already in retractState = 0, do NOTHING, stop retract motor. Timed action is for future use...
      retractLeftStop();
      currentSWMillis = millis();
      if(currentSWMillis - previousSWMillis >= retractStopDelay) {
        retractLeftState = 0;
      }
    }
// 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();
      initSWMillis = true;               // Reset switch timer boolean
      initCSMillis = true;               // Reset current sensor timer boolean
    } 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 (initSWMillis) {
        previousSWMillis = millis();
        initSWMillis = false;
      }
      retractLeftClose();
      currentSWMillis = millis();
      if(currentSWMillis - previousSWMillis >= retractStopDelay) {  
        retractLeftState = -1;
        lidMoveLeft(servoPosClose);
        delay(1000);
      }
      if ((curretValLeft < currentLimitLOW) || (curretValLeft > currentLimitHIGH)) {
        if (initCSMillis) {
          previousCSMillis = millis();
          initCSMillis = false;
        }
        currentCSMillis = millis();
        if(currentCSMillis - previousCSMillis >= currentStopDelay) {  
          retractLeftState = 1;
        }
      } else {
        initCSMillis = true;
      }
    }
  }
}

void lidMoveLeft(int servoPos){         // Function for Moving(openinng or closing) Retract lids
  lid_servo_left.write(servoPos);
}
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);
}

Kodda "blocking" bir fonksiyon (delay fonksiyonu blocking bir fonksiyondur, kullanılmasından mümkün olduğunca kaçınılmalıdır) kullanılmadığı sürece sağ taraf içinde benzer şekilde kod yazılınca çalışacaktır. Aslında kodu basitleştirmek için iki ayrı Arduino bile kullanlabilir, ne de olsa ProMini'nin 3.3 santime 1.8 santim boyutları ve 3 dolar fiyatı var. Koda gelecek olursak;

- 800 milisaniye altındaki PWM sinyalleri, Arduino tarafından alıcının daha açılmadığı yönünde kabul edilip,"void loop" döngüsüne geçilmeyecek şekilde düzenleme yapıldı.
- "void loop" döngüsüne geçmeden önce, alıcıdan gelen sinyal okunarak, varsayılan değer olarak alıcının sinyali kabul edildi.
- akım okuma için kod eklendi. 1 saniye boyunca(ayarlanabilir) yüksek akım çekilirse(bu da ayarlanabilir) mekanizmanın görevini yaptığı varsayılıyor.
- akım sensörünün devreye girmemesi ihtimaline karşı, zamanaşımı özelliği düzenlendi. Zamanaşımına uğranırsa, mekanizmanın görevini yaptığı varsayılıyor.

Sıkıntılar;
- Takımlar açılırken sıkıntı yok, servo ilk önce kapağı açıyor, sonra tekerlekler dışarı çıkıyor. Servo bozulmadığı müddetçe kapakların açılması garanti olduğundan açılış rutininde sıkıntı yok. Servo bozulsa bile, motoru süren yüksek akımı farkedip, bir saniye sonra motoru durduruyor oluyoruz. Ama kapanış rutininde, tekerleklerin tam olarak içeri girdiğinden %100 emin olmak çok zor. Mekanik algılama için ek bir anahtar bile konsa araya dal sıkışabilir, taş sıkışabilir, çamur, toz toprak girebilir. Bu sebeple hem yüksek akım çekilir hem de zamanaşımına uğranır. Ve teker kapanmadığı halde servo, kapağı kapatabilir... Bunu aşmak için, mekanik anahtar ile kombine bir algılama yapmak daha mantıklı olacak gibi...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Bu proje bitince gercekten harika bir sey olacak belli :bravo: :halay: :RCKolik:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Ben olmadi Arduino diye yeni bir bolum acayim da bu tur farkli uygulamalari ayri konular halinde paylasalim :thumbup:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer Bey, coffeeware, teaware, hatta rakıware... Hepsi uygundur. Bence şimdilik kapaklara takılmayalım. Onları devre dışı bırakıp sadece retract yönetimini halledelim. Onu tam oturttuktan sonra kapaklara geçeriz.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Mehmet Kucuksari' Alıntı:
Ben olmadi Arduino diye yeni bir bolum acayim da bu tur farkli uygulamalari ayri konular halinde paylasalim :thumbup:

Mehmet bey, yurtdışı forumlarında insanlar Arduino gibi cihazlar ve benzerleri ilgili yığınla şey yapıyorlar ve yaptıklarını da paylaşıyorlar. RCGroups'da Arduino ile yapılmış yüzlerce DIY projesi var.


Siz de böyle bir başlık açsanız ama en önemlisi, özel ilgisi bulunan bir kaç kişi dışındaki insanlar da bu başlığa katkılarda bulunmaya başlasalar ne güzel olurdu. İş güç nedeni ile zamanı kısıtlı olan insanlar değil ama elektronik ve mekatronik mühendisliğinde okuyan genç arkadaşar, yarım yamalak alışveriş listelerini "multikopter tasarladım" diye sunmak yerine bu tarz konulara eğilip, üretseler şahsım adına gayet mutlu olurdum...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Ben de bir deney seti ile USB bağlantılılardan 5'li paket sipariş ettim. Tekirdağ No:10 olur mu yanında? :)
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
Mehmet bey, yurtdışı forumlarında insanlar Arduino gibi cihazlar ve benzerleri ilgili yığınla şey yapıyorlar ve yaptıklarını da paylaşıyorlar. RCGroups'da Arduino ile yapılmış yüzlerce DIY projesi var.


Siz de böyle bir başlık açsanız ama en önemlisi, özel ilgisi bulunan bir kaç kişi dışındaki insanlar da bu başlığa katkılarda bulunmaya başlasalar ne güzel olurdu. İş güç nedeni ile zamanı kısıtlı olan insanlar değil ama elektronik ve mekatronik mühendisliğinde okuyan genç arkadaşar, yarım yamalak alışveriş listelerini "multikopter tasarladım" diye sunmak yerine bu tarz konulara eğilip, üretseler şahsım adına gayet mutlu olurdum...
Ozellikle son kism aynen katiliyorum Zafer bey. Son zamanlarda universitelerde bir multikopter furyasi aldi gidiyor :-\

Oysa bu tur DIY (Do it yourself) projeler cok daha ogretici ve faydali. Mesela Amerika'da daha ilkokul ve orta okul seviyesinde buna benzer calismlari LOGO ile yapiyorlar. Bununla ilgili proje takimlari kurulup, duzenli olarak yarisma duzenliyorlar.

Aksama hemen yeni bir baslik altinda gerekli duzenlemeleri yapiyorum :RCKolik:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer Bey'in son retract kodunu biraz anlamaya çalıştım. Aklıma şöyle bir şey geldi.
Şimdi akım sensörü için başlangıç değeri olarak 511 kullanılmış. Analog giriş çözünürlüğü 1024 adım mıdır Arduino'da? Yani sıfır Volt 0, besleme gerilimi yani 5V ise 1024 müdür? Doğru mu anlıyorum? Eğer böyle ise sorun yok çünkü sensör ile Arduino aynı kaynaktan besleniyorlar. Dolayısıyla mutlak gerilim değerlerinden çok göreceli değerler kullanıyor olmak işi kolaylaştırıyor. Ayrıca besleme gerilimindeki olası oynamalarda da sanki bir güvenlik sağlıyor gibi...
Şu an hem düşünüyor hem de yazıyorum. Yani yazılı düşünüyorum. Bağışlayın. Buraya nereden geldim. Sensör değeri olarak programda doğrudan değer atamak yerine motorlar kapalı haldeyken sensör çıkışını alıp sıfır Amper değeri olarak bunu kullanmayı düşünmüştüm. Ama yukarıda açıklamaya çalıştığım sebeplerle bu pek gerekli olmayacak anlaşılan.
Pratik olarak retractları üç değil iki konumlu butona atamayı tercih ediyorum. Yani açık ve kapalı konumları olsa yeterli. Stop konumuna gerek yok bence. Yani kodu biraz daha basitleştirmek mümkün olur sanıyorum.
İlk aşamada timer konusuna hiç girmeden devam etsek benim gibi acemilerin kodu çözebilmelerini kolaylaştırır gibime geliyor ne dersiniz?
Ve son bir ukalalık...
Sadece üç adet subroutine olsa:
Retract open
Retract close
Retract stop

Her biri kendi içinde iki retracta birden kumanda etse ve akım izlemesini yapsa. Her iki tarafın akımını kestikten sonra geri dönse.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Zafer Bey'in son retract kodunu biraz anlamaya çalıştım. Aklıma şöyle bir şey geldi.
Şimdi akım sensörü için başlangıç değeri olarak 511 kullanılmış. Analog giriş çözünürlüğü 1024 adım mıdır Arduino'da? Yani sıfır Volt 0, besleme gerilimi yani 5V ise 1024 müdür? Doğru mu anlıyorum? Eğer böyle ise sorun yok çünkü sensör ile Arduino aynı kaynaktan besleniyorlar. Dolayısıyla mutlak gerilim değerlerinden çok göreceli değerler kullanıyor olmak işi kolaylaştırıyor. Ayrıca besleme gerilimindeki olası oynamalarda da sanki bir güvenlik sağlıyor gibi...
Şu an hem düşünüyor hem de yazıyorum. Yani yazılı düşünüyorum. Bağışlayın. Buraya nereden geldim. Sensör değeri olarak programda doğrudan değer atamak yerine motorlar kapalı haldeyken sensör çıkışını alıp sıfır Amper değeri olarak bunu kullanmayı düşünmüştüm. Ama yukarıda açıklamaya çalıştığım sebeplerle bu pek gerekli olmayacak anlaşılan.
Arduino Regüle edilmiş 5V(spesifik olarak USB portu voltajı ... ) ya da regüle edilmemiş 7V - 12V (9 Voltluk pil, 2S - 3S lipo pil...) kullanabilir. Regüle edilmemiş voltaj ile beslendiğinde, kartın üzerindeki regülatör devreye girerek, voltajı sabit bir 5 Volta düşürür.

ACS serisi akım ölçerlerin datasheet'ine baktığımızda ise şu şekilde bir durum var. ACS serisi akım ölçerler için filtrelenmiş 4.5V - 5.5V giriş voltajı gerekiyor. Dar bir aralıktaki giriş voltajı, ölçüm sonuçlarında, yanı çıkış değerlerinde pek bir fark yaratmıyor.

Ek bir not olarak, tüm sensörlerin, kartların (-) uçlarını birleştirdiğimiz için, "floating voltage" yani referans gerlimlerinin birbirinden faklı olması nedeni ile gerlimlerin yanlış ölçülmesi sorunu yaşamıyoruz.

Arduinonun analog uclarında 10 bitlik ADC kullanıldığında dolayı, sizin de farkettiğiniz üzere çözünürlük 1024.Ama uçlardan okunabilecek değer aralığı 0V - 5V ile sınırlı. Dijital değer skalası da 1 - 1024 değil, 0 - 1023. Direnç net'deki ACS712'ler -5A ve +5A arasındaki değerleri okuyorlar. ACS712'ler, çıkış voltajı olarak -5A için 0V , 0A için 2.5V, +5A için 5V üretiyor, tabii iki datasheet'e bakılarak kayma değerleri de hesaba katılmalı. Yazdığım kodda da (kayma değerlerini hesaba katmadım, datasheet'e bakarak bunlar da hesaba katılmalı)buna uygun olarak, L293D'nin verebileceği yaklaşık maksimum akım olan -1000mA ve +1000mA değerlerini zorlama değeri olarak kabul ederek, 0 - 1023 skalasında bu değerlere yaklaşık karşılık gelen değerleri, limit olarak tanımladım.

Sümer Yamaner' Alıntı:
Pratik olarak retractları üç değil iki konumlu butona atamayı tercih ediyorum. Yani açık ve kapalı konumları olsa yeterli. Stop konumuna gerek yok bence. Yani kodu biraz daha basitleştirmek mümkün olur sanıyorum.
3 pozisyonlu anahtardaki durdurma kodunu ise, kodda yanlışlık durumunda, sistemi yakmadan, retratları durdurabilmek amacı ile koydum. Nihai kodda bu olmayacak ama şu anda kod biraz ham olduğundan gözden kaçan bir şey olabilir. Ama genede sadelik amacı ile şimdilik koddan çıkardım

Sümer Yamaner' Alıntı:
Ve son bir ukalalık...
Sadece üç adet subroutine olsa:
Retract open
Retract close
Retract stop

Her biri kendi içinde iki retracta birden kumanda etse ve akım izlemesini yapsa. Her iki tarafın akımını kestikten sonra geri dönse.
İlk önce ben de o şekilde yapmıştım. Ama üzerinde biraz düşününce şu durumların ortaya çıkacağını farkettim.
- Malzemelerdeki ufak tefek farklılıklarda dolayı, asla iki retract aynı anda açılmayacak ve kapanmayacak.
- Düşme, çarpma ve tozlanma gibi yıpratıcı etkiler, bir retractın diğerinden farklı çalışmasına yol açacak.
- Arıza gibi durumlarda, arızalı ve sağlam tarafa aynı muammeleyi yapmak, sağlam tarafında düzgün çalışmamasına yol açacak.

Dolayısı ile her retract'ı bağımsız olarak değerlendirmenin, nihai üründe en sağlıklı sonucu ortaya çıkaracağı sonucuna vardım. Tabi birbirinden bağımsız çalıştırılacak iki ayrı retract'tı, tek "Thread"a sahip arduino üzerinde yapabilmek için kodu "non-blocking" olarak yazmak gerekiyor. Bu da işi karışık hale getiriyor. Ben de kodun anlaşılır kalmasını sağlamak için şimdilik kodda tek yarıyı yazıyorum.

Sümer Yamaner' Alıntı:
İlk aşamada timer konusuna hiç girmeden devam etsek benim gibi acemilerin kodu çözebilmelerini kolaylaştırır gibime geliyor ne dersiniz?
Timer'lara da güle güle :). Onlar olmayınca kod da bayağı rahatladı.

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);
}

Düzenleme : Servolar da gitti...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Yeni grup olusturup, konulari yeniden duzenleme isini unutmadim arkadaslar aklimda ama PC sorun oldugu icin duzenleme isleri yarina kaldi :-\
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Yorucu bir uçuş günü sonrası günün raporu yazılacak. Sonra oturup yeni kodu anlamaya çalışacağım. Bu arada bugünden bir video koyalım... :)

Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Yorucu bir uçuş günü sonrası günün raporu yazılacak. Sonra oturup yeni kodu anlamaya çalışacağım. Bu arada bugünden bir video koyalım... :)
Abi model Touch and Go resmen doymus :thumbup: Cok keyifli bir ucus olmus, ellerine saglik :thumbup:

Kodlari anlamak icin allah zihin aciklisi versin bu arada :laugh: :D
 
Arduino Quick Start Guide ve Uygulama Örnekleri

İlk sorum geliyor:

rxPWMduration = pulseIn(rxPin, HIGH);
while (rxPWMduration < 800) {
delay(1000);
rxPWMduration = pulseIn(rxPin, HIGH);
}

1- pulseIn bir Arduino komutu mudur yoksa servo.h kitaplığı içindeki bir fonksiyon mudur?
2- rxPin'i başta deklare ettikten sonra PULLUP yapmak gerekir mi? PULLDOWN yapmak için o porta LOW değeri yzamak mı gerekir?
3- Varsayalım ki vericiden sinyal gelmiyor. pulseIn fonksiyonu bir HIGH darbesi için sonsuza kadar bekleyecek mi?
4- Eğer bir HIGH darbesi için bekleyecek ise ve girişi PULLUP ya da PULLDOWN ile parziter sinyallere karşı emniyete almış isek, artık pulse süresini tekrar kontrol etmeye gerek kalmaz diye düşünüyorum. Pulse süresi 1500'ün altında ise retractLeftState değişkenine 0, 1500 ve üstündeyse değişkene 1 yazabiliriz gibime geliyor.

NOT: Bunları eleştirmek ya da değişiklik önermek için değil işin mantığını anlayabilmek için soruyorum.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Yorucu bir uçuş günü sonrası günün raporu yazılacak. Sonra oturup yeni kodu anlamaya çalışacağım. Bu arada bugünden bir video koyalım... :)
Piper çıkmış meydane. :laugh: Sümer abi keyifle izledim, paylaşım için teşekkürler. :saygilar:

Yalnız rudder lobisi başkanı olmanın etkisi olsa gerek çok fazla rudder kullandığın dikkatimi çekti, gerek var mı gerçekten bu kadar rudder'a. :laugh: :laugh: :laugh: