[DIY]: Arduino ile Navigasyon Işık Uygulaması

Ömer Erkan

RcFanatik
Katılım
4 Eki 2012
Mesajlar
3,570
Tepkime puanı
6,164
Yaş
66
Konum
Başiskele - Kocaeli
İlgi Alanı
Uçak
Zafer bey, navigasyon ışıklarına dönersek, daha önce burada örneklerini verdiğiniz Arduino kartlarından hangisini almalıyım? Ben de bir Banggood siparişi ile başlasam iyi olacak!...(Veya yurtiçi) (biraz armut piş gibi olacak ama, geçmiş konuları bir kaç kez okudum, okudukça kafam biraz daha karıştı!)

PS: Service costs will be paid as charity-ware or tea-ware, even beer-ware where possible! :lol:

Bu konu aşağıdaki konudaki mesajların taşınması ile oluşturulmuştur.
 
Arduino ile Navigasyon Işık Uygulaması

Omer Erkan' Alıntı:
Zafer bey, navigasyon ışıklarına dönersek, daha önce burada örneklerini verdiğiniz Arduino kartlarından hangisini almalıyım? Ben de bir Banggood siparişi ile başlasam iyi olacak!...(Veya yurtiçi) (biraz armut piş gibi olacak ama, geçmiş konuları bir kaç kez okudum, okudukça kafam biraz daha karıştı!)

Ömer bey, kart bu :

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


10 ledli örnek devre bu :
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


10 led için örnek kod da bu :
Kod:
/* 10 LED Lights Project
 by Zafer SAHIN 
 License of this example code is TEA-WARE.

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

#include "Timer.h"

int LED[] =      {2,    3,    4,    5,    6,   7,   8,  9,   10,   11};   // 10 Led pins
int PERIOD[] =   {1000, 2000, 1200, 3330, 100, 150, 20, 550, 9000, 400};  // Blinking period for the leds as milliseconds
int ledEvent[] = {0,    0,    0,    0,    0,   0,   0,  0,   0,    0};    // ID No of leds

int rxPin = 12;                                                           // Receiver pin
boolean ledState = false ;                                                // Variable to hold left led state
unsigned long rxPWMduration;                                              // Variable for reading receiver

int iCnt = 0;

Timer t;                                                                  // Instantiate the timer object

void setup() {
  for(iCnt = 0; iCnt < 10; iCnt++){
    pinMode(LED[iCnt], OUTPUT);
  }
}

void loop() {
  t.update();
  rxPWMduration = pulseIn(rxPin, HIGH);
  if (rxPWMduration > 1500) {
    if (ledState == false) {
      for(iCnt = 0; iCnt < 10; iCnt++) {
        ledEvent[iCnt] = t.oscillate(LED[iCnt], PERIOD[iCnt], HIGH);
      }
      ledState = true;
    }
  } else {
    if (ledState == true) {
      for(iCnt = 0; iCnt < 10; iCnt++) {
        t.stop(ledEvent[iCnt]);
      }
      ledState = false;
    }
  }
}

İlk mesajda da açıklamaya çalışmıştım aslında ama, Arduino'nun herhangi bir kartını kullanabilirsiniz. Test yada da geliştirme kartları, üzerinde daha rahat çalışabilmek için büyük boyutlular. Ama ufak kartlar ile özellikleri nerede ise aynı. Yukarıda önerdiğim kartın ise üzerinde, ufak boyuna rağmen USB portu var. Yani yeni kod yüklemek için sadece USB kablosu gerekiyor :).

--------------------------------------------------------------------------------------

Arduino alıp biraz üzerinde çalışılırsa, çok basit bir şekilde çok daha karmaşık devreler rahatlıkla gerçekleştirilebilir. Servo kullanmak her ne kadar pratik bir çözüm olsa da, Banggood'da alıncak 3 - 4 dolarlık bir arduino, 10 kanallı bir ışıklandırma sistemi için rahatlıkla bir kontrol kartı olarak kullanılabilir. Aşağıda Taranis ve Arduino ile 15 dakikada yapılabilen basit bir radyo kontrollü led flaşör devresi gözüküyor. Kodu yazmak da bu süreye dahil. Bu mesajı yazmak ise çok daha uzun sürdü.
Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol

Devre ise bu kadar basit. Toplamda 13 tane (bir tane kumanda sinyali girişi için, 2 tane USB için kullanıldığından aslında 10 tane) kullanılabilir pini var. Çıkışlarda direnç yerine bir önceki mesajımda belirttiğim akım ve güç kaynakları kullanılırsa, bu devre rahatlıkla Power ledler için de kullanılabilir.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Kod da bu. Timer kullanılarak çok karışık ışık desenleri yapılabilir ama bu kadar kısa sürede yazılan kod bu kadar oluyor :).
int sensePin = 5;
int ledPin = 4;
unsigned long duration;

void setup() {
pinMode(sensePin, INPUT);
pinMode(ledPin, OUTPUT);
}

void loop() {
duration = pulseIn(sensePin, HIGH);
if (duration > 1600) {
patternLed(200);
} else if (duration > 1400) {
patternLed(80);
} else {
patternLed(30);
}
}

void patternLed(int LedDelay) {
digitalWrite(ledPin, HIGH);
delay(LedDelay);
digitalWrite(ledPin, LOW);
delay(LedDelay);
}

Arduino olarak kullandım. Pro Mini'lerden biraz daha büyük olsa bile V8FR II alıcıdan daha ufak ve harici bir TTL USB dönüştürücüye ihtiyaç duymadığı için çok pratik.

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Son bir not olarak, APM, Multiwii, Naze32 gibi uçuş kontrol kartlarının temelinde Arduino olduğu için, işin elektronik ısmı ile ilgileniliyorsa Arduino öğrenmek, kendin yap tarzı projelerde çok fayda sağlayacaktır. Yukarıda da görüldüğü üzere tasarımı da aslında son derece kolaylaştıracaktır.
 
Arduino ile Navigasyon Işık Uygulaması

Çok teşekkürler, hemen geçiyorum! :halay: Yanına garnitür kabilinden eklenebilecek bir şey de varsa ekleyeyim!
 
Arduino ile Navigasyon Işık Uygulaması

Omer Erkan' Alıntı:
Çok teşekkürler, hemen geçiyorum! :halay: Yanına garnitür kabilinden eklenebilecek bir şey de varsa ekleyeyim!

Şu kabloların el altında bulunması faydalı oluyor.

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Şu da gece çalışırken lazım olabiliyor :lol:
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Almışken led de lazım :

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol
 
Arduino ile Navigasyon Işık Uygulaması

Zafer SAHIN' Alıntı:
...
Şu da gece çalışırken lazım olabiliyor :lol:
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol

Teşekkürler, diğerlerini ekliyorum. Ancak, ikinci kalem saat 22:00'ı geçtiği için sabaha kaldı! Mevcutlardan idare edeceğiz!... :lollol:
 
Arduino ile Navigasyon Işık Uygulaması

Ben ise siparişi verdim, sabırsızlıkla bekliyorum. Hele bir gelsin, bir tane led'i yakıp söndüreyim, siz görün bendeki keyfi! :) Şimdilik yazılanları anlamaya çalışıyorum. :-\
 
Arduino ile Navigasyon Işık Uygulaması

Omer Erkan' Alıntı:
Ben ise siparişi verdim, sabırsızlıkla bekliyorum. Hele bir gelsin, bir tane led'i yakıp söndüreyim, siz görün bendeki keyfi! :) Şimdilik yazılanları anlamaya çalışıyorum. :-\
Ömer bey, ilk kendi yaptığım yanıp sönen led'i kaç saat boyunca oturup izlediğimi, ne siz sorun ne de ben söyleyeyim :lollol:
 
Arduino ile Navigasyon Işık Uygulaması

Bu konuda Arduino ile yapılabilecek en basit LED uygulaması olmazsa olmaz diye düşünerek "Blink" isimli kodu tekrar bu konuda da hatırlatayım istedim. Saniyede bir yanıp sönen bu LED'i izlemeye doyamayacaksınız :lollol:

Bu yazıda kullanılan kart Arduino UNO R3'dür ama tüm kartlarda işlem nerede ise %100 aynıdır.

Şimdi ilk gerçek kodumuzu Arduino'ya gönderiyor olacağız. Bunu hazır yazmak yerine, Arduino IDE üzerindeki "File->Examples" menüsünden faydalanıyor olacağız. File->Examples->01.Basics->Blink kodunu yüklüyor olacağız.
Kod:
void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

Arduino kartların hemen hepsinde, 13. pine bağlı bir LED bulunmaktadır. Bu LED UNO R3 kartında da mevcuttur. Yukarıdaki kod, 13. pine bağlı ve kart üzerindeki bu LED ışığını, 1000 milisaniye aralıklarla yakıp söndürmektedir. Kodu adım adım incelersek...
Kod:
void setup() {
  pinMode(13, OUTPUT);
}

"void setup()" fonksiyonu, Arduino'nun çalışmaya başlaması esnasındaki ilk parametrelerin ayarlanması amacı ile kullanılmaktadır. "pinMode(13, OUTPUT)" komutu vasıtası ile, 13. pin, diital bir çıkış pini olarak atanmış olmaktadır. Arduino UNO R3 kartınıdaki pinlerin çıkış voltaj değeri 5 Volt'dur. "void setup()" fonksiyonunun çalışması biter bitmez(mikrosaniyeden daha kısa bir sürede) devreye giren "void loop()" fonksiyonu, sonsuz çalışan bir döngüdür.
Kod:
void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

"digitalWrite(13, HIGH)" komutu vasıtası ile, LED'in bağlı olduğu 13. pine 5V değeri uygulanmış oluyor, yani LED yakılıyor. "delay(1000)" komutu ile LED yanıyor durumda iken 1000 milisaniye bekleniyor. 1000 milisaniyenin sonunda çalışan "digitalWrite(13, LOW)" komutu ile LED'in bağlı olduğu 13. pine 0V değeri uygulanmış oluyor, yani LED söndürülüyor. Sonraki "delay(1000)" komutu ile LED sönük durumda iken tekrar 1000 milisaniye bekleniyor. 1000 milisaniyenin sonuda ise döngü baştan başlayarak, devamlı yanıp sönen bir LED elde edilmiş oluyor.

Yukarıdaki kod ile beraber kartın üzerindeki değil harici bir LED'de kullanılabilir. Bu durumda harici LED ışığını aşağıdaki gibi yerleştirmek gerekecektir.
Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Arduino'nun çıkışının 5V olduğunu belirtmiştik. Kırmızı ledler ise tipik olarak 2V voltaj düşümüne ve maksimum 20mA maksimum çalışma akımına sahiptir. Akımı sınırlamak ve güvende kalmak amacı ile 220Ohmluk bir direnç kullanırsak, direnç üzerinde düşecek gerilim değeri yaklaşık 3V (5V pin voltajı - 2V led voltaj düşümü = 3V) olacağından, led üzerinden de yaklaşık 14mA (3V / 220Ohm ~= 14mA) akım geçiyor olacaktır.

Yukarıdaki "Blink" kodunu Arduino UNO R3'e yükleyip çalıştırdığımız takdirde, saniyede bir yanan ve sönen bir LED devresi yapmış oluruz.
 
Arduino ile Navigasyon Işık Uygulaması

Henüz fişleri heceleme seviyesindeki arduino okur-yazarlığım ile yazmaya çalıştığım, iki kere çakan led flaşör kodu. Delay kullanmadan almak istediğim sonuç şu:
Kod:
void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
  digitalWrite(13, HIGH);
  delay(150);
  digitalWrite(13,LOW);
  delay(150);
  digitalWrite(13, HIGH);
  delay(150);
  digitalWrite(13,LOW);
  delay(1000);
}

Henüz becerebildiğim şu: (12-13 pinler arasında 100 ohm direnç vardır.)
Kod:
// constants won't change. Used here to 
// set pin numbers
const int buttonPin = 12;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
long interval = 0;              // interval at which to blink (milliseconds)
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
}


void loop() {
   // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
      interval = 150;
    }
    else {
      // if the current state is LOW then the button
      // wend from on to off:
      interval = 150; 
    }
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;

  
  
  if (buttonPushCounter % 2 == 0) {
    interval = 1000;
  } else {
   interval = 150;
  }
  
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

Bu kodda ilk çakış 150ms bekleme 150ms ama ikinci çakış 1000ms ve bekleme 1000ms oluyor. O ikinci çakışı kısaltamadım, uyku vakti geldi geçti. Bu halide fena olmadı aslında :D

Edit: Yani o kadar kod, araya direnç falan, bi şunun yaptığını yapamıyor. (Çözüyorum yavaştan.. :halay: )
Kod:
#include "Timer.h"
 
 
Timer t;
int ledpin = 13;
 
 
void setup()
{
  pinMode(ledpin, OUTPUT);  
  t.oscillate(ledpin, 150, LOW, 2);
  t.after(1500, LOW);
}
 
 
void loop()
{
  t.update();
}
 
Arduino ile Navigasyon Işık Uygulaması

Gecenin bu saatinde sen de kodlarla uğraştığına göre sen de olmuşsun tamamdır :laugh: :D
 
Arduino ile Navigasyon Işık Uygulaması

Abi boyle kodlarla ugrasmak falan gibi yazinca cok karizmatik durmus ama, aslinda yaptigim okuyup okuyup ne diyo bu yau diye anlamaya calismaktan ibaret :) tabi benim gordugum mars robotu gelistirmisim gibi, disardan gorunen iki kere yanan led :D
 
Arduino ile Navigasyon Işık Uygulaması

Emre Kaman' Alıntı:
Abi boyle kodlarla ugrasmak falan gibi yazinca cok karizmatik durmus ama, aslinda yaptigim okuyup okuyup ne diyo bu yau diye anlamaya calismaktan ibaret :) tabi benim gordugum mars robotu gelistirmisim gibi, disardan gorunen iki kere yanan led :D
Emre her şey 2 ledle başlıyor sonrasını yazmayayım [emoji9]