• 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
Problem z Serwem
#1
Question 
Witam.
Zacząłem zabawę z joystickiem w arduino UNO R3.
Projekt jest taki, że jeżeli poruszę joystickiem w prawo silnik kręci się w prawo na 0 stopni. Jak nie robię nic, ma powrócić do 90 stopni, a jak joystick idzie w lewo, serwo ma się poruszać w lewo na 180 stopni.
Problem jest taki, że kiedy nic nie robię, serwo kręci bączka w prawą stronę.
Tak wygląda kod:
Kod:
#include <Servo.h>

// Stworzenie obiektu serwomechanizmu
Servo sg90;
int MGD;
int GD=0;
int p=0;
void setup()
{
 sg90.attach(9);
 MGD=analogRead(A0);
 Serial.begin(9600);

}
void loop()
{  
 GD=analogRead(A0);
 delay(10);
 
 

 if(GD<MGD-10)
 {
 p=0;
 sg90.write(p);
 }else{
       
 if(GD>MGD+10)
 {
 p=180;
 sg90.write(p);
 
 }
 else
 {
  p=90;
  sg90.write(p);
 }
}
}
 
 
Odpowiedź
#2
Zacznij od tego aby prawidłowo umieścić kod na forum,chyba, że znasz prosty sposób aby wyszukać tekstu do porównania na tym obrazku, wstawienia, edycji.
Widać, że nie zadałeś sobie nawet trudu przeczytania innych postów aby zobaczyć jak to się robi.
Tobie się nie chce innym nie chce sie pomagać.

PS
Dobrze, że nie dałeś fotografii ekranu, co jest nagminne na Elektrodzie ale nie został jeszcze pobity rekord pokazujący kod jako filmik na YT. Nadal masz szansę.
 
Odpowiedź
#3
(09-11-2018, 10:04)es2 napisał(a): Zacznij od tego aby prawidłowo umieścić kod na forum,chyba, że znasz prosty sposób aby wyszukać tekstu do porównania na tym obrazku, wstawienia, edycji.

A jak to zrobić? Jak prawidłowo umieścić kod?
 
Odpowiedź
#4
(09-11-2018, 12:10)Jezel123 napisał(a):
(09-11-2018, 10:04)es2 napisał(a): Zacznij od tego aby prawidłowo umieścić kod na forum,chyba, że znasz prosty sposób aby wyszukać tekstu do porównania na tym obrazku, wstawienia, edycji.

A jak to zrobić? Jak prawidłowo umieścić kod?

Jak? Potrzebujesz pomocy, jaki więc link należy wybrać?
Rejestracja?
Nowa odpowiedź?
Może pomoc? - https://forum.arduinopolska.pl/misc.php?action=help

Zobacz jak wygląda poprawnie umieszczony kod choćby poprzedni wątek https://forum.arduinopolska.pl/watek-pro...na-silniku


PS
Skoro nawet nie potrafisz przeczytać krótkiej pomocy, z pewnością nie przeczytałeś regulaminu forum, pewnie nie czytałeś innych podobnych wątków, to blado widzę abyś był w stanie napisać porządny program. Aż się boję zobaczyć co w tym kodzie "namalowałeś".
 
Odpowiedź
#5
es2

   
    Teraz dobrze?
 
Odpowiedź
#6
(09-11-2018, 13:52)Jezel123 napisał(a): es2

   
    Teraz dobrze?
Dobrze, byłoby, gdyby kod był sformatowany, jak poniżej:
Kod:
#include <Servo.h>

// Stworzenie obiektu serwomechanizmu
Servo sg90;
int MGD;
int GD = 0;
int p = 0;
void setup()
{
 sg90.attach(9);
 MGD = analogRead(A0);
 Serial.begin(9600);

}
void loop()
{
 GD = analogRead(A0);
 delay(10);



 if (GD < MGD - 10)
 {
   p = 0;
   sg90.write(p);
 } else {

   if (GD > MGD + 10)
   {
     p = 180;
     sg90.write(p);

   }
   else
   {
     p = 90;
     sg90.write(p);
   }
 }
}

i jak by w końcu zrobiono po ludzku wyświetlanie kodu na form, ale to już nie wina użytkowników.

Co do kodu. Skąd go masz? Twoja "radosna twórczość", czy z netu? Jak z netu to omijaj stronę, z której masz kod szerokim łukiem.

Wiesz co robi
Kod:
  Serial.begin(9600);
?
 
Odpowiedź
#7
(09-11-2018, 14:22)es2 napisał(a): Co do kodu. Skąd go masz? Twoja "radosna twórczość", czy z netu? Jak z netu to omijaj stronę, z której masz kod szerokim łukiem.

Wiesz co robi
Kod:
  Serial.begin(9600);
?

Kod jest w połowie z internetu a w połowie sam go napisałem.
a Serial.begin(9600); napisałem, bo testowałem , który warunek działa, kiedy serwo kręci "bączka".
Niestety kończyło się na tym, że na monitorze portu nic się nie wyświetlało.
 
Odpowiedź
#8
(09-11-2018, 14:27)Jezel123 napisał(a): Kod jest w połowie z internetu a w połowie sam go napisałem.
Wyszła ciekawa hybryda. Niestety łączy wady obu połówek zamiast łączyć zalety.

(09-11-2018, 14:27)Jezel123 napisał(a): a Serial.begin(9600); napisałem, bo testowałem , który warunek działa, kiedy serwo kręci "bączka".
Niestety kończyło się na tym, że na monitorze portu nic się nie wyświetlało.
Czyli dobrze kombinowałeś. Arduino nie ma możliwości sprzętowego debugowania (co ciekawe AVR taka możliwość mają) więc trzeba sobie radzić używając UART.
Doprowadź do tego, aby komunikaty wysyłane z Arduino pojawiały się w monitorze. Bez tego szkoda czasu na domyślanie się co i czy pojawia się po odczycie z wejścia analogowego. Może jakieś druty nie stykają? Może pomyliłeś wyprowadzenia? Za dużo zgadywania. Nie pisz, ze wszystko sprawdziłeś 100 razy i jest ok. Sam po sobie dobrze nie sprawdzisz. Będziesz widział co chcesz widzieć a nie co jest. Najszybciej błąd znajdzie inna osoba.

Zacznij więc od wysłania na monitor wartości odczytywanej przez
Kod:
analogRead(A0);
 
Odpowiedź
#9
es2


Kiedy skieruję joystick w lewo (przewody wychodzą od dołu), wartość jest równa 0. Kiedy skieruję joystick w prawo, wartość waha się od 954 do 1017, ale kiedy nic nie robię wartość waha się od 410 do ok 520. Po paru minutach zostaje na 520. Przez to pierwszy odczyt = ok 450 a następne są większe lub mniejsze. Czy jeżeli zamiast if (GD>MGD+10) dałbym MGD+100 to działało by?
 
Odpowiedź
#10
(09-11-2018, 16:11)Jezel123 napisał(a): es2


Kiedy skieruję joystick w lewo (przewody wychodzą od dołu), wartość jest równa 0. Kiedy skieruję joystick w prawo, wartość waha się od 954 do 1017, ale kiedy nic nie robię wartość waha się od 410 do ok 520. Po paru minutach zostaje na 520. Przez to pierwszy odczyt = ok 450 a następne są większe lub mniejsze. Czy jeżeli zamiast if (GD>MGD+10) dałbym MGD+100 to działało by?

Próby przeprowadziłeś poprawnie ale wyciągnąłeś złe wnioski. Jak zauważyłeś, wynik nie jest stabilny. To jest normalne zjawisko. Przetwornik w AVR ma zdaje się +/2 LSB. Problemem może też być jakie ustawiłeś źródło napięcia odniesienia i jak włączyłeś potencjometr. Pomiary mogą być dokładniejsze, jak na czas konwersji uśpisz uC ale w tym przypadku nie jest to konieczne, ponadto tylko taki zabieg, nie rozwiązał by problemu. Przypisanie +100 też nie rozwiąże problemu, bo przy kolejnym uruchomieniu, może się okazać, że potrzeba +50 albo -20.

Musisz uśrednić wyniki pomiarów. Uśrednianie musisz przeprowadzić zarówno przed przypisaniem wyniku pomiaru w setup() jak i w loop().
ZAPOMINJ o rozwiązaniu
Kod:
zmienna = analogRead(x);
i dalsze operacje na "zmienna". Musisz wykonać serię pomiarów i dopiero jej wynik użyć do dalszej obróbki. Ja obliczać średnią? Czy może zrobić LPF? To zależy od aplikacji. Tu wymagań dużych nie ma, ani pod względem prędkości (zwłaszcza, że dostawiasz delay) jak i rozdzielczości. Użyj więc metody jaka najłatwiej zaimplementować..
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości