Skocz do zawartości

Sterowanie serwo SG90


Pomocna odpowiedź

Napisano

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

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

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

 

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

 

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

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

 

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