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

Arduino Quick Start Guide ve Uygulama Örnekleri

Türker Akgün' Alıntı:
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:

Hahahaaa... Piper uçurmayan garibanın soruları bunlar. :D Piper demek rudder demek! :lol:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Hahahaaa... Piper uçurmayan garibanın soruları bunlar. :D Piper demek rudder demek! :lol:
Heh tamam şimdi oldu Sümer abi. Normalde uçakta rudder gerekli birşey değil benim bildiğim çünkü. Piper almıycaz demek ki. :lollol: :lol: :lol:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Türker Akgün' Alıntı:
Heh tamam şimdi oldu Sümer abi. Normalde uçakta rudder gerekli birşey değil benim bildiğim çünkü. Piper almıycaz demek ki. :lollol: :lol: :lol:

Bence Piper ile uçmayan pilottan sayılmaz! :D
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
NOT: Bunları eleştirmek ya da değişiklik önermek için değil işin mantığını anlayabilmek için soruyorum.
Sümer Bey, şimdiye kadar uçak kullanamadım, dolayısı ile retract'ın nasıl çalışabiliyor olacağını sadece gördüklerimden faydalanarak aklımda canlandırıyorum ve ona uygun kod yazmaya çalışıyorum. Dolayısı ile sizin geri bildirimleriniz benim için gayet önemli... Amaç doğruyu bulmaya çalışmak olduktan sonra kodu siz ya da konuyu takip eden herhangi biri eleştirebilir ve yorumlayabilir, hiç sıkıntı yok :), daha önce de dediğim gibi uzman değilim, ben de hala öğreniyorum.

Sümer Yamaner' Alıntı:
İ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.

Servo kütüphanesini de şimdilik kapakları açma kapama olayı ile beraber rafa kaldırdık. Şimdilik koddaki tüm fonksiyonlar, Arduino'nun varsayılan olarak gelen "native" kütüphaneleri, 'de dahil.


Buradaki kullanımda PULLUP ya da PULLDOWN ile ilgili söylediklerinizi tam anladığımı söyleyemiyeceğim. PWM sinyalini sağlamaktan alıcı, okumaktan ise 12 numaralı porttaki rxPIN sorumlu. Bu konunun alıcı RC kontrolü için kullanılan PWM sinyalinden bahsetmiştim. pulseIn(rxPin, HIGH) fonksiyonu vasıtası ile Arduino, rxPin'i üzerindeki, aslında rxPIN'i bağladığımız alıcı kanalı üzerindeki sinyalin ilk önce HIGH ve tekrar LOW olduğu değerler arasında geçen süreyi okuyor. LOW-HIGH geçişinde içsel bir kronometreyi başlatıyor, HIGH-LOW geçişinde de bu içsel kronometreyi durdurup, aradaki farkı okuyup, ölçümü yapmış oluyor. Bu da zaten tam bize gereken, 1000 mikrosaniye ile 2000 mikrosaniye arasında olan ve anahtar pozisyonunu belirlemekte kullanacağımız süre.

Dokümanlarında geçmiyor ama bu pulseIn fonksiyonun varsayılan bir zamanaşımı değeri var. Zamanaşımı sonrasında fonksiyon "0" değerini üretiyor. ya da zamanaışımını "pulseIn(pin, value, timeout)" formatında biz de belirleyebiliyoruz. Kumanda kontrollü flaşör devresi yaptığımda varsayılan zamanaşımının yaklaşık 1 - 2 saniye civarında olduğunu görmüştüm ama hassas olarak ölçmedim.

Alıcı zaten görevi ve PWM sinyalinin yapısı gereği HIGH ve LOW sinyalleri kendisi sağlıyor. Ama;
- Alıcı ve Arduino'nun beslemeleri farklı yerden sağlanıyorsa ve alıcı Arduino'dan sonra açılırsa,
- Alıcı ve Arduino aynı yerden besleniyor olsa bile, alıcının boot süresi Arduino'dan daha fazlaysa, alıcı gene Aruino'dan sonra açlılacaktır

Yukarıdaki senaryolarda, Arduino alıcının tamamen açılmasını beklediği bu süre boyunca herhangi bir PWM sinyali okuyamayacak, dolayısı ile pulseIn fonksiyonu zamanaşımına uğrayacak ve "0"değeri üretecektir. Alıcının açılış sürecinde ise, belki de bir kaç milisaniye boyunca parazit olarak bir kaç darbe gönderme ihtimali elbette var. İşte bu parazit sinyalleri okumakatan sakınmak için ise "delay(1000)" fonksiyonunu kullanıp, 1000 milisaniye boyunca kodu bekletiyorum. Ve 1000 milisaniye sonra PWM değerlerini yani anahtar pozisyonunu okutuyorum. Bu okuduğumu da varsayılan pozisyon olarak kabul etmiş oluyorum. Ama bir alıcı 1000 milisaniyeden sonra da parazit sinyal veriyorsa kodu değil bence alıcıyı değiştirmek mantıklı olan :).

Düzenleme : pulseIn fonksiyonunun zamanaşımı değeri, ilgili sayfasında geçiyormuş. Bu değer de varsayılan olarak 1 saniye imiş.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Omer Erkan' Alıntı:
Ben ise siparişi verdim, sabırsızlıkla bekliyorum. Hele bir gelsin, bir tane led'i yakıp söndüreyim, siz görün bendeki keyfi! :) Şimdilik yazılanları anlamaya çalışıyorum. :-\
Ömer bey, ilk kendi yaptığım yanıp sönen led'i kaç saat boyunca oturup izlediğimi, ne siz sorun ne de ben söyleyeyim :lollol:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
Servo kütüphanesini de şimdilik kapakları açma kapama olayı ile beraber rafa kaldırdık. Şimdilik koddaki tüm fonksiyonlar, Arduino'nun varsayılan olarak gelen "native" kütüphaneleri,


Ben biraz daha yazacak olursam kod tek satıra inebilir. :D :D :D
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Diğer Grubunun içine "DIY Uygulamaları" diye yeni bir bölüm açıldı. Şu an ki konu içerik ve başlık olarak " Arduino ile Rectract - Iniş Takımı Uygulaması" şeklinde değiştirildi.
Zafer Bey bu konunun ilk mesajlarını siz düzenlersiniz artık :)

Diğer taraftan daha önce bu konu içerisinde yer alan diğer içerikler farklı konu olarak yeniden düzenlendi.





 
Arduino ile Rectract - Iniş Takımı Uygulaması

İlk mesajı düzenledim, ilk mesajda artık sadece en güncel kod ve çok kısa bir şekilde "Changelog" olacak.
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Tamamen antrenman amaçlı olarak kendi kafamda bir algoritma oluşturup biraz farklı bir yoldan giderek bir kod da ben yazdım. Kodun en önemli özelliği yazmış olduğum ilk mikrokontroller kodu olması. Yani benim açımdan çok önemli. İşin güzel yanı, Arduino compiler tek bir curly brace eksikliği dışında hatasız işledi. :D :D :D

Kod:
int motor_l[] = {3, 4}; // Sol retract motoru 3 ve 4 nolu pinlerde
int motor_r[] = {5, 6}; // Sağ retract motoru 5 ve 6 nolu pinlerde
int rxPin = 12; //Alıcı sinyali 12 nolu pinde
int cur_l = 1; // Sol akım sensörü 1 nolu analog girişte
int cur_r = 2; // Sağ akım sensörü 2 nolu analog girişte
int ret_com = 1; // Retract komutu Açık = 1 Kapalı = 0
int ret_pos = 1; // Aktüel retract pozisyonu Açık = 1, Kapalı = 0
int rxPWM = 0; //Alıcı sinyalini depolayan değişken
int x = 0; //Motor akım kontrolünde kullanılacak değişiken
int maxcur = 550; // Azami pozitif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
int mincur = 470; // Azami negatif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
int normcur1 = 530; // Beklenen normal pozitif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
int normcur2 = 490; // Beklenen normal negatif akım. Akım sensörüne ve motora göre bu değer değiştirilecek

void setup()
{
  pinMode(motor_l[0], OUTPUT);
  pinMode(motor_l[1], OUTPUT);
  pinMode(motor_r[0], OUTPUT);
  pinMode(motor_r[1], OUTPUT);

  while(rxPWM < 800 || rxPWM > 2200)
  {
    rxPWM = pulseIn(rxPin, HIGH);
  }
  if(rxPWM < 1500)
  {
    ret_com = 0; // PWM 1.5 ms altında retract kapalı komutu
  }
  else
  {
    ret_com = 1; // PWM 1.5 ms üstünde retract açık komutu
  }

}

void loop()
{
  while(ret_com == ret_pos) // Kumanda sinyali ile retract konumu aynı ise hiçbir şey yapma
  {
    rxPWM = pulseIn(rxPin, HIGH); // Kumanda sinyalini oku ve yorumla
    if(rxPWM < 1500 && rxPWM > 800) // Arada kumanda sinyali gitmiş olabilir. Bu durumda herhangi bir şey yapılmadan loop devam edecek
    {
      ret_com = 0; // PWM 1.5 ms altında retract kapalı komutu
    }
    else if(rxPWM >= 1500 && rxPWM < 2200)
    {
      ret_com = 1; // PWM 1.5 ms üstünde retract açık komutu
    }  
  }
  if(ret_com == 1)
  {
    RetractOpen();
  }
  else
  {
    RetractClose();
  }

}

void RetractOpen() //Retractı açan subroutine
{
  x = 0;
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  delay(500);
  /* Bu aşamada motorlar aktive edildiler. Yarım saniye beklendikten sonra
   motorların her birinin akım değeri kontrol edilecek.
   Eğer yeterli akım akmıyor ise, o taraf retractının bağlı olmadığı
   düşünülecek ve ileride döngünün takılmaması için X değeri bir artırılacak.
   Bu şekilde bağlı olan retract sıkışıp fazla akım çektiği anda X tekrar artırılıp 2 olacak
   ve döngüden çıkılmış olacak. */

  cur_l = analogRead(1);
  cur_r = analogRead(2);
  if(cur_l < normcur1 || cur_l > normcur2)
  {
    x = x + 1;
  }
  if(cur_r < normcur1 || cur_r > normcur2)
  {
    x = x + 1;
  }

  while (x < 2)
  {
    cur_l = analogRead(1);
    cur_r = analogRead(2);
    if(cur_l > maxcur || cur_l < mincur)
    {
      x = x + 1;
      digitalWrite(3, LOW);
    }
    if(cur_r > maxcur || cur_l < mincur)
    {
      x = x + 1;
      digitalWrite(5, LOW);
    }
    delay(250); //Motorların tam durup akım sensörlerinin sıfırlanabilmesi için bekleme
  }
}


void RetractClose() //Retractı kapatan subroutine
{
  x = 0;
  digitalWrite(2, HIGH);
  digitalWrite(4, HIGH);
  delay(500);
  /* Bu aşamada motorlar aktive edildiler. Yarım saniye beklendikten sonra
   motorların her birinin akım değeri kontrol edilecek.
   Eğer yeterli akım akmıyor ise, o taraf retractının bağlı olmadığı
   düşünülecek ve ileride döngünün takılmaması için X değeri bir artırılacak.
   Bu şekilde bağlı olan retract sıkışıp fazla akım çektiği anda X tekrar artırılıp 2 olacak
   ve döngüden çıkılmış olacak. */
  cur_l = analogRead(1);
  cur_r = analogRead(2);
  if(cur_l < normcur1 || cur_l > normcur2)
  {
    x = x + 1;
  }
  if(cur_r < normcur1 || cur_r > normcur2)
  {
    x = x + 1;
  }
  while (x < 2)
  {
    cur_l = analogRead(1);
    cur_r = analogRead(2);
    if(cur_l > maxcur || cur_l < mincur)
    {
      x = x + 1;
      digitalWrite(2, LOW);
    }
    if(cur_r > maxcur || cur_l < mincur)
    {
      x = x + 1;
      digitalWrite(4, LOW);
    }
    delay(250); //Motorların tam durup akım sensörlerinin sıfırlanabilmesi için bekleme
  }
}
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Abi ne yaptin sen ya :thumbup: Baya baya program yazmissin, helal vallla :bravo:
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Sümer bey, olaya yaklaşımınız çok zarif olmuş. Kodu karıştırmadan iki yarıyıda aynı anda işlemişsiniz...

Ama Retractların gerçek pozisyonunu belirleyecek rutini henüz eklememişsiniz koda galiba. Bir de Arduino'da karşılaştırma operatörü olarak "=" değil "==" kullanılması gerekiyor.
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Zafer SAHIN' Alıntı:
Sümer bey, olaya yaklaşımınız çok zarif olmuş. Kodu karıştırmadan iki yarıyıda aynı anda işlemişsiniz...

Ama Retractların gerçek pozisyonunu belirleyecek rutini henüz eklememişsiniz koda galiba. Bir de Arduino'da karşılaştırma operatörü olarak "=" değil "==" kullanılması gerekiyor.

Daha çoook çalışmam lazım. :D

IF'i anladım. WHILE için de mi == lazım?
while(ret_com == ret_pos) gibi mi?

Retractların gerçek pozisyonuna gelince. Onları belirlemeye gerek duymadım. Şöyle ki;
Retractlar kapalı ve biz de tekrar kapatmak istersek zaten akım hemen artacak ve yazılım "tamam oldu bu iş" diye akımı kesecek. Açıkkıen açmak istersek de benzeri geçerli. O nedenle... :)
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Açık olduğu konum için tamam da kapat komutu verildiği konumda devamlı kapak kapatılmak istenecek, her ne kadar akım algılanıp kesilmek istense bile 500 + 250 milisaniyelik delay fonksiyonu yüzünden aslında kesintisiz olarak kapalı konumda akım veriliyor olacak.