Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

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

 

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

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

@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

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

Link do komentarza
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
Link do komentarza
Share on other sites

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