• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc w projekcie systemu pozycjonowania paneli slonecznych
#3
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);
}


Załączone pliki Miniatury
   
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Pomoc w projekcie systemu pozycjonowania paneli slonecznych - przez indianin - 15-07-2017, 15:31

Skocz do:


Przeglądający: 1 gości