[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Birkaç test yaptım. Aşağıdaki kod çalışıyor ama her alıcı ile değil. Anladığım kadarıyla alıcıların çıkışlarında voltaj farkları var. Örneğin Assan alıcılar ile bu kodu kullandığımda PPM sinyali kimi zaman dört kimi zaman sekiz kanallı çıkarken Hitec ve klon Hitec alıcılarda en ufak bir sorun olmuyor.

Kod:
// 8 kanala kadar PWM sinyalini PPM sinyaline dönüştürücü

#define cikis 12
#define pulselen 300

int channels = 8;
unsigned long tmr;
boolean flag;

void setup()
{
  pinMode(cikis, OUTPUT);
  digitalWrite(cikis, HIGH);

}


void loop()
{
  digitalWrite(cikis, HIGH);
  while (digitalRead(0) == LOW);
  pulse();
  flag = false;
  for (int n = 0; n < channels; n++)
  {
    tmr = micros();
    while (digitalRead(n) == HIGH);
    if ((micros() - tmr) < 100)
    {
      flag = true;
      n = channels + 1;
    }
    delayMicroseconds(pulselen);
    if (!flag) pulse();
  }
}

void pulse()
{
  digitalWrite(cikis, LOW);
  delayMicroseconds(pulselen);
  digitalWrite(cikis, HIGH);
}

Kodun bana göre en önemli tarafı (ki bunu da osiloskopla test ettim) sekiz kanala kadar kaç kanal takarsak o kadar kanal çıkışı veriyor. Yani kanal sayısını bir bakıma otomatik algılıyor. Yeter ki D0 ucundan başlayarak kanallar sırası ile bağlanmış olsun. Yani ilk dört kanalı bağladığımızda kodda değişikliğe gerek kalmadan sistem dört kanallı olarak çalışıyor.
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Açıkçası bende biraz araştırdım ve malumunuz ppm kütüphane si buldum 8 kanal kullanıyorum, şu an iyi, eve geçtiğim de bunuda deneyeceğim. alicim spektrum ar8000+sat voltaj olarak usb den besliyorum olmazsa 2s pille bir deneyeyim belki çıkış voltajı nda farklılık olabilir usb çok ince bir kablo tam amper geçirmiyor olabilir tabi amper in birseyi değişirip degistirmeyecegini bilmiyorum. mantık açısında servo olsa amper lazım ama iş sinyal olunca amper etkiler mi acaba? Test ederim Teşekkürler emeğin için.

SM-G900F cihazımdan gönderildi
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Bu kod bende çalışmadı artık Ar8000 in çıkışının sizdeki alıcılardan farklı olduğunu düşünüyorum (bunu test etmek için programa kod eklemek aklıma geldi işte d0 dan gelen sinyale göre d13 e bağlı ledi yak gibi bir kod çıkarabilirsem bendeki sorunu test edebilirim sanırım)
birde sorun çıkıştada olabilir şayet d12 den çıkış alıyorum ama daha önceki kodların birinde çalışmasa bile dongle ile RF titremeler şekinde dead bant sinyalleri gibi titriyordu ama bu son kodlarda hiç kıpırtı yok buna rağmen multimetre ölçtüğüm Mono jak tan DCA 2000u da darbe şeklinde sinyal geliyor. iyice çorba oldu galiba küpüthane ile herşey tamammı tamam ama sizin kütüphane karşıtı tavrınıza bende destek olmak adına yazıyorum değerli vaktinizi alıyorsam hemen kütüphaneye geçip bu konuyu kapatabiliriz sizi sıkmak istemem. :saygilar:
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Mustafa'cığım sıkılmam söz konusu değil. Sorun şurada ki her alıcı farklı zamanlamayla sinyal üretebiliyor. Örneğin elimdeki Assan alıcılar için kısa bir kod yazdım ve servo çıkışları arasında 30 - 90 mikrosaniyelik gecikmeler olduğunu gördüm. Ama servo çıkışları sıra ile oluyor. Bir alıcı her servoya eşzamanlı sinyal gönderiyor olabilir ki bu işleri karma karışık hale getirebilir. Bunu anlamanın tek yolu alıcı çıkışını çift kanallı osiloskopla incelemek.

Sonuçta benim üzerinde karar kıldığım altı kanallı sorunsuz çalışan kod şu:

Kod:
/*
   Herhangi bir alıcıdan çıkan servo sinyallerini
   birleştirip senkron darbeli bir PPM pulse train
   oluşturan program

   Kanal girişleri sıralı olarak D02 - D07'ye bağlanacak
   Çıkış D12'den ama istenirse ilk satırdaki #define
   komutu ile değiştirilebilir
*/

#define ppmout 12
#define maxchan 6

int ppm[maxchan + 1];
int current_channel = 0;
int tmp;
unsigned long tmr2H;


void setup()
{
  pinMode(ppmout, OUTPUT);
  digitalWrite(ppmout, HIGH);
  for (int n = 2; n < (maxchan + 2); n++)
  {
    pinMode(n, INPUT_PULLUP);
    ppm[n - 2] = 1500;
  }
  ppm[maxchan] = 6000;
  TCCR1A = 0;
  TCCR1B = 10; // CTC Mode ve Prescaler 8
  TIMSK1 = 0;
  TCNT1 = 0;
  OCR1A = 12000; // İlk sync pulse 6 mS
  TIMSK1 = 2; // Start interrupts for PPM generation

  TCCR2A = 0;
  TCCR2B = 2; // Prescaler 8
  TIMSK2 = 0; // Timer2 interruptları beklemede
}

void loop()
{
  for (int n = 0; n < maxchan; n = n + 2)
  {
    tmp = pulse(n + 2);
    if (tmp > 800 && tmp < 2200) ppm[n] = tmp;
  }
  for (int n = 1; n < maxchan; n = n + 2)
  {
    tmp = pulse(n + 2);
    if (tmp > 800 && tmp < 2200) ppm[n] = tmp;
  }
}

ISR(TIMER1_COMPA_vect)
{
  if (digitalRead(ppmout) == HIGH)
  {
    digitalWrite(ppmout, LOW);
    OCR1A = 600;
  }
  else
  {
    digitalWrite(ppmout, HIGH);
    if (current_channel < maxchan)
    {
      OCR1A = 2 * ppm[current_channel] - 600;
      current_channel++;
    }
    else
    {
      current_channel = 0;
      OCR1A = 2 * ppm[maxchan];
    }
  }
}


ISR(TIMER2_OVF_vect)
{
  tmr2H++;
}


int pulse(int x)
{
  byte pin;
  byte cmp;
  unsigned long t;
  cmp |= 1 << x;
  pin = PIND & cmp;
  TCNT2 = 0;
  tmr2H = 0;
  TIMSK2 = 1; // Start Timer2 Overflow Interrupt
  while (!pin)
  {
    pin = PIND & cmp;
    if(tmr2H > 200) return 0;
  }
  TCNT2 = 0;
  tmr2H = 0;
  while (pin)
  {
    pin = PIND & cmp;
    if(tmr2H > 200) return 0;
  }
  TIMSK2 = 0; // Stop Timer2 Overflow Interrupt
  t = (256 * tmr2H + TCNT2) / 2;
  return t;
}