Sim kumandası yapalım ...

Hayır tepemi attıracaksın, oturup yarım saatte kütüphanesiz çalışır kod yazıvereceğim... [emoji38]

SM-N910C cihazımdan Tapatalk kullanılarak gönderildi
 
Sim kumandası yapalım ...

Zafer SAHIN' Alıntı:
... Ama yine de PhoeniX RC'de Y kanalını çalıştırmayı başardım :D :D ... Neyse ... Çalışmalara devam ....
Bu proje de inşallah güzel ve başarılı bir şekilde sonuçlanacak inşallah :thumbup: :bravo: :RCKolik:
 
Sim kumandası yapalım ...

Sümer Yamaner' Alıntı:
Hayır tepemi attıracaksın, oturup yarım saatte kütüphanesiz çalışır kod yazıvereceğim... [emoji38]
Ben de senin kodunun tırtıklayıp, kütüphaneye çevirir sonra kendi kodumda kullanırım Sümer abi :D :D :D ... Tabi eğer izin verirsen :) .
 
Zafer SAHIN' Alıntı:
Ben de senin kodunun tırtıklayıp, kütüphaneye çevirir sonra kendi kodumda kullanırım Sümer abi :D :D :D ... Tabi eğer izin verirsen :) .

Valla pes. Böyle bir kütüphanecinin önünde söylenecek laf yok! :D :p :D Benim yazdığım ve yazacağım tüm kodların doğal telif hakkı sana ait unutma!
 
Sim kumandası yapalım ...

Bak bu programı sen beğenmezsin ama olsun. Toplam 1432 byte yer tutuyor ve 33 byte RAM kullanıyor.

Kod:
//Sekiz kanallı PPM sinyali üreten kumanda

unsigned int j;

const int ppmoutpin = 5; //D05

unsigned long frame;

unsigned int channelpwm[8];



void setup()
{
  pinMode(ppmoutpin, OUTPUT);
  digitalWrite(ppmoutpin, HIGH);
  for (int n = 2; n < 5; n++)
  {
    pinMode(n, INPUT_PULLUP);
  }
}

void loop()
{
  frame = micros(); //20 milisaniyelik çerçeveyi belirlemek için döngüye başlarken zamanı frame değişkenine yazıyoruz
//Beş analog kanalı okuyoruz. Okuma hassasiyetini artırmak için her kanalı üç kez peş peşe okuyoruz
//Okuduğumuz değerleri potansiyometrelerin orta konumu 1500 mikrosaniyeye denk gelecek şekilde düzenliyoruz
//Değerleri channelpwm array değişkenine yazıyoruz
  for (int n = 0; n < 5; n++)
  {
    j = analogRead(n);
    j = analogRead(n);
    j = analogRead(n);
    channelpwm[n] = 988 + j;
  }

//Üç digital kanalı peş peşe okuyoruz. Arrayin son üç hanesine de
//bu değerleri 1000 ya da 2000 olacak şekilde yazıyoruz
  for (int n = 2; n < 5; n++)
  {
    j = digitalRead(n);
    channelpwm[n + 3] = 1000 + 1000 * j;
  }

//Artık elimizde sekiz adet PWM değeri var. İlk darbe öncesi 300 mikrosaniyelik LOW sinyali veriyoruz.  
  digitalWrite(ppmoutpin, LOW);
  delayMicroseconds(300);
  digitalWrite(ppmoutpin, HIGH);

//Artık ilk kanaldan başlayarak darbelerimizi üretebiliriz
  for (int n = 0; n < 8; n++)
  {
    delayMicroseconds(channelpwm[n]);
    digitalWrite(ppmoutpin, LOW);
    delayMicroseconds(300);
    digitalWrite(ppmoutpin, HIGH);
  }

//Döngünün 20 milisaniye civarında olması için burada beklemede kalıyoruz. Bu esnada çıkış HIGH
//Otomatik olarak uzun senkronizasyon pulse oluşmuş oluyor.
  while((micros() - frame) < 20000);
  {
  }
}
 
Sim kumandası yapalım ...

Bunu da çok eskiden hazırlamışım. Digital trimleri bile var. :D :p

Kod:
/*
RC Sim kumandası
*/

const int ch1 = 0; //Aileron A0
const int ch2 = 1; //Elevator A1
const int ch3 = 2; //Throttle A2
const int ch4 = 3; //Rudder A3
const int ch5 = 4; //Gear A4
const int ch6 = 5; //Flap A5
const int ppmout = 10; //PPM çıkışı
unsigned long frame;

// Trimler
const int tr1minus = 0;
const int tr1plus = 1;
const int tr2minus = 2;
const int tr2plus = 3;
const int tr3minus = 4;
const int tr3plus = 5;
const int tr4minus = 6;
const int tr4plus = 7;

unsigned int pwm[6];
int trimm[8];
int trimvalue[6];
byte trimpress = B11111111;


void setup()
{
  pinMode(ppmout, OUTPUT);
  for(int n = 0; n < 8; n++)
  {
    pinMode(n, INPUT_PULLUP);
  }
  trimvalue[4] = 0;
  trimvalue[5] = 0;
}

void loop()
{
  frame = millis();
  digitalWrite(ppmout, HIGH);
  for (int n = 0; n < 6; n++)
  {
    pwm[n] = 1000 + analogRead(n);
  }
  while ((millis() - frame) < 6)
  {
    trimpress = PIND;
    trimm[0] = trimpress & B00000001;
    trimm[1] = trimpress & B00000010;
    trimm[2] = trimpress & B00000100;
    trimm[3] = trimpress & B00001000;
    trimm[4] = trimpress & B00010000;
    trimm[5] = trimpress & B00100000;
    trimm[6] = trimpress & B01000000;
    trimm[7] = trimpress & B10000000;
    for(int n = 0; n < 8; n++)
    {
      if(trimm[n] > 0)
      {
        trimm[n] = 0; //Butona basılmamış ise 0
      }
      else
      {
        trimm[n] = 1; //Butona basılmış ise 1
      }
    }
    for(int n = 0; n < 8; n = n + 2)
    {
      if(trimm[n] == 1)
      {
        trimvalue[(n / 2)]--;
        if(trimvalue[(n / 2)] < (-255)) trimvalue[(n / 2)] = -255;
      }
      if(trimm[n + 1] == 1)
      {
        trimvalue[(n / 2)]++;
        if(trimvalue[(n / 2)] > 255) trimvalue[(n / 2)] = 255;
      }
      
    }
  }
  digitalWrite(ppmout, LOW);
  for (int n = 0; n < 6; n++)
  {
    delayMicroseconds(300);
    digitalWrite(ppmout, HIGH);
    delayMicroseconds(pwm[n] + trimvalue[n]);
    digitalWrite(ppmout, LOW);
  }
  delayMicroseconds(300);
  digitalWrite(ppmout, HIGH);
  while((millis() - frame) < 20)
  {
  }
}
 
Sim kumandası yapalım ...

Saleae mantıksal analiz cihazı ile hem Taranis'in PPM sinyalini hem de ArduinoRClib ile oluşturulmuş PPM sinyalini inceledim. Taranis'de çercçeve süresi varsayılan olarak 22.5ms ve darbe süresi de 300us. ArduinoRClib ile oluşturulan PPM sinyalinde ise darbe süresi ayarlanabiliyor olmasına rağmen çerçeve süresi ayarlanamıyor... Bu da kullanılan kanal sayısına ve PPM içerisinde gönderilen servo pozisyonuna bağlı olarak çerçeve süresinin değişmesine yol açıyor ve önceki mesajlarımda da belirttiğim üzere sonuç hüsran oluyor... Bir kaç tane daha kütüphane inceledim ama istediğim sonucu hızlı bir şekilde verebilecek bir kütüphane bulamadım. Tüm kodu kütüphanesiz olarak yazmak gerekecek gibi gözüküyor ...
 
Sim kumandası yapalım ...

Zafer abi sıkı takipteyim her ne kadar su anki sistemi kullansamda bir kumanda yapmayi isterim acikcasi, cok faydali olacak diye düşünüyorum.
 
Mustafa Çoban.' Alıntı:
Zafer abi sıkı takipteyim her ne kadar su anki sistemi kullansamda bir kumanda yapmayi isterim acikcasi, cok faydali olacak diye düşünüyorum.
Yapı elektriksel olarak çok basit ...
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol

Arduino için düzgün bir yazılım yapıldıktan sonra, 4 dolarlık arduino kartı + simulator dongle kullanarak ile eski kumandaların hepsi tak çalıştır SIM kumandasına dönüşebilecek ...
 
Zafer SAHIN' Alıntı:
... Bir kaç tane daha kütüphane inceledim ama istediğim sonucu hızlı bir şekilde verebilecek bir kütüphane bulamadım. Tüm kodu kütüphanesiz olarak yazmak gerekecek gibi gözüküyor ...
Sumer abi neredesin koş :laugh: ;D
 
İlk prototip hazır ... Kumanda konusunda sponsor olan Ömer abi'ye tekrar teşekkürler :thumbup: .
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Kumandanın tüm anahtar ve pot kablolarını söküp, Arduino'ya kolay bir şekilde takılabilmesi için 2.54mm dişi dupont konnektörleri ile değiştirdim.

Bu da, uygun kütüphane bulamadığım için kütüphane kullanmadan yazılmış kod ... Amaç bu projenin ilk fazını kütüphane kullanarak hızlı bir şekilde bitirmekti ama kaderimi kabullendim :D ...
Kod:
#define CHANNELS 8        //set the number of chanels
#define CENTER_VAL 1500   //set the default servo value
#define PPM_FRLEN 22500   //set the PPM frame length in microseconds (1ms = 1000µs)
#define PPM_PULSELEN 300  //set the pulse length
#define ONSTATE 0         //set polarity of the pulses: 1 is positive, 0 is negative
#define SIGPIN 9          //set PPM signal output pin on the Arduino

int ppm_val[CHANNELS];
int input_pins[CHANNELS] = {14,15,16,17,2,3,4,5};

void setup(){  
    for (int i = 0;  i < CHANNELS; ++i) {
        if (i < 4) {
            pinMode(input_pins[i], INPUT);
            ppm_val[i] = map(analogRead(input_pins[i]), 0, 1024, 1000, 2000);
        } else {
            pinMode(input_pins[i], INPUT_PULLUP);
            ppm_val[i] = map(digitalRead(input_pins[i]), 0, 1, 1000, 2000);
        }
        if(i>5) ppm_val[i]=CENTER_VAL;
    }
    pinMode(SIGPIN, OUTPUT);
    digitalWrite(SIGPIN, !ONSTATE);
    
    cli();
    TCCR1A = 0; // set entire TCCR1 register to 0
    TCCR1B = 0;
    
    OCR1A = 100;             // compare match register
    TCCR1B |= (1 << WGM12);  // turn on CTC mode
    TCCR1B |= (1 << CS11);   // 8 prescaler: 0,5 microseconds at 16mhz
    TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
    sei();
}

void loop(){
    for (int i = 0;  i < CHANNELS; ++i) {
        if (i < 4) {
            ppm_val[i] = map(analogRead(input_pins[i]), 0, 1024, 1000, 2000);
        } else {
            ppm_val[i] = map(digitalRead(input_pins[i]), 0, 1, 1000, 2000);
        }
        if(i>5) ppm_val[i]=CENTER_VAL;
    }
}

ISR(TIMER1_COMPA_vect){
    static boolean bState = true;
    TCNT1 = 0;
    if(bState) {
        digitalWrite(SIGPIN, ONSTATE);
        OCR1A = PPM_PULSELEN * 2;
        bState = false;
    } else {
        static byte bCurChan;
        static unsigned int iPPMRest;

        digitalWrite(SIGPIN, !ONSTATE);
        bState = true;

        if(bCurChan >= CHANNELS){
            bCurChan = 0;
            iPPMRest = iPPMRest + PPM_PULSELEN;// 
            OCR1A = (PPM_FRLEN - iPPMRest) * 2;
            iPPMRest = 0;
        } else {
            OCR1A = (ppm_val[bCurChan] - PPM_PULSELEN) * 2;
            iPPMRest = iPPMRest + ppm_val[bCurChan];
            bCurChan++;
        }     
    }
}

6 kanalı rahatlıkla kullanabiliyorum ve elimde 4 tane anahtar olmadığı için 8 kanalı deneyemedim. Ama 8 kanal çalışmaması için teorikte ve pratikte hiç bir neden gözükmüyor. Konunun başında da belirttiğim üzere, Arduino'ya sadece PPM sinyalini ürettiriyorum, PPM sinyalini alıp USB'ye çevirme işlemini Banggood'dan aldığım 10 dolarlık USB Simulator dongle hallediyor ...

Kumanda gücünü tamamen bilgisayardan alıyor ama 1 tane Arduino ve 1 tane de USB dongle olmak üzere 2 USB portu gerekiyor.
 
Sim kumandası yapalım ...

2. Faz için malzemeler :

Özelleştirilmiş bir bluetooth beacon... Üzerinde 7DOF sensörler bulunuyor, MPU6050(gyr+acc) ve BMP180 var. Sadece MPU6050'den okunacak açısal ve doğrusal ivmelenme verileri gerekiyor. Bunlar bir şekilde yorumlanıp Aileron, Elevator, Throttle ve Rudder sinyallerine dönüştürülecek... Yani elimizi sağa sola, öne arkaya, yukarı aşağı hareket ettirerek sim kullanabiliyor hale geleceğiz :D.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Arduino + HC05(master slave sıkıntısına göre HC06 da olabilir ...) . Beacon'un gönderdiği verileri okuyup PPM'e çevirme işlemi burada yapılacak..

USB dongle... Tabii ki PPM'den USB'ye çevirme işlemi de burada yapılacak ...
 
Zafer SAHIN' Alıntı:
İlk prototip hazır ... Kumanda konusunda sponsor olan Ömer abi'ye tekrar teşekkürler [emoji106] .
......
Kumanda gücünü tamamen bilgisayardan alıyor ama 1 tane Arduino ve 1 tane de USB dongle olmak üzere 2 USB portu gerekiyor.
Zafer abi Teşekkürler gerçekten güzel işler yapıyorsun nacizane sana akıl vermek gibi olmasın ama bir fikir sunmak isterim, dongle usb girişine eski bir telefon şarj cihazı kablosu lehimlenerek tek usb ye dusurulebilir, bence uyumlu da olur yanlız dongle orjinalligi gider oda 10 dolar önemli değil. vallahi bravo tebrik ediyorum bu iyi oldu herkes elindeki kumandalar da son sistem simülasyon kumandası yapabilecek. Birde v9 küsür kumanda lari pil ile çalıştığı için öyle kasada olur hiç değilse bir ise yarar.

SM-G900F cihazımdan gönderildi
 
Sim kumandası yapalım ...

Zafer abi eline sağlık, ilk kısım süper olmuş, ikinci kısım ise fantastik olacak. Sen bunu yapıp çalıştırırsan -ki çalıştırırsın- ben de bi quad toplar buna bi modül bağlayıp elimle uçururum :D
 
Sim kumandası yapalım ...

Zafer SAHIN' Alıntı:
Bu da, uygun kütüphane bulamadığım için kütüphane kullanmadan yazılmış kod ...

Vahhhh yazıııkkk... Kütüphane yok muydu yahuu?!?! :)

Ellerine sağlık. :D Demek ki kendin yazınca da güzel oluyormuş.