• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Arduino- Problem z Serwo

Mały hosting, OGROMNE możliwości
0 głosów
705 wizyt
pytanie zadane 9 listopada 2018 w Mikrokontrolery przez Jezel123 Nowicjusz (120 p.)

Witam.
Zacząłem zabawę z joystickiem w arduino.
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ę.

Kod:

#include <Servo.h>

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);
  }
}
}
  

 

 

1
komentarz 9 listopada 2018 przez DragonCoder Nałogowiec (36,500 p.)
Ja bym sprawdzil jakie wartości dostaje na outpucie u joysticka. I wtedy moze problem sie rozwiaze. Moze byc tak, ze wartosc w dalszym ciagu jest wieksza od poczatkowej. Joystick sam w sobie jest czuly i lekki ruch powoduje dosyc duzy skok wartosci. Sprawdz, czy gdy zamiast zmiennym zmiennych uzyjesz liczb, to zadziala. Tzn joystick ma na poczatku warzosc rowna 524, gdy wychylenie jest wieksze od 524 to zakrec na 180 stopni, gdy mniejsze to na 180 szopni

1 odpowiedź

0 głosów
odpowiedź 11 listopada 2018 przez Maciej Złotorowicz Gaduła (4,230 p.)
Ja bym ustawił większe wartości progowe ;) nie ma co ufać analogom.
komentarz 11 listopada 2018 przez Maciej Złotorowicz Gaduła (4,230 p.)
Ok już wszystko wiem:
Joys. dla X(lub Y) w pozycji 0 zwraca liczbę bliską 512  i dla wartości skrajnych 0 lub 1023 aby te warunki działały musisz sprawdzić czy wartość na pinie analogowym mieści sie w jakiś progach: np od 0 do 250 mamy servo na 0; od 251 do 750 mamy 90 i od 750 do 1023 mamy 180. dasz radę zakodować?
komentarz 11 listopada 2018 przez Maciej Złotorowicz Gaduła (4,230 p.)
#include <Servo.h>
 
Servo sg90;
int MGD;
int GD=0;
int p=0;
int lastpos=0;
void setup()
{
  sg90.attach(9);
  Serial.begin(9600); 
  
}
void loop()
{  
  GD=analogRead(A0);
  delay(10);
   
   Serial.println(GD);

  
  if(GD <= 250)
  {
    p=0;
  }else if(GD>250 && GD <= 750){
    p=90;
  }else if(GD > 750){
   p=180;
  }
  
  //Ten if sprawdza czy ostatna pozycja nie była taka sama
  if(lastpos != p){
     sg90.write(p);
  }
  lastpos = p;
}

Przykład rozwiązania - w arduino warto używać serialbusa aby zrozumieć charakterystykę danego czujnika, więc polecam na przyszłość Serial.println(GD) w loopie. 

Podobne pytania

0 głosów
2 odpowiedzi 1,217 wizyt
pytanie zadane 6 lutego 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,490 p.)
0 głosów
1 odpowiedź 760 wizyt
pytanie zadane 13 lutego 2020 w Mikrokontrolery przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 12 lutego 2020 w Mikrokontrolery przez Marak123 Stary wyjadacz (11,190 p.)

93,715 zapytań

142,629 odpowiedzi

323,260 komentarzy

63,257 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...