Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

@DraveS, 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.
11 minut temu, DraveS napisał:

Gdy ustawiam na nim wartość 0 to on jakby ciągle pracuje chcąc się przekręcić jeszcze trochę. Natomiast jak ustawiam 180 jest ok, ale w sumie ustawienie pozycji np 175 jest taka sama jak dla 180.

Chodzi Ci o to, że serwo staje w pozycji 0, ale trochę "drży", czy oto, że kręci się cały czas dookoła (360 stopni)? Oba warianty są możliwe i od tego zależy moja dalsza odpowiedź 😉

Udostępnij ten post


Link to post
Share on other sites

Staje w miejscu i drży. 

Tak z ciekawości jaka jest funkcja na przekazywanie ręcznie wartości pwm zamiast kąta? 

Udostępnij ten post


Link to post
Share on other sites
1 minutę temu, DraveS napisał:

Staje w miejscu i drży. 

To w takim razie jest to normalne zachowanie serw. Większość egzemplarzy serw tego typu drży w jednej ze skrajnych pozycji.

1 minutę temu, DraveS napisał:

Tak z ciekawości jaka jest funkcja na przekazywanie ręcznie wartości pwm zamiast kąta? 

Będzie to analogWrite(), do której jako argument podajesz wartość wypełnienia od 0 do 255 (co oznacza 100%).

Udostępnij ten post


Link to post
Share on other sites

Ok. Pytałem znajomych modelarzy i oni nie zauważyli takiego zachowania. Ale może używają lepszych serw analogowych. 

A te wartości nie powinny być na 0 jako środek i ujemne i dodatnie dla stron?

Udostępnij ten post


Link to post
Share on other sites
Przed chwilą, DraveS napisał:

Ok. Pytałem znajomych modelarzy i oni nie zauważyli takiego zachowania. Ale może używają lepszych serw analogowych. 

Wszystko zależy od konkretnych serw, oczywiście im droższe tym precyzyjniejsze. W takich najpopularniejszych i tanich serwach opisane zachowanie jest zupełnie normalne.

1 minutę temu, DraveS napisał:

A te wartości nie powinny być na 0 jako środek i ujemne i dodatnie dla stron?

W przypadku sygnału PWM nie ma czegoś takiego jak wartość ujemna - wypełnienie jest procentowe. Możesz sobie przyjąć jakąś wartość za 0 i operować +/- względem tej wartości, ale wypełnienie sygnału PWM w praktyce zawsze będzie wartością dodatnią 🙂

Udostępnij ten post


Link to post
Share on other sites

Ok. Dzięki za odpowiedzi :). No właśnie jak się nad tym zastanowiłem to sam na to wpadłem, że to w sumie trochę bez sensu ;).

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam

Zacząłem realizować zadanie 5.4, wydaje mi się że kod napisałem dobrze lecz serwo zachowuje się dziwnie od wartości 15-179 ( pierwsze 2 obroty na filmie)  wszystko działa poprawnie lecz w granicach wartości 1-15 serwo się "przekręca".

#include <Servo.h>

Servo serwomechanizm;  //nazwa

int zmiana=0;
String dane="";


void setup() {

serwomechanizm.attach(9);
Serial.begin(9600);
}

void loop() {
  while (Serial.available() == 0); // zatrzymanie wysylaniu komunikatu o błedzie

if(Serial.available()>0){
dane= Serial.readStringUntil ('|n');
  zmiana=dane.toInt();   // zmiana danych wspisywaych na wartosc INT
}

if(zmiana>0 && zmiana<180){    //spełnienie warunków opsianych w zadaniu
  serwomechanizm.write(zmiana);
}else{
  Serial.println("błąd");   //komunikat o prezkorczeniu wartosci
}

}

 

Edytowano przez Treker
Usunąłem załącznik.

Udostępnij ten post


Link to post
Share on other sites

@Kamar, 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.
28 minut temu, Kamar napisał:

Zacząłem realizować zadanie 5.4, wydaje mi się że kod napisałem dobrze lecz serwo zachowuje się dziwnie od wartości 15-179 ( pierwsze 2 obroty na filmie)  wszystko działa poprawnie lecz w granicach wartości 1-15 serwo się "przekręca".

Temat przewijał się już na forum kilka razy, w skrócie: niestety od pewnego czasu w obiegu jest nowy typ serwa, który ma dodatkowo właśnie możliwość obrotu o 360*, który wyzwala się podając komendę ustawienia serwomechanizmu w pozycji bliskiej zero (tak jak u Ciebie: 1-15). Producent wprowadził taką opcję bez zapowiedzi i pomieszał typy serw w różnych dostawach, więc nawet przy ręcznym sprawdzaniu każdego napędu czasem trafi się źle opisane silnik.

Z tego co widzę, to nie masz naszego zestawu lub go nie zarejestrowałeś (nie mogę znaleźć zestawu powiązanego z Twoim kontem), pozostaje Ci więc ewentualnie zakup nowego serwa. Jeśli jednak masz nasz zestaw to zgłoś się do Botlandu, na pewno wymienią napęd bez problemu - pamiętaj tylko o rejestracji zestawów w przyszłości, bo to wiele ułatwia.

Decyzja należy do Ciebie - serwo, które posiadasz nie jest uszkodzone, to po prostu trochę inna wersja tego samego napędu. Zastanów się jaka wersja serwomechanizmu będzie dla Ciebie w przyszłości bardziej przydatna (w wykonaniu ćwiczeń z kursu nie będzie to przeszkadzało) i od tego uzależnij ewentualny zakup lub wymianę.

PS usunąłem Twój załącznik, bo trzymanie filmu w formie archiwum zip na forum to trochę mało wygodna opcja 😉

Udostępnij ten post


Link to post
Share on other sites

5.2

#define dioda 3

int wypelnienie = 0;
int zmienna = 5;
 
void setup() {

pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
}

void loop() {

analogWrite(dioda, wypelnienie);

if (wypelnienie<255) {
  wypelnienie = wypelnienie + zmienna;
} else if (wypelnienie == 255) {
  
        while(wypelnienie!=0 && wypelnienie>0){
          
             wypelnienie = wypelnienie - zmienna; 
             analogWrite(dioda, wypelnienie);
             delay(50);
           }
    }
delay (50);
}

 

Udostępnij ten post


Link to post
Share on other sites

@Maszynyodsrodka, jeśli program działa, to super - pamiętaj tylko o komentowaniu kodu, bo to naprawdę znacznie poprawia czytelność programów 🙂

Jeśli miałbym się do czegoś "przyczepić" to do poniższego warunku, bo coś tutaj chyba Ci nie wyszło - zastanów się czy nie możesz tego skrócić do jednego warunku:

11 godzin temu, Maszynyodsrodka napisał:

while(wypelnienie!=0 && wypelnienie>0){

Udostępnij ten post


Link to post
Share on other sites

@112majek, 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.

3 godziny temu, 112majek napisał:

1

Czy przypadkiem nie skasowałeś swojej wiadomości? Ciężko pomóc, gdy nie ma pytania 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

5.4

#include <Servo.h> 

Servo serwomechanizm;
int pozycja = 0;
String wartosc_polozenia = ""; //wartość wpisana przez użytkownika  
int wartosc_polozenia_int = 0; 

void setup() 
{
  Serial.begin(9600);
  serwomechanizm.attach(9);
}

void loop()
{

Serial.println("Wpisz liczbę z zakresu 0 - 180");

while (Serial.available() == 0);                                 //czakamy na podanie liczby

wartosc_polozenia = Serial.readStringUntil ('\n');               //wczytujemy wartośc wpisaną przez użytkownika
wartosc_polozenia_int = wartosc_polozenia.toInt();               //przekrztalcenie zmiannej string na int

  if (wartosc_polozenia_int > 0 && wartosc_polozenia_int <= 180) //jeśli wartosc wpisanej liczby jest miedzy 0 i 180
  {
   pozycja = wartosc_polozenia_int ;                             //jeśli tak pozycja = wczytanej liczbie
   serwomechanizm.write(pozycja);                                //ruch do wpisanego położenia
  } 
      else if (wartosc_polozenia_int == 0)                       // jeśli wpisana wartość równa się 0 - wracamy na pozycję 0
      {
        pozycja = 0;
        serwomechanizm.write(pozycja); 
      } 
         else if (wartosc_polozenia_int > 180)                   // jeśli wartość przekracza 180 wyświetlamy komunikat
         {
          Serial.println("Podałeś złą wartość! Wartość musi być z zakresu 0-180");
          delay(3000);
         }
}

 

Edytowano przez Maszynyodsrodka
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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

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