Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

Dnia 7.01.2021 o 19:59, Benji_Tomek napisał:

Fainy kurs, mój syn bacznie się temu przyglada, lat 11, może go zinteresuje... 🙂

@Benji_Tomek jeśli Arduino będzie w tym przypadku zbyt trudne to koniecznie sprawdź kurs micro:bita. Powinien być idealny dla młodszych adeptów elektroniki: http://kurs.forbot.pl/microbit

  • Lubię! 1
Link do komentarza
Share on other sites

// PWM - Pulse Width Modulation
// Sygnał PWM generowany przez Arduino przeważnie przełączany jest 490/sekundę.
#define ledPin3 3
int wypelnienie = 0;
int zmiana = 5;
bool onOff = false;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin3, OUTPUT);

}

void loop() {
  analogWrite(ledPin3, wypelnienie); // Generuje sygnal o zmiennym wypelnieniu

  if(onOff == false) { //Jezeli wypelnienie mniejsze od 100% (kazdy kanal PWM arduino jest 8 bitowy wiec przyjmuje wartosci od 0 do 255)
  wypelnienie = wypelnienie + zmiana;
  if(wypelnienie == 255){
    onOff = true;
  }
  } else if (onOff == true) {
    wypelnienie = wypelnienie - zmiana;
    if(wypelnienie == 0){
      onOff = false;
      delay(500);
    }
  }
  delay(50);

}

Mam pytanie dlaczego w momencie w którym wypelnienie sygnału PWM jest równe zero (pół sekundy na końcu zagniezdzonego IFa.) dioda lekko się świeci tak jakby było podawane na nią napięcie? Pozdrawiam @Treker

Link do komentarza
Share on other sites

@maroitt zwróć uwagę, że w Twoim programie zmieniasz wypełnienie, odczekujesz te pół sekundy, a dopiero później wracasz na początek programu, gdzie to wypełnienie jest realnie przekazywane na diodę (analogWrite). W praktyce więc Twój program nie zatrzymuje się, gdy na diodę podany jest PWM o wypełnieniu 0 tylko krok wcześniej. Pokombinuj jak to można naprawić - sprawa powinna być całkiem łatwa 🙂

PS Popracuj też trochę nad odrobinę lepszym formatowaniem. Wcięcia i spacje - to wszystko jest ważne 🙂

Link do komentarza
Share on other sites

Hej,

Rozpocząłem wasz kurs - jest super i przepraszam jeżeli zadaje banalne pytanie do

Zadania 5.4

Jak najprościej dodać tu możliwość sterowania prędkością obrotów Serwomechanizmu?

Mój kod:
 

#include <Servo.h> // biblioteka Serva

Servo Serwo; // obiekt
int pozycja = 0; // aktualna pozycja 0-180
int zmiana = 6; // co ile ma sie zmienic kat
String podanaWartosc = ""; // podany kat
int podanaWartoscINT = 0; // zmiena podawaWartosc w INT

//int predkosc


void setup(){
    Serial.begin(9600); // komunikacja
    Serwo.attach(9); // serwo pin 9
}

void loop(){
    Serial.println("Podaj kąt serwa! (0-180)");
    while (Serial.available() == 0)
    delay(100);
    
        podanaWartosc = Serial.readStringUntil('\n'); // odczytanie wartosci z klawiatury
        podanaWartoscINT = podanaWartosc.toInt(); // zamiana na INT

    if (podanaWartoscINT <=180 && podanaWartoscINT >=0) { // jesli miesciemy sie w zakresie
        Serwo.write(podanaWartoscINT);
        Serial.println("Aktalny kąt serwa to: " + podanaWartosc);
        
} else {
    Serial.println("UWAGA - Podano kąt z poza zakresu!");
    }
    delay(100);
}

 

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

@KamilKolesnik witam na forum 🙂

2 godziny temu, KamilKolesnik napisał:

Jak najprościej dodać tu możliwość sterowania prędkością obrotów Serwomechanizmu?

Serwomechanizmy nie posiadają takiej opcji. Można zadać im pozycję, ale nie mamy niestety wpływu na prędkość obrotu. Można próbować to obejść np. zadając pośrednie pozycje i dodając małe opóźnienie, ale to trochę prowizorka 😉

 

  • Lubię! 1
Link do komentarza
Share on other sites

20 godzin temu, Treker napisał:

@KamilKolesnik witam na forum 🙂

Serwomechanizmy nie posiadają takiej opcji. Można zadać im pozycję, ale nie mamy niestety wpływu na prędkość obrotu. Można próbować to obejść np. zadając pośrednie pozycje i dodając małe opóźnienie, ale to trochę prowizorka 😉

 

ok dziękuję muszę to zrobić prowizorycznie 🙂

Link do komentarza
Share on other sites

W trakcie wykonywania ostatniego ćwiczenia napotkałem problem.

Konkretnie chodzi o to, że gdy podpinam baterie to arduino najzwyczajniej w świecie nie działa w ogóle.

Nie świeci się żadna dioda. Nigdzie nie ma napięcia.

Gdy próbowałem zrobić to na zasilaniu z kabla do komputera wpisując wartości które były podane układ nic nie robił jedynie servo wydawało bardzo ciche dźwięki. Po kilku próbach zmiany parametrów servo zaczęło się ruszać ale nie wracało do wartości 0. W momencie sprawdzania napięcia pomiędzy wejściem a wyjściem stabilizatora przez przypadek styknęły mi się końcówki igieł miernika i nagle wszystko zaczęło działać jak powinno.

Kompletnie nie mam pojęcia co zrobiłem źle, mógł by mi ktoś wytłumaczyć w miarę prostym językiem?

Link do komentarza
Share on other sites

@Bacantis bardzo dziwna sprawa. Szczerze mówiąc nigdy nie słyszałem o podobnym problemie. Może coś zwyczajnie nie stykało, a Twoje zwarcie nie miało nic wspólnego z naprawą tego błędu. Obserwuj temat, zobaczymy czy napotkasz jeszcze podobny problem.

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć, mam pewien problem. Złożyłem układ z podpunktu "Serwomechanizm w praktyce" po wgraniu kodu serwomechanizm porusza się lekko(nie jest to zakres od 0 do 180 stopni, wykonuje max 2 ruchy) i zatrzymuje(piszcząc lekko). Wykorzystałem rożne kondensatory i układ "działa" w taki sam sposób. Nie wiem w czym może leżeć problem..--->Już wiem, wymieniłem baterie i działa tylko teraz pytanie z innej beczki jeżeli nasz lm7805 ma Vd = 2 V to dlaczego dla baterii nowej 9,6V układ działa, a dla starej 8,77V nie działa ??
Pozdrawiam

Edytowano przez michaltoja
Link do komentarza
Share on other sites

@michaltoja witam na forum 🙂

4 godziny temu, michaltoja napisał:

Już wiem, wymieniłem baterie i działa tylko teraz pytanie z innej beczki jeżeli nasz lm7805 ma Vd = 2 V to dlaczego dla baterii nowej 9,6V układ działa, a dla starej 8,77V nie działa ??

Zakładam, że to napięcie, które mierzysz na "gołej" baterii. Gdy próbujesz pobrać z niej jakiś większy prąd (np. do sterowania serwem) to napięcie na tej baterii na pewno dość mocno spada i wcale nie ma tam 8,77 V.

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć, wszystko fajnie działa, tylko mam zapytanie na temat samego serva. Czy to normalne że nie zatacza on pełnych 180 stopni tylko jakieś (na oko) 160. Przesyłam zdjecia dla pozycji 180 i dla pozycji 0.

149730334_3663228437129253_484489181889721479_n.thumb.jpg.30dc2742ddac676256b3c217dd472bb3.jpg149363445_419636542651561_5508026529340901085_n.thumb.jpg.de08cfdec29ef580509ea94224dd2429.jpg

Link do komentarza
Share on other sites

@luka81 witam na forum. Tak, raczej jest to normalne. Dokładny zakres ruchu może zależeć od konkretnego egzemplarza serwomechanizmu, w praktyce często np. i tak korzysta się tylko z zakresów typu +/- 45*. Jeśli w żadnej ze skrajnej pozycji Twój serwomechanizm nie wydaje żadnych dziwnych dźwięków to wszystko jest "w normie" 🙂

Link do komentarza
Share on other sites

Napotykam na dziwny problem przy programie który odczytuje wartość z COM3 i przekazuje tą wartość do serwomechanizmu...

Po każdej wpisanej wartości po jakiejś sekundzie funkcja Serial sama odczytuje wartość 0 i przekazuje ją do servo.write().

Czy używam funkcji Serial.parseInt() nieprawidłowo? Z góry dzięki za pomoc 🙂

Kod:

#include <Servo.h>

Servo servo;
int servoPin;
int input;

void setup() {
  // put your setup code here, to run once:
  servo.attach(9);

  Serial.begin(9600);

  Serial.print("Enter value for servo to spin: ");
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available())
  {
    input = Serial.parseInt();
    Serial.println(input);
    if(input >= 0 && input <= 180)
    {
      servo.write(input);
    } else
    {
      Serial.println("Wrong value! Enter integer between 0 and 180!");
    }
    delay(1000);
    Serial.print("Enter value for servo to spin: ");
  }
}

 

Link do komentarza
Share on other sites

7 minut temu, Jcob21 napisał:

Czy używam funkcji Serial.parseInt() nieprawidłowo?

Owszem. Spójrz na dokumentację Serial.parseInt, w szczególności na jedno zdanie:

Cytat

Parsing stops when no characters have been read for a configurable time-out value, or a non-digit is read;

Załóżmy, że program dostaje na wejściu "45". Oczywiście do tego dochodzą znaki nowej linii i powrotu karetki, czyli w sumie w buforze lądują cztery znaczki: '4', '4', '\r', '\n'. Jak zadziała Twój program?

ParseInt pobierze po kolei '4', '5', '\r' i na tym skończy (bo '\r\ nie jest przecież cyfrą);

Program uruchomi serwo i odczeka sekundę.

Po sekundzie nastąpi kolejny obrót pętli, a Serial.availabvle() odpowie "Tak, mamy tam znak" (bo przecież został nam ten '\n' którego nie odczytał parseInt)

ParseInt pobierze '\n', a potem już nic bo nie będzie już znaków w buforze. A ponieważ jak dalej czytamy w dokumentacji:

Cytat

If no valid digits were read when the time-out (see Serial.setTimeout()) occurs, 0 is returned;

zwróci zero - właśnie po sekundzie.

Powinieneś prawdopodobnie użyć Serial.readStringUntil lub Serial.readBytesUntil, ale nie chcę nic sugerować.

 

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