Skocz do zawartości

Sun Tracker i problem z servo


Aspiruje

Pomocna odpowiedź

1//Servo motor library
2#include <Servo.h>
3//Initialize variables
4int   mode = 0;
5int axe = 0;            
6int buttonState1 = 0;    
7int buttonState2   = 0;   
8int prevButtonState1 = 0;
9int prevButtonState2 = 0; 
10 
11int ldrtopr=   0;                // top-right LDR                          
12int ldrtopl = 1;                // top-left LDR                          
13int ldrbotr = 2;               //   bottom-right LDR                     
14int ldrbotl = 3;               // bottom-left   LDR                   
15int topl = 0;
16int topr = 0; 
17int botl = 0;
18int   botr = 0;
19
20//Declare two servos
21Servo servo_updown;
22Servo servo_rightleft;
23
24int   threshold_value=10;           //measurement sensitivity
25
26void setup()
27{
28   Serial.begin(9600);                                //serial connection setup  //opens   serial port, sets data rate to 9600 bps
29  Serial.println("CLEARDATA");                       //clear   all data that’s been place in already
30  Serial.println("LABEL,t,voltage,current,power,Mode");    //define the column headings (PLX-DAQ command)
31
32  pinMode(12, INPUT);              //Mode   switch Button
33  pinMode(11, INPUT);              //Axis switch
34  pinMode(A4,   INPUT);              //Potentiometer for right-left movement and for up-down movement
35   
36  servo_updown.attach(5);             //Servo motor up-down movement
37  servo_rightleft.attach(6);           //Servo motor right-left movement
38}
39
40void loop()
41{
42//  pv_power();
43char   Mode;
44    float volt = analogRead(A5)*5.0/1023;
45    float voltage = 2*volt;                 //  Volt=(R1/R1+R2)*Voltage / R1=R2=10Ohms  => voltage=2*volt)
46     float current = voltage/20;            //  I=voltage/(R1+R2) 
47    float power   = voltage*current;
48    Serial.print("DATA,TIME,"); // PLX-DAQ command
49    Serial.print(voltage);     //send the voltage to serial port
50    Serial.print(",");
51    Serial.print(current);     //send the current to serial port
52    Serial.print(",");
53    Serial.print(power);   //send the power to serial port
54    Serial.print(",");
55    
56//    Serial.println(Mode);       
57  buttonState1 = digitalRead(12);
58  if (buttonState1 != prevButtonState1)   {
59    if (buttonState1 == HIGH) {
60      //Change mode and ligh up the correct   indicator  
61      if (mode == 1) {
62        mode = 0;
63      } else {
64         mode = 1;
65      }
66    }
67  }
68  prevButtonState1 = buttonState1;
69   delay(50); // Wait for 50 millisecond(s)
70  
71  if (mode == 0) {
72    Mode='M';
73     Serial.println(Mode);   //send Mode "Manual" to serial port    
74    manualsolartracker();
75   } else { // mode automatic
76    Mode = 'A';
77    Serial.println(Mode);      
78     automaticsolartracker(); //send Mode "Automatic" to serial port
79    } 
80}
81
82void   automaticsolartracker(){
83  
84     //capturing analog values of each LDR
85      topr= analogRead(ldrtopr);         //capturing analog value of top right LDR
86      topl= analogRead(ldrtopl);         //capturing analog value of top left LDR
87      botr= analogRead(ldrbotr);         //capturing analog value of bot right LDR
88      botl= analogRead(ldrbotl);         //capturing analog value of bot left LDR
89
90     // calculating average
91     int avgtop = (topr + topl) / 2;     //average   of top LDRs
92     int avgbot = (botr + botl) / 2;     //average of bottom LDRs
93      int avgleft = (topl + botl) / 2;    //average of left LDRs
94     int avgright   = (topr + botr) / 2;   //average of right LDRs
95   
96    //Get the different   
97     int diffelev = avgtop - avgbot;      //Get the different average betwen   LDRs top and LDRs bot
98     int diffazi = avgright - avgleft;    //Get the different   average betwen LDRs right and LDRs left
99    
100    //left-right movement of   solar tracker
101     
102      if (abs(diffazi) >= threshold_value){        //Change   position only if light difference is bigger then the threshold_value
103       if   (diffazi > 0) {
104        if (servo_rightleft.read() < 180) {
105          servo_rightleft.write((servo_updown.read()   + 2));
106        }
107      }
108      if (diffazi <  0) {
109        if (servo_rightleft.read()   > 0) {
110          servo_rightleft.write((servo_updown.read() - 2));
111        }
112       }
113    }
114             
115      //up-down movement of solar tracker
116
117       if (abs(diffelev) >= threshold_value){    //Change position only if light   difference is bigger then thethreshold_value
118       if (diffelev > 0) {
119        if   (servo_updown.read() < 180) {
120          servo_updown.write((servo_rightleft.read()   - 2));
121        }
122      }
123      if (diffelev <  0) {
124        if (servo_updown.read()   > 0) {
125          servo_updown.write((servo_rightleft.read() + 2));
126        }
127       }
128    }       
129 }  
130
131void manualsolartracker(){
132  buttonState2   = digitalRead(13);
133  if (buttonState2 != prevButtonState2) {
134    if (buttonState2   == HIGH) {
135      //Change mode and ligh up the correct indicator  
136      if   (axe == 1) {
137        axe = 0;
138      } else {
139        axe = 1;
140      }
141     }
142  }
143  prevButtonState2 = buttonState2;
144  delay(50); // Wait for 50   millisecond(s)
145  if (axe == 0) {     //control right-left movement
146    servo_rightleft.write(map(analogRead(A4),   0, 1023, 0, 180));
147  } else { // //control up-down movement
148    servo_updown.write(map(analogRead(A4),   0, 1023, 0, 180));
149  } 
150}
151
152
153
154

Mam problem z silnikami serwo micro SG-90 otóż serwa wydaje się jakby nie odbierały poprawnie sygnału albo miały zbyt małe napięcie przez co jeden silnik stoi w miejscu i się nie rusza a drugi rusza się o 1 stopień a następnie wraca o 1 stopień jakby go coś blokowało, i jest jeszcze druga opcja kiedy silnik drugi obraca się razem z obrotem potencjometru tzn. kręcę potencjometrem i serwo razem z nim. Niżej zamieszczam program oraz schemat podłączenia.

Rezystory 330Ω

Potencjometr obrotowy 10kΩ liniowy 1/8W

321978281_6129301247104412_4374495662978765901_n (1).png

Edytowano przez Aspiruje
Link do komentarza
Share on other sites

@Aspiruje witam na forum 🙂 Nie możesz zasilać dwóch serwomechanizmów wprost z 5 V na Arduino, bo spalisz płytkę. Przygotuj osobne zasilania dla serwomechanizmów - tak będzie bezpieczniej. Od tego warto zacząć. 

Link do komentarza
Share on other sites

Czy przy osobnym zasilaniu masz połączone masy obu układów?

Czy 9V to nie za dużo dla SG-90? 🤔

Z tego co wiem, taka bateria może mieć, zwłaszcza jak już nie daje nominalnego napięcia, może prądowo nie wydalać już przy jednym serwie. 🤔

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

4 godziny temu, Aspiruje napisał:

@Danyeru jedna płytka na której znajdują się fotorezystory razem z rezystorami są podłączone do styku GND z arduino a serwo są podłączone na osobnej płytce z osobnym "+" i "-" z baterii

 

 

Masy serwa Arduino i co tam jeszcze masz mają być połączone razem!...druga sprawa zasilanie serw z baterii 9v (mam nadzieję że obnizasz napięcie do 5v) to też zły pomysł...takie serwa wbrew pozorom pod obciążeniem potrafią łyknąć prądu, więc koniecznie zainwestuje w jakąś normalna baterie lub zasilacz...dopiero wtedy można się doszukiwać problemów w kodzie

Link do komentarza
Share on other sites

@Aspiruje zakładając, że nie zasilasz serw wprost z baterii 9 V tylko jest tam stabilizator to i tak jest to zły pomysł - bateria 9 V nie nadaje się na dłuższą metę do zasilania większej liczby silników. Musisz zastosować coś lepszego - albo zasilacz, albo chociaż szeregowo połączone baterie AA.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.