Ruchomy panel fotowoltaiczny - mechanika i sterowanie (cz. 2/4)


Tomasz Bartuś



2016-10-01
Ruchomy panel fotowoltaiczny - mechanika i sterowanie

Wstęp

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

Fig. 1. Panel czujników założony na serwomechanizm - efekt finalny (widok z przodu)

Założenia:

  1. panel słoneczny powinien wychylać się w dwóch płaszczyznach XOY oraz YOZ,
  2. wieczorem, w momencie zaniku oświetlenia słonecznego, panel powinien zmieniać swe nachylenie na poziome, rano powinien zacząć działać normalnie od właściwych ustawień dla azymutu wschodniego,
  3. panel zmienia swe nachylenie na poziome w momencie rejestracji silnych podmuchów wiatru,
  4. za pomoca wyświetlacza informuje o parametrach wychylenia, siły i kierunku wiatru,

Układ

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).

Serwomechanizmy MG995 z uchwytem
Fig. 2. Serwomechanizmy MG995 wraz z uchwytem mocującym i testerem serw

Lista części

  1. platforma prototypowa Arduino (Leonardo),
  2. fotorezystory 5-10KΩ (4 szt.: LDR0, LDR1, LDR2, LDR3),
  3. rezystory 100Ω (4 szt.: R0, R1, R2, R3),
  4. serwomechanizmy MG995 (2 szt.) [Nota katalogowa],
  5. zestaw uchwytów serw umożliwiający ich przechył w dwóch płaszczyznach i osadzenie mechanizmu na podstawie,
  6. tester serw np.: 3CH ECS,
  7. zasilacz serwomechanizmów,
  8. płytka prototypowa,
  9. przewody,
  10. płyta wiórowa podstawy,

Montaż

Montaż rozpoczęto od przycięcia z płyty wiórowej odpowiedniej podstawy (w przypadku projektu: 220 × 220 mm) (Fig. 3).

Podstawa mechanizmu
Fig. 3. Serwomechanizmy MG995 wraz z uchwytem mocującym i testerem serw

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).

Kalibracja serwa obrotu w płaszczyźnie horyzontalnej
Fig. 4. Kalibracja serwa obrotu w płaszczyźnie horyzontalnej

Po zamontowaniu serwa obrotu poziomego, przystąpiono do montażu zakupionego zestawu (serwa + uchwyt). Wykorzystywano instrukcję montażową (Fig. 5).

Skalibrowane serwo z uchwytem
Fig. 5. Skalibrowane serwo z uchwytem

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.

Kompletny, skalibrowany mechanizm serw
Fig. 6. Kompletny, skalibrowany mechanizm serw

Schemat montażowy układu trackera
Fig. 7. Schemat montażowy układu trackera

Efekt końcowy przedstawiają Fig. 1, 7-9.

Fig. 8. Panel czujników założony na serwomechanizm (widok boczny)

Fig. 9. Panel czujników założony na serwomechanizm (widok z tyłu)

Film:

Kod:

///////////////////////////////////////////////////////////////////
// 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);
}
 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]