Arduino ile akıllı kill switch yapalım...

Arduino ile akıllı kill switch yapalım...

Öncelikle hemen belirtmeliyim ki fikir bana ait değil. Piyasada (yüksekçe fiyatlara) bu mantıkla çalışan ürünler bulunabiliyor. Örneğin PowerBox ürünlerinde buna benzer bir özellik var. Yani fikir bana ait değil. Ben sadece fikri alıp Arduino ile uyguladım. Küçük Arduino plaketlerim geldiğinde bir optokuplör bağlayarak sistemi shrinkleyip akıllı kill switch projesini tamamlamış olacağım inşallah. :)
Tecrübeye gelince...
Bugüne kadar iki farklı kill switch kullandım. Birisi RCEXL marka olandı ki en çok kullandığımız budur. Switch pozisyonuna göre ateşlemeyi ya hemen açıyor ya da hemen kapatıyor. Sonra bir gün HobbyKing ürününü kullanmak zorunda kaldım. Ama bilmiyordum ki yaklaşık 1.5 saniyelik bir gecikmeyle devreye giriyormuş. Uçağı iniş sonrası pit alanına getirdim ve motoru kapattım. Yani kapattığımı sanıyordum ama motor 1.5 saniye daha çalışmaya devam ettiği için masalardan birine ilerledi, ahşap pervane kırıldı. Bir de eski Sea Fury ile (RCEXL kill switch) bir kalkışta sanıyorum iniş takımını kapatırken ateşlemeyi de kapattım. Doğal olarak pistin ilerisinde tarlaya indim. Bu iki olay nedeniyle kill switch konusunda hassasım. Bu hazırladığım kodda alıcı sinyalinin kesilmesi de motorun stopuna neden oluyor emniyet tedbiri olarak. Ancak ne yazık ki artık neredeyse tüm alıcılarda failsafe var. İletişim kesilse bile servo kanalında sinyal devam ediyor. Bu bir sıkıntı...
 
Arduino ile akıllı kill switch yapalım...

Sümer Yamaner' Alıntı:
...... Küçük Arduino plaketlerim geldiğinde bir optokuplör bağlayarak sistemi shrinkleyip akıllı kill switch projesini tamamlamış olacağım inşallah. :)
Bu projelerin en güzel tarafı da bu zaten. $3 bir ürünün etrafına koy $5-$10 elektronik.
Sonra kendi diyazn edip, kodladığın ürünleri modelinde kullan. Bundan daha büyük bir zevk olabilir mi :thumbup: :halay: :yuppi:
 
Arduino ile akıllı kill switch yapalım...

Kodun yeni versiyonu. Sisteme enerji verildiğinde vericiden ON komutu geliyorsa LED pırpır ediyor. OFF komutu gelinceye kadar bekliyor. OFF komutu gelince LED sistemin hazır olduğunu göstermek amacıyla yavaş olarak yanıp sönüyor. Sonrası aynı...

Kod:
// Benzinli motor ateşlemesini kontrol etmek için akıllı kill switch uygulaması
// Alıcı PWM <= 1500 ise ateşleme kapalı, > 1500 ise ateşleme açık
int rxPin = 12; //Alıcı sinyali 12 nolu uçta
int ignition = 3; //Ateşleme kontrolü 3 nolu uçta
int ignLED = 2; //Ateşleme göstergesi LED 2 nolu uçta
int ign_status = 0; //Başlangıçta ateşleme kapalı. Bu değişken şimdilik bir işe yaramıyor.
int rxPWM = 0; //Alıcı sinyali değişkeni

void setup()
{
  pinMode(ignition, OUTPUT);
  pinMode(ignLED, OUTPUT);

  rxPWM = pulseIn(rxPin, HIGH, 25000);
  while(rxPWM > 1500) //Burada ateşlemenin kapalı komutunu bekliyoruz. LED hızlı yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(100);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(100);
  }

  while(rxPWM <= 1500) //Burada ateşlemenin açık komutunu bekliyoruz. LED yavaş yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(300);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(300);
  }
  ign_status = 1;
  digitalWrite(ignLED, HIGH);
  digitalWrite(ignition, HIGH); //Ateşlemeyi açtık
}


void loop()
{
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  if(rxPWM == 0)
  {
    delay(500);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    if(rxPWM == 0)
    {
        digitalWrite(ignition, LOW);
        digitalWrite(ignLED, LOW);
        ign_status = 0;
    }
  }
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  if(rxPWM > 1500)
  {
  ign_status = 1;
  digitalWrite(ignLED, HIGH);
  digitalWrite(ignition, HIGH); //Ateşlemeyi açtık
  }
  while(rxPWM > 1500)
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  }
  //Alıcıdan ateşleme OFF komutu geldiyse bir saniye bekleyip tekrar kontrol ediyoruz
  //Eğer bir saniye içinde komut ON olmadıysa hiç birşey yapmıyoruz
  //Eğer bir saniye içinde tekrar ON yapıldıysa bu sistemi arm ediyor
  delay(1000);
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  if(rxPWM > 1500)
  {
    for(int i = 0; i < 50; i ++)	//Sistem arm edilmiş durumda. Beş saniye boyunca alıcıyı okuyoruz.
		//Beş saniye içinde OFF komutu gelirse ateşlemeyi kapatıyoruz.
    {
      rxPWM = pulseIn(rxPin, HIGH, 25000);
      delay(100);
      if(rxPWM <= 1500)
      {
        digitalWrite(ignition, LOW);
        digitalWrite(ignLED, LOW);
        ign_status = 0;
        i = 50;
      }
    }
  }
  while(rxPWM <= 1500)	//Tek bir OFF komutu geldi ama sonrasında tekrar ON/OFF yapılmadı
			//Bu durumda ON komutu gelene kadar burada bekliyoruz
    {
      rxPWM = pulseIn(rxPin, HIGH, 25000);      
    } 
}
 
Arduino ile akıllı kill switch yapalım...

Kill Switch hazır.

* Sisteme enerji verildiğinde eğer motor ON konumundaysa LED pırpır ediyor ve ateşleme açılmıyor. Buton OFF yapılınca LED daha yavaş pırpır ediyor ve tekrar ON yapılınca ateşleme açılıyor.

* Sisteme enerji verildiğinde motor OFF konumundaysa LED yavaş pırpır ediyor ve ON komutu bekleniyor.

* Ateşleme açılınca LED sürekli yanık kalıyor.

* Ateşleme OFF komutu geldiğinde bu komutun ne kadar sürdüğüne bakılıyor. Eğer yarım saniyeden kısa ya da bir saniyeden uzun ise hiçbir şey olmamış gibi ateşleme açık tutuluyor.

* Eğer yarım saniye ile bir saniye arasında bir sürede hemen tekrar ON yapılmışsa yaklaşık 3 saniyelik bir süre boyunca yeniden OFF komutu gelecek mi diye bekleniyor. Gelirse ateşleme kapatılıyor. Bu süre içinde OFF komutu gelmezse hiçbir şey olmamış gibi devam ediliyor.

Bu şekilde hem istendiği anda motor bir saniyeden daha kısa sürede kapatılabiliyor ama motoru yanlışlıkla durdurma riski ortadan kalkmış oluyor.


Kod:

Kod:
// Benzinli motor ateşlemesini kontrol etmek için akıllı kill switch uygulaması
// Alıcı PWM <= 1500 ise ateşleme kapalı, > 1500 ise ateşleme açık
int rxPin = 12; //Alıcı sinyali 12 nolu uçta
int ignition = 4; //Ateşleme kontrolü 3 nolu uçta
int ignLED = 2; //Ateşleme göstergesi LED 2 nolu uçta
int rxPWM = 0; //Alıcı sinyali değişkeni
unsigned long timer;

void setup()
{
  pinMode(ignition, OUTPUT);
  pinMode(ignLED, OUTPUT);

  rxPWM = pulseIn(rxPin, HIGH, 25000);
  while(rxPWM > 1500) //Burada ateşlemenin kapalı komutunu bekliyoruz. LED hızlı yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(100);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(100);
  }

  while(rxPWM <= 1500) //Burada ateşlemenin açık komutunu bekliyoruz. LED yavaş yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(300);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(300);
  }
}


void loop()
{
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  if(rxPWM == 0)
  {
    delay(500);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    if(rxPWM == 0)
    {
      digitalWrite(ignition, LOW);
      digitalWrite(ignLED, LOW);
    }
  }
  if(rxPWM > 1500)
  {
    digitalWrite(ignLED, HIGH);
    digitalWrite(ignition, HIGH); //Ateşlemeyi açtık
  }
  while(rxPWM > 1500)
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  }
  timer = millis();
  while(rxPWM <= 1500)
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  }
  timer = millis() - timer;
  if(timer >= 500 && timer <= 1000)
  {
      for(int i = 0; i < 30; i ++)	//Sistem arm edilmiş durumda. Üç saniye boyunca alıcıyı okuyoruz.
        //Üç saniye içinde OFF komutu gelirse ateşlemeyi kapatıyoruz.
      {
        rxPWM = pulseIn(rxPin, HIGH, 25000);
        delay(100);
        if(rxPWM <= 1500)
        {
          digitalWrite(ignition, LOW);
          digitalWrite(ignLED, LOW);
          i = 30;
        }
      }
  }
}


Devre şeması bu:

[attachimg=1]

Prototip plaket bu:

[attachimg=2]

Bence bu sistemi Arduino Nano ile değil en en küçük Arduino uyumlu plaket ile yapmak daha akıllıca olacak.

[attachimg=3]
 

Ekli dosyalar

  • pic0001.jpg
    pic0001.jpg
    40 KB · Görülme: 113
  • Kill Switch plaket.jpg
    Kill Switch plaket.jpg
    130.1 KB · Görülme: 113
  • Arduino Kickstarter.jpg
    Arduino Kickstarter.jpg
    29.6 KB · Görülme: 113
Arduino ile akıllı kill switch yapalım...

Sümer Yamaner' Alıntı:
Kill Switch hazır.
...
Bence bu sistemi Arduino Nano ile değil en en küçük Arduino uyumlu plaket ile yapmak daha akıllıca olacak.
Kesinlikle abi, ne kadar küçük o kadar iyidir :thumbup:
 
Arduino ile akıllı kill switch yapalım...

Dün akşamdan beri minik Digispark Kickstarter kartı ile cebelleşiyorum. Önce sürücü bulma sorunu sonra Arduino IDE uyumu falan derken epey mesafe katettim. Sonra yazılımı aktarmayı başardım. Ancak bir türlü istediğim tepkileri alamadım. Sonra bir test programı yazdım. Sadece 0, 2 ve 4 No'lu çıkışları kullanabildiğimi farkettim. Orada takılıp kaldım. Sebebini bir türlü anlayamadım. Sonra programı bu üç ucu kullanacak şekilde değiştirdim ve olur gibi oldu. :D
Daha sonra algoritmayı değiştirdim ve yeni bir program akışı oluşturdum. Sonunda tam istediğim gibi oldu.
Şu an bulmaya çalıştığım şey, acaba ben plaketin sağını solunu lehimlerken (headerleri birkaç kez lehimleyip sökmek zorunda kaldım da) donanımsal bir hasar mı oluşturdum yoksa başka bir numara mı var... Bu soruyu da yanıtladığımda minik akıllı kill switch plaketlerimi hemen basıp hafta sonu uçakta test etmek istiyorum.

Kodun son hali:

Kod:
// Benzinli motor ateşlemesini kontrol etmek için akıllı kill switch uygulaması
// Alıcı PWM <= 1500 ise ateşleme kapalı, > 1500 ise ateşleme açık
int rxPin = 0; //Alıcı sinyali 0 nolu uçta
int ignition = 4; //Ateşleme kontrolü 4 nolu uçta
int ignLED = 2; //Ateşleme göstergesi LED 2 nolu uçta
int rxPWM = 0; //Alıcı sinyali değişkeni
unsigned long timer1;
unsigned long timer2;
int armed = 0;

void setup()
{
  timer1 = millis();
  pinMode(ignition, OUTPUT);
  pinMode(ignLED, OUTPUT);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  while(rxPWM > 1500) //Burada ateşlemenin kapalı komutunu bekliyoruz. LED hızlı yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(100);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(100);
  }
  while(rxPWM <= 1500) //Burada ateşlemenin açık komutunu bekliyoruz. LED yavaş yanıp sönüyor
  {
    digitalWrite(ignLED, HIGH);
    delay(300);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    digitalWrite(ignLED, LOW);
    delay(300);
  }
}


void loop()
{
  rxPWM = pulseIn(rxPin, HIGH, 25000);
  timer2 = millis() - timer1;
  if(timer2 > 3000)
  {
    armed = 0;
    digitalWrite(1, LOW);
  }
  if(rxPWM == 0)
  {
    delay(500);
    rxPWM = pulseIn(rxPin, HIGH, 25000);
    if(rxPWM == 0)
    {
      digitalWrite(ignition, LOW);
      digitalWrite(ignLED, LOW);
    }
  }
  if(rxPWM > 1500)
  {
    digitalWrite(ignLED, HIGH);
    digitalWrite(ignition, HIGH); //Ateşlemeyi açtık
  }
  while(rxPWM > 1500)
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  timer2 = millis() - timer1;
  if(timer2 > 3000)
  {
    armed = 0;
    digitalWrite(1, LOW);
  }
  }
// OFF komutu geldi
  if(armed == 0) // Daha önce OFF komutu gelmediyse armed değişkeni 0 olacak. O zaman sadece armed 1 yapılıp timer başlatılacak
  {
  timer1 = millis();
  armed = 1;
  digitalWrite(1, HIGH);
  }
  else //Armed 0 değilse daha önce OFF komutu geldi demektir. O zaman ne kadar süre önce geldiğine bakılacak. 3 saniyeyi geçtiyse armed sıfırlanacak. Yoksa ateşleme OFF.
  {
    timer2 = millis() - timer1;
    if(timer2 < 3000)
    {
      digitalWrite(ignition, LOW);
      digitalWrite(ignLED, LOW);
      armed = 0;
      digitalWrite(1, LOW);
    }
  }
  
  while(rxPWM <= 1500)
  {
    rxPWM = pulseIn(rxPin, HIGH, 25000);
  }
}
 
Arduino ile akıllı kill switch yapalım...

Digispark kartının birçok kısıtlaması varmış. Üzerinde sadece ATTINY85 işlemci ve bir de 7805 voltaj regülatörü var. Birkaç tane de direnç diyot vs. Yani adamlar minimal elemanla işi çözerken doğal olarak bazı kısıtlamalar da gelmiş. Ek bir USB modülü olmadığı için bazı uçlar birden fazla işleve sahip.
Bir gün kullanmayı düşünen olursa diye temel tabloyu paylaşıyorum:

[attachimg=1]

Sonunda delikli plaket kullanarak ilk prototipi oluşturmayı başardım. Yukarıdaki kodu yükledim. Tam olması gerektiği şekilde çalışıyor. Bundan sonraki adım PCB tasarım ve üretimi olacak tabii.

[attachimg=2]
 

Ekli dosyalar

  • Digispark Pin Usage Guide.jpg
    Digispark Pin Usage Guide.jpg
    56.6 KB · Görülme: 80
  • pic0001.jpg
    pic0001.jpg
    60.1 KB · Görülme: 82
Arduino ile akıllı kill switch yapalım...

Abi ellerine saglik prototip de sahane gozukuyor. Model uzerinde calisma videosunu da merakla bekliyoruz :)

Bu arada faydali bilgiler arada kaybolmasin diye ana konuya ilave ettim :RCKolik:

 
Arduino ile akıllı kill switch yapalım...

Bu arada, Banggood'dan gelen Digispark plaketler Rev 3. Digispark ise "biz hiç Rev 3 kart üretmedik, Rev 3 olanların tümü çakmadır" diyor. :)
 
Arduino ile akıllı kill switch yapalım...

Sümer Yamaner' Alıntı:
Bu arada, Banggood'dan gelen Digispark plaketler Rev 3. Digispark ise "biz hiç Rev 3 kart üretmedik, Rev 3 olanların tümü çakmadır" diyor. :)
Hadi bakalim buradan yak :rolleyes: Yeter ki calissin abi ;)
 
Arduino ile akıllı kill switch yapalım...

Bu da şu an asitteki plaket...

[attachimg=1]
 

Ekli dosyalar

  • pic0001_001.jpg
    pic0001_001.jpg
    79.4 KB · Görülme: 54
Arduino ile akıllı kill switch yapalım...

Abi maşallah süper gidiyorsun Allah nazarlardan kem gözlerden sakınsın [emoji106] [emoji122] [emoji122]
 
Arduino ile akıllı kill switch yapalım...

ExpressPCB programı, PNP kağıdı, termostatlı model kaplama ütüsü, adam gibi tuz ruhu ile perhidrol... Plaket onbeş dakikada hazır neredeyse... Boşuna dememişler. Alet işler el övünür. :)
 
Arduino ile akıllı kill switch yapalım...

Sümer Yamaner' Alıntı:
ExpressPCB programı, PNP kağıdı, termostatlı model kaplama ütüsü, adam gibi tuz ruhu ile perhidrol... Plaket onbeş dakikada hazır neredeyse... Boşuna dememişler. Alet işler el övünür. :)
Abi hazir olan paketi gormemiz mumkin mu acaba ?