Zafer ŞAHİN
Mahna Mahna ...
Arduino ile Navigasyon Işık Uygulaması
Sümer bey, strobe ledleri yüksek akım ile süreceğiniz belirtmişsiniz ama gözün parlaklı algısı lineer değil logaritmiktir (bir doktora söylenecek bir laf değil ama ). Yani LED akımını iki katına çıkarsanız bile göz onu iki kat parlaklaşmış olarak algılamaz. Nacizane, akımı yukseltmenin cok da faydalı olmayacağını düşünüyorum. Bir de ukalalık olarak almazsanız kodunuzu sizin stilinize bağlı kalarak yazsam hemen hemen şu şekilde yazardım.
Multitasking davranışını taklit etmek için kullanılan SimpleTimer, Timer, Metro v.b. bir çok kütüphane var aslında, ki özellikle Soft Timer kütüphanesini Scheduler'e pek benzer bulacaksınız. Ama arduino tarafından sağlanan saatin çok hassas olmamasından kaynaklı olarak, zaman içerisinde kayma yaşanabiliyor. Yani Soft Timer ile, birisi 100 diğeri 200ms sonra çalışan 2 loop tanımladınız. Bir kaç dakika sonra loop'ların zaman değerlerinin örtüşmemeye başladığını farkedeceksiniz. Ama kütüphanenin BlinkTask diye bir özelliği var ki evlere şenlik.
Sümer bey, strobe ledleri yüksek akım ile süreceğiniz belirtmişsiniz ama gözün parlaklı algısı lineer değil logaritmiktir (bir doktora söylenecek bir laf değil ama ). Yani LED akımını iki katına çıkarsanız bile göz onu iki kat parlaklaşmış olarak algılamaz. Nacizane, akımı yukseltmenin cok da faydalı olmayacağını düşünüyorum. Bir de ukalalık olarak almazsanız kodunuzu sizin stilinize bağlı kalarak yazsam hemen hemen şu şekilde yazardım.
Bu LİNKİ görmek için izniniz yok. Giriş yap veya üye ol
Kod:
/* Uçak ışıklandırma sistemi projesi. Her iki kanat ucunda birer navigasyon lambası (solda kırmızı sağda yeşil).
Kanat uçlarında birer beyaz strobe light. Gövdenin altında kırmızı strobe light. Dikey stabun tepesinde kırmızı beacon.
V03'teki değişiklik, rxpwm sinyalinin interruptlar ile okunuyor oluşu. */
#include <MsTimer2.h>
int nav1 = 2; // Sol kanat ucu, kırmızı NAV light
int nav2 = 3; // Sağ kanat ucu yeşil NAV light
int strobe1 = 4; // Sol kanat ucu beyaz strobe light
int strobe2 = 5; // Sağ kanat ucu beyaz strobe light
int strobe3 = 6; // Gövde altı kırmızı strobe light
int beacon = 10; // Dikey stab ucu kırmızı beacon LED. PWM çıkışlı uç olmalı.
int rxpin = 8; // Alıcıdan gelen kontrol sinyali girişi
int rxflag = 0; // chkrx altprogramında beklemeyi engellemek için flag
int rxpwm = 0;
int mode = 0; // 0: LED'ler OFF. 1: NAV. 2: Beacon. 4: Strobe => NAV + Beacon + Strobe = 1 + 2 + 4 = 7
int beaconvalue = 33; // Beacon için minimum ışık düzeyi
int beaconstep1 = 11; // Beacon adımı
int beaconstep2 = 37;
int yon = 1; // Beacon artış azalış değişkeni. 1 ya da -1
int rxyon = 1;
int strobetiming; // Şu an için kullanılmıyor
unsigned long timer; // Genel zamanlama değişkeni
void setup () {
// Serial.begin(9600);
pinMode(nav1, OUTPUT);
pinMode(nav2, OUTPUT);
pinMode(strobe1, OUTPUT);
pinMode(strobe2, OUTPUT);
pinMode(strobe3, OUTPUT);
//pinMode(beacon, OUTPUT); //analogWrite için OUTPUT tanımlamaya gerek yok.
MsTimer2::set(90, beaconwrite);
MsTimer2::start();
}
void loop() {
// Serial.println(mode);
switch (mode) {
case 1: // NAV = 1
navs_on();
break;
case 2: // Beacon = 2
mode = mode + 1; // Sadece beacon kullanılmıyor, dolayisi ile bir ust mode seviyesine gec, bunu da ilerisi icin hazir tut
break;
case 3: // NAV + Beacon = 1 + 2 = 3
navs_on();
break;
case 4: // Strobe = 4
mode = mode + 1; // Sadece Strobe kullanılmıyor, dolayisi ile bir ust mode seviyesine gec, bunu da ilerisi icin hazir tut
break;
case 5: // NAV + Strobe = 1 + 4 = 5
mode = mode + 1; // NAV + Strobe kullanılmıyor, dolayisi ile bir ust mode seviyesine gec, bunu da ilerisi icin hazir tut
break;
case 6: // Beacon + Strobe = 2 + 4 = 6
mode = mode + 1; // Beacon + Strobe kullanılmıyor, dolayisi ile bir ust mode seviyesine gec, bunu da ilerisi icin hazir tut
break;
case 7: // NAV + Beacon + Strobe = 1 + 2 + 4 = 7
navs_on();
strobeon();
break;
default: // LEDs off
switchoff();
}
}
void switchoff() { // Tüm LED'leri kapatan altprogram
digitalWrite(nav1, LOW);
digitalWrite(nav2, LOW);
digitalWrite(strobe1, LOW);
digitalWrite(strobe2, LOW);
digitalWrite(strobe3, LOW);
//digitalWrite(beacon, LOW); // PWM kullanılacaksa, karisiklik olmaması icin digital write kullanilmamali
analogWrite(beacon, 0);
}
void chkrx() { // Alıcı sinyaline göre mode değişkenini düzenleyen altprogram
rxpwm = pulseIn(rxpin, HIGH);
if(rxpwm < 1500) {
rxflag = 1;
} else if(rxpwm >= 1500 && rxflag == 0) {
return;
} else if(rxpwm >= 1500 && rxflag == 1) {
rxflag = 0;
mode = mode + 1;
if(mode > 7) {
mode = 0;
}
}
}
void navs_on() { // NAV isiklarini ac
digitalWrite(nav1, HIGH);
digitalWrite(nav2, HIGH);
}
void beaconwrite() { // Beacon LED2ine analog çıkış veren ve her seferinde parlaklığı bir artıran ya da azaltan altprogram
chkrx();
// if(mode == 0);
// {
// switchoff();
// return;
// }
if((mode == 1) || (mode == 4) || (mode == 5)) {
analogWrite(beacon, 0); // PWM icin digitalWrite yerine analogWrite kullanilmali, kodun butunlugu icin heryerde ayni olmali
return;
}
if((mode == 2) || (mode == 3) || (mode == 6) || (mode == 7)) {
analogWrite(beacon, beaconvalue);
beaconvalue = beaconvalue + (yon * 34);
if(beaconvalue >= 255) {
yon = yon * (-1);
beaconvalue = 255;
} else if(beaconvalue < 10) {
yon = yon * (-1);
beaconvalue = 10;
}
}
}
void strobeon() {
int z = 0;
digitalWrite(strobe1, HIGH);
digitalWrite(strobe2, HIGH);
delay(60);
digitalWrite(strobe1, LOW);
digitalWrite(strobe2, LOW);
delay(60);
digitalWrite(strobe1, HIGH);
digitalWrite(strobe2, HIGH);
delay(60);
digitalWrite(strobe1, LOW);
digitalWrite(strobe2, LOW);
delay(60);
digitalWrite(strobe1, HIGH);
digitalWrite(strobe2, HIGH);
delay(60);
digitalWrite(strobe1, LOW);
digitalWrite(strobe2, LOW);
delay(60);
digitalWrite(strobe3, HIGH);
delay(60);
digitalWrite(strobe3, LOW);
delay(180);
digitalWrite(strobe3, HIGH);
delay(60);
digitalWrite(strobe3, LOW);
delay(380);
}
Multitasking davranışını taklit etmek için kullanılan SimpleTimer, Timer, Metro v.b. bir çok kütüphane var aslında, ki özellikle Soft Timer kütüphanesini Scheduler'e pek benzer bulacaksınız. Ama arduino tarafından sağlanan saatin çok hassas olmamasından kaynaklı olarak, zaman içerisinde kayma yaşanabiliyor. Yani Soft Timer ile, birisi 100 diğeri 200ms sonra çalışan 2 loop tanımladınız. Bir kaç dakika sonra loop'ların zaman değerlerinin örtüşmemeye başladığını farkedeceksiniz. Ama kütüphanenin BlinkTask diye bir özelliği var ki evlere şenlik.
Bu LİNKİ görmek için izniniz yok. Giriş yap veya üye ol
Kod:
#include <SoftTimer.h>
#include <BlinkTask.h>
#define LED_YLW 12
#define LED_BLU 11
#define LED_GRN 10
#define LED_RED 9
#define LED_WHI 8
BlinkTask hb_ylw(LED_YLW, 150, 50, 3, 1150); // 150 ms acik, 50ms kapali, 3 defa tekrar et, 1150ms bekle sonra bastan basla
BlinkTask hb_blu(LED_BLU, 50, 50, 4, 1500);
BlinkTask hb_grn(LED_GRN, 20, 20, 10, 200);
BlinkTask hb_red(LED_RED, 100, 500, 2, 1000);
BlinkTask hb_whi(LED_WHI, 500, 200, 2, 1000);
void setup() {
hb_ylw.start();
hb_blu.start();
hb_grn.start();
hb_red.start();
hb_whi.start();
}