Skocz do zawartości

Sterowanie serwo SG90


Prometeuszanin

Pomocna odpowiedź

Cześć, potrzebuję szybkiej pomocy. Próbuję się dowiedzieć jak zmieniać pozycje serwo +1 stopień i - 1 stopień. ktoś z was wie?

Wiem jak ustawić wybraną pozycję z pomocą komendy z portu szeregowego, ale nie wiem jak napisać komendę która zmienia pozycje na wyższą lub niższą od tej w której się aktualnie znajduje.

 

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 1; //Co ile ma się zmieniać pozycja serwa?

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() 
{ 
  Serial.begin(9600); //Uruchomienie komunikacji
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{        if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 
    
    if (odebraneDane == "a") { 
  serwomechanizm.write(pozycja = 45);
    }
    
    if (odebraneDane == "d") { 
  serwomechanizm.write(pozycja = 90);
    }
      if (odebraneDane == "s") { 
  serwomechanizm.write(pozycja+= 10);
    }
    }       
}

Ostatni warunek to moje kombinacja,
nieudana kombinacja

Link do komentarza
Share on other sites

(edytowany)

Nie wiem czy o to Ci chodzi, ale spróbuj tak... 

if (odebraneDane == "+") { 
  serwomechanizm.write(pozycja++);
  delay(50);
    }
      if (odebraneDane == "-") { 
  serwomechanizm.write(pozycja--);
        delay(50);
    } 
if (pozycja >= 180 && pozycja < 0) { 
  pozycja = 0;
  delay(1500); 
  }

Ps...dobrze kombinowałeś z tym ostatnim warunkiem z tym że nie dałeś żadnego opóźnienia i te zmiany nastąpiły błyskawicznie...na tyle szybko że servo nie zdarzyło się poruszyć...

Edytowano przez farmaceuta
  • Pomogłeś! 1
Link do komentarza
Share on other sites

if (odebraneDane == "a") { 
  serwomechanizm.write(pozycja = 45);
    }
    
    if (odebraneDane == "d") { 
  serwomechanizm.write(pozycja = 90);
    }

I to powyżej zamień na 

if (odebraneDane == "a") { 
  pozycja = 45;
    }
    
    if (odebraneDane == "d") { 
 pozycja = 90;
    }

A serwo.write() wrzuć raz gdzieś do pętli loop()...

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

kierunek serwomechanizm jeszcze na chwilę zostawię bo zamierzam zrobić dłuższy kod wykorzystujący też silnik krokowy. Dobrze rozumiem że przy jednym serwo ten opis nie jest potrzebny a przy kilku już tak?

 

Link do komentarza
Share on other sites

Przed chwilą, Prometeuszanin napisał:

Działa, teraz pytanie jak zmienić kod aby pozycja zmieniała się nie o 1 stopień a o 5 lub 10.

 

Dopisać kolejne if'y i dołożyć jedna zmienną która będzie określała o ile ma się zmieniać kąt... 

if (odebraneDane == "+") {
  pozycja += kąt;
  serwomechanizm.write(pozycja);
  delay(50);
    }
      if (odebraneDane == "-") {
        pozycja -= kąt;
  serwomechanizm.write(pozycja);
        delay(50);
    } 
if (pozycja >= 180 && pozycja < 0) { 
  pozycja = 0;
  delay(1500); 
  }
if (odebraneDane == "5") { 
  kąt = 5; 
  } 
if (odebraneDane == "10") { 
  kąt = 10; 
  }

 

Link do komentarza
Share on other sites

7 minut temu, Prometeuszanin napisał:

nie mam "kąt" w bibliotece

Bo to nie metoda biblioteki a zwykła zmienna... Dodaj na początku kodu (przed setup()) 

byte kąt = 0;

 

Link do komentarza
Share on other sites

To mi działa

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 1; //Co ile ma się zmieniać pozycja serwa?
byte kat = 60; //Kąt
String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() 
{ 
  Serial.begin(9600); //Uruchomienie komunikacji
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{        if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 

if (odebraneDane == "+") {
  pozycja += kat;
  serwomechanizm.write(pozycja);
  delay(50);
    }
      if (odebraneDane == "-") {
        pozycja -= kat;
  serwomechanizm.write(pozycja);
        delay(50);
    } 
if (pozycja >= 180 && pozycja < 0) { 
  pozycja = 0;
  delay(1500); 
}
}

Tego nie rozumiem
 

if (odebraneDane == "5") { 
  kąt = 5; 
  } 
if (odebraneDane == "10") { 
  kąt = 10; 
  }

 

Link do komentarza
Share on other sites

Chciałeś mieć możliwość zmiany kąta przez serial...po to te ostatnie warunki (przykładowe) jeśli wpiszesz w serial "5" to twój kąt będzie się zmieniał o 5 stopni (podczas ruchu serwa w lewo/prawo) jeśli wpiszesz "10" to o 10 stopni...

Link do komentarza
Share on other sites

Próbowałem ale nie działało. Mimo to mam już kod na którym mi zależało. postarałem się go ładnie opisać dla potomnych szukających wskazówek na tym forum. Dziękuję za pomoc farmaceuta. Bez pomocy nie udało by mi się do tego tak szybko dojść.
 

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
int zmiana = 1; //Co ile ma się zmieniać pozycja serwa?
String odebraneDane = ""; //Pusty ciąg odebranych danych
byte kat = 10; //o ikle stopni kąt ma sie zmienić

void setup() 
{ 
  Serial.begin(9600); //Uruchomienie komunikacji
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{        if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 
    
    if (odebraneDane == "t") { //po otrzymaniu wiadomości"t"
  serwomechanizm.write(pozycja = 120); //ustawienie serwo w pozycji 45
  delay(50); // opóźnienie dla sprawnego działania serwo
    }

    if (odebraneDane == "r") { //po otrzymaniu wiadomości"r"
  serwomechanizm.write(pozycja = 90); //ustawienie serwo w pozycji 90
  delay(50);
    }

    if (odebraneDane == "e") { //po otrzymaniu wiadomości"e"
  serwomechanizm.write(pozycja++); //zmiana + 1 stopień
  delay(50);
    }

     if (odebraneDane == "q") { //po otrzymaniu wiadomości"q"
  serwomechanizm.write(pozycja--); //zmiana - i stopień
   delay(50);
    } 

    if (odebraneDane == "w") { //po otrzymaniu wiadomości"w"
  pozycja += kat; //zmiana + ustalony kąt
  serwomechanizm.write(pozycja);
  delay(50);
    }

    if (odebraneDane == "s") { //po otrzymaniu wiadomości"s"
        pozycja -= kat; //zmiana - ustalony kąt
  serwomechanizm.write(pozycja);
  delay(50);
    } 
  }
 }       

 

Link do komentarza
Share on other sites

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

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.