Gerçek lövye ile model uçurmak

Gerçek lövye ile model uçurmak

Sümer Yamaner' Alıntı:
Acele etmeyelim... Basit bir traineri bu sistemle uçurup indirebilirsek o zaman hep birlikte sevineceğiz. :)
Abi akşam akşam güldürdün beni siz bununla P47 uçurmazsanız ben sizi hiç tanımamışım demektir.[emoji122] [emoji122] [emoji106]

Discovery cihazımdan Tapatalk kullanılarak gönderildi
 
Gerçek lövye ile model uçurmak

Abi maşallah yine herkesin düşündüğü ama lafına bile etmediği bir konu, bu proje olur bu zamana kadar olmayan varmiydiki bence yok kolay gelsin.

SM-G900F cihazımdan gönderildi
 
Celalettin Yazkan' Alıntı:
Abi akşam akşam güldürdün beni siz bununla P47 uçurmazsanız ben sizi hiç tanımamışım demektir.[emoji122] [emoji122] [emoji106]

Discovery cihazımdan Tapatalk kullanılarak gönderildi

İmkansız. Bende P47 yok ki! :D
 
Gerçek lövye ile model uçurmak

Altı kanallı bir sistem oluyor. İki adet switch var. Hani retract ve flap gerekir falan diye. İstenirse sekiz kanala kadar yolu var. Dört ana eksende digital trimler mevcut ancak trimleri henüz deneyemedim. Ama kodu simülatöre USB dongle aracılığı ile bağlayıp denedim.
Trimler EEPROM'da saklanıyor ve istendiğinde resetlenebiliyor.
Bu sistemde en önemli nokta throttle kanalının endpoint ayarları. Yazılım daha önce anlattığım şekilde onu da yapıyor ama henüz test edilemedi. Ben sizinle yazılımın temel işlevleri çalışır halini paylaşıyorum.

Kod:
/* Uçuş alanında kullanılacak lövye sistemi için program
 * Aileron A0
 * Elevatör A1
 * Throttle A2
 * Rudder A3
 *
 * Aileron trim left D2
 * Aileron trim right D3
 * Elevatör trim down D4
 * Elevatör trim up D5
 * Rudder trim left D6
 * Rudder trim right D7
 * Throttle trim down D8
 * Throttle trim up D9
 *
 * Kanal 5 D11
 * Kanal 6 D12
 *
 * Throttle EPA Set butonu D13
 *
 * PPM çıkışı D10
 */

#include <EEPROM.h>

const int aileronin = 0;
const int elevatorin = 1;
const int throttlein = 2;
const int rudderin = 3;

const int PPMout = 10;

const int aileronleft = 2;
const int aileronright = 3;
const int elevatordown = 4;
const int elevatorup = 5;
const int rudderleft = 6;
const int rudderright = 7;
const int throttledown = 8;
const int throttleup = 9;

const int ch5in = 11;
const int ch6in = 12;

const int epabutton = 13;

unsigned long frame;

unsigned int aileron;
unsigned int elevator;
unsigned int throttle;
unsigned int rudder;
unsigned int ch5;
unsigned int ch6;

unsigned int epa1;
unsigned int epa2;
int epacount;

int ailerontrim;
int elevatortrim;
int throttletrim;
int ruddertrim;

byte keyread;
byte keyread1;
byte keyread2;

int resetcount = 0;


void setup()
{
  for (int n = 2; n < 10; n++)
  {
    pinMode(n, INPUT_PULLUP);
  }
  pinMode(ch5in, INPUT_PULLUP);
  pinMode(ch6in, INPUT_PULLUP);
  pinMode(epabutton, INPUT_PULLUP);
  pinMode(PPMout, OUTPUT);
  digitalWrite(PPMout, HIGH);
  frame = micros();
  TCCR1A = 0;
  TCCR1B = 2; // Timer 1 Clock prescaler 8
  TIMSK1 = 0;
  EEPROMread();
}

void loop()
{
  frame = micros();
  aileron = analogRead(aileronin);
  aileron = analogRead(aileronin);
  aileron = analogRead(aileronin);
  aileron = 1000 + aileron + ailerontrim;
  elevator = analogRead(elevatorin);
  elevator = analogRead(elevatorin);
  elevator = analogRead(elevatorin);
  elevator = 1000 + elevator + elevatortrim;
  throttle = analogRead(throttlein);
  throttle = analogRead(throttlein);
  throttle = analogRead(throttlein);
  throttle = 1000 + throttle + throttletrim;
  if(digitalRead(epabutton) == 1) throttle = map(throttle, 1000, 2000, epa1, epa2);
  rudder = analogRead(rudderin);
  rudder = analogRead(rudderin);
  rudder = analogRead(rudderin);
  rudder = 1000 + rudder + ruddertrim;
  ch5 = 1000 + 1000 * digitalRead(ch5in);
  ch6 = 1000 + 1000 * digitalRead(ch6in);
  PPM();
  while ((micros() - frame) < 25000);
  
  keyread1 = PIND | B00000011;
  keyread2 = PINB | B11111100;
  keyread = keyread1 & B11111100;
  keyread = keyread | (keyread2 & B00000011);
  /* keyread1 PORT D'yi okuyor (digital 0 - 7)
   * keyread2 PORT B'yi okuyor (digital 8 - 13)
   * keyread2'deki iki LSBit daha sonra keyread'daki iki LSBit yerine aktarılıyor
   * Böylece...
   * keyread
   * -------------------------------------------------
   * I  7  I  6  I  5  I  4  I  3  I  2  I  1  I  0  I
   * I Rud I Rud I Elv I Elv I Ail I Ail I Thr I Thr I
   * I  R  I  L  I Up  I Dn  I  R  I  L  I Up  I Dn  I
   * -------------------------------------------------
   */
  keys();
  if (digitalRead(epabutton) == 0)
  {
    epaset();
  }
  else
  {
    epacount = 0;
  }
}

void PPM()
{
  cli();
  unsigned int x;
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  TCNT1 = 0;
  digitalWrite(PPMout, HIGH);
  x = aileron * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  TCNT1 = 0;
  digitalWrite(PPMout, HIGH);
  x = elevator * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  TCNT1 = 0;
  digitalWrite(PPMout, HIGH);
  x = throttle * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  TCNT1 = 0;
  digitalWrite(PPMout, HIGH);
  x = rudder * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  digitalWrite(PPMout, HIGH);
  x = ch5 * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  digitalWrite(PPMout, HIGH);
  x = ch6 * 2;
  while (TCNT1 < x);
  digitalWrite(PPMout, LOW);
  TCNT1 = 0;
  while(TCNT1 < 300);
  digitalWrite(PPMout, HIGH);
  sei();
}

void EEPROMread()
{
  /* Trim değeri - 200 ile + 200 arasında
   * Her bir trim değerine 250 ekleyerek her zaman artı değerde olmasını sağlıyoruz
   * ve EEPROM'a o şekilde kaydediyoruz
   * Aileron 0, 1 MSB, LSB
   * Elevator 2, 3 MSB, LSB
   * Throttle 4, 5 MSB, LSB
   * Rudder 6, 7 MSB, LSB
   * epa1 8, 9 MSB, LSB
   * epa2 10, 11 MSB, LSB
   */
  unsigned int x;
  x = 256 * EEPROM.read(0) + EEPROM.read(1);
  ailerontrim = x - 250;
  x = 256 * EEPROM.read(2) + EEPROM.read(3);
  elevatortrim = x - 250;
  x = 256 * EEPROM.read(4) + EEPROM.read(5);
  throttletrim = x - 250;
  x = 256 * EEPROM.read(6) + EEPROM.read(7);
  ruddertrim = x - 250;
  epa1 = 256 * EEPROM.read(:coolxf: + EEPROM.read(9);
  epa2 = 256 * EEPROM.read(10) + EEPROM.read(11);
}

void EEPROMwrite()
{
  /* Trim değeri - 200 ile + 200 arasında
   * Her bir trim değerine 250 ekleyerek her zaman artı değerde olmasını sağlıyoruz
   * ve EEPROM'a o şekilde kaydediyoruz
   * Aileron 0, 1 MSB, LSB
   * Elevator 2, 3 MSB, LSB
   * Throttle 4, 5 MSB, LSB
   * Rudder 6, 7 MSB, LSB
   */
  unsigned int x;
  byte m;
  byte l;
  x = ailerontrim + 250;
  m = x / 256;
  l = x % 256;
  EEPROM.write(0, m);
  EEPROM.write(1, l);
  x = elevatortrim + 250;
  m = x / 256;
  l = x % 256;
  EEPROM.write(2, m);
  EEPROM.write(3, l);
  x = throttletrim + 250;
  m = x / 256;
  l = x % 256;
  EEPROM.write(4, m);
  EEPROM.write(5, l);
  x = ruddertrim + 250;
  m = x / 256;
  l = x % 256;
  EEPROM.write(6, m);
  EEPROM.write(7, l);
}

void resettrims()
{
  resetcount++;
  if (resetcount > 100) // Throttle up ve elevator down 2 saniyeden fazla basılı tutulduysa...
  {
    ailerontrim = 0;
    elevatortrim = 0;
    throttletrim = 0;
    ruddertrim = 0;
    EEPROMwrite();
    resetcount = 0;
    EEPROM.write(8, 5);
    EEPROM.write(9, 100);
    EEPROM.write(10, 6);
    EEPROM.write(11, 100);
  }
}

void keys()
{
  if (keyread < 255)
  {
    /* 2 saniye boyunca Elevator down ve throttle up trimi
     * basılı tutulursa trimler resetleniyor
     * Bu süreyi resetcount değişkeni tutuyor ve resettrims()
     * altprogramında güncellenip 100'ü geçince
     * reset işlemi uygulanıyor
     */
    if (keyread == B11101101)
    {
      resettrims();
      return;
    }
    resetcount = 0;
    if ((keyread & B00000001) == 0) throttletrim--;
    if ((keyread & B00000010) == 0) throttletrim++;
    if ((keyread & B00000100) == 0) ailerontrim--;
    if ((keyread & B00001000) == 0) ailerontrim++;
    if ((keyread & B00010000) == 0) elevatortrim--;
    if ((keyread & B00100000) == 0) elevatortrim++;
    if ((keyread & B01000000) == 0) ruddertrim--;
    if ((keyread & B10000000) == 0) ruddertrim++;
    if (throttletrim < -200) throttletrim = -200;
    if (throttletrim > 200) throttletrim = 200;
    if (ailerontrim < -200) ailerontrim = -200;
    if (ailerontrim > 200) ailerontrim = 200;
    if (elevatortrim < -200) elevatortrim = -200;
    if (elevatortrim > 200) elevatortrim = 200;
    if (ruddertrim < -200) ruddertrim = -200;
    if (ruddertrim > 200) ruddertrim = 200;
    EEPROMwrite();
  }
}

void epaset()
{
  /* Eğer throttle butonu yakınına yerleştirilecek olan
   * butona üç saniyeden fazla dasılı tutulursa
   * throttle kolunun konumuna göre o anki throttle değeri epa olarak
   * set ediliyor. Bunu her yeni model için alt epa ve üst epa olarak
   * iki kez yapmak gerekiyor.
   * Değer set edildiğinde EEPROM'a da yazılıyor
   */
  int m;
  int l;
  epacount++;
  if (epacount > 150)
  {
    epacount = 0;
    throttle = analogRead(throttlein);
    throttle = analogRead(throttlein);
    throttle = 1000 + analogRead(throttlein);
    if (throttle > 1600) epa2 = throttle;
    if (throttle < 1400) epa1 = throttle;
    m = epa1 / 256;
    l = epa1 % 256;
    EEPROM.write(8, m);
    EEPROM.write(9, l);
    m = epa2 / 256;
    l = epa2 % 256;
    EEPROM.write(8, m);
    EEPROM.write(9, l);
  }
}
 
Gerçek lövye ile model uçurmak

Sümer abi harika bir proje, eminim harika da olacak. :bravo: :bravo: :bravo:

Merakla takipteyiz. :saygilar:
 
Gerçek lövye ile model uçurmak

Kodun buton işlevlerini de test ettim. Göründüğü kadarıyla tam planlandığı gibi çalışıyor. Yani trim yapabiliyorum, trimleri sıfırlayabiliyorum ve throttle endpointlerini ayarlayabiliyorum. Lövye tamam. Throttle bagajda. Hafta sonu onunla ilgilenirim. En çok zaman alacak olan aşama tümünü bir sehpa gibi bir yere monte etmek ve rudder pedallarını hazırlamak. Fena gitmiyoruz... :)
 
Gerçek lövye ile model uçurmak

Sümer Yamaner' Alıntı:
Kodun buton işlevlerini de test ettim. Göründüğü kadarıyla tam planlandığı gibi çalışıyor. Yani trim yapabiliyorum, trimleri sıfırlayabiliyorum ve throttle endpointlerini ayarlayabiliyorum. Lövye tamam. Throttle bagajda. Hafta sonu onunla ilgilenirim. En çok zaman alacak olan aşama tümünü bir sehpa gibi bir yere monte etmek ve rudder pedallarını hazırlamak. Fena gitmiyoruz... :)


Hadi hayırlısı abi. merakla ve kıvançla bekliyorum :)
 
Gerçek lövye ile model uçurmak

Bugün throttle da idare edecek hale getirildi. Rudder kanalını yazılımdan ortaladım ve Real Flight ile P51 uçurdum. Rudder kanalı olmayınca kalibrasyon yapamadığım için ve sistemde trimler henüz aktif olmadığı için epey bir zorlansam da uçağı indirebildim. Sanıyorum lövye boyunu biraz kısaltmak gerekecek. Bu hali ile epeyce bir sağır kalıyor. Yani aşırı expo verilmiş gibi...
Bu iş güzel olacak sanki... :)

[attachimg=1]
 

Ekli dosyalar

  • pic0001.jpg
    pic0001.jpg
    72.2 KB · Görülme: 163
Gerçek lövye ile model uçurmak

Sümer Yamaner' Alıntı:
Bugün throttle da idare edecek hale getirildi. Rudder kanalını yazılımdan ortaladım ve Real Flight ile P51 uçurdum. Rudder kanalı olmayınca kalibrasyon yapamadığım için ve sistemde trimler henüz aktif olmadığı için epey bir zorlansam da uçağı indirebildim. Sanıyorum lövye boyunu biraz kısaltmak gerekecek. Bu hali ile epeyce bir sağır kalıyor. Yani aşırı expo verilmiş gibi...
Bu iş güzel olacak sanki... :)
Sanki mi, bence sahane oluyor Abi :bravo: uzun cubuk= fazla expo aritmatigi de ilginc bir deneyim olmus :D
 
Gerçek lövye ile model uçurmak

Elinize sağlık, insanların hayallerini gerçekleştirebilmeleri kadar güzel başka bir şey yoktur.

Sizi tebrik ediyor, çalışmalarınızı hayranlıkla izliyorum.
 
Gerçek lövye ile model uçurmak

Sümer bey, bir gün böyle bir sistemle yan yana oturup, FPV gözlüklerini de takıp, bir P51 ile it dalaşı (dog fight) yapmayı çok isterdim doğrusu. Eliniz sağlık gerçekten!
 
Gerçek lövye ile model uçurmak

Omer Erkan' Alıntı:
Sümer bey, bir gün böyle bir sistemle yan yana oturup, FPV gözlüklerini de takıp, bir P51 ile it dalaşı (dog fight) yapmayı çok isterdim doğrusu. Eliniz sağlık gerçekten!
Dur Ömer abi hemen ileriye görtürme bu kadar. Aşama aşama gitmek lazım, Sümer abi bu işe başladı bir kere elindeki işleri bir bitirsin bu iş zaten simulatör kabinine kadar gider. :laugh: Şimdi it dalaşını statik lövyeyle mi yapacaksın, olmaz ki. :lollol:

Nedir yani altı üstü bu lövyeyle senkron hareket eden basit bir iki tane pistoncukla çözülür bu iş dimi Sümer abi. :lol:
 
Gerçek lövye ile model uçurmak

Omer Erkan' Alıntı:
Sümer bey, bir gün böyle bir sistemle yan yana oturup, FPV gözlüklerini de takıp, bir P51 ile it dalaşı (dog fight) yapmayı çok isterdim doğrusu. Eliniz sağlık gerçekten!
Bir helici olarak ben bile böyle bir uçak uçurmak isterim doğrusu :laugh: ;D