/* Uçuş alanında kullanılacak lövye sistemi için program
* Aileron A0
* Elevatör A1
* Throttle A2
* Rudder A3
*
* Aileron trim left D2
* Aileron trim right D3
* Elevatör trim down D4
* Elevatör trim up D5
* Rudder trim left D6
* Rudder trim right D7
* Throttle trim down D8
* Throttle trim up D9
*
* Kanal 5 D11
* Kanal 6 D12
*
* Throttle EPA Set butonu D13
*
* PPM çıkışı D10
*/
#include <EEPROM.h>
const int aileronin = 0;
const int elevatorin = 1;
const int throttlein = 2;
const int rudderin = 3;
const int PPMout = 10;
const int aileronleft = 2;
const int aileronright = 3;
const int elevatordown = 4;
const int elevatorup = 5;
const int rudderleft = 6;
const int rudderright = 7;
const int throttledown = 8;
const int throttleup = 9;
const int ch5in = 11;
const int ch6in = 12;
const int epabutton = 13;
unsigned long frame;
unsigned int aileron;
unsigned int elevator;
unsigned int throttle;
unsigned int rudder;
unsigned int ch5;
unsigned int ch6;
unsigned int epa1;
unsigned int epa2;
int epacount;
int ailerontrim;
int elevatortrim;
int throttletrim;
int ruddertrim;
byte keyread;
byte keyread1;
byte keyread2;
int resetcount = 0;
void setup()
{
for (int n = 2; n < 10; n++)
{
pinMode(n, INPUT_PULLUP);
}
pinMode(ch5in, INPUT_PULLUP);
pinMode(ch6in, INPUT_PULLUP);
pinMode(epabutton, INPUT_PULLUP);
pinMode(PPMout, OUTPUT);
digitalWrite(PPMout, HIGH);
frame = micros();
TCCR1A = 0;
TCCR1B = 2; // Timer 1 Clock prescaler 8
TIMSK1 = 0;
EEPROMread();
}
void loop()
{
frame = micros();
aileron = analogRead(aileronin);
aileron = analogRead(aileronin);
aileron = analogRead(aileronin);
aileron = 1000 + aileron + ailerontrim;
elevator = analogRead(elevatorin);
elevator = analogRead(elevatorin);
elevator = analogRead(elevatorin);
elevator = 1000 + elevator + elevatortrim;
throttle = analogRead(throttlein);
throttle = analogRead(throttlein);
throttle = analogRead(throttlein);
throttle = 1000 + throttle + throttletrim;
if(digitalRead(epabutton) == 1) throttle = map(throttle, 1000, 2000, epa1, epa2);
rudder = analogRead(rudderin);
rudder = analogRead(rudderin);
rudder = analogRead(rudderin);
rudder = 1000 + rudder + ruddertrim;
ch5 = 1000 + 1000 * digitalRead(ch5in);
ch6 = 1000 + 1000 * digitalRead(ch6in);
PPM();
while ((micros() - frame) < 25000);
keyread1 = PIND | B00000011;
keyread2 = PINB | B11111100;
keyread = keyread1 & B11111100;
keyread = keyread | (keyread2 & B00000011);
/* keyread1 PORT D'yi okuyor (digital 0 - 7)
* keyread2 PORT B'yi okuyor (digital 8 - 13)
* keyread2'deki iki LSBit daha sonra keyread'daki iki LSBit yerine aktarılıyor
* Böylece...
* keyread
* -------------------------------------------------
* I 7 I 6 I 5 I 4 I 3 I 2 I 1 I 0 I
* I Rud I Rud I Elv I Elv I Ail I Ail I Thr I Thr I
* I R I L I Up I Dn I R I L I Up I Dn I
* -------------------------------------------------
*/
keys();
if (digitalRead(epabutton) == 0)
{
epaset();
}
else
{
epacount = 0;
}
}
void PPM()
{
cli();
unsigned int x;
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
TCNT1 = 0;
digitalWrite(PPMout, HIGH);
x = aileron * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
TCNT1 = 0;
digitalWrite(PPMout, HIGH);
x = elevator * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
TCNT1 = 0;
digitalWrite(PPMout, HIGH);
x = throttle * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
TCNT1 = 0;
digitalWrite(PPMout, HIGH);
x = rudder * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
digitalWrite(PPMout, HIGH);
x = ch5 * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
digitalWrite(PPMout, HIGH);
x = ch6 * 2;
while (TCNT1 < x);
digitalWrite(PPMout, LOW);
TCNT1 = 0;
while(TCNT1 < 300);
digitalWrite(PPMout, HIGH);
sei();
}
void EEPROMread()
{
/* Trim değeri - 200 ile + 200 arasında
* Her bir trim değerine 250 ekleyerek her zaman artı değerde olmasını sağlıyoruz
* ve EEPROM'a o şekilde kaydediyoruz
* Aileron 0, 1 MSB, LSB
* Elevator 2, 3 MSB, LSB
* Throttle 4, 5 MSB, LSB
* Rudder 6, 7 MSB, LSB
* epa1 8, 9 MSB, LSB
* epa2 10, 11 MSB, LSB
*/
unsigned int x;
x = 256 * EEPROM.read(0) + EEPROM.read(1);
ailerontrim = x - 250;
x = 256 * EEPROM.read(2) + EEPROM.read(3);
elevatortrim = x - 250;
x = 256 * EEPROM.read(4) + EEPROM.read(5);
throttletrim = x - 250;
x = 256 * EEPROM.read(6) + EEPROM.read(7);
ruddertrim = x - 250;
epa1 = 256 * EEPROM.read(:coolxf: + EEPROM.read(9);
epa2 = 256 * EEPROM.read(10) + EEPROM.read(11);
}
void EEPROMwrite()
{
/* Trim değeri - 200 ile + 200 arasında
* Her bir trim değerine 250 ekleyerek her zaman artı değerde olmasını sağlıyoruz
* ve EEPROM'a o şekilde kaydediyoruz
* Aileron 0, 1 MSB, LSB
* Elevator 2, 3 MSB, LSB
* Throttle 4, 5 MSB, LSB
* Rudder 6, 7 MSB, LSB
*/
unsigned int x;
byte m;
byte l;
x = ailerontrim + 250;
m = x / 256;
l = x % 256;
EEPROM.write(0, m);
EEPROM.write(1, l);
x = elevatortrim + 250;
m = x / 256;
l = x % 256;
EEPROM.write(2, m);
EEPROM.write(3, l);
x = throttletrim + 250;
m = x / 256;
l = x % 256;
EEPROM.write(4, m);
EEPROM.write(5, l);
x = ruddertrim + 250;
m = x / 256;
l = x % 256;
EEPROM.write(6, m);
EEPROM.write(7, l);
}
void resettrims()
{
resetcount++;
if (resetcount > 100) // Throttle up ve elevator down 2 saniyeden fazla basılı tutulduysa...
{
ailerontrim = 0;
elevatortrim = 0;
throttletrim = 0;
ruddertrim = 0;
EEPROMwrite();
resetcount = 0;
EEPROM.write(8, 5);
EEPROM.write(9, 100);
EEPROM.write(10, 6);
EEPROM.write(11, 100);
}
}
void keys()
{
if (keyread < 255)
{
/* 2 saniye boyunca Elevator down ve throttle up trimi
* basılı tutulursa trimler resetleniyor
* Bu süreyi resetcount değişkeni tutuyor ve resettrims()
* altprogramında güncellenip 100'ü geçince
* reset işlemi uygulanıyor
*/
if (keyread == B11101101)
{
resettrims();
return;
}
resetcount = 0;
if ((keyread & B00000001) == 0) throttletrim--;
if ((keyread & B00000010) == 0) throttletrim++;
if ((keyread & B00000100) == 0) ailerontrim--;
if ((keyread & B00001000) == 0) ailerontrim++;
if ((keyread & B00010000) == 0) elevatortrim--;
if ((keyread & B00100000) == 0) elevatortrim++;
if ((keyread & B01000000) == 0) ruddertrim--;
if ((keyread & B10000000) == 0) ruddertrim++;
if (throttletrim < -200) throttletrim = -200;
if (throttletrim > 200) throttletrim = 200;
if (ailerontrim < -200) ailerontrim = -200;
if (ailerontrim > 200) ailerontrim = 200;
if (elevatortrim < -200) elevatortrim = -200;
if (elevatortrim > 200) elevatortrim = 200;
if (ruddertrim < -200) ruddertrim = -200;
if (ruddertrim > 200) ruddertrim = 200;
EEPROMwrite();
}
}
void epaset()
{
/* Eğer throttle butonu yakınına yerleştirilecek olan
* butona üç saniyeden fazla dasılı tutulursa
* throttle kolunun konumuna göre o anki throttle değeri epa olarak
* set ediliyor. Bunu her yeni model için alt epa ve üst epa olarak
* iki kez yapmak gerekiyor.
* Değer set edildiğinde EEPROM'a da yazılıyor
*/
int m;
int l;
epacount++;
if (epacount > 150)
{
epacount = 0;
throttle = analogRead(throttlein);
throttle = analogRead(throttlein);
throttle = 1000 + analogRead(throttlein);
if (throttle > 1600) epa2 = throttle;
if (throttle < 1400) epa1 = throttle;
m = epa1 / 256;
l = epa1 % 256;
EEPROM.write(8, m);
EEPROM.write(9, l);
m = epa2 / 256;
l = epa2 % 256;
EEPROM.write(8, m);
EEPROM.write(9, l);
}
}