Sumer Yamaner
Moderator
- Katılım
- 17 Eyl 2013
- Mesajlar
- 9,044
- Tepkime puanı
- 23,663
- Yaş
- 62
- Konum
- İstanbul
- Web sitesi
- www.sumeryamaner.com
- İlgi Alanı
- Uçak
Arduino ile Rectract - Iniş Takımı Uygulaması
Retractlarımız çok boşlandı...
Bu akşam epey uğraştım. Tek bir elektrik motoru, L293 sürücü, akım sensörü vs ile bir prototip oluşturdum. Tek retractı kontrol edecek basitleştirilmiş de bir kod yazdım. Ne yazık ki aptalca bir şey yapmışım. L293'ün 8 No'lu bacağını yanlış anlayıp 0 V'a bağlamışım. Tabii ne yaptıysam motoru çalıştıramadım. Sonra antiparalel bağlı LED'ler kullandım, programa debug amaçlı Serial.print komutları ekledim. Akım sensörünü devre dışı bırakıp stop butonu ekledim. Sonunda aşağıdaki kod çalıştı.
Daha sonra L293 testlerinde hatamı bulup çalışır hale getirdim ama bu saatten sonra akım sensörlü sistemle uğraşmak istemedim.
Halihazır durumda retract komutu ile anlık pozisyon karşılaştırılıyor. Farklı ise açma ya da kapama alt programları çağrılıyor. Bu alt programlar da motoru çalıştırıp butona basılmasını bekliyorlar. Daha sonra buton işlevi akım sensörü ile değiştirilecek ama bu bence kolay bir eklenti olacak. İnşallah yarına...
Retractlarımız çok boşlandı...
Bu akşam epey uğraştım. Tek bir elektrik motoru, L293 sürücü, akım sensörü vs ile bir prototip oluşturdum. Tek retractı kontrol edecek basitleştirilmiş de bir kod yazdım. Ne yazık ki aptalca bir şey yapmışım. L293'ün 8 No'lu bacağını yanlış anlayıp 0 V'a bağlamışım. Tabii ne yaptıysam motoru çalıştıramadım. Sonra antiparalel bağlı LED'ler kullandım, programa debug amaçlı Serial.print komutları ekledim. Akım sensörünü devre dışı bırakıp stop butonu ekledim. Sonunda aşağıdaki kod çalıştı.
Daha sonra L293 testlerinde hatamı bulup çalışır hale getirdim ama bu saatten sonra akım sensörlü sistemle uğraşmak istemedim.
Halihazır durumda retract komutu ile anlık pozisyon karşılaştırılıyor. Farklı ise açma ya da kapama alt programları çağrılıyor. Bu alt programlar da motoru çalıştırıp butona basılmasını bekliyorlar. Daha sonra buton işlevi akım sensörü ile değiştirilecek ama bu bence kolay bir eklenti olacak. İnşallah yarına...
Kod:
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 sensor_l = 1; // Sol akım sensörü 1 nolu analog girişte
//int cur_l = 0; // Sol 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 = 0; //Motor akım kontrolünde kullanılacak değişiken
//int maxcur = 550; // Azami pozitif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
//int mincur = 470; // Azami negatif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
//int normcur1 = 530; // Beklenen normal pozitif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
//int normcur2 = 490; // Beklenen normal negatif akım. Akım sensörüne ve motora göre bu değer değiştirilecek
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()
{
pinMode(motor_l1, OUTPUT);
pinMode(motor_l2, OUTPUT);
digitalWrite(motor_l1, LOW);
digitalWrite(motor_l2, LOW);
pinMode(senspin, INPUT);
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
}
}
void loop()
{
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 ama kapat komutu geldiyse retractlar kapatılacak
{
RetractClose();
}
else if(ret_com == 1 && ret_pos == 0) // Eğer retract kapalı ama aç komutu geldiyse retractlar açılacak
{
RetractOpen();
}
}
void RetractOpen() //Retractı açan subroutine
{
digitalWrite(motor_l1, HIGH); // Retract motoru açma yönünde enerjilendirildi
digitalWrite(motor_l2, LOW);
sense = digitalRead(senspin);
// cur_l = analogRead(sensor_l); Henüz akım kontrolü yapmıyoruz
rxPWM = pulseIn(rxPin, HIGH, 25000);
// while((cur_l < maxcur && cur_l > mincur) && rxPWM >= 1500) // Akım normal sınırlarda ve arada alıcıdan ters bir komut gelmediyse beklemede kalıyoruz
while(rxPWM >= 1500 && sense == 1) // Buton kontrol ediliyor. Ayrıca alıcı sinyali de kontrol ediliyor. Çünkü arada ters sinyal gelmiş olabilir. Yani retract açılırken kapatmaya karar verebiliriz
{
// cur_l = analogRead(sensor_l);
rxPWM = pulseIn(rxPin, HIGH, 25000);
sense = digitalRead(senspin);
}
digitalWrite(motor_l1, LOW); // Ya butona basıldı ya da alıcıdan gelen komut değişti. Motoru durduruyoruz.
ret_pos = !ret_pos; // Retract pozisyon değişkenini ters çeviriyoruz ve geri dönüyoruz.
// Bu subroutine'den geri döndüğümüzde eğer butona bası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.
// Butona basılmış olması retractın istenilen pozisyona ulaştığı anlamına geliyor. Daha sonra buton işlevini akım sensörü ile değiştireceğiz.
}
void RetractClose() //Retractı kapatan subroutine
{
digitalWrite(motor_l2, HIGH);
digitalWrite(motor_l1, LOW);
sense = digitalRead(senspin);
// cur_l = analogRead(sensor_l);
rxPWM = pulseIn(rxPin, HIGH, 25000);
// while((cur_l < maxcur && cur_l > mincur) && rxPWM < 1500) // Akım normal sınırlarda ve arada alıcıdan ters bir komut gelmediyse beklemede kalıyoruz
while(rxPWM < 1500 && sense == 1)
{
// cur_l = analogRead(sensor_l);
rxPWM = pulseIn(rxPin, HIGH, 25000);
sense = digitalRead(senspin);
}
digitalWrite(motor_l2, LOW);
ret_pos = !ret_pos;
}