Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

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ź 😉

Link do komentarza
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%).

Link do komentarza
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?

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

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ą 🙂

Link do komentarza
Share on other sites

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.
Link do komentarza
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 😉

Link do komentarza
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);
}

 

Link do komentarza
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){

Link do komentarza
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 😉

Link do komentarza
Share on other sites

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
Link do komentarza
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!

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

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.