DC motor ile Tek eksen güneş takip devresi yardım.

badwet

Üye
Katılım
14 Ağu 2009
Mesajlar
100
Puanları
1
Öncelikle herkese merhabalar forumda birçok güneş takip devresi başlığı var ama ben tam olarak aradığımı bulamadım gerçi arduino'ya yeni başladım ama Şöyle bir devre tasarlamaya çalıştım ama sorunlarım var çözemiyorum bilgisi olan arkadaşlardan yardım istiyorum devreyi bread board üzerine kurdum.ama istediğim gibi çalıştıramadım.
açıklamak gerekirse;
panel doğu-batı ekseninde yani tek eksende çalıaşacak,2 adet ldr ile kontrol edilecek ve sistemde 2 adette limit sw.olacak biri doğuda biri batıda.panel batıya ulaştığında limit sw'e basacak ldr'leri okuyup tam karanlık olduğunda ertesi gün için doğuya yönelecek ve doğudaki sw'e bastığında duracak ve ertesi gün güneşin doğmasını bekleyecek ve gün doğduğunda tekrar aynı işlemi tekrarlayacak.dc motorun devir yönünüde röle ile polariteyi değiştirerek yapacağım ekteki şemada var.
kodları benzer bir projeden aldım ve üzerinde bazı değişikler yapmaya çalıştım ışığı bir yönde aldığında bir tarafa diğer yönden aldığında diğer tarafa çıkış alabiliyorum fakat karanlık olduğunda yani her iki ldr değeri aynı olduğunda ve batı limit sw'e bastığında sonuç elde edemiyorum
size isiste yapmaya çalıştığım devreyi ve kodları gönderiyorum yardımcı olursanız sevinirim .dediğim gibi aduino'da daha yeniyim kusurlardan dolayı affola.
resimi yükleyince farkettim sw.'ten sonra pulldown direncini çizmeyi unutmuşum kusura bakmayın.


int sensorPinA0 = A0; // doğu ldr
int sensorPinA1 = A1; // batı ldr
const int motor1Pin = 11; // motor batı röle ucu
const int motor2Pin = 12; // motor doğu röle ucu
const int switch1Pin = 5; //doğu limit sw
const int switch2Pin = 6; //batı limit sw

int sensorValueA0 = analogRead(sensorPinA0);
int sensorValueA1 = analogRead(sensorPinA1);
int switch1val= digitalRead(switch1Pin);
int switch2val= digitalRead(switch2Pin);
void setup()
{
Serial.begin(9600);
analogReference(INTERNAL);

pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(switch1Pin, INPUT);
pinMode(switch2Pin, INPUT);
pinMode(sensorValueA0, INPUT);
pinMode(sensorValueA1, INPUT);

}

void loop()
{
// read the sensor:
sensorValueA0 = analogRead(sensorPinA0);
sensorValueA1 = analogRead(sensorPinA1);
switch1val = digitalRead(switch1Pin);
switch2val = digitalRead(switch2Pin);
float voltage1 = sensorValueA0*(5.0/1023.0);
float voltage2 = sensorValueA1*(5.0/1023.0);



if (voltage1 > voltage2);// if the voltage1 > voltage2, motor doğuya döner
{
digitalWrite(motor1Pin, LOW); //
digitalWrite(motor2Pin, HIGH); // motor doğuya döner

}



else

{
digitalWrite(motor1Pin, HIGH); // motor batıya döner
digitalWrite(motor2Pin, LOW); //

}

if (voltage1 == voltage2);
{

digitalWrite(motor1Pin, LOW); //eğer her iki ldr voltajı eşit ise her iki motor çalışmaz panel durur
digitalWrite(motor2Pin, LOW);


}

{

if ((voltage1+ voltage2<3) && (switch1val == HIGH));//her iki ldr voltajı eşit ise ve batı sw basılı ise motor 1 pinine enerji ver ve paneli doğuya döndür.

digitalWrite(motor2Pin, HIGH);
digitalWrite(motor1Pin, LOW);

}

{

if (switch2val == HIGH);

digitalWrite(motor1Pin, LOW);
digitalWrite(motor2Pin, LOW);

}



}
ÇİZİM.jpg
 
Merhaba, bende arduinoda iyi sayılmam. Bildiğim kadarıyla bir öneride bulunayım bir deneyin.

switch2val = digitalRead(switch2Pin); i iki ldr de karanlıkta kaldığında görev yapmıyor demişsiniz. İlgili if döngüsüne girerken bu butonu tekrar okutmayı dener misiniz.
programınızda ayrıca bazı parantez hataları gördüm. Şöyle ki if döngüsünden önce süslü parantezi açıp if i dahil edip işlem sonucunda parantezi kapatmışsınız. Süslü parantez if satırı bitince başlar işlem bitince kapanır.
Ben düzelttim aşağıdaki gibi dener misiniz.

int sensorPinA0 = A0; // doğu ldr
int sensorPinA1 = A1; // batı ldr
const int motor1Pin = 11; // motor batı röle ucu
const int motor2Pin = 12; // motor doğu röle ucu
const int switch1Pin = 5; //doğu limit sw
const int switch2Pin = 6; //batı limit sw

int sensorValueA0 = analogRead(sensorPinA0);
int sensorValueA1 = analogRead(sensorPinA1);
int switch1val= digitalRead(switch1Pin);
int switch2val= digitalRead(switch2Pin);

void setup()
{
Serial.begin(9600);
analogReference(INTERNAL);

pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(switch1Pin, INPUT);
pinMode(switch2Pin, INPUT);
pinMode(sensorValueA0, INPUT);
pinMode(sensorValueA1, INPUT);

}

void loop()
{
// read the sensor:
sensorValueA0 = analogRead(sensorPinA0);
sensorValueA1 = analogRead(sensorPinA1);
switch1val = digitalRead(switch1Pin);
switch2val = digitalRead(switch2Pin);
float voltage1 = sensorValueA0*(5.0/1023.0);
float voltage2 = sensorValueA1*(5.0/1023.0);



if (voltage1 > voltage2);// if the voltage1 > voltage2, motor doğuya döner
{
digitalWrite(motor1Pin, LOW); //
digitalWrite(motor2Pin, HIGH); // motor doğuya döner
}

else
{
digitalWrite(motor1Pin, HIGH); // motor batıya döner
digitalWrite(motor2Pin, LOW); //
}

if (voltage1 == voltage2);
{
digitalWrite(motor1Pin, LOW); //eğer her iki ldr voltajı eşit ise her iki motor çalışmaz panel durur
digitalWrite(motor2Pin, LOW);
}



if ((voltage1+ voltage2<3) && (switch1val == HIGH));//her iki ldr voltajı eşit ise ve batı sw basılı ise motor 1 pinine enerji ver ve paneli doğuya döndür.
{
digitalWrite(motor2Pin, HIGH);
digitalWrite(motor1Pin, LOW);
}

switch2val = digitalRead(switch2Pin);

if (switch2val == HIGH);
{
digitalWrite(motor1Pin, LOW);
digitalWrite(motor2Pin, LOW);
}

}

Kolay gelsin
 
serial monitor'dan baktığımda karanlıkta her iki ldr'nin değerinin aynı olmaması sanırım sorun yaratıyor buna göre if içerisindeki formülü biraz daha değiştirmem gerekecek galiba.
 
söylediğim değişiklikleri yapınca bir şey farkettimi
 
Parantezler hatalı idi. Fakat komutu da değiştirmeniz gerekebilir. Mesela karanlık olunca ldr1 ve ldr2 yi okumalı ve durum değişkenine 1 yazmalı.
int durum; //durum değişkeni oluşturduk (void setuptan önce )

if durum==1
{
switch2val= digitalRead(switch2Pin)
digitalWrite(motor2Pin, HIGH);
digitalWrite(motor1Pin, LOW);
}
gibi bir şey denenebilir
 
Işıksız kalınca sarmaşık misali ya bir istikamette sürekli döndür veya süreyi arttırarak misal 5 sn. 1 tarafa süre sonunda diğer tarafa tarama yaptır sonra 10 sn aynı işlem.
 
aklıma şu geldi batıdaki limit sw'e bastığında geri dönüş ucunu high yapayım ve süre verip geri döndüreyim ama şöylede bir durum var batıdaki sw'e bastığında güneş henüz batmamış oluyor ben bu yüzden karanlık oluncaya kadar batıda kalmasını istiyorum.
 
önce ldr leri kontrol etmelisin. ldr ler karanlık olduğunda ise butona bakmalısın
 

Forum istatistikleri

Konular
127,951
Mesajlar
913,870
Kullanıcılar
449,599
Son üye
Gksn

Yeni konular

Geri
Üst