int rxPin = 12; //Alıcı sinyali 12 nolu pinde
int motor_l1 = 3; // Sol retract motoru 3 ve 4 nolu pinlerde
int motor_l2 = 4;
int motor_r1 = 5; // Sağ retract motoru 5 ve 6 nolu pinlerde
int motor_r2 = 6;
int sensor_l = 1; // Sol akım sensörü 1 nolu analog girişte
int cur_l = 0; // Sol akım
int sensor_r = 2; // Sağ akım sensörü 2 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 mincur = 420; // Azami negatif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
int normcur = 470; // Beklenen normal pozitif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
// Geçici değişkenler. Akım kontrolü devreye girince iptal edilecekler.
int senspin = 10; // Buton 10 numaralı digital girişe bağlı
int sense = 1; // Butona basıldığında LOW olan değişken
void setup()
{
Serial.begin(9600);
pinMode(motor_l1, OUTPUT);
pinMode(motor_l2, OUTPUT);
pinMode(motor_r1, OUTPUT);
pinMode(motor_r2, OUTPUT);
digitalWrite(motor_l1, LOW);
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r1, LOW);
digitalWrite(motor_r2, LOW);
pinMode(senspin, INPUT); // Akım kontrolü devreye girince iptal edilecek.
rxPWM = pulseIn(rxPin, HIGH, 25000);
while(rxPWM < 800 || rxPWM > 2200) // Burada valid 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
}
// Serial.print("RET COM = ");
// Serial.print(ret_com);
// Serial.print(" RET POS = ");
// Serial.println(ret_pos);
// Serial.println("Setup tamam loopa gidiyoruz");
}
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
}
// Serial.print("Ret_Com = ");
// Serial.print(ret_com);
// Serial.print(" Ret_Pos = ");
// Serial.println(ret_pos);
if(ret_com == 0 && ret_pos == 1) // Eğer retract açık konumdaysa ve kapat komutu geldiyse retractlar kapatılacak
{
Serial.println("Kapatmaya gidiyoruz");
RetractClose();
}
else if(ret_com == 1 && ret_pos == 0) // Eğer retract kapalı konumdaysa ve aç komutu geldiyse retractlar açılacak
{
Serial.println("Açmaya gidiyoruz");
RetractOpen();
}
// Retract komutu ile retract pozisyonu aynı ise herhangi bir şey yapılmadan loop'a devam edilecek
}
void RetractOpen() //Retractı açan subroutine
{
Serial.println("Retract Open");
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 = 1;
delay(250);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l > normcur) // Beklenen normal akım çekilmezse o kanalda retract bağlı olmayabilir. x değişkeni bir artırılır yani o kanalın işi bitti varsayılır
{
// Serial.println("Checkpoint 1");
digitalWrite(motor_l1, LOW);
x = x + 1;
}
if(cur_r > normcur) // Beklenen normal akım çekilmezse o kanalda retract bağlı olmayabilir. x değişkeni bir artırılır yani o kanalın işi bitti varsayılır
{
// Serial.println("Checkpoint 2");
digitalWrite(motor_r1, LOW);
x = x + 1;
}
while(x < 2)
{
rxPWM = pulseIn(rxPin, HIGH, 25000);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l < 400)
{
// Serial.println("Checkpoint 3");
digitalWrite(motor_l1, LOW);
x = x + 1;
}
if(cur_r < 400)
{
// Serial.println("Checkpoint 4");
digitalWrite(motor_r1, LOW);
x = x + 1;
}
if(rxPWM < 1500)
{
// Serial.println("Checkpoint 5");
digitalWrite(motor_l1, LOW);
digitalWrite(motor_r1, LOW);
x = 2;
}
}
digitalWrite(motor_l1, LOW);
digitalWrite(motor_r1, LOW);
ret_pos = 1; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
Serial.println("Retract Open Bitti");
// 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
{
Serial.println("Retract Close");
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 = 1;
delay(250);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l > normcur) // Beklenen normal akım çekilmezse o kanalda retract bağlı olmayabilir. x değişkeni bir artırılır yani o kanalın işi bitti varsayılır
{
digitalWrite(motor_l2, LOW);
x = x + 1;
}
if(cur_r > normcur) // Beklenen normal akım çekilmezse o kanalda retract bağlı olmayabilir. x değişkeni bir artırılır yani o kanalın işi bitti varsayılır
{
digitalWrite(motor_r2, LOW);
x = x + 1;
}
while(x < 2)
{
rxPWM = pulseIn(rxPin, HIGH, 25000);
cur_l = analogRead(sensor_l);
cur_r = analogRead(sensor_r);
if(cur_l < 420)
{
digitalWrite(motor_l2, LOW);
x = x + 1;
}
if(cur_r < 420)
{
digitalWrite(motor_r2, LOW);
x = x + 1;
}
if(rxPWM >= 1500)
{
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r2, LOW);
x = 2;
}
}
digitalWrite(motor_l2, LOW);
digitalWrite(motor_r2, LOW);
ret_pos = 0; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
Serial.println("Retract Close Bitti");
// 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.
}