[DIY]: Arduino ile Rectract - Iniş Takımı Uygulaması

Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Aşağı yukarı aynı delilik derecesinde insanlarla bir arada olmak güzel di mi?! :D :p

Estafurullah Abi. Biz deli değiliz bu hobiyle ilgilenmeyenler normal değil. :yuppi: :yuppi:
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
Konu "Arduino Quick Start Guide ve Uygulama Örnekleri" olmak yerine "Arduino ile Retract yapma Guide" oldu bile :).

Ehh rudder lobisinden sonra retract lobisi de benden sorulur! Gİrdiğim muhabbette konu dönüp dolaşıp retracta gelir. :D
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Ahhh bu programcı takımı yok muuu... :)

void setup() {
int i;
for(i = 0; ı < 2; ı++){
pinMode(motor_left[ı], OUTPUT);"
pinMode(motor_right[ı], OUTPUT);"
}

yerine

void setup() {
pinMode(motor_left[1], OUTPUT);
pinMode(motor_right[1], OUTPUT);
pinMode(motor_left[2], OUTPUT);
pinMode(motor_right[2], OUTPUT);
}

yazsak noolur ki? :)

Bu arada, output olarak tanımladığımız pinler özellikle bir değer belirtmezsek "L" mi oluyorlar?

Dur dur bak burada ne var.

duration = pulseIn(sensePin, HIGH);
if (duration > 1500) {
retractOpen();
} else {
retractClose();
}

Yahu her şey hazır. İnsan "kod yazdım" bile diyemez. Hani timing falan hesaplasak. Direkt milisaniye cinsinden süre giriliyor yahu. Tam tembel işiymiş. :D

Durdurma işi bence çok kolay. Her bir retract için ayrı bir akım sensörü girişi kullanılacak ve ilgili pin set HIGH işlemleri bir if döngüsü içinde bulunacak. ELSE kısmına da her iki motor pinini LOW yapacak iki satır yazılacak. Değil mi??? :D

Aklıma bir şey daha geldi. Örneğin 3 saniye boyunca alıcı sinyali gelmediğinde retractı açabiliriz. :)

Aklıma başka bir şey daha geldi. Bir Arduino kullanarak iki alıcılı fail safe bir sistem de yapabilirmişiz gibime geliyor. Ne dersiniz???
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
void setup() {
pinMode(motor_left[1], OUTPUT);
pinMode(motor_right[1], OUTPUT);
pinMode(motor_left[2], OUTPUT);
pinMode(motor_right[2], OUTPUT);
}
[/i]
yazsak noolur ki? :)

Bu arada, output olarak tanımladığımız pinler özellikle bir değer belirtmezsek "L" mi oluyorlar?
Arduino uzmanı değilim, hâlâ öğrenen bir çırağım. Ama aklıma gelen nerede ise her projenin, en azından basit hallerinin Arduino ile rahatlıkla yapılabildiğini görünce denemeden duramıyorum :).

Kod olduğu için, kodda hiç bir algoritma, zeka gerektirecek bir şey yok. Özellikle zamanlamalar ayarlanmaya başlandığı zaman kodun "non-blocking"(ARDUINO kartının yapması beklenenen diğer işleri engellememesi için) çalışabilmesi için işler çığrından çıkmaya başlayacak. İşin temelinin son derece basit fakat dataylara girildiği zaman asıl şeytanın ortaya çıkacağını göstermek istedim.

Kodda da elimden geldiğince, anlaşılırlık ve düzgün yazma pratiklerinin ortalamasını tutturmaya çalışıyorum. "motor pinleri" dedğiniz gibi ayrı ayrı yazılabilir ama atıyorum 100 retract :laugh: kontrol etmeye çalıştığımızda 200 satır yazmak gerekecek. Benim yazdığım şekilde ise sadece "i < 2" yerine "i < 100" yazmak yeterli olacak.

Dijital çıkışlar ilk ayarlandığından L değerini alıyorlar. Hoş ayarlanmasalar dahi, milisaniyeden "void setup()" rtuininden hemen sonra "void loop()" sonsuz döngüsü çalışmaya başlıyor. Yani aradaki bekleme süresi, işlemci hızı ile orantılı olarak büyük ihtimalle 1/16000000 saniye kadar.

Kodu da alfa v0.11 olarak güncelledim. Gene zeka kırıntıs bir şey yok ama :) ...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
Kodda da elimden geldiğince, anlaşılırlık ve düzgün yazma pratiklerinin ortalamasını tutturmaya çalışıyorum. "motor pinleri" dedğiniz gibi ayrı ayrı yazılabilir ama atıyorum 100 retract :laugh: kontrol etmeye çalıştığımızda 200 satır yazmak gerekecek. Benim yazdığım şekilde ise sadece "i < 2" yerine "i < 100" yazmak yeterli olacak.


Tamam söz. İlk fırsatta 100 retractlı bi model toplayacağım! :D :)
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Bu arada benim kafamdaki asıl olay işin içine interruptları katıp kısmi bir multitasking sağlayabilmek. Ama interruptlar devreye girince timing şaşmaları olacak mı acaba diye düşünmeden de duramıyorum. Örneğin servo sinyalinin okunmasında...
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Bu arada benim kafamdaki asıl olay işin içine interruptları katıp kısmi bir multitasking sağlayabilmek. Ama interruptlar devreye girince timing şaşmaları olacak mı acaba diye düşünmeden de duramıyorum. Örneğin servo sinyalinin okunmasında...

Sümer bey siz daha önce Arduino kullanamadığınıza emin misiniz ?
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Arduin'da varsayılan kütüphaneler, interrupt'lara çok müdahale etmiyorlar. Harici bir Real Time Clock kullanılmadığı zaman bile çok CPU yoğun bir işlem yapmadığımda, zamanlamaların çok kaymadığını bizzat test ettim.

Servo kütüphanesi de donanımsal interruptlar yerine yazılımsal bazı numaralar kullanarak klasik 50Hz değeri ile çıkış veriyor. CPU yoğun bir işlem olsa bile yukarıda açıkladığım sebepten dolayı, hissedilebilir bir kayma olacağını zannetmiyorum.

Tabiiki çok hassas bir işlem yaptırılacaksa, harici bir Real Time Clock kullanılıp, interrupt'ların Arduino kütüphaneleri tarafından değil de tamamen bizim yazdığımız kod tarafından kontrol edildiğine emin olmak lazım. Ama bundan çok daha karışık projelerde bile insanlar buna tenezzül etmiyorlar.

Multitasking sağlayabilmek için ya Timer diye adlandırılan bir kod öbeği kullanılıyor, ya da multitasking için yazılmış kütüphaneler kullanılıyor. Ben Timer'dan ziyade hazır kütüphanelerin kullanımını daha konforlu buldum. İlk seferinde anlamak için biraz uğraşmak gerekse de sonrasında tam tembel işi :D.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Valla Z80 makine kodunu assemblersiz kafadan yazardım ama o zamanlar Arduino'nun "A"'sı bile yoktu ufukta. :)
Harici RTC falan işi kompleks hale getirir. Sonuçta giriş sinyali 1.5 mS'den uzun mu kısa mı bakacağız hepi topu. :)
Ama asenkron yanıp sönecek LED'ler için interrupt gerekli olabilir.
Bu arada, servo sürmek için kullanılacak frame zamanlama açısından fazla hassas olmadığı için 50 Hz civarı bir şey sorun yaratmadan çalışıyor sanırım.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Sümer Yamaner' Alıntı:
Valla Z80 makine kodunu assemblersiz kafadan yazardım ama o zamanlar Arduino'nun "A"'sı bile yoktu ufukta. :)
Harici RTC falan işi kompleks hale getirir. Sonuçta giriş sinyali 1.5 mS'den uzun mu kısa mı bakacağız hepi topu. :)
Ama asenkron yanıp sönecek LED'ler için interrupt gerekli olabilir.
Bu arada, servo sürmek için kullanılacak frame zamanlama açısından fazla hassas olmadığı için 50 Hz civarı bir şey sorun yaratmadan çalışıyor sanırım.

CPPM ya da SBUS kullanamayan alıcı çıkışları için 50Hz, bidiğim kadarı ile klasik bir değer. 400Hz ve üstü PWM frekansları, en azından multirotorlar için, Arduino tabanlı multiwii ve SimonK yazılımı ile beraber geldi. Elimdeki Flysky ve Frsky alıcıların normal çıkışlarının hepsini de osiloskop ile ölçtüğümde onlarında 50Hz verdiğini gördüm.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer SAHIN' Alıntı:
CPPM ya da SBUS kullanamayan alıcı çıkışları için 50Hz, bidiğim kadarı ile klasik bir değer. 400Hz ve üstü PWM frekansları, en azından multirotorlar için, Arduino tabanlı multiwii ve SimonK yazılımı ile beraber geldi. Elimdeki Flysky ve Frsky alıcıların normal çıkışlarının hepsini de osiloskop ile ölçtüğümde onlarında 50Hz verdiğini gördüm.
Evet, evet. Demek istediğim şey, 50 Hz çok kritik değil. 45 ya da 55 olsa da sorun olmaz.
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Yavaş yavaş üzerinde düşünmek gerektiren bir şeyler yazmakta fayda var. Retract Project for RCKolik v0.22 alfa :).

Retract motorları ve iniş takımı kapakları kumanda ile kontrol ediliyor. Şimdili akım sensörü kodda yok. 3 pozisyonlu kumanda anahtarı, AÇMA - DURDURMA - KAPAMA modunda çalışıyor. Varsayılan olarak iniş takımları açık kabul ediliyor. AÇMA veya KAPAMA pozisyonlarında 1000milisaniye(servolar) + 4000milisaniye sonra, motorlar durduruluyor. Sonsuz döngü içerisinde, 3 farklı pozisyon için zamanı kontrol edebilmek, kodu bir öncekine göre belirgin bir şekilde karıştırıyor...

Kod:
/* Retract Project for RCKolik
 by Zafer SAHIN 
 This example code is in the public domain.

 modified 09/01/2015
 by Zafer SAHIN
 Version 0.22
 */

#include <Servo.h>

Servo lid_servo_left;          // Servo object for left retract lid
Servo lid_servo_right;         // Servo object for right retract lid

int motor_left[] = {3, 11};    // Arduino pins for controlling left retract motor
int motor_right[] = {5, 6};    // Arduino pins for controlling right retract motor
int lid_servo[] = {9, 10};     // Arduino pins for controlling lid servos
int rxPin = 12;                // Arduino pin for receiver pin

int servoPosClose = 180;       // Degree type value for positioning the lid servos closed
int servoPosOpen = 0;          // Degree type value for positioning the lid servos open

int retractState = 1 ;         // Variable to hold retract position, open = 1, stopped = 0, closed = -1

unsigned long previousMillis = 0;        // Timer variables
unsigned long retractStopDelay = 4000;   // Timer variables
unsigned long currentMillis = 0;         // Timer variables
boolean initMillis = true;               // Timer variables

unsigned long rxPWMduration;  // Variable for reading receiver

void setup() {
  pinMode(motor_left[0], OUTPUT);
  pinMode(motor_left[1], OUTPUT);
  pinMode(motor_right[0], OUTPUT);
  pinMode(motor_right[1], OUTPUT);
  lid_servo_left.attach(lid_servo[0]);
  lid_servo_right.attach(lid_servo[1]);
  previousMillis = millis();
}

void loop() {
  rxPWMduration = pulseIn(sensePin, HIGH);
  if (rxPWMduration > 1600) {  // This switch position is for opening the retracts
    if (retractState == 1) {   // If we are already in retractState = 1, do NOTHING, stop retract motor.
      retractStop();
    } else {                   // If we are not in retractState = 1, because we are switched from another state just yet, use a timed action to set state to 1, meanwhile open retracts.
      if (initMillis) {
        lidMove(servoPosOpen);
        previousMillis = millis();
        initMillis = false;
      }
      retractOpen();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {  
        retractState = 1;
        initMillis = true;
      }
    }
  } else if (rxPWMduration > 1400) {   // This switch position is for stopping the retracts
    if (retractState == 0) {  // If we are already in retractState = 0, do NOTHING, stop retract motor.
      retractStop();
    } else {                   // If we are already in retractState = 0, do NOTHING, stop retract motor. Timed action is for future use...
      retractStop();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {
        retractState = 0;
        initMillis = true;
      }
    }
  } else {                              // This switch position is for closing the retracts
    if (retractState == -1) {   // If we are already in retractState = -1, do NOTHING, stop retract motor.
      retractStop();
    } else {                    // If we are not in retractState = -1, because we are switched from another state just yet, use a timed action to set state to -1, meanwhile close retracts.
      if (initMillis) {
        previousMillis = millis();
        initMillis = false;
      }
      retractClose();
      currentMillis = millis();
      if(currentMillis - previousMillis >= RetractStopDelay) {  
        retractState = -1;
        lidMove(servoPosClose);
        initMillis = true;
      }
    }
  }
}

void lidMove(int servoPos){     // Function name says all
  lid_servo_left.write(servoPos);
  lid_servo_right.write(servoPos);
  delay(1000);
}
void retractOpen(){            // Function name says all
  digitalWrite(motor_left[0], HIGH);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], HIGH);
  digitalWrite(motor_right[1], LOW);
}
void retractClose(){            // Function name says all
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], HIGH);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], HIGH);
}
void retractStop(){            // Function name says all
  digitalWrite(motor_left[0], LOW);
  digitalWrite(motor_left[1], LOW);
  digitalWrite(motor_right[0], LOW);
  digitalWrite(motor_right[1], LOW);
  delay(100);
}
 
Arduino Quick Start Guide ve Uygulama Örnekleri

Zafer Bey elinize sağlık. Kafamda birkaç soru ve öneri var da tam toparlayamadım. Bugün ameliyatarım bitsin oturup yazacağım soru ve önerilerimi.