Skocz do zawartości

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

Staje w miejscu i drży. 

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

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

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?

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

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

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

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

  • 4 tygodnie później...

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

 

@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){

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

(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
  • 2 tygodnie później...

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