Yeni Proje: Servolu jikle koruması

Sumer Yamaner

Moderator
Katılım
17 Eyl 2013
Mesajlar
8,746
Tepkime puanı
23,120
Yaş
61
Konum
İstanbul
Web sitesi
www.sumeryamaner.com
İlgi Alanı
Uçak
Benzin motorlarında jikle bağlantısı bazen sıkıntılı olabiliyor. Genelde uyguladığımız yöntem bir pushrod ile jikle kontrolünü ön taraftan yapmak. Bu amaçla elimizi pervanenin arkasına uzatıp jikle telini itiyor ya da çekiyoruz. Ben bir alışkanlık olarak bunu yaparken her zaman ateşlemeyi kapatırım. Ama ne olursa olsun bir risk var. Bu amaçla jikleyi bir servo ile kontrol etme seçeneği geliştirildi. Ancak bunun da bir sakıncası var. Uçuş sırasında hatalı bir tuş hareketi ile jikleyi aktive edip motor stopuna yol açmak mümkün.Biz Hezarfen grubunda bunları tartışırken Yücel Kardeşimizden bir öneri geldi. Motor belirli bir devrin üstünde ise vericiden komut gelse bile jikle devreye girmeyecek. İşte yeni proje konusu belli oldu. Sonuçta alıcı sinyali ve ateşleme sinyali için toplam iki giriş ve jikle servosu çin toplam bir çıkış gerekeceği için en küçük işlemci (Attiny) bu iş için yetecek gibi görünüyor. Bunun sonucunda jikle servosunun hemen altına yapıştırılacak minik bir devre ile bu sorunu çözeriz diye düşünüyorum. Tarih 8 Nisan. Bakalım çalışır hale gelmesi ne kadar zaman alacak. :D
 
Yeni Proje: Servolu jikle koruması

Kod test edildi ve tam planlandığı gibi çalışıyor.

Plaket olarak basit bir şey tasarladım. Bunun bir de LCD devir göstergeli olanı gelecek. Her zamanki gibi bu "Lite" versiyonu. O da "Pro" versiyonu olacak. :D

[attachimg=1]


Kod:
//Motor çalışırken jikle aktivasyonunu önleyen program

const int sensorpin = 3; // Ateşleme sensörü girişi
const int pwmpin = 2; // Alıcıdan gelen jikle kanalı sinyali girişi
const int servopin = 4; // Jikle servosu çıkışı
const int setpospin = 0; // Trimpot ile jikle OFF servo konumu ayarlanıyor

const int butonL = 9;
const int buton = 11;

// Interruptlar sırasında değiştirilecek olan değişkenler
volatile unsigned long xpwm1;
volatile unsigned long xpwm2;
volatile unsigned long xrpm1;
volatile unsigned long xrpm2;

// Normal işleyişte kullanılacak değişkenler
unsigned long pwm1;
unsigned long pwm2;
unsigned long rpm1;
unsigned long rpm2;

// Yardımcı değişkenler
volatile byte pflag = 0;
volatile byte temp = 0;
unsigned long frame;

// Temel parametreler
unsigned long period; // Motor devir periyodu
unsigned int pwm; // Alıcıdan gelen darbe süresi
unsigned int servopwm; // Servoya gidecek darbe süresi
unsigned int offvalue; // Jikle OFF konumunu içeren değişken

void setup()
{
  pinMode(servopin, OUTPUT);
  pinMode(butonL, OUTPUT);
  digitalWrite(butonL, LOW); // Buton için LOW sinyali oluşturduk
  pinMode(buton, INPUT_PULLUP);
  offvalue = 1000 + analogRead(setpospin); // Jikle OFF konumu çin belirlenen servo pozisyonu okunuyor
  attachInterrupt(0, pwmread, CHANGE); // Alıcı sinyalini okumak için
  attachInterrupt(1, rpmread, FALLING); // Ateşlemeyi okumak için
}

void loop()
{
  if (digitalRead(buton) == 0)
  {
    setservo();
  }
  else
  {
    while (pflag == 0) // Alıcıdan yeni bir sinyal gelene kadar bekliyoruz
    {
    }
    noInterrupts(); // Atomic read
    pwm1 = xpwm1;
    pwm2 = xpwm2;
    rpm1 = xrpm1;
    rpm2 = xrpm2;
    interrupts();

    if (pwm2 >= pwm1) pwm = pwm2 - pwm1; // PWM pulse süresi hesabı
    if (rpm2 <= rpm1) period = rpm1 - rpm2; // RPM pulse süresi hesabı
    if (period < 120000) // Motor devri 500'den fazla ise
    {
      servopwm = offvalue;
    }
    else // Motor devri 500'den az ise
    {
      servopwm = pwm;
    }
    servoout();
    pflag = 0;
  }
}

void pwmread() // Alıcı sinyalini okuyan interrupt işlevi
{
  temp = digitalRead(pwmpin);
  if (temp == 1) xpwm1 = micros();
  if (temp == 0)
  {
    xpwm2 = micros();
    pflag = 1;
  }
}

void rpmread() // Motor devrini okuyan interrupt işlevi
{
  interrupts();
  xrpm2 = xrpm1;
  xrpm1 = micros();
}


void servoout() // Jikle servosuna çıkış veren işlev
{
  digitalWrite(servopin, HIGH);
  delayMicroseconds(servopwm);
  digitalWrite(servopin, LOW);
}

void setservo()
{
  offvalue = 1000 + analogRead(setpospin); // Jikle OFF konumu çin belirlenen servo pozisyonu okunuyor
  servopwm = offvalue;
  frame = micros();
  servoout();
  while ((micros() - frame) < 20000)
  {
  }
}
 

Ekli dosyalar

  • Choke.jpg
    Choke.jpg
    85.6 KB · Görülme: 108
Yeni Proje: Servolu jikle koruması

Abi Hazerfen ekibi olarak harikasınız. Projenin birisi bitiyor, hemen diğer bir proje devreye giriyor :thumbup: :bravo:

Bu senin için çok zor bir proje değil bence. Bu nedenle proje süresini ben max 10 gün olarak öngörüyorum :laugh: :D
 
Yeni Proje: Servolu jikle koruması

Abi bence bu proje de bitince bunu kill switch projenle birleştirirsin tek bir modülle halledersin gibi geliyor bana . %p
 
Yeni Proje: Servolu jikle koruması

Sümer abi gerçekten güzel bir proje. :bravo: En güzel şekilde ortaya çıkacağına hiç şüphem yok. Hatta bence sana fazla dayanmaz 9 Nisan'da biter diye düşünüyorum. :laugh:

Benimde bir önerim var, eğer uçuş süresi 15 dakikayı geçerse de yine jikleyi çeksin bu sevro bence. Yanlış anlaşılma olmasın sahibi uçağı havada unutmuştur boşa benzin yakıp durmasın, ülke ekonomisini korumak gerekir diye düşünerek söylüyorum tamamen. :laugh: :lol:
 
Yeni Proje: Servolu jikle koruması

Tam kongre dönemi. Bin tane konuşma falan hazırlamam gerekirken uğraştığım şeylere bak. :p Yani 9 Nisan fazla iddalı bir bitiş tarihi. :D

Türker'ciğim o dediğini vantilatörler için planladım bile. Ama 15 dakika çok. Beşinci dakikada çekiveriyorum iplerini! :p
 
Yeni Proje: Servolu jikle koruması

Sümer Yamaner' Alıntı:
Tam kongre dönemi. Bin tane konuşma falan hazırlamam gerekirken uğraştığım şeylere bak. :p Yani 9 Nisan fazla iddalı bir bitiş tarihi. :D
Sümer abi ameliyathane ile konuşma yapacağın kürsü arasındaki yolculuk esnasında bitmiş olur bence bu proje. :laugh:

Sümer Yamaner' Alıntı:
Türker'ciğim o dediğini vantilatörler için planladım bile. Ama 15 dakika çok. Beşinci dakikada çekiveriyorum iplerini! :p
Sümer abi bizim helilerde jikle yok ki, bi uçaklarda bir de pancar motorlarında kaldı bildiğim kadarıyla. :lol: :lol:
 
Yeni Proje: Servolu jikle koruması

İlk aşamada UNO ya da Nano ile başlıyorum. Henüz Attiny ile olup olmayacağını araştırmadım.

Temel mantık aşamalarını özetleyeyim:

Alıcı sinyali haricî iki interrupttan daha "kıdemli" olan int0 ile okunuyor. Bu amaçla alıcı sinyali 2 No'lu digital bacağa bağlı olmalı. Biz pozitif darbe süresini okuyacağız. Bu nedenle interrupt'ı hazırlarken "CHANGE" parametresini kullanıyoruz. İlgili işlevin adı ise pwmread(). Yani alıcıdan gelen hattaki sinyaldeki değişim (LOW -> HIGH ya da HIGH - > LOW) bu işlevi çağırıyor. Interrupt işlevleri elden geldiğince kısa olmalı. Burada öyle yaptım. 2 No'lu digital bacağı okuyorum. Eğer HIGH ise demek ki darbe yeni başlamış. O zaman o anki micros() değerini alıp xpwm1 değişkenine not ediyorum. Bu değişken volatile olarak tanımlı unsigned long bir değişken. Eğer digital bacak LOW ise darbe yeni bitmiş demektir. O zaman micros() değerini xpwm2 değişkenine yazıyorum. Ayrıca bu durumda yeni ve geçerli bir darbe verisi oluştuu için pflag değişkenini de 1 yapıyorım ki ana loop bunu farketsin.

Devri ateşleme sensöründen gelen sinyalle hesaplıyorum. Ateşleme sinyali 3 No'lu digital bacağa bağlı. Bu bacak ise bir alt "kıdemdeki" harici interrupt bacağı. Burada int1 kullanıyoruz. Ama "CHANGE" değil de "RISING" parametresini tercih ediyoruz. Çünkü burada darbe süresi değil iki darbe arasındaki süre önem taşıyor. RISING dediğimiz için alıcı sinyalindeki gibi tekrar bacağı okuma derdimiz yok. Eski değeri (xrpm1) bir önceki değere (xrpm2) yazıyoruz. xrpm1 değişkenine de o anki micros() değerini aktarıyoruz.

Programın ana loop'unda öncelikle iki interrupt'un ölçtüğü değerleri normal kullanım değişkenlerine aktarıyoruz. Bunun için "atomic read" denilen bir işlevi kullanıyoruz. Okuduğumuz değerler "long" statüsünde yani her biri dört byte. Biz normal olarak okuyacak olursak tam okuma anında bir interrupt geldiğinde değer değişir ve okuduğumuz dört byte hatalı olabilir. İşte bunu engellemek için atomic read yapıyoruz. Yaptığımız şey interruptları kısa süreliğine kapatıp değerleri okumak ve interruptların müdahale edemediği yeni değişkenlere yazmak. Sonra hemen interruptlar tekrar aktive ediliyor tabii.

Şimdi elimizde alıcıdan gelen darbenin başlangıç ve sonunu gösteren mikrosaniye değerleri ile ateşlemenin peş peşe gelen iki darbesinin mikrosaniye değerleri var. Bunları birbirinden çıkararak istediğimiz değerleri elde ediyoruz. Yani pwm2'den pwm1'i çıkarında alıcıdan gelen darbenin süresini elde ediyoruz ki bunun klasik olarak 1000 - 2000, pratikte 800 - 2200 arasında olması lazım.
rpm2'den rpm1'i çıkarınca motorun bir devir periyodunu mikrosaniye cinsinden buluyoruz.

Dakikada 1000 devir için saniyede 16.7 devir ediyor. Bir dönüş iiçin gereken süre 60 milisaniye yani 60000 mikrosaniye ediyor. Dakikada 500 devri limit olarak alırsak periyot 120000 mikrosaniye ediyor. Yani programın ana loop'unda hesapladığımız periyot eğer 120000 ya da daha uzun ise motor normal çalışmıyor demektir. Yani bu durumda alıcıdan gelen sinyali aynen servoya aktarabiliriz anlamına gelir. Kısaca motor çalışmıyorken ya da çalıştırma aşamasındayken jikle servosunu biz vericiden kontrol edebiliyoruz.

Eğer hesaplanan periyot 120000 mikrosaniyeden kısa ise o zaman jikleyi deaktive etmemiz gerekiyor demektir. Artık alıcıdan gelen sinyale bakmıyoruz. Jikleyi OFF yapıyoruz. Ama nasıl? Sonuçta olay bir mekanik setup içeriyor. Servonun sıkışmaması çok önemli. İşte bu amaçla analog girişlerden birine bir trimpot bağlı. Bununla bir sefere mahsus olmak izere servonun jikle OFF konumundaki endpointini ayarlıyoruz. Motor devri 500'ün üzerine çıktığında sistem alıcıdan gelen sinyale bakmadan servoya bu ayarladığımız değeri gönderiyor.

Yani havada motor çalıştığı sürece biz kumandadan isteyerek ya da yanlışlıkla jikleyi aktive etme komutu versek bile sistem buna izin vermiyor.
 
Yeni Proje: Servolu jikle koruması

İkinci mesaja nihai kodu ve plaketi ekledim. Modülü alıcının jikle servosu kanalına bağlıyoruz. Jikle servosunu da modül çıkışına bağlıyoruz. Ateşleme sensöründen Y kablo ile ateşleme sinyalini alıyoruz.
İlk çalıştırmada modül üzerindeki butona basıp basılı tutarak çok turlu potansiyometre ile hassas bir JİKLE OFF endpoint ayarı yapıyoruz ki servo sıkışmasın. Sonra başka bir şeye gerek yok.
Motor devri 500'ün üzerinde olduğu sürece servo sürekli JİKLE OFF konumunda kalıyor. Eğer devir 500'ün altında ise vericiden gelen komut servoya aktarılıyor.
Normalde benzinli motorlarda jikleyi aktive edip pervaneyi vuruyoruz. Birkaç vuruş sonrasında motor çalışır gibi oluyor ve boğulup duruyor. Bunun üzerine jikleyi deaktive edip yani kelebeği açıp tekrar vurmaya başlıyoruz. Motor bu şekilde çalışıyor. Bu modül ile jikle ile çalıştığı anda jikle OFF olacağı için muhtemelen motor normal çalışmaya devam edecek. Yani motoru çalıştırmak çok kolaylaşacak.
 
Yeni Proje: Servolu jikle koruması

Eskiden karbüratörlü arabaların son dönemlerinde otomatik jigle vardı, onu hatırlattı bana. Oldukça faydalı bir eser olacak!
 
Yeni Proje: Servolu jikle koruması

Sümer Yamaner' Alıntı:
.... Normalde benzinli motorlarda jikleyi aktive edip pervaneyi vuruyoruz. Birkaç vuruş sonrasında motor çalışır gibi oluyor ve boğulup duruyor. Bunun üzerine jikleyi deaktive edip yani kelebeği açıp tekrar vurmaya başlıyoruz. Motor bu şekilde çalışıyor. Bu modül ile jikle ile çalıştığı anda jikle OFF olacağı için muhtemelen motor normal çalışmaya devam edecek. Yani motoru çalıştırmak çok kolaylaşacak.
Eğer söylediğin gibi olursa büyük bir kolaylık daha elde edilmiş olacak abi, daha ne olsun :halay: Gerçek kullanım sonucu merakla bekliyoruz :)
 
Yeni Proje: Servolu jikle koruması

Mehmet Kucuksari' Alıntı:
Eğer söylediğin gibi olursa büyük bir kolaylık daha elde edilmiş olacak abi, daha ne olsun :halay: Gerçek kullanım sonucu merakla bekliyoruz :)

Ayrı bir Arduino ile birkaç yüz devir ile yaklaşık 10 bin devir aralığını simüle eden bir darbe üreteci yapıp onunla test yaptım. Tam beklediğim gibi tepki alıyorum. Uçağın üzerinde de benzer şekilde çalışmaması için bir sebep yok. Belki devir limitine hassas bir ayar yapmak gerekecek o kadar.
Ama...
Şu ekskavatör konusunu gördükten sonra artık herhangi bir şey paylaşmamaya karar verdim. Utandım resmen. :D
 
Yeni Proje: Servolu jikle koruması

Abi sen de bişeyler yapmıyorum diye utanıyorsan benim gibi hazırcılar ne yapması lazım anlamadım. :saygilar: