Skocz do zawartości
Komentator

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki

Pomocna odpowiedź

(edytowany)

@Treker ok, tak też myślałem, ale wolałem się upewnić. Zapomniałem że w 2 części podstaw elektroniki też był w zestawie wiec do  czasu reklamacji skorzystam z niego. Dzięki. 😉 

@EDIT 
 

@Treker po kilki godzinach jeszcze raz podłączyłem poprzedniego serwa i o dziwo zaczął działać normalnie, nie wiem co się podziało w tym czasie ale działa. 😄 

Edytowano przez krzym2
Aktualizacja problemu
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam.

Również zamieszczam swoje rozwiązania do prac domowych z tego rozdziału:

zadania 5.3 nie wrzucam, bo nie jest ono chyba aż tak trudne ; )

Zadanie 5.4

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
void setup() 
{ 
  Serial.begin(9600);
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
} 
 
void loop() 
{
  if( Serial.available() > 0 ){
    pozycja = Serial.parseInt(); // wczytuje liczbe
    Serial.print("Podales liczbe:");
    Serial.println(pozycja);
  
    if (pozycja > 180){
      Serial.println("Podales za duza liczbe, podaj liczbe z zakresu od 0-180");
    }else if (pozycja < 0 ) {
      Serial.println("Podales za mala liczbe, podaj liczbe z zakresu od 0-180");
    } else {      
      serwomechanizm.write(pozycja); //Wykonaj ruch
    }
  }
  delay(800); //Opóźnienie dla lepszego efektu 
  pozycja = 0; // pozycja poczatkowa
  serwomechanizm.write(pozycja);  // serwo na pozycji poczatkowej                      
}

Zadanie 5.5

#include <Servo.h> // bibliotka odpowiedzialna za serwo

int ADCC = 0; // odczyt z ADC
Servo serwomechanizm; // tworze obiekt za pomoca korego bede sie odwolywac do serwa

void setup() {
  Serial.begin(9600);
  serwomechanizm.attach(9); // Serwo podlaczone do pinu 9  
}

void loop() {
  ADCC = analogRead(A5); // odczytuje wartosc napiecia
  Serial.println(ADCC); // wyswietla odczytana wartosc
  delay(200);
  ADCC = map(ADCC, 0, 1000, 1,180); // przeskalowanie wartosci
  Serial.println(ADCC); // wyswietla przekonwertowana wartosc
  delay(200);

  serwomechanizm.write(ADCC); // wykonaj ruch

  delay(1000);
 
}

Pozdrawiam ; )

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam. Mam pewien problem odnośnie zadania 5.5. Cały układ wykonałem poprawnie, lecz zawsze gdy podłączałem go, to słyszałem jak servo się obraca i zaczyna buczeć i wibrować. Nie wiedziałem o co chodzi. Kręcenie potencjometrem nic nie daje. Gdy dopisałem wiersz, który pisał w uart ile powinien wynosić kąt, to bardzo się zdziwiłem, gdyż było ciągle 0, jedynie gdy potencjometr był na maxa, to pokazywało się 180 i servo się obracało. Tak jakby był przekazywany sygnał z potencjometru 0 lub 1023. Potencjometr działa poprawnie, ponieważ go również sprawdziłem i podaje wartości takie, jakie powinien podawać. Na dole podam cały kod. Pozdrawiam.

#include <Servo.h>
Servo serwomechanizm;
int odczytanaWartosc = 0;
int stopnie = 0;
void setup() {
serwomechanizm.attach(9);
Serial.begin(9600);
}

void loop() {
odczytanaWartosc = analogRead(A5);
stopnie = odczytanaWartosc / 1023 * 180;
serwomechanizm.write(stopnie);
Serial.println(stopnie);
Serial.println(odczytanaWartosc);
delay(600);
}

 

Udostępnij ten post


Link to post
Share on other sites

@Panda jakoś ciężko mi wywnioskować z tego opisu na czym dokładnie polega problem. Możesz napisać konkretnie:

  • jak jest w praktyce,
  • a jak według Ciebie powinno być?

Schemat podłączenia też byłby pomocny 😉

Udostępnij ten post


Link to post
Share on other sites

@Treker Chciałbym, aby było tak, jak ma być, czyli żeby podczas kręcenia potencjometrem, obracał się serv. Jest tak, że serv po prostu obraca się do 0 stopni na samym początku. Gdy potencjometr jest na maxa, to przesuwa się na 180 stopni. Gdy potencjometr jest w jakimkolwiek innym miejscu niż na najwyższej wartości, to serv jest ciągle na 0 stopni, bzyczy i wibruje.  Dlaczego tak się dzieje? Zdjęcie jest obok.

IMG_20190710_201918.thumb.jpg.e63db722af01996f429735930a673194.jpg

Udostępnij ten post


Link to post
Share on other sites

Ma ktoś może pomysł o co z tym chodzi?

Udostępnij ten post


Link to post
Share on other sites

Z programowania to cienki jestem, wydaje mi się, że jest to problem typu zmiennych. Czytałeś coś o typach zmiennych np.: int, jak wyglądają operacje na różnych typach zmiennych, i o czymś co chyba nazywa się rzutowanie typów?

Udostępnij ten post


Link to post
Share on other sites
17 godzin temu, Panda napisał:

Gdy dopisałem wiersz, który pisał w uart ile powinien wynosić kąt, to bardzo się zdziwiłem, gdyż było ciągle 0, jedynie gdy potencjometr był na maxa, to pokazywało się 180

To teraz policz sobie.

Dla pełnego skręcenia potencjometru wartość odczytana wynosi 1023. Wykonujemy działania:

1023 / 1023 - wychodzi 1

1 * 180 - wychodzi 180, czyli dobrze...

A teraz lekko skręćmy potencjometr, niech odczytana wartość wyniesie 1022.

1022 / 1023 - wychodzi 0

0 * 180 - jak nie liczyć wychodzi zero, i tak dalej dla wszystkich wartości w dół...

 

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@ethanak Wychodzi 0, ponieważ jest funkcja int, która nie podaje liczb po przecinku! Spróbuję z funkcją float. Dzięki za pomoc!

Działa, dzięki jeszcze raz!

Edytowano przez Panda
napisałem string zamiast float

Udostępnij ten post


Link to post
Share on other sites
Dnia 12.07.2019 o 14:51, Panda napisał:

Wychodzi 0, ponieważ jest funkcja int, która nie podaje liczb po przecinku! Spróbuję z funkcją float. Dzięki za pomoc!

@Panda dla formalności dodam tylko, że int i float to nie są funkcje tylko typy zmiennych. Wiem, że na początku może Ci się to mieszać, ale jest to jednak ważne 😉

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

w części z wykorzystaniem serwo mechanizmu w praktyce co to jest to niebieskie obok stabilizatora (na obrazku)

Udostępnij ten post


Link to post
Share on other sites

@sk1lek są to kondensatory ceramiczne (w nowej wersji kursu będą już zaktualizowane, aby wyglądały jak rzeczywiste elementy) 🙂

Udostępnij ten post


Link to post
Share on other sites

Zadania domowe :DD

5.3

#include <Servo.h>
Servo serwomechanizm;
int pozycja = 0;
int zmiana = 6;
int czas = 150;
int zmianaCzasu = 50;
void setup() {
  serwomechanizm.attach(10);

}

void loop() {
  if(pozycja < 180){
    serwomechanizm.write(pozycja); //wykonaj ruch
    }else{
      pozycja = 0;
      }

      pozycja += zmiana;
      
      delay(czas);
      czas += zmianaCzasu; //za każdym zapętleniem zwiększaj opóźnienie o wartosc w zmianie czasu 
}

 

ZAD 5.4

#include <Servo.h>

Servo serwomechanizm;
int pozycja = 0;
String userInput = "";
void setup() {
  Serial.begin(9600);
  serwomechanizm.attach(10);
  Serial.println("Wpisz kąt o jaki ma się obrócić serwo");
}

void loop() {
  if(Serial.available() > 0){
      userInput = Serial.readStringUntil('\n'); //jeżeli w buforze znajdą się jakieś dane przypisz je do userInput
      pozycja = userInput.toInt();  //zmien typ na int
      if(pozycja <= 180 && pozycja >= 0){ //jeżeli pozycja jest w zakresie <0,180> ustaw ją na serwo
        serwomechanizm.write(pozycja);
        delay(20);
        }
       else{ //w innym wypadku wyświetl komunikat
        Serial.println("Podaj liczbe z zakresu <0,180>");
        }
    }

}

ZAD 5.5

#include <Servo.h>

Servo serwomechanizm;
int potencjometr = 0;
int pozycja = 0;
void setup() {
  serwomechanizm.attach(10);

}

void loop() {
  potencjometr = analogRead(A5);
  pozycja = map(potencjometr, 0, 1023, 0, 180); //zmien odczyty z przetwornika ADC na zakres od 0 do 180
  serwomechanizm.write(pozycja); //ustaw pozycje serwa na podstawie wartości z map()
  delay(20); //małe opóźnienie w celu redukcji ewentualnych szumów
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@adrianrogalski jeśli wszystko działa to śmiało idź dalej 🙂 Popracuj jedynie nad tym, aby nie powielać poniższego błędu formatowania:

        }
       else{

Lepiej tak robić tak:

        } else {
  • Lubię! 1

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