Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

(edytowany)
#include <Servo.h>  //biblioteka serwo

Servo serwomechanizm;  //zmienna serwo

int serwo = 6;
int dt = 200;
String msg = "What position do you want? ";
int myPosition;

String msg2="Your position doesn't exist";
void setup() {

  serwomechanizm.attach(serwo);  //podłączenie serwo
  Serial.begin(9600);
}

void loop() {
  Serial.println(msg);  //Ask
  while (Serial.available() == 0) {}//Wait
  myPosition = Serial.parseInt();//Read
  if (myPosition<=180){//Jesli mieści się w zakresie
    serwomechanizm.write(myPosition);//Porusz o podaną liczbe
  } else {//Jak sie nie mieści
    myPosition=0;
    Serial.println(msg2);
  }delay(dt);

  
}

Moje rozwiązanie do zadania 5.3:)

Edytowano przez hhube
  • Lubię! 1
  • 1 miesiąc później...
Cytat

Wejście stabilizatora łączymy z pinem Vin Arduino, masę z GND, a do wyjścia podłączamy czerwony przewód serwomechanizmu. Oczywiście konieczne są również kondensatory filtrujące.

Na rysunku przykładowego schematu nie ma żadnych kondensatorów. Zostały pominięte?

Screenshot_1.png

3 godziny temu, Krigor napisał:

A jak zrobię bez nich to coś się stanie?

Bez kondensatorów... tak. Układ najprawdopodobniej nie zadziała (chociaż płytka stykowa ma dość dużą pojemność własną, więc to loteria). Zastąp te niebieskie kondensatorki elektrolitami pamiętając o polaryzacji (o ile korzystasz z zestawu z kursu). Wszystko powinno być OK 😉

  • Lubię! 1
  • 2 miesiące później...

Zadanie 5.1

#define dioda 3
int wypelnienie = 0;
int zmiana = 5;

void setup() {
pinMode(dioda, OUTPUT);  // put your setup code here, to run once:
}

void loop() {
  analogWrite(dioda, wypelnienie);
  wypelnienie = wypelnienie + zmiana;
  delay(50); 
}

 

Zadanie 5.4

#include <Servo.h> //biblioteka serwo
Servo serwo;
int zero = 0; //wyzerowanie serwo
String komendaS; //komenda zmiany wychylenia serwo - wiadomość użytkownika
byte komenda; //komenda zamieniona na wartość liczbową

void setup() {
serwo.attach(9); //serwo podłączone do pin 9
Serial.begin(9600);
Serial.println("Podaj kąt serwa od 0 do 180"); //wiadomość początkowa
}

void loop() {
if (Serial.available() > 0) { //jeżeli wiadomość od użytkownika jest wysłana
  komendaS = Serial.readStringUntil('\n'); //czytaj wiadomość aż do końca linii
  komenda = komendaS.toInt(); //konwersja ciągu znaków na liczby
  if (komenda >= 0 and komenda <= 180) { //jeżeli skonwertowana wiadomość mieści się między 0-180, to:
    serwo.write(komenda); //wykonaj ruch serwo o wartość z wiadomości
    Serial.println("Ustawiona pozycja to: " + komendaS); //komunikat tekstowy z wartością wychylenia
    delay(3000); //czas na zadanym wychyleniu
    serwo.write(zero); //wyzerowanie serwo
    Serial.println("Wyzerowano kąt serwo"); //komunikat o wyzerowaniu
  } 
  else {
  Serial.println("Podano złą wartość"); //komunikat o błędzie, jeżeli wiadomość nie spełni warunku
  }
}
}

Program ustawia wychylenie serwo o kąt wpisany przez użytkownika. Po wychyleniu serwo wraca do pozycji zerowej po 3 sekundach i komunikuje o tym  użytkownikowi. W przypadku złej wartości pojawia się stosowny komunikat. 

  • Lubię! 1

Zadanie 5.5

#include <Servo.h> //biblioteka serwo
Servo serwo; //nazwa serwo
int pozycja = 0; //pozycja serwo 0-180
int odczyt = 0;
 
void setup() {
serwo.attach(9); //serwo sterowane z pin 9
Serial.begin(9600);
Serial.println("Aktualna pozycja");
}

void loop() {
odczyt = analogRead(A1); //odczyt z potencjometru pin A1 0-1023
pozycja = map(odczyt, 0, 1023, 180, 0); //przeskalowanie pomiaru z potencjometru na wychylenie serwo

serwo.write(pozycja); //praca serwo

Serial.println(pozycja); //komunikat o pozycji
delay(100);

}

 

  • Lubię! 1

@Sito89 bardzo ładne programy, dobra robota 🙂 W drugim warto byłoby dodać jedynie wcięcia w całych funkcjach setup/loop, ale to drobiazg.

  • Lubię! 1

Cześć wszystkim!

Ostatnio pracowałem nad ćwiczeniem w ramach kursu, w którym używam serwa do sterowania pewnym mechanizmem. Niestety, natrafiłem na problem, którego nie jestem w stanie rozwiązać, dlatego postanowiłem się z Wami podzielić i zapytać o Waszą pomoc.

Oto link do krótkiego filmu prezentującego problem: Link do filmu

Mam problem z dziwnym zachowaniem serwa, zwłaszcza podczas zmiany obciążenia. Wydaje się, że nie zachowuje się ono poprawnie. Napięcie baterii w moim układzie wynosi 8.67V.

Próbowałem z kondensatorami o pojemności 100nF, ale niestety sytuacja nie poprawiła się. Czy moglibyście rzucić okiem na film i podzielić się swoimi spostrzeżeniami? Czy to zachowanie serwa jest normalne, czy może coś jest nie tak z moim układem?

Dodam, że nie jestem pewien, czy dobrałem odpowiednie kondensatory. Może to być problem z ich pojemnością lub typem. 

Bardzo Was proszę o pomoc i rady! Może ktoś miał podobny problem i zna rozwiązanie?

Z góry dzięki za każdą wskazówkę!

Jakub

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