Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

@Patita, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

22 minuty temu, Patita napisał:

Czy możliwe jest by podłączyć dwa serwa które jednocześnie będą wykonywały dwa różne ruchy?

Tak, oczywiście - bez żadnego problemu. 

Udostępnij ten post


Link to post
Share on other sites

Witam, 

Jako całkowity amator mam problem, mianowicie w lekcji 3 było pokazane pobieranie tekstu. Natomiast w zadaniu domowym z lekcji o serwomechanizmach i PWM jest zadanie domowe 5.4. Nie mam totalnie pojęcia jak pobrać zmienną, próbowałem konwersji, zaglądnąłem na strone arduino do manuali, i każda próba pobrania zmiennej kończy się fiaskiem.

Niby pobiera wartość liczbową, i wyświetla ją, ale zaraz potem niezaleznie od metody jest jakaś nagła odpowiedź mikro-kontrolera. (zaznaczam iż ta 5 nie ma nic wspolnego z odpowiedzią, niezależnie od tej linijki i tak wyświetlane są wartości wpisane, i zaraz potem całkowicie niespodziewana liczba.

Dlaczego? 😞

Przechwytywanie2.JPG

Udostępnij ten post


Link to post
Share on other sites

@krzych90, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

1 godzinę temu, krzych90 napisał:

Niby pobiera wartość liczbową, i wyświetla ją, ale zaraz potem niezaleznie od metody jest jakaś nagła odpowiedź mikro-kontrolera. (zaznaczam iż ta 5 nie ma nic wspolnego z odpowiedzią, niezależnie od tej linijki i tak wyświetlane są wartości wpisane, i zaraz potem całkowicie niespodziewana liczba.

Widocznie wysyłasz do Arduino "coś więcej" oprócz wpisanej przez Ciebie liczby. Zapewne wynika to z ustawień Twojego monitora portu szeregowego:

1.png 2.png

W obecnej formie program "myśli", że przesyłane znaki linii też mają być traktowane jak liczby stąd pojawia się 0+5=5. Jeśli chcesz tego uniknąć to wystarczy tak zmienić ustawienia nadawania, aby nie wysyłać żadnych innych znaków. Możesz też zmodyfikować program, aby sam filtrował takie znaki.

PS na przyszłość umieszczaj kody programów w treści wiadomości i wklejaj zrzuty ekranu całego okna monitora portu szeregowego to będzie łatwiej udzielić pomocy 😉

Udostępnij ten post


Link to post
Share on other sites

Dziękuję za pomoc w początkach zabawy z Arduino :)

Genialne, tyle godzin nad tym spędziłem a po zmianie w monitorze portu szeregowego jest OK :)

a jak wyglądałaby modyfikacja, aby program sam filtrował znaki?

 

Udostępnij ten post


Link to post
Share on other sites

@krzych90, nie mam teraz pod ręką Arduino, ale pewnie wystarczyłoby coś takiego dodać do Twojego programu (trim usuwa białe znaki):

    String odebrane = Serial.readString();
    odebrane.trim();
    zmienna = odebrane.toInt();

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Hej, mam pytanko. Serwo zawsze na początku ustawia się do pozycji około 90 stopni, czy to można jakoś zmienić? By np zaczynał od 0.

 

Edytowano przez Karliko

Udostępnij ten post


Link to post
Share on other sites

@Karliko, serwomechanizm tego typu nigdy nie ustawia się sam w żadnej pozycji. Wszystko zależy od programu 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
#define diodaPIN 3

byte wypelnienie = 0;
int zmiana = 5;

void setup() {
  pinMode(diodaPIN, OUTPUT);//Konfiguracja pinu jako wyjścia 
}

void loop() {
  analogWrite(diodaPIN, wypelnienie); //Generujemy sygnał o zadanym wypełnieniu

 wypelnienie=wypelnienie+zmiana;
 
  delay(50); //Małe opóźnienie, aby efekt był widoczny
}

zad5.1 

Jest latwe nawet dla kogos kto nie potrafi programowac 🙂

#define diodaPIN 3

byte wypelnienie = 0;
int zmiana = 5;

void setup() {
  pinMode(diodaPIN, OUTPUT);//Konfiguracja pinu jako wyjścia 
}

void loop() 
{
  analogWrite(diodaPIN, wypelnienie); //Generujemy sygnał o zadanym wypełnieniu

  if (wypelnienie < 255) 
  { //Jeśli wypełnienie mniejsze od 100%
    wypelnienie = wypelnienie + zmiana; //Zwiększamy wypełnienie

  
  }
  else if(wypelnienie==255) // Jeśli wypełnienie osiągnie 100%
  {
    while(wypelnienie>0) // Jeśli wypełnienie większe od 0 
    {
    wypelnienie=wypelnienie-zmiana; // Zmniejsz je do 0
    analogWrite(diodaPIN, wypelnienie);
    delay(15);
    }
  } 
 
  delay(15); //Małe opóźnienie, aby efekt był widoczny
}

zad 5.2 

Wydaje mi sie ze dziala poprawnie. Prosze o podpowiedz jesli mozna cos zmienic na lepsze poniewaz sie ucze 🙂

5.4

#include <Servo.h> //Bibloteka odpowiedzialna za serwa

Servo servoMechanizm; //Tworzymy obiekt, dzieki ktoremu mozemy odwolac sie do serwa
int pozycja=0; // Aktualna pozycja serva 0-100

void setup() 
{
  Serial.begin(9600);
  servoMechanizm.attach(9); //Servomechanizm podlaczony do pinu 9
}

void loop() 
{
  Serial.print("Poczatkowa pozycja: ");
  Serial.println(pozycja);
  for(int pozycja; pozycja<=180; pozycja++) //Zwiekszaj pozycje
  {
    Serial.print("Aktualna pozycja: ");
    Serial.println(pozycja);
    servoMechanizm.write(pozycja); //Wykonaj ruch
    if(pozycja ==180)
    {
      Serial.print("Maksymalna pozycja: ");
      Serial.println(pozycja);
      pozycja=0;
    }
    delay(50);
  }
}

Jak to poprawic? 

Chcialbym aby terminal byl bardziej czytelny + chce zeby kiedy silnik dojedzie do pozycji maks wyswieltal sie ponownie napis pozycja poczatkowa. 🙄

Edytowano przez arek2007100

Udostępnij ten post


Link to post
Share on other sites
Dnia 7.03.2019 o 15:16, arek2007100 napisał:

Chcialbym aby terminal byl bardziej czytelny + chce zeby kiedy silnik dojedzie do pozycji maks wyswieltal sie ponownie napis pozycja poczatkowa.

Co dokładnie chciałbyś poprawić? Wyświetlanie napisu o pozycji początkowej najprościej będzie uzależnić od wartości zmiennej pozycja - będziesz mógł wyświetlać wtedy odpowiednie komunikaty dla praktycznie dowolnej pozycji 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam,

Do tej pory przerobiłem wszystkie zadania, ale mam pytanie dotyczące serwo z kursu. Doczytałem już z poprzednich postów, że może być to inny model, bez blokady mechanicznej. Na pewno takiej nie posiada, bo wykonując poniższy program zachowuje się inaczej niż założenia w kursie.


#include <Servo.h> // Biblioteka

Servo serwomechanizm; // tworzenie obiektu
int pozycja = 0; // aktualna pozycja
int zmiana = 6; // zmiana pozycji serwa

void setup() {
  serwomechanizm.attach(5); // podłączenie do pinu 5
  Serial.begin(9600); // prędkość transmisji
}

void loop() {
  if (pozycja < 180) { // jeżeli pozycja jest <180
    serwomechanizm.write(pozycja); // wykonanie ruchu
  } else { // w przeciwnym wypadku
    pozycja = 0;
  }
  Serial.println(pozycja); // wyświetl pozycję
  pozycja += zmiana; // zwiększenie pozycji
  delay(200); // opóźnienie
}

Najpierw wykonuje kilka obrotów. Następnie zwalnia, wykonuje powolny obrót o kilkadziesiąt stopni i wraca do położenia innego, niż początkowe. Wg monitora portu szeregowego zmiana kierunku obrotów następuje przy wartości 90. Przy nastawieniu pozycji na kilkanaście "stopni" kręci się w jedną stronę. Nie jestem pewien jak długo, bo wolę go w ten sposób nie eksploatować. Wygląda, jakby serwo jednak nie interpretował zadanej pozycji, jako stopnie wychylenia z pozycji zerowej.

Moje pytania brzmią. Po pierwsze, czy nie popełniłem jakiejś głupoty w programie (sądzę, że podłączyłem wszystko właściwie). Jeżeli wszystko jest napisane poprawnie, czy mogę to serwo zmusić do współpracy? Wiem już, że mogę próbować pisać do botlandu o serwo dokładnie taki jak w kursie, ale sądzę, że mógłbym spróbować pracować z tym co mam. Zwłaszcza, że nie jest najwidoczniej uszkodzony.

Edytowano przez Kage

Udostępnij ten post


Link to post
Share on other sites

@Kage, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 11.03.2019 o 18:27, Kage napisał:

Następnie zwalnia, wykonuje powolny obrót o kilkadziesiąt stopni i wraca do położenia innego, niż początkowe. Wg monitora portu szeregowego zmiana kierunku obrotów następuje przy wartości 90.

Jeśli Twoje serwo zmienia kierunek obrotów o 360*, to wygląda na to, że posiadasz złe serwo. Konkretnie masz serwo 360*, które używa się np. do napędzania małych robotów. W przypadku tych serw nie ma możliwości, aby kontrolować ich położenie. Zmiana wypełnienia sygnału PWM wpływa tylko na kierunek i prędkość obrotów. pozostaje więc wymiana na właściwe serwo lub po prostu możesz zostawić sobie takie, bo też jest przydatne 😉

Udostępnij ten post


Link to post
Share on other sites

Witam,

Od jakiegoś czasu zmagałem się z lekcją #5 kursu arduino i sterowaniem serwem SG90. Problem polegał na tym, że nie dało się nim kompletnie sterować, tak jak to jest opisane w kursie. Jego ramie poruszało sie chaotycznie w zakresie ok 15 stopni, a samo serwo mocno drgało (co widac na zalaczonym gifie).

Jezeli chodzi o zasilanie, to próbowałem różnych konfiguracji: bezpośrednie podłączenie serwa do zasilacza LW-K3010D, zasialnie z zasilacza poprzez LM7805 lub z wykorzystaniem baterii. W każdej wersji zasilanie prowadzone było niezależnie od płytki, którą zasilałem z USB z kompa. W skrócie sygnal PWM z pin 9 był podawany z arduino, a zasialnie silnika szło oddzielnie poza kontrolerem. Za kazdym razem objawy były identyczne.

Program do sterowania został skopiowany ze strony, jak należy. Dodałem dwie linie kodu, aby odczytać wartości 'pozycja' przez serial monitor i PWM działało bez zarzutu. Niby wszystko  było ok, ale serwo trząsło się jak przy ataku żółtej febry. Ogarniała mnie już desperacja i miałem ochotę się poddać, gdy wpadłem na pomysł płączenie masy płytki z masą zasilania silnika w serwie. I to było bingo. Drgawki ustały, a ramie zaczęło sie rytmicznie poruszać. Wprawdzie, nie wszystko jeszcze działa dobrze, bo ramie krąży w zakrasie  0-165 stopni, ale mam nadzieję, że dojdę do tego, jak uzyskać obrót 0-180. Może macie jakieś sugestie?

Mam nadzieję, ze ten wpis zaoszczędzi komuś trochę czasu.

 

Serwo SG90 fail.gif

Udostępnij ten post


Link to post
Share on other sites

@walfer2000 czy to serwo pochodzi z naszego zestawu? Pytam, bo nie widzę, abyś miał przypisany jakiś zestaw do swojego konta na forum, a warto byłoby zacząć od tego czy wina nie leży w zakupie złego napędu. Akurat w przypadku tego typu serwa symbol SG90 nie mówi zbyt wiele, bo producenci pod tą samą nazwą wypuszczają na rynek zupełnie różne napędy.

Udostępnij ten post


Link to post
Share on other sites

Problem został już pozytywnie rozwiązany. Mea culpa. Wielkie dzięki za pomoc.

 

Udostępnij ten post


Link to post
Share on other sites

Zadanie 5.3

#include <Servo.h>

Servo serwo;
int pozycja = 0;
int zmienna = 6;
int opoznienie = 200;
int zmiana = 50;
void setup() {
  
  serwo.attach(9);
}

void loop() {
  if (pozycja < 180){
    serwo.write(pozycja);
  } else {
    pozycja = 0;
  }

  pozycja = pozycja + zmienna;
  delay(opoznienie);

  opoznienie = opoznienie + zmiana;
}

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...