Arduino ile servo reverser

Sumer Yamaner

Moderator
Katılım
17 Eyl 2013
Mesajlar
8,776
Tepkime puanı
23,158
Yaş
61
Konum
İstanbul
Web sitesi
www.sumeryamaner.com
İlgi Alanı
Uçak
Bu bence, paketim elime ulaştığında, benim LED yakıp söndürme sonrası ilk projem olur.

Kod:
int rxPin = 12; //Giriş bacağı seçimi
int servoPin = 5; //Çıkış bacağı seçimi
int inPulse = 0; //Giriş darbe süresi
int servoPulse = 0; //Çıkış darbe süresi
unsigned long time; //Süre değişkeni


void setup()
{
pinMode(rxPin, INPUT); //Bacak işlevi giriş
pinMode(servoPin, OUTPUT); //Bacak işlevi çıkış
}

void loop()
{
inPulse = pulseIn(rxPin, HIGH, 25000); //Max. 25 milisaniye boyunca giriş darbesi okunuyor
if(inPulse > 800 && inPulse < 2200) //Darbe süresi 0.8 - 2.2 milisaniye arasında ise...
  {
  servoPulse = 3000 - inPulse; //Servo darbesi 3000'den çıkarılarak ters çevriliyor
  pulseOut(); //Hesaplanan çıkış darbesi için darbe çıkış altprogramı çağrılıyor
  }
}


void pulseOut() //Darbe çıkış altprogramı
{
time = micros(); //Mikrosaniye olarak timer okunuyor
digitalWrite(servoPin, HIGH); //Çıkış HIGH yapılıyor
time = time + servoPulse; //Timer bitiş değeri belirleniyor
while (time < micros()) //Timer değeri timer bitiş değerinin altında olduğu sürece while loop içinde bekleniyor
  {
  }
digitalWrite(servoPin, LOW); //Timer değeri timer bitiş değerine ulaşınca çıkışa LOW yazılıp altprogramdan çıkılıyor
}

Sanıyorum burada pulse çıkışı için timer kullanmak pek de gerekli değil çünkü gördüğüm kadarıyla bir de delaymicroseconds() komutu varmış! :)
Bu halde kullanırsam mikrosaniye sayacının overflow ve resetlenmesi bir sorun yaratır mı diye düşündüm ama 70 dakikada oluyormuş bu overflow. Modellerimiz 70 dakika uçmuyor genelde. :) Yine de deneyip görmek lazım.

Kod daha da basitleşti delaymicroseconds komutu ile

Kod:
int rxPin = 12; //Giriş bacağı seçimi
int servoPin = 5; //Çıkış bacağı seçimi
int inPulse = 0; //Giriş darbe süresi
int servoPulse = 0; //Çıkış darbe süresi

void setup()
{
pinMode(rxPin, INPUT); //Bacak işlevi giriş
pinMode(servoPin, OUTPUT); //Bacak işlevi çıkış
}

void loop()
{
inPulse = pulseIn(rxPin, HIGH, 25000); //Max. 25 milisaniye boyunca giriş darbesi okunuyor
if(inPulse > 800 && inPulse < 2200) //Darbe süresi 0.8 - 2.2 milisaniye arasında ise...
  {
  servoPulse = 3000 - inPulse; //Servo darbesi 3000'den çıkarılarak ters çevriliyor
  digitalWrite(servoPin, HIGH); //Çıkış HIGH yapılıyor
  delayMicroseconds(servoPulse);
  digitalWrite(servoPin, LOW);
  }
}
 
Arduino ile servo reverser

Sümer bey zaten yazmışsınız ama bu da, "Servo" kütüphanesini kullanan versiyonu.

Kod:
#include <Servo.h>

Servo revServo;  //Servo nesnesi olustur

int rxPin = 12; //Giriş bacağı seçimi
int servoPin = 5; //Çıkış bacağı seçimi
int inPulse = 0; //Giriş darbe süresi
int servoPulse = 0; //Çıkış darbe süresi

void setup()
{
pinMode(rxPin, INPUT); //Bacak işlevi giriş
revServo.attach(servoPin);  //servoPin numarali pin ile Servo nesnesini ilsikilendir
}

void loop()
{
inPulse = pulseIn(rxPin, HIGH, 25000); //Max. 25 milisaniye boyunca giriş darbesi okunuyor
if(inPulse > 800 && inPulse < 2200) //Darbe süresi 0.8 - 2.2 milisaniye arasında ise...
  {
  servoPulse = 3000 - inPulse; //Servo darbesi 3000'den çıkarılarak ters çevriliyor
  revServo.writeMicroseconds(servoPulse); // Servo nesnesine bulunan degeri yaz.
  }
}
 
Arduino ile servo reverser

Sonraki proje de VTail mikser olsun, bunun üzerine tamam olur :)

 
Arduino ile servo reverser

Sümer Yamaner' Alıntı:
"Nesne" olayını henüz tam kavrayamadım. :) Harıl harıl çalışıyorum ama görüyorsunuz. :D

Hem görüyor hem de takdir ediyoruz abi, harikasın :bravo: :thumbup: %p
 
Arduino ile servo reverser

Servo reverser uygulamasını rafine ettim. Artık 1024 çözünürlükte çalışıyor. Hem Arduino hem de Attiny ile kullanılabilecek (tek bir satır değiştirilerek) bir kod oluştu ve test edildi.

Kod:
const int inp = 1;
const int normout = 2;
const int revout = 3;

unsigned int pwmin;
volatile unsigned int counter;



ISR(TIMER2_OVF_vect)
{
  counter++;
}

void setup() 
{
  pinMode(normout, OUTPUT);
  pinMode(revout, OUTPUT);
  cli();
  TCCR2A = 0;
  TCCR2B = 2; // Timer2 prescaler 8
  TIMSK2 = 1; // Timer2 Overflow Interrupt enabled
  sei();
}

void loop() 
{
  readpwm();
  servoout(pwmin, normout);
  pwmin = 6000 - pwmin; // Attiny85 kullanıldığında 6000 yerine 3000 yazılacak.
  servoout(pwmin, revout);
}

void readpwm()
{
  unsigned int pwmL;
  unsigned int pwmH;
  pwmin = 0;
  while (digitalRead(inp) == 0)
  {
  }

  TCNT2 = 0;
  counter = 0;
  while (digitalRead(inp) == 1)
  {
  }
  TCCR2B = 0;
  cli();
  pwmH = counter;
  pwmL = TCNT2;
  pwmin = 256 * pwmH + pwmL;
  sei();
  TCCR2B = 2;
}

void servoout(unsigned int x, int y)
{
  unsigned int pwmL;
  unsigned int pwmH;
  pwmH = highByte(x);
  pwmL = lowByte(x);
  digitalWrite(y, HIGH);
  TCNT2 = 0;
  counter = 0;
  while (counter <= pwmH)
  {
  }
  TCNT2 = 0;
  counter = 0;
    while (counter <= pwmL)
    {
      counter = TCNT2;
    }
  digitalWrite(y, LOW);
}
 
Arduino ile servo reverser

Attiny85 ile plaketler hazırladım. Hatta plaketsiz olarak sadece bir Attiny85 ve heat shrink kullanarak minicik bir tane ürettim. Ama büyük hayal kırıklığı. Servolar sürekli titriyor ve bazı stick konumlarında abuk sabuk hareketler yapıyorlar. Çok uğraştım ve araştırdım. Sorunun Attiny85'de 16 bit timer olmaması ve 16 bit timerin yazılımla emüle edilmesinden kaynaklandığı sonucuna vardım. O kadar mesai harcadım ki artık dayanamadım ve tüm reverser projemi Atmega328 üzerine kurmaya karar verdim. Atmega328 ile yaptığım reverser şiir gibi çalışıyor. :D

[attachimg=1]
 

Ekli dosyalar

  • pic0001.jpg
    pic0001.jpg
    38.1 KB · Görülme: 114
Arduino ile servo reverser

Yeni bir ürün daha profilimize ilave oldu demek ki, ellerine saglık abi :bravo:


Sent from my iPhone using Tapatalk
 
Arduino ile servo reverser

Attiny85'li olanların stoklarını erittin mi abi, bunu 85 stokları bittikten sonra piyasa sürersin. ;D :lollol: :lol: :lol:

Bir sürü şey öğrenmiş olmak iyi güzelde, keşke biri diyeymiş onunla olmaz diye. :mad:

İnşallah keyifli bir süreç olmuştur demekten başka söyleyebilecek birşey yok abi. :laugh:

Yeni ürünün başarılı sonucu için tebrik ederim. :bravo:
 
Arduino ile servo reverser

Stok eritmem ürünü geri çağırırım ben. :)
Ayrıca biraz zaman geçince tekrar araştırmaya başlayacağım çünkü Attiny ile olmaması için hiçbir sebep yok.

SM-N910C cihazımdan Tapatalk kullanılarak gönderildi
 
Arduino ile servo reverser

Sümer Yamaner' Alıntı:
Stok eritmem ürünü geri çağırırım ben. :)
Ayrıca biraz zaman geçince tekrar araştırmaya başlayacağım çünkü Attiny ile olmaması için hiçbir sebep yok.

Hep paraya kıyıpta benim gibi bir pazarlama müdürü çalıştırmadığın için oluyor bunlar Sümer abi. :lol: :lol:

Taş mı yiyecek bu Sümerelectronics. :lollol: Sen Attiny'le uğraş abi ben ona birşey demiyorumki, arge ayrı birşey. Bu arada bende " Antin kuntiny'le " uğraşırım kurumsal yaparız firmayı. ;D
 
Arduino ile servo reverser

Türker Akgün' Alıntı:
Hep paraya kıyıpta benim gibi bir pazarlama müdürü çalıştırmadığın için oluyor bunlar Sümer abi. [emoji38] [emoji38]

Taş mı yiyecek bu Sümerelectronics. :lollol: Sen Attiny'le uğraş abi ben ona birşey demiyorumki, arge ayrı birşey. Bu arada bende " Antin kuntiny'le " uğraşırım kurumsal yaparız firmayı. ;D
[emoji14] [emoji14] [emoji14]

SM-N910C cihazımdan Tapatalk kullanılarak gönderildi
 
Sümer Yamaner' Alıntı:
Ayrıca biraz zaman geçince tekrar araştırmaya başlayacağım çünkü Attiny ile olmaması için hiçbir sebep yok.

Demiştim olacak diye. İnternetin altını üstüne getirdim. Sorunu buldum. Artık Attiny85 ile oluyor bu iş... :)
 
Arduino ile servo reverser

Sümer Yamaner' Alıntı:
Demiştim olacak diye. İnternetin altını üstüne getirdim. Sorunu buldum. Artık Attiny85 ile oluyor bu iş... :)
Abi maşallahın Kontronik gibi bir fabrika kurarsan Rc sektöründe gurur kaynağımız olursun. :saygilar:
 
Arduino ile servo reverser

Sümer Yamaner' Alıntı:
Demiştim olacak diye. İnternetin altını üstüne getirdim. Sorunu buldum. Artık Attiny85 ile oluyor bu iş... :)
Abi bir seyi de eksik birak ya :laugh: :bravo: :thumbup: