Aspiruje Napisano 15 lutego Udostępnij Napisano 15 lutego (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 Edytowano 15 lutego przez Aspiruje Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) 16 lutego Udostępnij 16 lutego @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ąć. Cytuj Link do komentarza Share on other sites More sharing options...
Aspiruje 16 lutego Autor tematu Udostępnij 16 lutego @Treker zrobiłem osobne zasilanie na drugiej płytce do serwomechanizmów i użyłem baterii 9V i problem dalej jest ten sam 😞 Cytuj Link do komentarza Share on other sites More sharing options...
Danyeru 16 lutego Udostępnij 16 lutego 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. 🤔 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Aspiruje 16 lutego Autor tematu Udostępnij 16 lutego @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 Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta 16 lutego Udostępnij 16 lutego 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 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) 17 lutego Udostępnij 17 lutego @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. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!