Projekt ma na celu zbudowanie interaktywnego panel fotowoltaicznego, który w trakcie dnia będzie automatycznie śledził Słońce poruszające się po nieboskłonie. W części 1-szej projektu (Tracking panelu solarnego cz. 1/4) zbudowaliśmy moduł czujników światła i pomierzyliśmy wartości analogowych sygnałów dostarczanych z dzielników napięcia fotorezystorów. W tej części projektu utworzymy część mechaniczą i będziemy nią sterować za pomocą Arduino. W 3-ciej i 4-tej części projektu (Ładowarka słoneczna, Ładowarka słoneczna (modyfikacja)) utworzony zostanie panel fotowoltaiczny oraz zostanie zbudowany układ ładowania akumulatorów oraz układ umożliwiający podłączenie do niego urządzeń elektrycznych
Najważniejszą częścią mechaniki układu będzie urządzenie złożone z dwóch serwomechanizmów, które dzięki aluminiowemu uchwytowi umożliwi ruch panelu fotowoltaicznego w dwóch płaszczyznach XOY oraz YOZ. Do wykonania układu użyto dwóch serwomechanizmów wielkości standard (typ: MG995) umożliwiających obrót orczyka o 60° w każdą stronę (łącznie 120°). Razem z nimi zakupiony został odpowiedni uchwyt umożliwiający zmontowanie obu serw i przykręcenie do niego płaszczyzny panelu fotowoltaicznego oraz układ testujący serwa (Fig. 2).
Montaż rozpoczęto od przycięcia z płyty wiórowej odpowiedniej podstawy (w przypadku projektu: 220 × 220 mm) (Fig. 3).
Po zamontowaniu na podstawę serwomechanizmu obrotu horyzontalnego (azymutalnego), przystąpiono do jego kalibracji. Polegała ona na ustawieniu wrzeciona w pozycji neutralnej (tzn. w pozycji środkowej odpowiadającej położeniu 60° w kierunku maksymalnego lewego i prawego położenia orczyka) (Fig. 4).
Po zamontowaniu serwa obrotu poziomego, przystąpiono do montażu zakupionego zestawu (serwa + uchwyt). Wykorzystywano instrukcję montażową (Fig. 5).
W trakcie montażu warto zwrócić uwagę na odpowiednie skalibrowanie serwomechanizmu rotacji pionowej. W moim przypadku, pozycja neutralna została ustawiona pod kątem 45° pomiędzy zenitem, a płaszczyzną poziomą. Zmontowany mechanizm przedstawia Fig. 6. Jak widać przesunięto także cały mechanizm do jednej z krawędzi podstawy. Po przykręceniu panelu czujników światła, umożliwi to ich nieskrępowany ruch w obu płaszczyznach.
Efekt końcowy przedstawiają Fig. 1, 7-9.
/////////////////////////////////////////////////////////////////// // Obsługa panelu śledzącego padające oświetlenie. Do wykorzy- // // stania w projekcie samonastawnego panelu fotowoltaicznego. // // // // pomysł: http://www.electronicshub.org/arduino-solar-tracker/ // // projekt: bartus[malpa]agh.edu.pl // /////////////////////////////////////////////////////////////////// #include <Servo.h> int czulosc = 30; // Czułość oznacza różnicę pomiarów górnych/donych ew. prawych/lewych fotorezystorów //Definiowanie serwomechanizmów Servo servohori; int servoh = 0; int servohLimitHigh = 160; // płaszczyzna panelu ustawiona w kier. wschodnim int servohLimitLow = 20; // płaszczyzna panelu ustawiona w kier. zachodnim Servo servoverti; int servov = 0; int servovLimitHigh = 120; // płaszczyzna panelu ustawiona poziomo int servovLimitLow = 50; // płaszczyzna panelu ustawiona pionowo //Przypisanie pinów fotorezystorom (LDR) int ldrtopl = 2; //górny lewy (zielony) int ldrtopr = 1; //górny prawy (biały) int ldrbotl = 3; //dolny lewy (brązowy) int ldrbotr = 0; //dolny prawy (czarny) void setup () { Serial.begin(9600); //Przypisanie pinów serwomechanizmom servohori.attach(10); servohori.write(90); servoverti.attach(9); servoverti.write(90); delay(500); } void loop() { servoh = servohori.read(); // aktualny kąt poziomy servov = servoverti.read(); // aktualny kąt pionowy //Pobranie wartości spadków napięć na fotorezystorach int topl = analogRead(ldrtopl); int topr = analogRead(ldrtopr); int botl = analogRead(ldrbotl); int botr = analogRead(ldrbotr); //Obliczenie średnich int avgtop = (topl + topr) / 2; // średnia arytm. z pomiarów górnych fotorezystorów int avgbot = (botl + botr) / 2; // średnia arytm. z pomiarów dolnych fotorezystorów int avgleft = (topl + botl) / 2; // średnia arytm. z pomiarów lewych fotorezystorów int avgright = (topr + botr) / 2; // średnia arytm. z pomiarów prawych fotorezystorów if(abs(avgtop - avgbot) > czulosc) { // warunek sprawdzający czy różnica pomiarów jest na tyle znacząca, że warto dokonać zmiany if (avgtop > avgbot) { servoverti.write(servov +1); if (servov > servovLimitHigh) { servov = servovLimitHigh; servoverti.write(servov); } delay(10); } else if (avgbot > avgtop) { servoverti.write(servov -1); if (servov < servovLimitLow) { servov = servovLimitLow; servoverti.write(servov); } delay(10); } else { servoverti.write(servov); } } // zamknięcie war. spr. czy różnica pomiarów jest na tyle znacząca, że warto dokonać zmian if(abs(avgleft - avgright) > czulosc) { // warunek sprawdzający czy różnica pomiarów jest na tyle znacząca, że warto dokonać zmiany if (avgleft < avgright) { servohori.write(servoh +1); if (servoh > servohLimitHigh) { servoh = servohLimitHigh; servohori.write(servoh); } delay(10); } else if (avgright < avgleft) { servohori.write(servoh -1); if (servoh < servohLimitLow) { servoh = servohLimitLow; servohori.write(servoh); } delay(10); } else { servohori.write(servoh); } } // zamknięcie war. spr. czy różnica pomiarów jest na tyle znacząca, że warto dokonać zmiany delay(50); Serial.print("Kąt poziomy: "); Serial.println(servoh); Serial.print("Kąt pionowy: "); Serial.println(servov); //delay(1000); }