Skocz do zawartości

Sun Tracker i problem z servo


Pomocna odpowiedź

Napisano (edytowany)
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

@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ąć. 

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

@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

 

 

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...