Dzień dobry
Nie chcę zakładać nowego tematu więc podepnę się tu.
Pracuję właśnie nad swoim drugim projektem na arduino - solar tracker.
Mam już poskładany cały układ elektroniczny oraz mechaniczny. Napisałem też program pod arduino, ale mam problem z prawidłowym działaniem układu. Nie wiem już gdzie popełniłem błąd i może ktoś z forumowiczów wytłumaczy co robię nie tak. Czy problem leży w programie, czy może brakuje mi czegoś w układzie?
W urządzeniu steruję dwoma silnikami do ustawienia pozycji panela. Silniki sterowane są przy pomocy modułu L298N. Aby panel nie wyszedł poza swój zakres ruchu, zastosowałem krańcówki - i one nie działają tak jak powinny - nie zatrzymują silników w momencie ich przyciśnięcia. Krańcówki są ustawione jako normalnie zamknięte.
Dodatkowo pomimo ustawienia tolerancji na potencjometrze układ cały czas drży.
Za ustawienie układu do słońca odpowiadają 4 fotorezystory przedzielone krzyżakiem rzucającym na nie cień. Czas oraz tolerancja wyników ustawiane są przy pomocy dwóch potencjometrów. System startuje przy odpowiednim natężeniu światła, ustawionym w programie. Panel ma się przesuwać za słońcem, a po zachodzie słońca (gdy spadnie natężenie światła) ma wrócić na swoje położenie startowe i czekać na wschód.
Załączam schemat układu - podłączenia oraz kod programu.
Z góry dziękuję za pomoc.
Kod:
// silniki obracające
int x=350;
int lewo = 8; //silnik 1 w lewo
int prawo = 9; //silnik 1 w prawo
int gora = 10; //silnik 2 w górę
int dol = 11; //silnik 2 w dół
// fotorezystory piny
// nazwa = analogpin;
int flg = 0; //fotorezystor lewy górny a0
int fpg = 1; //fotorezystor prawy górny a1
int fld = 2; //fotorezystor lewy dolny a2
int fpd = 3; //fotorezystor prawy dolny a3
// krancowki
int krl = 4; // lewa
int krp = 5; // prawa
int krg = 6; // gora
int krd = 7; // dol
void setup() {
Serial.begin(9600);
// ustawienia silnikow jako wyjścia
pinMode (lewo, OUTPUT);
pinMode (prawo, OUTPUT);
pinMode (gora, OUTPUT);
pinMode (dol, OUTPUT);
// ustawienie krańcówek jako wejścia
pinMode (krl, INPUT_PULLUP);
pinMode (krp, INPUT_PULLUP);
pinMode (krg, INPUT_PULLUP);
pinMode (krd, INPUT_PULLUP);
}
void loop() {
// odczyt z fotorezystorów
int lg = analogRead(flg);
int pg = analogRead(fpg);
int ld = analogRead(fld);
int pd = analogRead(fpd);
int czas = analogRead(4) / 10; //potencjometr sterujący opoznieniem petli a4
int tol = analogRead(5) / 10; //potencjometr ustawiajacy tolerancje wynikow a5
int sog = (lg + pg) / 2; //sredni odczyt z gornych fotorezystorow
int sod = (ld + pd) / 2; //sredni odczyt z dolnych
int sol = (lg + ld) / 2; //sredni odczyt z lewych
int sop = (pg + pd) / 2; //sredni odczyt z prawych
int rgd = sog - sod; //roznica pomiedzy gora i dolem
int rlp = sol - sop; //roznica pomiedzy lewa i prawa
Serial.print(lg);
Serial.print("--");
Serial.println(pg);
Serial.print(ld);
Serial.print("--");
Serial.println(pd);
Serial.println(tol);
if(lg>x && pg>x && ld>x && pd>x) //jezeli jest malo swiatla, wszystkie fotorezystory maja odczyt ponizej x
{
if(digitalRead(krl) == HIGH && digitalRead(krd) == HIGH) //krancowki lewa i dolna nie są wcisniete
{
digitalWrite(lewo, HIGH);
digitalWrite(dol, HIGH);
delay(50);
digitalWrite(lewo, LOW);
digitalWrite(dol, LOW);
delay(5); //- ustawiamy sie na wschod i dol
}
else if(digitalRead(krl) == HIGH && digitalRead(krd) == LOW) //krancowka dolna wcisnieta, lewa nie wcisnieta
{
digitalWrite(lewo, HIGH);
delay(50);
digitalWrite(lewo, LOW);
delay(5);//- ustawiamy sie na wschod
}
else if(digitalRead(krl) == LOW && digitalRead(krd) == HIGH) //krancowka lewa wcisnieta, dolna nie wcisnieta
{
digitalWrite(dol, HIGH);
delay(50);
digitalWrite(dol, LOW);
delay(5);//- ustawiamy sie w dol
}
else //(digitalRead(krl) == LOW && digitalRead(krd) == LOW) //obie krancowki wcisniete
{
//nie rob nic
}
}
else if(lg<=x || pg<=x || ld<=x || pd<=x) //ktorys lub wszystkie foto rezystory maja odczyt powyzej x
{
if(-1*tol > rgd || rgd > tol) // jesli roznica gora dol jest wieksza od zadanej tolerancji to:
{
if(sog > sod)//gora wieksza
{
if(digitalRead(krg) == HIGH)//krancowka gorna nie jest wcisnieta
{
digitalWrite(gora, HIGH);
delay(50);
digitalWrite(gora, LOW);
delay(5);//-do gory
}
else//(digitalRead(krg) == LOW)//krancowka gorna wcisnieta
{
//nic nie rob
}
}
else if(sog < sod)//dol wiekszy
{
if(digitalRead(krd) == HIGH)//krancowka dolna nie jest wcisnieta
{
digitalWrite(dol, HIGH);
delay(50);
digitalWrite(dol, LOW);
delay(5);//-do dolu
}
else//(digitalRead(krd) == LOW)//krancowka dolna wcisnieta
{
//nic nie rob
}
}
else//(sog == sod)//gora i dol rowne
{
//nic nie rob
}
}
else if(-1*tol <= rgd || rgd >= tol)
{
//nic nie rob
}
}
if(-1*tol > rlp || rlp > tol) // jesli roznica lewa prawa jest wieksza od zadanej tolerancji to:
{
if(sol > sop)//lewa wieksza
{
if(digitalRead(krl) == HIGH)//krancowka lewa nie jest wcisnieta
{
digitalWrite(lewo, HIGH);
delay(50);
digitalWrite(lewo, LOW);
delay(5);//-w lewo
}
else//(digitalRead(krl) == LOW)//krancowka lewa wcisnieta
{
//nic nie rob
}
}
else if(sol < sop)//prawa wieksza
{
if(digitalRead(krp) == HIGH)//krancowka prawa nie jest wcisnieta
{
digitalWrite(prawo, HIGH);
delay(50);
digitalWrite(prawo, LOW);
delay(5);//-w prawo
}
else//(digitalRead(krp) == LOW)//krancowka prawa wcisnieta
{
//nic nie rob
}
}
else//(sol == sop)//lewa i prawa rowne
{
//nic nie rob
}
}
else if(-1*tol <= rlp || rlp >= tol)
{
//nic nie rob
}
delay(czas);
}