Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


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

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

  • 2 tygodnie później...

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

 

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

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?

@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
(edytowany)

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

@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

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

@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" 🙂

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

 

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

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