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

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

Ben de bu akşam bunu yaptım. Alıcı Assan 2.4 7 kanal. Kutusundan çıkardım ve 90 derece konnektörleri söküp düz konnektör lehimledim. Sonra Atmega328 plaketine soketle taktım.

[attachimg=1]

[attachimg=2]

[attachimg=3]

[attachimg=4]

[attachimg=5]
 

Ekli dosyalar

  • pic0001.jpg
    pic0001.jpg
    61.1 KB · Görülme: 127
  • pic0002.jpg
    pic0002.jpg
    69.5 KB · Görülme: 126
  • pic0003.jpg
    pic0003.jpg
    63.8 KB · Görülme: 126
  • pic0004.jpg
    pic0004.jpg
    50.4 KB · Görülme: 126
  • Untitled.jpg
    Untitled.jpg
    79.5 KB · Görülme: 127
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Ellerine sağlık abi :)
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Sümer abi çok güzel bir çalışma olmuş ellerine sağlık.

Benim ATmega328P Nano V3 Controller Board Compatible Arduino Improved Version 2 güne elimde olacak inşallah senin yaptığın ilk kodu kullanmayı pilanlıyorum daha basit geldi bana
ama 6 kanal değilde ben 8 kanal kullanmak istiyorum rescue butonu için aslında 7 yeter ama birde fazla olsun yapmışken dedim
bu kodu

// Tek tek servo çıkışlarını okuyup PPM sinyali üreten program

unsigned int cpin[6] = {3, 4, 5, 6, 7, 8};
const int ppmoutpin = 9;

void setup()
{
pinMode(ppmoutpin, OUTPUT);
digitalWrite(ppmoutpin, HIGH);
}

void loop()
{
digitalWrite(ppmoutpin, HIGH);
for (int n = 0; n < 6; n++)
{
while (digitalRead(cpin[n]) == 0)
{
}
digitalWrite(ppmoutpin, LOW);
delayMicroseconds(300);
digitalWrite(ppmoutpin, HIGH);
while (digitalRead(cpin[n]) == 1)
{
}
delayMicroseconds(300);
digitalWrite(ppmoutpin, LOW);
}
delayMicroseconds(300);
digitalWrite(ppmoutpin, HIGH);
}


8 kanal yapmak için şu şekilde değiştirsem olurmu?

unsigned int cpin[8] = {2, 3, 4, 5, 6, 7, 8, 9};
const int ppmoutpin = 10;

void setup()
{
pinMode(ppmoutpin, OUTPUT);
digitalWrite(ppmoutpin, HIGH);
}

void loop()
{
digitalWrite(ppmoutpin, HIGH);
for (int n = 0; n < 8; n++)
{
while (digitalRead(cpin[n]) == 0)
{
}
digitalWrite(ppmoutpin, LOW);
delayMicroseconds(300);
digitalWrite(ppmoutpin, HIGH);
while (digitalRead(cpin[n]) == 1)
{
}
delayMicroseconds(300);
digitalWrite(ppmoutpin, LOW);
}
delayMicroseconds(300);
digitalWrite(ppmoutpin, HIGH);
}
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Mustafa, eğer üzerinde oynamayacaksan son kodu kullanmanı öneririm. Çok güzel çalışıyor. Bu ilk kodu artık hatırlayamıyorum. Ama denemekten zarar gelmez. O kodu sekiz kanala çıkarmak için yaptığın değişiklik de doğru.
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Sümer Yamaner' Alıntı:
Arkadaşlar, kodu geliştirdim. Simülatörde denedim. Gayet keyifli uçuluyor. İsteyen deneyebilir. Sahada trainer olarak da deneyeceğim bu hafta sonu.

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;
}
Sümer abi bu kodu ısrarla kullanmamı önerdin ama ben giriş kanallarını 7 kanala çıkarmam için ne yapmam gerekli koddan anladığım kadarıyla bütün girişlerı kontrol et hangisinden sinyal geliyorsa al şeklinde, umarım doğru anlamışımdır ama #define maxchan bölümünde 6 kanal ile sınırlandırılmış durumda bu durumda maxchan nı 7 yapsam ve 2 den 8 e kadar olan pinlere giriş yapsam 7 cannel alabileceğim ama o aşağıdaki timerler, darbe ayarlarından felan hiç bişey anlamadım.
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Gittikçe seri üretime hazır hale geliniyor gibi hissettim abi :D ellerine saglık, gayet sık olmuş. Şimdi buna guzel bir kapta uydurulur ve paketlenirse harika olacak :halay:


Sent from my iPhone using Tapatalk
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Mustafa Çoban.' Alıntı:
Sümer abi bu kodu ısrarla kullanmamı önerdin ama ben giriş kanallarını 7 kanala çıkarmam için ne yapmam gerekli koddan anladığım kadarıyla bütün girişlerı kontrol et hangisinden sinyal geliyorsa al şeklinde, umarım doğru anlamışımdır ama #define maxchan bölümünde 6 kanal ile sınırlandırılmış durumda bu durumda maxchan nı 7 yapsam ve 2 den 8 e kadar olan pinlere giriş yapsam 7 cannel alabileceğim ama o aşağıdaki timerler, darbe ayarlarından felan hiç bişey anlamadım.

Mustafa haklısın. Ben hızlı okuyabilmek adına portlara doğrudan müdahale ediyorum. Bitleri kaydırıyorum falan. Port D'nin0 ve 1 bitlerini kullanmadım (seri iletişim için gerekli, debug sırasında işe yarıyor). Aslında programı 8 kanal olarak yazıp buraya koyabilirim. Bana biraz zaman ver.

Mehmet Kucuksari' Alıntı:
Gittikçe seri üretime hazır hale geliniyor gibi hissettim abi :D ellerine saglık, gayet sık olmuş. Şimdi buna guzel bir kapta uydurulur ve paketlenirse harika olacak :halay:


Sent from my iPhone using Tapatalk

İleri görüşlü Mehmet Kardeşim benim...

[attachimg=1]

[attachimg=2]

[attachimg=3]

Eğer sim kumandası olacaksa enerjiyi USB'den alıyor (Emre'ciğimin mükemmel anlatımı ve fotoğrafları ile becerdim). Trainer olarak kullanılacaksa diğer uçtaki jack kullanılıyor ve kutunun sırtına yapıştırdığım 2S LiFe pilden güç alıyor.
 

Ekli dosyalar

  • pic0002.jpg
    pic0002.jpg
    38.3 KB · Görülme: 102
  • pic0003.jpg
    pic0003.jpg
    61.1 KB · Görülme: 102
  • pic0004.jpg
    pic0004.jpg
    61.8 KB · Görülme: 101
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Mustafa, birinci kanalı D00'a bağlayacak şekilde D00 - D07 arasını kullanan sekiz kanallı kod aşağıda...

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 D00 - D07'ye bağlanacak
   Çıkış D12'den ama istenirse ilk satırdaki #define
   komutu ile değiştirilebilir
*/

#define ppmout 12
#define maxchan 8

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


void setup()
{
  pinMode(ppmout, OUTPUT);
  digitalWrite(ppmout, HIGH);
  for (int n = 0; n < maxchan; n++)
  {
    pinMode(n, INPUT_PULLUP);
    ppm[n] = 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);
    if (tmp > 800 && tmp < 2200) ppm[n] = tmp;
  }
  for (int n = 1; n < maxchan; n = n + 2)
  {
    tmp = pulse(n);
    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;
}
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Biraz açıklama yapayım:

Kanal değerlerini bir array değişkeninde tutuyoruz. Timer 1 ve interruptlar kullanılarak tamamen şeffaf (yani arka planda) sürekli PPM çıkışı üretilmesini sağlıyoruz. ISR(TIMER1_COMPA_vect) işlevi bunu yapıyor. İstenirse daha ayrıntısına gireriz.
Ana program ise sıra ile her kanaldaki PWM sinyalinin süresini okuyor. Bunu da Timer2'yi kullanarak yapıyor ve 0.5 mikrosaniye hassasiyette yapıyor. Gerçi biz doğal olarak 1 mikrosaniye hassasiyete dönüştürüyoruz.
Şöyle bir ayrıntı var:
Alıcıdan çıkan servo sinyalleri birbirini aralıksız izliyor. O nedenle bir kanalı okuyunca onu değişkene yazıp ikinci kanala geçene kadar ikinci kanalın sinyali başlamış oluyor. Bu da hatalı değer okunmasına yol açabiliyor. Bu riski önlemek için şöyle bir yol izledim. Önce birinci kanal okunuyor. Sonra üçüncü kanalın darbesi beklenip o okunuyor. Sonra beşinci kanal... Daha sonra başa dönüp 2, 4, 6 okunuyor. Kısaca her kanal iki frame'de bir okunmuş oluyor. Bu da hissedilebilir mi hissedilemez mi bilemediğim bir gecikme oluşturuyor. Simülatörde hiç hissetmedim. Trainer bağlantısı ile hover ya da sıkı 3D uçulmayacağı düşünülürse bence pek bir sorun oluşturmayacaktır. Pazar günü sahada göreceğiz...
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Sümer Yamaner' Alıntı:
Mustafa, birinci kanalı D01'e bağlayacak şekilde D01 - D07 arasını kullanan sekiz kanallı kod aşağıda...

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 D00 - D07'ye bağlanacak
   Çıkış D12'den ama istenirse ilk satırdaki #define
   komutu ile değiştirilebilir
*/

#define ppmout 12
#define maxchan 8

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


void setup()
{
  pinMode(ppmout, OUTPUT);
  digitalWrite(ppmout, HIGH);
  for (int n = 0; n < maxchan; n++)
  {
    pinMode(n, INPUT_PULLUP);
    ppm[n] = 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);
    if (tmp > 800 && tmp < 2200) ppm[n] = tmp;
  }
  for (int n = 1; n < maxchan; n = n + 2)
  {
    tmp = pulse(n);
    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;
}
Abi anlatımlar ve 8 kanal kod için teşekkürler, umarım yaparımda buradan paylaşırım sizinle.
şimdi geldi anlamaya, açıklama ile birlikte tekrar kodu okuyayım. :)
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Gecenin son numarası da şu:
Ben bu sistemi eski Futaba verici ve üzerindeki Assan 2.4 modül ile kullanmak üzere hazırladım. Kullandığım alıcı da Assan doğal olarak. Şimdi vericideki modüle bir adaptör kablo yaptım. Onu lövye setine takıyorum ve lövye seti de artık kablosuz trainer olarak çalışıyor. Çok keyifli... :D
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Lovye seti de kablosuz olmuş, valla harika fikir ve uygulama :halay:

Nihai urunu cok beğendim, ellerine saglık abi :D


Sent from my iPhone using Tapatalk
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Wireless trainer modülünü kumanda tepsisine monte ettim. Kompakt bir yapı oluştu.

[attachimg=1]
 

Ekli dosyalar

  • pic0001.jpg
    pic0001.jpg
    68.4 KB · Görülme: 51
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Sümer Yamaner' Alıntı:
Wireless trainer modülünü kumanda tepsisine monte ettim. Kompakt bir yapı oluştu.
Soketler bile duzenli :bravo: :thumbup:
 
[Urun]: Wireless Sim Dongle (Sümer Abi sağolsun... )

Sümer Yamaner' Alıntı:
Wireless trainer modülünü kumanda tepsisine monte ettim. Kompakt bir yapı oluştu.

[attachimg=1]

Tepsi ile çok derli toplu olmuş Sümer bey! Ben kumandaya, alıcı ve pilin altına sünger koyup lastikle tutturmuştum.