Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Sumer Yamaner

Moderator
Katılım
17 Eyl 2013
Mesajlar
8,771
Tepkime puanı
23,156
Yaş
61
Konum
İstanbul
Web sitesi
www.sumeryamaner.com
İlgi Alanı
Uçak
Hezarfen ekibinden bir arkadaşım, motor düşük devirlerdeyken stop edecek kadar yavaşlarsa bunu farkedip biraz gaz açacak bir devre istedi.

Tasarladığım devre şöyle:

Alıcıdan gaz servo çıkışı ve kill switch çıkışı devreye giriyor. Benzinli motorun ateşleme sensöründen gelen sinyal de Y kablo ile devreye alınıyor.
Devre üzerinde iki adet trimpot var. Bunlardan birisi sistemin devreye girmesi için gerekecek minimum devri belirliyor. Bu devir yaklaşık olarak 1000 ile 2023 devir arasında. Diğer trimpot ise devir sınırın altına indiğinde gazın ne kadar açılacağını belirliyor. Devrede bir de jumper var. Bu da throttle kanalının normal ya da reverse olmasına göre ya boş kalıyor ya da 0 V'a bağlanıyor.

Çalışma mantığı da şöyle:

Setup kısmında kill switch'in açılması bekleniyor. Ateşleme enerjilendiriliyor.
Loop kısmında öncelikle alıcıdan motor stop komutu gelip gelmediği sürekli izleniyor. Motor stop gelirse ateşleme kapatılıyor (buraya henüz akıllı kill switch işlevi ekleyemedim).
Motor stop gelmiyorsa sürekli devir ölçülüyor ve değerlendiriliyor. Devir trimpot ile belirlenen değerin altında ise gaz kolu değeri diğer trimpot ile belirlenen miktar kadar artırılıyor ya da eksiltiliyor. Bu artırma ya da eksiltme reverse jumper konumuna göre yapılıyor. (Biliyorsunuz gerek uçaktaki geometri gerekse karbüratörün yapısı ve konumu nedeniyle gaz kimi zaman ileriye kimi zaman ise geriye doğru çalışır. Bu reverse jumperi o ayarı sağlıyor bize.)

Peki devir nasıl ölçülüyor? Devir ölçmenin iki farklı yöntemi var. Birincisi belirli bir süre içindeki ateşlemeleri saymak. Bu çok uzun zaman alır ve hassas bir ayara izin vermez. O zaman ikinci yöntemi kullanacağız. Yani peş peşe gelen iki ateşleme sinyalinin arasını ölçüyoruz. Bu süreyi mikrosaniye cinsinden ölçüp 60000000'i bu sayıya böldüğümüzde dakikada devir sayısını elde ediyoruz. Aslında program içinde bu dönüşümü hiç yapmadan sadece süre üzerinden de gitmek mümkün ama daha iyi anlaşılabilirlik açısından ilk aşamada bunu tercih ettim.

Kod aşağıda.

Kod:
// Motor devrini sürekli gözleyip belirli bir değerin altına inmeye başladığında gaz verecek program

int throttlein = 1; // Alıcıdan throttle sinyali girişi
int sensorin = 3; // Ateşlemeden gelen sinyal girişi
int throttleout = 5; // Gaz servosu çıkışı
int ignLED = 11; // Ateşleme LED göstergesi çıkışı
int ign = 9; // Ateşleme optokuplör çıkışı
int steppin = 0; // Devir düştüğünde gazın ne kadar açılacağını belirleyen trimpot girişi
int revpin = 8; // Gaz servosu reverse jumper girişi
int mindevirpin = 2; // Alt devir sınırını ayarlamak için trimpot girişi
int motorstop = 0; // Motorun stop etmiş olduğunu gösteren değişken. 0 ise motor çalışıyor 1 ise stop etmiş

int mindevir;
int devir;
int ignPWM;
int rxPWM;
int oldrxPWM;
int thrstep = 15;
unsigned long timer;
unsigned long frame;
unsigned long timer2;
int n;
int x;



void setup()
{
  pinMode(throttleout, OUTPUT);
  pinMode(ign, OUTPUT);
  pinMode(ignLED, OUTPUT);
  pinMode(revpin, INPUT);
  digitalWrite(revpin, HIGH);
  ignPWM = pulseIn(ign, HIGH, 25000);
  while(ignPWM <= 1500) //Burada ateşlemenin açık komutunu bekliyoruz
  {
    ignPWM = pulseIn(ign, HIGH, 25000);
  }
  digitalWrite(ignLED, HIGH);
  digitalWrite(ign, HIGH); //Ateşlemeyi açtık
}


void loop()
{
  rxPWM = pulseIn(throttlein, HIGH, 25000);
  ignPWM = pulseIn(ign, HIGH, 25000);
  while(ignPWM > 1500)
  {
    frame = micros();
    ignPWM = pulseIn(ign, HIGH, 25000);
    rxPWM = pulseIn(throttlein, HIGH, 25000);
    devirhesapla();
    if(devir > 0)
    {
      mindevir = 1000 + analogRead(mindevirpin);
      thrstep = analogRead(steppin) / 4;
      if(devir < mindevir)
      {
        if(digitalRead(revpin) == HIGH)
        {
          rxPWM = rxPWM + thrstep;
        }
        else
        {
          rxPWM = rxPWM - thrstep;
        }
        oldrxPWM = rxPWM;
        if(rxPWM > 2200)
        {
          rxPWM = 2200;
        }
        if(rxPWM < 800)
        {
          rxPWM = 800;
        }
      }
      else
      {
        if(rxPWM > oldrxPWM)
        {
          rxPWM = rxPWM - ((rxPWM - oldrxPWM)/2);
          oldrxPWM = rxPWM;
        }
        else
        {
          rxPWM = rxPWM - ((rxPWM + oldrxPWM)/2);
          oldrxPWM = rxPWM;
        } 
      }
    }
    else
    {
      oldrxPWM = rxPWM;
    }
    throut();  
    while((micros() - frame) < 20000)
    {
    }
  }
  digitalWrite(ignLED, LOW);
  digitalWrite(ign, LOW); //Ateşlemeyi kapattık
}


void devirhesapla()
{
  motorstop = 0;
  n = digitalRead(sensorin);
  timer2 = micros();
  
  while(motorstop == 0)
  {
    
  while(n == 0)
  {
    n = digitalRead(sensorin);
    if((micros() - timer2) > 60000)
    {
     motorstop = 1;
     devir = 0; 
    }
  }
  timer = micros();
  while(n > 0)
  {
    n = digitalRead(sensorin);
    if((micros() - timer2) > 60000)
    {
     motorstop = 1;
     devir = 0; 
    }
  }
  while(n == 0)
  {
    n = digitalRead(sensorin);
    if((micros() - timer2) > 60000)
    {
     motorstop = 1;
     devir = 0; 
    }
  }
  }
  if(motorstop == 0)
  {
  x = micros();
  n = x - timer;
  devir = 60000000 / n;
  }
  else
  {
  devir = 0;
  }
}


void throut()
{
  digitalWrite(throttleout, HIGH);
  timer = micros();
  while((micros() - timer) < rxPWM)
  {
  }
  digitalWrite(throttleout, LOW);
}


Bu kodun şu an için büyük bir sorunu var. Düşünün, bir ateşleme aralığı ölçüldü ve devir asgari devrin altında çıktı. Servo sinyaline müdahale ettik. Gazı biraz açtık. Bir sonraki çevrimde devir yükselmiş olacak. Yani gaz kolu yine eski konumuna dönecek. Yani sürekli oynayan, kararsız bir rölanti ortaya çıkacak. Buna bir çözüm bulmak gerekiyor.

Aklıma gelen yöntem ise şu: rxPWM değerini her döngüde ayrı bir değişkende depolayıp aktüel rxPWM ile arasında fark varsa (yani bir döngü öncesinde sistem devreye girip gaz açtıysa) gaz servosu çıkışını adım adım aktüel değere getirmek. Bunu, daha çnce yapmış olduğum servo yavaşlatıcıdaki mantık ve algoritmayı uyarlayarak başarabilirim gibime geliyor.

EDİT: Koda ekleme yaptım. Bu şekilde anlattığım sorunun üstesinden gelebilmeyi umuyorum.
 
Eline sağlık Sümer abi, çok güzel bir proje ve de işlevsel. :bravo:
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Üzerinde epeyce emek ve zaman harcamak ve hassas ayarlar yapmak gerekecek. Ancak istediğim gibi çalıştırmayı başarırsam bir sonraki adım çift motor senkronizasyon sistemi olacak.
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Abi ellerine saglik. Gordugum kadari ile benzinli motorlar icin oldukca kritik iki olayi tek seferde çözmeyi planliyorsun. Eger olursa, ki bence kesin olacak, bu cihaza cok talep gelir, Ozellikle Ucakci camiasindan :bravo: :halay:
 
Ynt: Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Sumer abi eline saglik , basarili olursa cok guzel bir uygulama olur ve bence seri uretim icin bir adim olabilir , benim hover vs yaparken en korktugum sey motorun stop etmesi , bununla insan korkmadan ucabilecek,

motor devrini , kumandadan sinyal gelmedigi anlarda devamli 1800rpm de tutacak sekilde olsa bu devre ? kumandadan sinyal geldiginde devreden cikacak, sinyal kesildiginde devreye girip 1800rpm e sabitleyecek

mesela devrede set etme ozelligi olsa , kumanda (trim subtrim) ve gaz kolu ayarimiz yaptiktan sonra , set edip gaz kolunun o pozisyonunu 0 olarak kabul etse devre ? olmazmi

LG-D802 cihazımdan Tapatalk 2 ile gönderildi
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Mesut değişik şeyler olabilir ama işin içinde kill switch olduğu için olayın mantığı, alıcı sinyali kesildiği anda motorun kapatılması. İstenirse senin dediğin de yapılabilir. Fakat bir nokta var. Bu sistem rölanti civarındaki stop riskini önlemeye yönelik. Hover yaparken olan stopu önlemeyebileceğini düşünüyorum. Üzerinde daha çok çalışmak gerekecek.
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Sumer bey ellerinize saglik. .ino isi oturmus bence.

Aslinda bir olcuda governor gibi calisiyor degil mi ?
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Basit bir governör denilebilir ama kontrolü tüm devir aralığında değil. Sadece alt uçta. Bir governör projesi yolda. Hatta gaz koluna lineer çekiş cevabı oluşturulması düşünülebilir sanki.
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Devir icin optik takometre olabilir. Devri alir hedef devri gelen pwm'den bulur. Sonrasi kontrol algoritmasi PI ile rahatlikla olur gibi.
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Benzinli motorda devir sinyali var zaten. Ama diğer motorlar için farklı çözümler üretmek gerekecek...
 
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Bu projeyi unuttum sanmayın. Devre ve plaket tasarımını az önce tamamladım. Birkaç gün içinde yazılım testleri de tamamlanıp uçakta test edilecek hale gelecek umarım.
Modül alıcıdan ateşleme ve throttle girişleri alıyor. Ateşleme ünitesinden devir çıkışı ya da Y kablo ile sensör çıkışı alıyor. Üniteye ateşleme pili bağlanıyor. Throttle servosu bağlanıyor. Bir de ateşleme indikatör LED'i bağlanıyor.
Ünite standart bir kill swtich işlevinin yanısıra motor devrini sürekli izliyor. Devre üzerinde bulunan iki hassas potansiyometreden biri ile ayarlanan devir alt limitine ulaşılınca yani motorun stop riski baş gösterince sistem devreye girip diğer hassas potansiyometre ile ayarlanan miktar kadar gaz açıyor. İki saniye kadar bekleyip devreden çıkıyor ve yine gözetlemeye başlıyor.
Kod üzerinde hala çalıştığım için henüz paylaşmıyorum.

[attachimg=1]
 

Ekli dosyalar

  • Rölanti Guard.jpg
    Rölanti Guard.jpg
    137.7 KB · Görülme: 44
Yeni proje: Motor rölanti devri emniyeti ve kill switch kombinasyonu

Tüm başlanan projeler teker teker bitme aşamasına geldi abi. Ellerine ve azmine sağlık valla :thumbup: