Tuşlu Rotary Encoder Modül Yapımı

daha 1 ay var abi en erken.
Dijital potları devreye alıcaz istenen gerimi ayarlamayacak onunla uğraşıcaz istenen akımı ayarlamayacak onunla uğraşıcaz.
Uzun vadede pico ne sorunlar yaratır yaratır mı onu bilmiyoruz
Bu işin iki temel noktası var.

1. Mcu (dac) çıkış aralığında 0-5V regüle katını düzgün kontrol edebilmek. Yani buna müsait bir çıkış katı.

2. Adc ve Dac lar ile ne kadar hassas ayarlama yapabilinecek. Buda adc/dac çözünürlüğü...

Gerisi fantazi, makyaj. Bu ikisi düzgün olur ise cep telefonu üzerinden bile kontrol sağlanır.
 
Bu işin iki temel noktası var.

1. Mcu (dac) çıkış aralığında 0-5V regüle katını düzgün kontrol edebilmek. Yani buna müsait bir çıkış katı.

2. Adc ve Dac lar ile ne kadar hassas ayarlama yapabilinecek. Buda adc/dac çözünürlüğü...

Gerisi fantazi, makyaj. Bu ikisi düzgün olur ise cep telefonu üzerinden bile kontrol sağlanır.
dac yok abi dijital pot var harici
 
dac yok abi dijital pot var harici
Tamam sonuçta oda adım sayısı kadar hassas ayar yapabilecek...

Atıyorum . 10bit olsa 1024 adım ayar yapacak. 30v max çıkış voltajı olsa 30/1024 en düşük voltaj değişimi 29mv olacak tabi sistem süper lineer çalışmayacağı için başka sorunlar çıkacak. Bu sefer 29mv ve katlarında düzeltme tablosu gerekecek. O zaman en düşük ayar adımı 100mv olsun diyecez sonra 0.1V dijital ayar yaparken bir bakacan 5.1 yerine aslında 5.15 çıkış olacak vs... Daha yolu var bu projenin.
 
Tamam sonuçta oda adım sayısı kadar hassas ayar yapabilecek...

Atıyorum . 10bit olsa 1024 adım ayar yapacak. 30v max çıkış voltajı olsa 30/1024 en düşük voltaj değişimi 29mv olacak tabi sistem süper lineer çalışmayacağı için başka sorunlar çıkacak. Bu sefer 29mv ve katlarında düzeltme tablosu gerekecek. O zaman en düşük ayar adımı 100mv olsun diyecez sonra 0.1V dijital ayar yaparken bir bakacan 5.1 yerine aslında 5.15 çıkış olacak vs... Daha yolu var bu projenin.
çok yolu var abi
 
Abi kodu temize çektim.
En minimal kod aşağıdaki gibi.

Son duruma göre encoderi hangi kürsor pozisyonunda 1 artırırsam oradan itibaren 30v'a ulaşana kadar kendi kendine artıyor, ve ayrıca tam tersi işlemle 0v'a kadar eksilme de yapıyor.

C++:
#include <Arduino.h>
#include <U8g2lib.h>
#include "Wire.h"
#include "I2CKeyPad.h"
#include "hardware/watchdog.h"

/// 128x64 Ekran Tanımlaması ///////////////
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 17 /* A3 */, /* CS=*/ 16 /* A2 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 0, /* data=*/ 1, /* CS=*/ 10, /* reset=*/ 21);
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /*PICO SPI CLOCK PİN clock=*/ 10 /* A4 */ , /*PICO SPI TX data=*/ 11 /* A3 */, /*PICO CHIP SELECT CS=*/ 13 /* A2 */, /* reset=*/ U8X8_PIN_NONE);

//Timur abinin kodları
#define MAX_VOLTAJ 30.0
#define MIN_VOLTAJ 0.0

unsigned int kursor_konum; // 0 .. 3 arasinda degisiyor. 0 en soldaki hane
float katsayilar[] = {10, 1, 0.1, 0.01};
float voltaj = 0;
volatile int sayac = 0;

// Encoder Pinleri /////////////////////
#define PinCLK 7
#define PinDt 8
#define PinSw 6

/// 4x Yön Tuşları ////////////////////////
#define up_btn 2 //19
#define right_btn 3 //18
#define down_btn 4 //17
#define left_btn 5 //16

volatile bool PinDT = LOW;
long oncekiZaman;
int ival;
static char buffer[50];

void setup(void) {
  Serial.begin(115200);
  Wire.setSDA(0);
  Wire.setSCL(1);
  Wire.begin();
  u8g2.begin();
  pinMode(PinCLK, INPUT);
  pinMode(PinDt, INPUT);
  pinMode(PinSw, INPUT_PULLUP);
  pinMode(up_btn, INPUT);
  pinMode(right_btn, INPUT);
  pinMode(down_btn, INPUT);
  pinMode(left_btn, INPUT);

  attachInterrupt(digitalPinToInterrupt(PinCLK) , encoder , FALLING );//BAĞLI PIN LOW OLURSA KES
  attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );//BAĞLI PIN LOW OLURSA KES
}

//// ÇERÇEVE OLUŞTURMA FONKSİYONU/////////////
void drawF(int x, int y, int width, int height, int x2, int y2, int width2, int height2) {
  u8g2.drawFrame(x, y, width, height);
  u8g2.drawFrame(x2, y2, width2, height2);
}

/// Rotary Encoder Buton Fonksiyonu ///////
void debounce() {
  detachInterrupt(PinSw);
  boolean butonDurum = digitalRead(PinSw);
  if (butonDurum == 0) {
  }
  attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );
  delayMicroseconds(5000);
}

void encoder() {
  PinDT = digitalRead(PinDt);
  detachInterrupt(PinCLK);
  if (millis() - oncekiZaman > 1) {
    if (PinDT == HIGH) {
      sayac++;
      Serial.print(sayac);
      Serial.println(" : sag");
    } else {
      sayac--;
      Serial.print(sayac);
      Serial.println(" : sol");
    }
  }
  delayMicroseconds(10000); //Burası Debounce süresi için 10 milisaniye gecikme vererek encoder pals okuma sıklığını saniyede en falza 100'e ayaralar.
  attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);
  oncekiZaman = millis();
}

void loop(void) {

  u8g2.clearBuffer();
  if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
    if (digitalRead(right_btn) == 1) {
      sayac = 0;
      kursor_konum++;
      if (kursor_konum > 3) {
        kursor_konum = 0;
      }
    }
    else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum < 1) {
        kursor_konum = 3;
      }
    }
  }

  float yeni_voltaj = voltaj + sayac * katsayilar[kursor_konum];

  if ((yeni_voltaj <= MAX_VOLTAJ) && (yeni_voltaj >= MIN_VOLTAJ))
  {
    voltaj = yeni_voltaj;
    //ekrani_tazele();
  }

  //// Akım değerini ekrana yazdırma /////

  drawF(0, 0, 128, 64, 1, 1, 126, 62);
  u8g2.drawLine(5, 18, 122, 18);
  u8g2.drawLine(5, 46, 122, 46);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.setCursor(4, 40);
  u8g2.print("SET:");
  ival = voltaj * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setCursor(50, 40);
  u8g2.print(buffer);
  u8g2.setCursor(112, 40);
  u8g2.print(F("A"));
  u8g2.sendBuffer();
}
 

Ekler

  • Timur_abi_sayac.ino
    3.9 KB · Görüntüleme: 86
Kesmelere girildiğinde detachInterrupt ile kapattığınız kesmeleri, kesmeden çıkarken aktive etmeyin; kesme ile ürettiğiniz veriyi işledikten sonra aktive edin...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
sayaç değişkenine ya -1 yada +1 ataması yapman lazım, ama sen arttırıp azaltıyorsun. Belki neticede gene -1 veya +1 oluyordur ama kafa karıştırıyor şu anda.
 
Son duruma göre encoderi hangi kürsor pozisyonunda 1 artırırsam oradan itibaren 30v'a ulaşana kadar kendi kendine artıyor, ve ayrıca tam tersi işlemle 0v'a kadar eksilme de yapıyor.

Problem neymiş? Şimdi elinde çalışan bir kod olduğuna göre bunu asıl programa nakledebilirsin.
 
Bir de bir kesme gerçekleştiğinde sadece o kesmeyi değil diğer kesmeyi de kapatın...

Bu arada dün çalışırken yalın bir encoder ile yalnızca butona 0.1uF kondansatör bağlayarak çalıştım ve buton kesmesinde kontrolsüz hiçbir kesme meydana gelmedi... Bir de internal pullup yapmıştım, modül tasarımında bunu da dikkate almak lazım.

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Kesmelere girildiğinde detachInterrupt ile kapattığınız kesmeleri, kesmeden çıkarken aktive etmeyin; kesme ile ürettiğiniz veriyi işledikten sonra aktive edin...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Yani loop içinde sayac değişkenini kullandıktan sonra mı? Yoksa fonksiyonun kapatma süslü parantezinin hemen üstünde mi?

Bir de bir kesme gerçekleştiğinde sadece o kesmeyi değil diğer kesmeyi de kapatın...

Bu arada dün çalışırken yalın bir encoder ile yalnızca butona 0.1uF kondansatör bağlayarak çalıştım ve buton kesmesinde kontrolsüz hiçbir kesme meydana gelmedi... Bir de internal pullup yapmıştım, modül tasarımında bunu da dikkate almak lazım.

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Diğer kesmeyi de ekledim koda.
0.1uF'ı en son değerlendireceğim. Önce şu sorunu bir çözeyim.
 
sayaç değişkenine ya -1 yada +1 ataması yapman lazım, ama sen arttırıp azaltıyorsun. Belki neticede gene -1 veya +1 oluyordur ama kafa karıştırıyor şu anda.
Şuan da serial monitörde gördüğüm, encoderi bir tık sağ yapınca "sayac: 1" oluyor. Buna karşılık olarak kürsör sekmesi hangi basamaktaysa o basamaktan başlayıp 30v'a kadar devam ediyor. Encoder takılı kalıyor diyemiyorum çünkü serial monitörde sadece "sayac: 1" görünüyor.
Kısacası senin kodda bir yerde ya hata var yada loop içinde mi olmaması lazım bilemedim.
 
Hmm ben de düzeldi sandım :D Sürekli kendiliğinden artıyorsa o zaman enkoder bilgisi yanlış geliyor. Sanki sürekli dönüyormuş gibi bilgi geliyor demek.
 
Hmm ben de düzeldi sandım :D Sürekli kendiliğinden artıyorsa o zaman enkoder bilgisi yanlış geliyor. Sanki sürekli dönüyormuş gibi bilgi geliyor demek.
Abi buradaki kod loop içinde olduğu için encoderden gelen ilk "1" değeri sayaca aktarılıyor. sayac da kod içinde sürekli döngüde olduğu için habire 1 ekliyor. Max değere ulaşınca ancak durabiliyor. Bu kodda düzeltme yapmak lazım ama nasıl?

C++:
float yeni_voltaj = voltaj + sayac * katsayilar[kursor_konum];
 
Dedim ya, enkoderde sola dönüş algıladıysan sayaca -1 yazacaksın, sağa dönüş için de +1.

Senin debounce kodunu ben anlamadım açıkçası. Ben olsam interrupt'lu yapmazdım onu, loop içinde 1 milisaniyede tüm butonları kontrol ederek yapardım. Ama çalıştığını biliyorsan o zaman nasıl bir değişiklik yapacağını da bilirsin.
 
Ha bir de sola sağa dönüş algıladıktan sonra bir kere hesap yapıp ekranı tazeleyeceksin. Sonra da sağa sola dönüş bilgisini kaldıracaksın.
 
Ha bir de sola sağa dönüş algıladıktan sonra bir kere hesap yapıp ekranı tazeleyeceksin. Sonra da sağa sola dönüş bilgisini kaldıracaksın.
Ekran sürekli anlık tazeleniyor. Bütün kodlar clear.Buffer(); ile send.Buffer(); arasında. Bu ikisinin arasındaki en ufak hareket ekrana yansıyor.
Benim, senin kodu her encoder hareketinde 1 sefer çalışacak şekilde yapılandırmam lazım. Ama şuan lanet migren yakamı bırakmıyor. :kizgin2:
 
Tamam çözdüm olayı.

if ile sayacı kontrol altına aldım. sayaçla işim bitince sıfırladım. Şuan sorun yok.

C++:
if (sayac) {
    float yeni_voltaj = voltaj + sayac * katsayilar[kursor_konum];

    if ((yeni_voltaj <= MAX_VOLTAJ) && (yeni_voltaj >= MIN_VOLTAJ))
    {
      voltaj = yeni_voltaj;
      //ekrani_tazele();
    }
    sayac = 0;
  }
 
Sayın @Gokrtl,
void debounce() konusunda:
C++:
void debounce() {
  detachInterrupt(PinSw);
  boolean butonDurum = digitalRead(PinSw);
  if (butonDurum == 0) {
  }
  attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );
  delayMicroseconds(5000);
}
fonksiyon ve yapı hatalı çünkü
1- Bu fonksiyon PinSw'nin FALLING hâlinde yani *0'a çekildiğinde çağrılıyor. Dolayısıyla PinSw durumu zaten 0 demek ve siz if kontrolünde buton durumu 0 ise işlem yaptırmıyorsunuz. Yani fonksiyonu bypass ediyorsunuz. Bunun yerine fonksiyonu kullanmayacaksanız kesme hiç aktive etmeyin.
2- Kesmeler içerisinde değişken tanımlaması yapmamak gerekiyor,
3- boolean yerine bool değişkeninin daha kararlı çalıştığı Arduino referanslarında bahsediliyor.
4- Kesmeyi bu fonksiyondan çıkarken değil, bu fonksiyon yoluyla ürettiğiniz veriyi işledikten sonra yeniden aktive ediniz.

void encoder() konusunda:
C++:
void encoder() {
  PinDT = digitalRead(PinDt);
  detachInterrupt(PinCLK);
  if (millis() - oncekiZaman > 1) {
    if (PinDT == HIGH) {
      sayac++;
      Serial.print(sayac);
      Serial.println(" : sag");
    } else {
      sayac--;
      Serial.print(sayac);
      Serial.println(" : sol");
    }
  }
  delayMicroseconds(10000); //Burası Debounce süresi için 10 milisaniye gecikme vererek encoder pals okuma sıklığını saniyede en falza 100'e ayaralar.
  attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);
  oncekiZaman = millis();
}
1- delayMicroseconds() ile zaman kontrolü sağlıyorsunuz. Bu nedenle millis() fonksiyonu üzerinden ikinci bir kontrole gerek yok. Kesme içerisinde fazladan meşguliyet oluşturuyor.
2- Sayac değişkenini bu fonksiyon içerisinde işliyorsunuz, ancak bu değeri bu fonksiyondan çıktıktan sonra loop() fonksiyonu içerisinde sırası geldiğinde yazdırınız, çünkü kesmenin işleme hızı bu sebeple Serial.print kodunun çalışma hızına düşmekte bu nedenle sizin encoder hareketinizle oluşturulan senkronizasyon bozulmaktadır.
3- Kesmeyi bu fonksiyondan çıkarken değil, bu fonksiyon yoluyla ürettiğiniz veriyi işledikten sonra yeniden aktive ediniz.

void loop() konusunda:
C++:
  if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
    if (digitalRead(right_btn) == 1) {
      sayac = 0;
      kursor_konum++;
      if (kursor_konum > 3) {kursor_konum = 0;}
    } else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum < 1) {kursor_konum = 3;}
    }
  }
1- İlk satırda rigth_btn ve left_btn pinlerinden okuduğunuz değerleri birer değişkene atayınız. digitalRead() fonksiyonu pinin bu fonksiyon ile kontrol edildiği andaki değerini size verir. Her okuduğunuzda yeni bir değer döndürebilir. Özellikle birbiriyle karşılaştıracağınız pinleri aynı anda kaydediniz ki if-else bloğu içerisinde mantık hatasına yol açacak durumlara mahal kalmasın. Sonra bu değişken üzerinden if-else blokları içerisinde bu değişkenler üzerinden kontrol gerçekleştiriniz. Böylece bu butonların ilk okunduğu andaki değerlerine göre doğru ve öngörülebilir kesin işlemler yapabilirsiniz, diğer türlü her okumada yeni durumları üzerinden kararsız okumalar meydana gelecektir. Yukarılarda @semih_s pin durumlarını ilk satırdaki gibi aynı anda bir değişkene aktarmıştı, bu if-else içerisinde birbiriyle karşılaştırılacak pinleri bir değişkene kaydetmek için güzel bir yöntem.
2- Bir de right_btn basılı ise sayac değişkenini sıfırlıyorsunuz, ancak left_btn basılmış ise bunu yapmıyorsunuz neden?
Bu durumda bu kısımdaki kodlar şöyle olacaktır:
C++:
  byte butonlar = digitalRead(right_btn) + digitalRead(left_btn) << 1;
  if (butonlar == 0b01) {//right_btn basılı durumu
    sayac = 0;
    kursor_konum++;
    if (kursor_konum > 3) {kursor_konum = 0;}
  } else if (butonlar == 0b10) { //left_btn basılı durumu
    kursor_konum--;
    if (kursor_konum < 1) {kursor_konum = 3;}
  }
 
Yani loop içinde sayac değişkenini kullandıktan sonra mı? Yoksa fonksiyonun kapatma süslü parantezinin hemen üstünde mi?
loop içinde sayac değişkenini kullandıktan sonra...
 
Sayın @Gokrtl,
void debounce() konusunda:
C++:
void debounce() {
  detachInterrupt(PinSw);
  boolean butonDurum = digitalRead(PinSw);
  if (butonDurum == 0) {
  }
  attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );
  delayMicroseconds(5000);
}
fonksiyon ve yapı hatalı çünkü
1- Bu fonksiyon PinSw'nin FALLING hâlinde yani *0'a çekildiğinde çağrılıyor. Dolayısıyla PinSw durumu zaten 0 demek ve siz if kontrolünde buton durumu 0 ise işlem yaptırmıyorsunuz. Yani fonksiyonu bypass ediyorsunuz. Bunun yerine fonksiyonu kullanmayacaksanız kesme hiç aktive etmeyin.
2- Kesmeler içerisinde değişken tanımlaması yapmamak gerekiyor,
3- boolean yerine bool değişkeninin daha kararlı çalıştığı Arduino referanslarında bahsediliyor.
4- Kesmeyi bu fonksiyondan çıkarken değil, bu fonksiyon yoluyla ürettiğiniz veriyi işledikten sonra yeniden aktive ediniz.

void encoder() konusunda:
C++:
void encoder() {
  PinDT = digitalRead(PinDt);
  detachInterrupt(PinCLK);
  if (millis() - oncekiZaman > 1) {
    if (PinDT == HIGH) {
      sayac++;
      Serial.print(sayac);
      Serial.println(" : sag");
    } else {
      sayac--;
      Serial.print(sayac);
      Serial.println(" : sol");
    }
  }
  delayMicroseconds(10000); //Burası Debounce süresi için 10 milisaniye gecikme vererek encoder pals okuma sıklığını saniyede en falza 100'e ayaralar.
  attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);
  oncekiZaman = millis();
}
1- delayMicroseconds() ile zaman kontrolü sağlıyorsunuz. Bu nedenle millis() fonksiyonu üzerinden ikinci bir kontrole gerek yok. Kesme içerisinde fazladan meşguliyet oluşturuyor.
2- Sayac değişkenini bu fonksiyon içerisinde işliyorsunuz, ancak bu değeri bu fonksiyondan çıktıktan sonra loop() fonksiyonu içerisinde sırası geldiğinde yazdırınız, çünkü kesmenin işleme hızı bu sebeple Serial.print kodunun çalışma hızına düşmekte bu nedenle sizin encoder hareketinizle oluşturulan senkronizasyon bozulmaktadır.
3- Kesmeyi bu fonksiyondan çıkarken değil, bu fonksiyon yoluyla ürettiğiniz veriyi işledikten sonra yeniden aktive ediniz.

void loop() konusunda:
C++:
  if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
    if (digitalRead(right_btn) == 1) {
      sayac = 0;
      kursor_konum++;
      if (kursor_konum > 3) {kursor_konum = 0;}
    } else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum < 1) {kursor_konum = 3;}
    }
  }
1- İlk satırda rigth_btn ve left_btn pinlerinden okuduğunuz değerleri birer değişkene atayınız. digitalRead() fonksiyonu pinin bu fonksiyon ile kontrol edildiği andaki değerini size verir. Her okuduğunuzda yeni bir değer döndürebilir. Özellikle birbiriyle karşılaştıracağınız pinleri aynı anda kaydediniz ki if-else bloğu içerisinde mantık hatasına yol açacak durumlara mahal kalmasın. Sonra bu değişken üzerinden if-else blokları içerisinde bu değişkenler üzerinden kontrol gerçekleştiriniz. Böylece bu butonların ilk okunduğu andaki değerlerine göre doğru ve öngörülebilir kesin işlemler yapabilirsiniz, diğer türlü her okumada yeni durumları üzerinden kararsız okumalar meydana gelecektir. Yukarılarda @semih_s pin durumlarını ilk satırdaki gibi aynı anda bir değişkene aktarmıştı, bu if-else içerisinde birbiriyle karşılaştırılacak pinleri bir değişkene kaydetmek için güzel bir yöntem.
2- Bir de right_btn basılı ise sayac değişkenini sıfırlıyorsunuz, ancak left_btn basılmış ise bunu yapmıyorsunuz neden?
Bu durumda bu kısımdaki kodlar şöyle olacaktır:
C++:
  byte butonlar = digitalRead(right_btn) + digitalRead(left_btn) << 1;
  if (butonlar == 0b01) {//right_btn basılı durumu
    sayac = 0;
    kursor_konum++;
    if (kursor_konum > 3) {kursor_konum = 0;}
  } else if (butonlar == 0b10) { //left_btn basılı durumu
    kursor_konum--;
    if (kursor_konum < 1) {kursor_konum = 3;}
  }
Şu migrenimi bir kontrol altına alayım da sonra bu adımları uygulayacağım. Şuan odaklanamıyorum. Okuyorum, anlamıyorum.
 

Forum istatistikleri

Konular
5,899
Mesajlar
100,694
Üyeler
2,498
Son üye
TaKo

Son kaynaklar

Son profil mesajları

Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top