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

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

İlk bastırdığım "KÜP ???"lerin resimlerini hiç göndermeyeyim ben :). Hoş daha ilk baskısını dün yaptık zaten :D.
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Bi kere benim inişlerime dayanacak retractı basacak 3D printer belki NASA'da falan vardır. :D :p Ayrıca benim kafam basmıyor 3D baskı işine. Ben LED yakıp söndürmeye devam edeyim. :D
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Sümer Yamaner' Alıntı:
Bi kere benim inişlerime dayanacak retractı basacak 3D printer belki NASA'da falan vardır. :D :p Ayrıca benim kafam basmıyor 3D baskı işine. Ben LED yakıp söndürmeye devam edeyim. :D
Sümer abi , ABS flament baskılı bir kaç iş gördüm , baya sağlam görünüyor , gerçi senin modeller 10 kilo üzeri olunca , metalden işlenmesi daha mantıklı tabii ki... :)
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Bu akşam delikli plaket üzerine Arduino Nano ile retract kontrol devresini kurdum. Uzun bir süre Nano kart için USB - Serial sürücü bulamadım. Sonra kart üzerindeki CH340G entegresinden yola çıkarak sürücüleri buldum. İhtiyacı olabilecek arkadaşlar için link:
Programı yükledim ve öylece bıraktım. Yarın akşama kadar yazılım chip içinde mayalanacak. Yarın akşam test edeceğim. :D (Bu da benim totemim işte)! :D
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Sümer Yamaner' Alıntı:
...... Yarın akşama kadar yazılım chip içinde mayalanacak. Yarın akşam test edeceğim. :D (Bu da benim totemim işte)! :D
Vay ilginç bir totemmiş abi :D Sonucu belli ama sen yine de haber ver abi ;) :thumbup:
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Kablo salatası nedeniyle birkaç hatalı bağlantı vardı. Epey bir uğraşıp adım adım giderek tüm hataları bulup düzelttim. Ancak kullandığım motorlar orijinal motorlar değil. Bu nedenle sıkışma anındaki akım karakteristiği farklı. Ben de her iki taraf için ayrı ayrı ayarlanabilecek bir akım sınırı oluşturdum. Yani iki adet trimpot kullandım. Nihai plakette bu amaçla çok turlu trimpot kullanmayı düşünüyorum. O şekilde hassas ayar imkanım olacak. Kısaca açıklamak gerekirse ilgili tarafın motor karakteristiğine bağlı olarak sıkışma akımı bu trimpotlarla belirlenecek ve sistem o akım aktığında "tamam artık kapandı ya da açıldı" diyerek akımı kesecek.

Şimdilik son kod şöyle:

Kod:
int rxPin = 12; //Alıcı sinyali 12 nolu pinde
int motor_l1 = 6; // Sol retract motoru 6 ve 8 nolu pinlerde
int motor_l2 = 8;
int motor_r1 = 2; // Sağ retract motoru 2 ve 4 nolu pinlerde
int motor_r2 = 4;
int sensor_l = 1; // Sol akım sensörü 1 nolu analog girişte
int cur_l = 0; // Sol akım
int sensor_r = 3; // Sağ akım sensörü 3 nolu analog girişte
int cur_r = 0; // Sağ akım
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 = 1; //Motor akım kontrolünde kullanılacak değişiken
int mincurl = 0; // Azami akımda sensör değeri.
int mincurr = 0;// Azami akımda sensör değeri.
unsigned long timer; // Timeout timer işlevi için
int mincurpinl = 1; // Sol ayar trimpotu
int mincurpinr = 0; // Sağ ayar trimpotu

void setup()
{
  pinMode(motor_l1, OUTPUT);
  pinMode(motor_l2, OUTPUT);
  pinMode(motor_r1, OUTPUT);
  pinMode(motor_r2, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(motor_l1, LOW);
  digitalWrite(motor_l2, LOW);
  digitalWrite(motor_r1, LOW);
  digitalWrite(motor_r2, LOW);
  digitalWrite(13, LOW);

  rxPWM = pulseIn(rxPin, HIGH, 25000);
  while(rxPWM < 800 || rxPWM > 2200) // Burada geçerli bir alıcı sinyali bekliyoruz
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  }
  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
  }
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
}

void loop()
{
  digitalWrite(motor_l1, LOW);
  digitalWrite(motor_l2, LOW);
  digitalWrite(motor_r1, LOW);
  digitalWrite(motor_r2, LOW);

  rxPWM = pulseIn(rxPin, HIGH, 25000); // Kumanda sinyalini oku ve yorumla
  if(rxPWM < 1500) // Eğer rxPWM 1500'den küçükse kapat komutu geldi demektir yoksa açık komutu geldi demektir
  {
    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
  }
  if(ret_com == 0 && ret_pos == 1) // Eğer retract açık konumdaysa ve kapat komutu geldiyse retractlar kapatılacak
  {
    RetractClose();
  }
  else if(ret_com == 1 && ret_pos == 0) // Eğer retract kapalı konumdaysa ve aç komutu geldiyse retractlar açılacak
  {
    RetractOpen();
  }
}


void RetractOpen() //Retractı açan subroutine
{
  digitalWrite(13, HIGH);
  digitalWrite(motor_l1, HIGH); // Retract motorları açma yönünde enerjilendirildi
  digitalWrite(motor_l2, LOW);
  digitalWrite(motor_r1, HIGH); // Retract motorları açma yönünde enerjilendirildi
  digitalWrite(motor_r2, LOW);
  x = 0;
  delay(250);
  timer = millis();
  while(x < 2)
  {
     mincurl = analogRead(mincurpinl);
     mincurr = analogRead(mincurpinr);
     mincurl = 400 + mincurl / 10;
     mincurr = 400 + mincurr / 10;
     rxPWM = pulseIn(rxPin, HIGH, 25000);
     cur_l = analogRead(sensor_l);
     cur_r = analogRead(sensor_r);
     if(cur_l < mincurl)
     {
       digitalWrite(motor_l1, LOW);
       x = x + 1;
     }

     if(cur_r < mincurr)
     {
       digitalWrite(motor_r1, LOW);
       x = x + 1;
     }
     if(rxPWM < 1500)
     {
       digitalWrite(motor_l1, LOW);
       digitalWrite(motor_r1, LOW);
       x = 2;
     }
     if((millis() - timer) > 20000)
     {
       break;
     }
  }
  digitalWrite(13, LOW);  
  digitalWrite(motor_l1, LOW);
  digitalWrite(motor_r1, LOW);
  ret_pos = 1; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
  
// Bu subroutine'den geri döndüğümüzde eğer akım aşılmış ise ret_pos ve ret_com aynı olacak. Alıcı sinyali değiştiyse farklı olacak. Dolayısıyla program hemen diğer subroutine'i çağıracak.
}


void RetractClose() //Retractı kapatan subroutine
{
  digitalWrite(13, HIGH);
  digitalWrite(motor_l1, LOW); // Retract motorları açma yönünde enerjilendirildi
  digitalWrite(motor_l2, HIGH);
  digitalWrite(motor_r1, LOW); // Retract motorları açma yönünde enerjilendirildi
  digitalWrite(motor_r2, HIGH);
  x = 0;
  delay(250);
  timer = millis();
  while(x < 2)
  {
     mincurl = analogRead(mincurpinl);
     mincurr = analogRead(mincurpinr);
     mincurl = 400 + mincurl / 10;
     mincurr = 400 + mincurr / 10;
     rxPWM = pulseIn(rxPin, HIGH, 25000);
     cur_l = analogRead(sensor_l);
     cur_r = analogRead(sensor_r);
     if(cur_l < mincurl)
     {
       digitalWrite(motor_l2, LOW);
       x = x + 1;
     }

     if(cur_r < mincurr)
     {
       digitalWrite(motor_r2, LOW);
       x = x + 1;
     }
     if(rxPWM >= 1500)
     {
       digitalWrite(motor_l2, LOW);
       digitalWrite(motor_r2, LOW);
       x = 2;
     }
     if((millis() - timer) > 20000)
     {
       break;
     }
  }
  digitalWrite(13, LOW);
  digitalWrite(motor_l2, LOW);
  digitalWrite(motor_r2, LOW);
  ret_pos = 0; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
// Bu subroutine'den geri döndüğümüzde eğer akım aşılmış ise ret_pos ve ret_com aynı olacak. Alıcı sinyali değiştiyse farklı olacak. Dolayısıyla program hemen diğer subroutine'i çağıracak.
}


Bütün bunlar olurken bir yandan da ExpressPCB programı ile plaket tasarımına başladım. Yukarıda sözünü ettiğim trimpotlar olmadanki haline bir örnek aşağıda. Elişi kağıdına laser yazıcıdan çıktı alıp ütüleyerek birkaç deneme yaptım. Oldukça başarılı. Ütüleme süresini biraz daha uzun tutmam gerekecek. Bu arada termostatlı kaplama ütüsü kullandım. Bence mantıklı bir seçim oldu.

[attachimg=1]
 

Ekli dosyalar

  • Untitled.jpg
    Untitled.jpg
    27.9 KB · Görülme: 99
Arduino ile Rectract - Iniş Takımı Uygulaması

Bu da trimpotlu plaket prototipi...

[attachimg=1]
 

Ekli dosyalar

  • Untitled2.jpg
    Untitled2.jpg
    149.3 KB · Görülme: 97
Arduino ile Rectract - Iniş Takımı Uygulaması

Imzayi degistirmeye adim adim yaklasiyoruz :halay: :yuppi:
 
Arduino ile Rectract - Iniş Takımı Uygulaması

İmza için aceleye gerek yok... :D

Bugün üçten sonra yağmur bastırdığı için aceleyle toplandım. Retractları söküp yanıma alacaktım ama olmadı. Retractlar için birkaç farklı yeni motor siparişi vermiştim. Onlar da geldikten sonra daha net kararlar verebileceğim. Önümüzdeki günler havalar berbat. Kendimi baskılı devrelere adayacağım sanırım. :) Bu arada başka bir şey geldi aklıma. İniş takımı yuvalarına birer microswitch koyarak kapanmayı denetleyebilirim. Açılma için böyle bir mekanizma zor görünüyor. Ama eğer sabit akımlı ve/veya akım sınırlamalı bir devre oluşturabilirsem o durumda sadece süre tutarak retract açabilirim. Kapanma için switch, açılma için süre. Kod da çok basitleşir. Biraz da bu konuda kafa yoralım bakalım. :)
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Sümer Yamaner' Alıntı:
İmza için aceleye gerek yok... :D

Bugün üçten sonra yağmur bastırdığı için aceleyle toplandım. Retractları söküp yanıma alacaktım ama olmadı. Retractlar için birkaç farklı yeni motor siparişi vermiştim. Onlar da geldikten sonra daha net kararlar verebileceğim. Önümüzdeki günler havalar berbat. Kendimi baskılı devrelere adayacağım sanırım. :) Bu arada başka bir şey geldi aklıma. İniş takımı yuvalarına birer microswitch koyarak kapanmayı denetleyebilirim. Açılma için böyle bir mekanizma zor görünüyor. Ama eğer sabit akımlı ve/veya akım sınırlamalı bir devre oluşturabilirsem o durumda sadece süre tutarak retract açabilirim. Kapanma için switch, açılma için süre. Kod da çok basitleşir. Biraz da bu konuda kafa yoralım bakalım. :)

Abi 15 sn beyin fırtınası yapsan açılışa da mikro switch koyarsın. ;)
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Sümer Yamaner' Alıntı:
Ver gazı bakalım ne olacak. :)

Abi buraya kadar getirdin illaki açılışa da mikro switch koyarsın ısrar ediyorum. :thumbup:
Açıldığında bu retract illaki bir yere değecek oraya da mikro switch koyduk mu tamam. ;)
 
Arduino ile Rectract - Iniş Takımı Uygulaması

Benzinli bir uçakta switch beni rahatsız ediyor. Kaliteli bir switch bulup, titreşimden etkilenmeyecek, tozdan yakıttan korunaklı olacak şekilde monte etmek zor. Dün akşam bir test devresi daha yaptım. Motor zorlandığındaki değer ile tam sıkıştığındaki değer arasında ortalama 40 fark oluyor ki bu güvenli bir çalışma için yeterli. Kaldı ki elimde 0.47 ohm dirençler vardı. 1 ohm olsa muhtemelen bu değer iki katına çıkacak ve çok daha güvenli bir ölçüm sağlayacak.

Temel mantık şu: Besleme pilinden gelen hatta iki adet seri bağlı 1 ohm 1W direnç var. İki direncin birleşme noktasından ve ikinci direncin entegreye giriş noktasından iki ayrı voltaj ölçümü yapılıyor. Bu iki değerin farkı sürekli gözleniyor. Eğer fark belirli bir değeri aşarsa motorun sıkıştığına kanaat getiriliyor ve akım kesiliyor.

Test için kullandığım kod çok sıradan. Ölçüp seri porttan bilgisayar ekranına gönderiyor. Devre ise şu şekilde...

[attachimg=1]

1 ohm 1 W dirençlerim elime ulaştı. Bu akşam doğru değerlerle test edeceğim.

NOT: Bu arada şu 'i kafama kim soktuysa onunla bi hesabımız olacak. Her gün bir paket yapmak istiyor canım. :D :p
 

Ekli dosyalar

  • Ratract akým test.jpg
    Ratract akým test.jpg
    74 KB · Görülme: 52
Arduino ile Rectract - Iniş Takımı Uygulaması

Yukarıdaki şemada Arduino analog pinlere giden uçlardaki ikişer 4.7 kohm dirençle yapılan gerilim bölücüler unutulmuş. Aşağıda retract kontrolörünün nihai şeması görülüyor. Bir de hassas ayarlı ikinci versiyon gelecek.

[attachimg=1]
 

Ekli dosyalar

  • Ratract akým test çiftli 1.jpg
    Ratract akým test çiftli 1.jpg
    34.9 KB · Görülme: 39
Arduino ile Rectract - Iniş Takımı Uygulaması

Devre şemasında şu husus aklıma takıldı. 2S LiFe pilin nominal voltajı 6.6V olduğu için motor 800ma çekmediği sürece Arduino A0 ve A1'den 1023 okuyacak. L293D'nin tepe değeri ise 1200mA ve bu durumda bile A1'den 1023 değeri okunmaya devam edecek. Yani demem odur ki, A1'i okumaya gerek var mı ?

Hatta daha önemli bir husus ise, A0'ın hassasiyetinin pilin doluluk durumuna göre çok belirgin bir değişiklik göstereceği gerçeği. Life pilin 7.2V'dan 6.0V'a kadar yolu var. Tam dolu bir LiFe pilde A0'ın 1023'den aşağı bir değer göstermesi için, motorun 1100mA çekmesi gerekiyor. Boşalmaya yüz tutmuş bir LiFe pilde ise motor 500mA çektiğinde A0 1023'den aşağısını gösterecek. Burada fark okumak bir çözüm olabilir ama bu durumda da devre ilk söylediğim hususa takılıyor.

Sanki orada 3A BEC kullanıp gerilimi 5 ya da 5.5 Volta sabitlemek daha iyi iş görürdü gibime geliyor.

Düzenleme: Ben cevap yazarken zaten "part 2" gelmiş bile :). Ben biraz Part 2'yi de inceliyeyim :)