• 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
#1
Cześć, potrzebuję pomocy w zaprogramowaniu Arduino do budowy systemu pozycjonowania panela słonecznego. Ma działać to tak. Mam zamiar zbudować układ który będzie sie się obracal w dwóch osiach za pomocą silników krokowych. Jeden silnik będzie obracal panel w lewo, prawo a drugi pochylal go. Silniki krokowe mają dostawać informacje z arduino a arduino z drugiego mniejszego ogniwa słonecznego. Ogniwo to mniejsze (referencyjne) ma szukać słońca co 15 min ( tak samo jak ten większy ma się obracać w dwóch osiach tylko że przy pomocy serv) i właśnie tu jeat problem bo nie mam pomysłu jak to zaprogramować żeby jedno ogniwo szukalo optymalnej pozycji na obu osiach a potem ta pozycje przekazało wiekszemu, i ten większy żeby się ustawił jak ten mniejszy. Trzeba to zrobić przy pomocy jakiś tablic czy coś szukam jakiejś podpowiedzi.ten mniejszy ma być podłączony do wejścia analogowego arduino i odczytuwac napięcie z ogniwa, następniea wyszukać maksymalna wartość, następnie zapamiętać ustawienie obu osi ile ma obrocic, następnie wysłać do większego tak żeby ustawił się tak jak ten mały prostopadle do słońca. Dzieki z góry za pomoc
 
Odpowiedź
#2
A proszę bardzo , na razie serwa a jak zrobisz to pobawimy się resztą Wink

przycisk na pinie 2 do masy uruchamia poszukiwanie , z braku laku użyłem fotorezystora i nie do końca był w osi gimbala Wink szukacz kierował się zawsze na lampę aparatu bo była najjaśniejsza w pokoju .



Kod:
#include <Servo.h>

Servo SerwoH;
Servo SerwoV;
int posH = 0;  
int posV = 0;
int ChkH , chkH , OKH = 0;
int ChkV , chkV , OKV = 0;

void setup()
{
  Serial.begin(9600);
  SerwoH.attach(9);
  SerwoV.attach(10);
  pinMode(2,INPUT_PULLUP);
  SerwoH.write(90);
  SerwoV.write(90);
  delay(500);
  
  
  
}

void loop()
{
if ( digitalRead(2) == LOW){
  
     SerwoH.write(90);
  SerwoV.write(90);
  delay(500);
  
posH = 0; posV = 0;
ChkH = 0; chkH = 0; OKH = 0;
ChkV = 0; chkV = 0; OKV = 0;
  
  delay(500);
  
Horizontal();
SerwoH.write(OKH);
Veritical();
SerwoV.write(OKV);


}
  
  Serial.print("pozycja H - ");
  Serial.print(OKH);
  Serial.print(" / pozycja V - ");
  Serial.println(OKV);

}
  
void Horizontal(){  
  
  SerwoH.write(0);
  delay(1000);
  
  for ( posH = 0 ; posH < 180 ; posH ++ ){
  ChkH = analogRead(A0);
  if ( ChkH >= chkH ){
  chkH = ChkH;OKH = posH;
  }
  Serial.print(ChkH);
  Serial.print(" - ");
  Serial.println(chkH);
  SerwoH.write(posH);
  delay(50);
  }
}


void Veritical(){
  
  SerwoV.write(0);
  delay(1000);
  
  for ( posV = 0 ; posV < 180 ; posV ++ ){
  ChkV = analogRead(A0);
  if ( ChkV >= chkV ){
  chkV = ChkV;OKV = posV;
  }
  Serial.print(ChkV);
  Serial.print(" - ");
  Serial.println(chkV);
  SerwoV.write(posV);
  delay(50);
  }
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#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ź
  


Skocz do:


Przeglądający: 1 gości