Pomoc w projekcie systemu pozycjonowania paneli slonecznych - mateo94 - 26-04-2016
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
RE: Pomoc w projekcie systemu pozycjonowania paneli slonecznych - JasQ - 26-04-2016
A proszę bardzo , na razie serwa a jak zrobisz to pobawimy się resztą
przycisk na pinie 2 do masy uruchamia poszukiwanie , z braku laku użyłem fotorezystora i nie do końca był w osi gimbala 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);
}
}
RE: Pomoc w projekcie systemu pozycjonowania paneli slonecznych - indianin - 15-07-2017
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);
}
|