int rxPin = 12; //Alıcı sinyali 12 nolu pinde
int motor_l1 = 6; // Sol retract motoru 6 ve 8 nolu pinlerde
int motor_l2 = 8;
int motor_r1 = 2; // Sağ retract motoru 2 ve 4 nolu pinlerde
int motor_r2 = 4;
int sensor_l = 1; // Sol akım sensörü 1 nolu analog girişte
int cur_l = 0; // Sol akım
int sensor_r = 3; // Sağ akım sensörü 3 nolu analog girişte
int cur_r = 0; // Sağ akım
int ret_com = 1; // Retract komutu Açık = 1 Kapalı = 0
int ret_pos = 1; // Aktüel retract pozisyonu Açık = 1, Kapalı = 0
int rxPWM = 0; //Alıcı sinyalini depolayan değişken
int x = 1; //Motor akım kontrolünde kullanılacak değişiken
int mincurl = 0; // Azami akımda sensör değeri.
int mincurr = 0;// Azami akımda sensör değeri.
unsigned long timer; // Timeout timer işlevi için
int mincurpinl = 1; // Sol ayar trimpotu
int mincurpinr = 0; // Sağ ayar trimpotu
void setup()
{
pinMode(motor_l1, OUTPUT);
pinMode(motor_l2, OUTPUT);
pinMode(motor_r1, OUTPUT);
pinMode(motor_r2, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(motor_l1, LOW);
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r1, LOW);
digitalWrite(motor_r2, LOW);
digitalWrite(13, LOW);
rxPWM = pulseIn(rxPin, HIGH, 25000);
while(rxPWM < 800 || rxPWM > 2200) // Burada geçerli bir alıcı sinyali bekliyoruz
{
rxPWM = pulseIn(rxPin, HIGH, 25000);
}
if(rxPWM < 1500)
{
ret_com = 0; // PWM 1.5 ms altında retract kapalı komutu
}
else
{
ret_com = 1; // PWM 1.5 ms üstünde retract açık komutu
}
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
}
void loop()
{
digitalWrite(motor_l1, LOW);
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r1, LOW);
digitalWrite(motor_r2, LOW);
rxPWM = pulseIn(rxPin, HIGH, 25000); // Kumanda sinyalini oku ve yorumla
if(rxPWM < 1500) // Eğer rxPWM 1500'den küçükse kapat komutu geldi demektir yoksa açık komutu geldi demektir
{
ret_com = 0; // PWM 1.5 ms altında retract kapalı komutu
}
else
{
ret_com = 1; // PWM 1.5 ms üstünde retract açık komutu
}
if(ret_com == 0 && ret_pos == 1) // Eğer retract açık konumdaysa ve kapat komutu geldiyse retractlar kapatılacak
{
RetractClose();
}
else if(ret_com == 1 && ret_pos == 0) // Eğer retract kapalı konumdaysa ve aç komutu geldiyse retractlar açılacak
{
RetractOpen();
}
}
void RetractOpen() //Retractı açan subroutine
{
digitalWrite(13, HIGH);
digitalWrite(motor_l1, HIGH); // Retract motorları açma yönünde enerjilendirildi
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r1, HIGH); // Retract motorları açma yönünde enerjilendirildi
digitalWrite(motor_r2, LOW);
x = 0;
delay(250);
timer = millis();
while(x < 2)
{
mincurl = analogRead(mincurpinl);
mincurr = analogRead(mincurpinr);
mincurl = 400 + mincurl / 10;
mincurr = 400 + mincurr / 10;
rxPWM = pulseIn(rxPin, HIGH, 25000);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l < mincurl)
{
digitalWrite(motor_l1, LOW);
x = x + 1;
}
if(cur_r < mincurr)
{
digitalWrite(motor_r1, LOW);
x = x + 1;
}
if(rxPWM < 1500)
{
digitalWrite(motor_l1, LOW);
digitalWrite(motor_r1, LOW);
x = 2;
}
if((millis() - timer) > 20000)
{
break;
}
}
digitalWrite(13, LOW);
digitalWrite(motor_l1, LOW);
digitalWrite(motor_r1, LOW);
ret_pos = 1; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
// Bu subroutine'den geri döndüğümüzde eğer akım aşılmış ise ret_pos ve ret_com aynı olacak. Alıcı sinyali değiştiyse farklı olacak. Dolayısıyla program hemen diğer subroutine'i çağıracak.
}
void RetractClose() //Retractı kapatan subroutine
{
digitalWrite(13, HIGH);
digitalWrite(motor_l1, LOW); // Retract motorları açma yönünde enerjilendirildi
digitalWrite(motor_l2, HIGH);
digitalWrite(motor_r1, LOW); // Retract motorları açma yönünde enerjilendirildi
digitalWrite(motor_r2, HIGH);
x = 0;
delay(250);
timer = millis();
while(x < 2)
{
mincurl = analogRead(mincurpinl);
mincurr = analogRead(mincurpinr);
mincurl = 400 + mincurl / 10;
mincurr = 400 + mincurr / 10;
rxPWM = pulseIn(rxPin, HIGH, 25000);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l < mincurl)
{
digitalWrite(motor_l2, LOW);
x = x + 1;
}
if(cur_r < mincurr)
{
digitalWrite(motor_r2, LOW);
x = x + 1;
}
if(rxPWM >= 1500)
{
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r2, LOW);
x = 2;
}
if((millis() - timer) > 20000)
{
break;
}
}
digitalWrite(13, LOW);
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r2, LOW);
ret_pos = 0; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
// Bu subroutine'den geri döndüğümüzde eğer akım aşılmış ise ret_pos ve ret_com aynı olacak. Alıcı sinyali değiştiyse farklı olacak. Dolayısıyla program hemen diğer subroutine'i çağıracak.
}