#include <MsTimer2.h>
#include <EEPROM.h>
const byte servoin = 3;
const byte servo1 = 6;
const byte servo2 = 5;
const byte servo3 = 4;
const byte mode1 = 14;
const byte mode2 = 15;
const byte increase = 16;
const byte decrease = 17;
const byte centerLED = 12;
const byte epa1LED = 11;
const byte epa2LED = 10;
const byte servo1LED = 9;
const byte servo2LED = 8;
const byte servo3LED = 7;
volatile unsigned int servoinPWM = 1500;
volatile unsigned int servo1PWM = 1500;
volatile unsigned int servo2PWM = 1500;
volatile unsigned int servo3PWM = 1500;
long x;
volatile byte progflag = 0;
volatile byte keyflag = 0;
byte eepromerror = 0;
byte hibyte;
byte lobyte;
unsigned long timer;
int servo1cnt;
unsigned int servo1epa1;
unsigned int servo1epa2;
int servo2cnt;
unsigned int servo2epa1;
unsigned int servo2epa2;
int servo3cnt;
unsigned int servo3epa1;
unsigned int servo3epa2;
void setup()
{
pinMode(mode1, INPUT_PULLUP);
pinMode(mode2, INPUT_PULLUP);
pinMode(increase, INPUT_PULLUP);
pinMode(decrease, INPUT_PULLUP);
pinMode(centerLED, OUTPUT);
pinMode(epa1LED, OUTPUT);
pinMode(epa2LED, OUTPUT);
pinMode(servo1LED, OUTPUT);
pinMode(servo2LED, OUTPUT);
pinMode(servo3LED, OUTPUT);
pinMode(servo1, OUTPUT);
pinMode(servo2, OUTPUT);
pinMode(servo3, OUTPUT);
if (digitalRead(mode1) != digitalRead(mode2))
{
keyflag = 1;
}
delay(100);
if (digitalRead(mode1) != digitalRead(mode2))
{
progflag = 1;
keyflag = 0;
}
EEPROMtest();
if (eepromerror > 0) // EEPROM hatasında servo LED'lerini yakıp söndürerek beklemede kalıyoruz. Programa girmiyoruz. Güç kesilene kadar böyle devam.
{
while (eepromerror > 0)
{
digitalWrite(servo1, HIGH);
digitalWrite(servo2, HIGH);
digitalWrite(servo3, HIGH);
delay(300);
digitalWrite(servo1, LOW);
digitalWrite(servo2, LOW);
digitalWrite(servo3, LOW);
delay(300);
}
}
EEPROMoku();
if (progflag == 0)
{
MsTimer2::set(20, servoout);
MsTimer2::start();
}
}
void loop()
{
if (progflag == 0)
{
normal();
}
else
{
progmode();
}
}
void normal() // Programlama modunda değilsek loop()'tan sürekli bu işlev çağrılıyor
{
servoinPWM = pulseIn(servoin, HIGH, 21000); //Alıcıdan sinyali mikrosaniye olarak okuyoruz
x = servoinPWM - 1500; // x -700 ile + 700 arasında bir değer alıyor
if (x < 0)
{
servo1PWM = 1500 - ((x * servo1epa1) / 700) + servo1cnt; //Servo1 için çıkış değeri oluşturuluyor
servo2PWM = 1500 - ((x * servo2epa1) / 700) + servo2cnt; //Servo2 için çıkış değeri oluşturuluyor
servo3PWM = 1500 - ((x * servo3epa1) / 700) + servo3cnt; //Servo3 için çıkış değeri oluşturuluyor
}
else
{
servo1PWM = ((x * servo1epa2) / 700) + 1500 + servo1cnt; //Servo1 için çıkış değeri oluşturuluyor
servo2PWM = ((x * servo2epa2) / 700) + 1500 + servo2cnt; //Servo2 için çıkış değeri oluşturuluyor
servo3PWM = ((x * servo3epa2) / 700) + 1500 + servo3cnt; //Servo3 için çıkış değeri oluşturuluyor
}
}
void progmode() // Programlama modunda isek loop()'tan sürekli bu çağrılıyor
{
int servosira = 1; // 1 No'lu servo ile başlıyoruz
int islevsira = 1; // Center modu ile başlıyoruz. 1: Center, 2: Alt EPA, 3: Üst EPA
int pressedkey = 0; // 0: Key yok, 1: Mode1(servo), 2: Mode2(işlev), 3: Decrease, 4: Increase, 5: Exit
while (pressedkey < 5)
{
switch (islevsira)
{
case 1:
servo1PWM = 1500 + servo1cnt;
servo2PWM = 1500 + servo2cnt;
servo3PWM = 1500 + servo3cnt;
break;
case 2:
servo1PWM = 1500 + servo1cnt - servo1epa1;
servo2PWM = 1500 + servo2cnt - servo2epa1;
servo3PWM = 1500 + servo3cnt - servo3epa1;
break;
case 3:
servo1PWM = 1500 + servo1cnt - servo1epa2;
servo2PWM = 1500 + servo2cnt - servo2epa2;
servo3PWM = 1500 + servo3cnt - servo3epa2;
break;
}
switch (servosira)
{
case 1:
servo1out();
break;
case 2:
servo2out();
break;
case 3:
servo3out();
break;
}
pressedkey = keypress();
switch (pressedkey)
{
case 1:
servosira++;
if (servosira > 3)
{
servosira = 1;
}
break;
case 2:
islevsira++;
if (islevsira > 3)
{
islevsira = 1;
}
break;
case 3: // Burada o an seçili olan parametreyi bir azaltacağız. Range check yapıp düzelteceğiz.
if (servosira == 1)
{
if (islevsira == 1)
{
servo1cnt--;
if (servo1cnt < (-700))
{
servo1cnt = -700;
}
}
if (islevsira == 2)
{
servo1epa1--;
if (servo1epa1 < 1)
{
servo1epa1 = 1;
}
}
if (islevsira == 2)
{
servo1epa2--;
if (servo1epa2 < 1)
{
servo1epa2 = 1;
}
}
}
if (servosira == 2)
{
if (islevsira == 1)
{
servo1cnt--;
if (servo2cnt < (-700))
{
servo2cnt = -700;
}
}
if (islevsira == 2)
{
servo2epa1--;
if (servo2epa1 < 1)
{
servo2epa1 = 1;
}
}
if (islevsira == 2)
{
servo2epa2--;
if (servo2epa2 < 1)
{
servo2epa2 = 1;
}
}
}
if (servosira == 3)
{
if (islevsira == 1)
{
servo3cnt--;
if (servo3cnt < (-700))
{
servo3cnt = -700;
}
}
if (islevsira == 2)
{
servo3epa1--;
if (servo3epa1 < 1)
{
servo3epa1 = 1;
}
}
if (islevsira == 2)
{
servo3epa2--;
if (servo3epa2 < 1)
{
servo3epa2 = 1;
}
}
}
break;
case 4: // Burada o an seçili olan parametreyi bir artıracağız. Range check yapıp düzelteceğiz.
if (servosira == 1)
{
if (islevsira == 1)
{
servo1cnt++;
if (servo1cnt > 700)
{
servo1cnt = 700;
}
}
if (islevsira == 2)
{
servo1epa1++;
if (servo1epa1 > 700)
{
servo1epa1 = 700;
}
}
if (islevsira == 2)
{
servo1epa2++;
if (servo1epa2 > 700)
{
servo1epa2 = 700;
}
}
}
if (servosira == 2)
{
if (islevsira == 1)
{
servo1cnt++;
if (servo2cnt > 700)
{
servo2cnt = 700;
}
}
if (islevsira == 2)
{
servo2epa1++;
if (servo2epa1 > 700)
{
servo2epa1 = 700;
}
}
if (islevsira == 2)
{
servo2epa2++;
if (servo2epa2 > 700)
{
servo2epa2 = 700;
}
}
}
if (servosira == 3)
{
if (islevsira == 1)
{
servo3cnt++;
if (servo3cnt > 700)
{
servo3cnt = 700;
}
}
if (islevsira == 2)
{
servo3epa1++;
if (servo3epa1 > 700)
{
servo3epa1 = 700;
}
}
if (islevsira == 2)
{
servo3epa2++;
if (servo3epa2 > 700)
{
servo3epa2 = 700;
}
}
}
break;
}
if (pressedkey != 0);
{
digitalWrite(centerLED, LOW);
digitalWrite(epa1LED, LOW);
digitalWrite(epa2LED, LOW);
digitalWrite(servo1LED, LOW);
digitalWrite(servo2LED, LOW);
digitalWrite(servo3LED, LOW);
switch (servosira)
{
case 1:
digitalWrite(servo1LED, HIGH);
break;
case 2:
digitalWrite(servo2LED, HIGH);
break;
case 3:
digitalWrite(servo3LED, HIGH);
break;
}
switch (islevsira)
{
case 1:
digitalWrite(centerLED, HIGH);
break;
case 2:
digitalWrite(epa1LED, HIGH);
break;
case 3:
digitalWrite(epa2LED, HIGH);
break;
}
}
}
EEPROMyaz();
while (1 == 1) // Burada artık programı kilitliyoruz. Servo LED'leri hızlı yanıp sönüyorlar. Artık programlama bitti. Sistemin resetlenmesi gerekiyor.
{
digitalWrite(servo1, HIGH);
digitalWrite(servo2, HIGH);
digitalWrite(servo3, HIGH);
delay(100);
digitalWrite(servo1, LOW);
digitalWrite(servo2, LOW);
digitalWrite(servo3, LOW);
delay(100);
}
}
int keypress() // 0: Geçerli tuş yok. 1: Mode1. 2: Mode2. 3: Decrease. 4: Increase. 5: Done.
{
}
void EEPROMoku()
{
servo1cnt = EEPROM.read(1) + 256 * EEPROM.read(0);
servo1epa1 = EEPROM.read(3) + 256 * EEPROM.read(2);
servo1epa2 = EEPROM.read(5) + 256 * EEPROM.read(4);
servo2cnt = EEPROM.read(7) + 256 * EEPROM.read(6);
servo2epa1 = EEPROM.read(9) + 256 * EEPROM.read(:coolxf:;
servo2epa2 = EEPROM.read(11) + 256 * EEPROM.read(10);
servo3cnt = EEPROM.read(13) + 256 * EEPROM.read(12);
servo3epa1 = EEPROM.read(15) + 256 * EEPROM.read(14);
servo3epa2 = EEPROM.read(17) + 256 * EEPROM.read(16);
}
void EEPROMyaz()
{
hibyte = servo1cnt / 256;
lobyte = servo1cnt - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo1epa1 / 256;
lobyte = servo1epa1 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo1epa2 / 256;
lobyte = servo1epa2 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo2cnt / 256;
lobyte = servo2cnt - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo2epa1 / 256;
lobyte = servo2epa1 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo2epa2 / 256;
lobyte = servo2epa2 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo3cnt / 256;
lobyte = servo3cnt - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo3epa1 / 256;
lobyte = servo3epa1 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
hibyte = servo3epa2 / 256;
lobyte = servo3epa2 - 256 * hibyte;
EEPROM.write(0, hibyte);
EEPROM.write(1, lobyte);
}
void EEPROMtest() // EEPROM testi yapılıp flag ile sonuç bildiriliyor
{
eepromerror = 0;
unsigned int a[18];
unsigned long b = 0;
unsigned int temp;
for (int i = 0; i < 18; i++)
{
a[i] = EEPROM.read(i);
b = b + a[i];
}
if (b == 4590)
{
temp = EEPROM.read(0);
EEPROM.write(0, 0);
if (EEPROM.read(0) != 0)
{
eepromerror = 1;
}
EEPROM.write(0, temp);
}
}
void servoout() // MsTimer2 üzerinden interruptlarla her 20 mS'de bir çağrılıyor ve yaklaşık 3 - 6 mS sürüyor
{
timer = micros();
digitalWrite(servo1, HIGH);
while ((micros() - timer) < servo1PWM)
{
}
digitalWrite(servo1, LOW);
timer = micros();
digitalWrite(servo2, HIGH);
while ((micros() - timer) < servo2PWM)
{
}
digitalWrite(servo2, LOW);
timer = micros();
digitalWrite(servo3, HIGH);
while ((micros() - timer) < servo3PWM)
{
}
digitalWrite(servo3, LOW);
}
void servo1out()
{
timer = micros();
digitalWrite(servo1, HIGH);
while ((micros() - timer) < servo1PWM)
{
}
digitalWrite(servo1, LOW);
while ((micros() - timer) < 20000)
{
}
}
void servo2out()
{
timer = micros();
digitalWrite(servo2, HIGH);
while ((micros() - timer) < servo2PWM)
{
}
digitalWrite(servo2, LOW);
while ((micros() - timer) < 20000)
{
}
}
void servo3out()
{
timer = micros();
digitalWrite(servo3, HIGH);
while ((micros() - timer) < servo3PWM)
{
}
digitalWrite(servo3, LOW);
while ((micros() - timer) < 20000)
{
}
}