Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

Cześć 😊 Czy mogę podłączyć serwomechanizm z tej lekcji do osobnego zasilania (9V + stabilizator) a do Arduino tylko przewód sterujący? I kolejne może głupie pytanko, czy mogę mieć podłączone Arduino do PC przez USB oraz podłączoną baterię 9V (wydaje mi się że nie, gdyż na logikę Arduino będziesz otrzymywać napięcie 14V😅😅)😅😅 Z góry dziękuję za odpowiedź 

Pozdrawiam😊😇😇

@Mordel możesz podłączyć serwo przez stabilizator a nawet powinieneś, ale bateria 9v to marny wybór dla obciążeń bo bardzo szybko się rozładuje...masę Ardu i serwa łączysz razem...natomiast Arduino zasilacz tylko z jednego zasilania, bo w przeciwnym wypadku napięcia będą się "gryzły"

2 godziny temu, Mordel napisał:

I kolejne może głupie pytanko, czy mogę mieć podłączone Arduino do PC przez USB oraz podłączoną baterię 9V (wydaje mi się że nie, gdyż na logikę Arduino będziesz otrzymywać napięcie 14V😅😅)

Możesz bez problemu jednocześnie podłączyć baterię i przewód USB. Nic się nie będzie gryzło, napięcia nie sumują się w taki sposób w tym przypadku 🙂 

  • 1 miesiąc później...

Cześć niestety mój serwomechanizm się nie obraca i nie wiem co jest tego przyczyną. Próbowałem zmieniać płytkę z arduino na klona, serwomechanizm od forbota na inny, sprawdzałem wszystkie połączenia kilka razy. Nawet kod skopiowałem, żeby wyeliminować ewentualny błąd z mojej strony. Za każdym razem jak podłącze wszystko i prześle program słyszę jakieś brzęczenie jakby próbował pracować, ale efektu brak.  Te "ramiona" z serwomechanizmu zdjąłem bo myślałem, że może się gdzieś blokują. (Serwo sprawny w innym kursie Forbota przy sterowaniu potencjometrem działa)  😕 

20240705_093935.jpg

Dnia 5.07.2024 o 09:58, DemoMajster napisał:

Cześć niestety mój serwomechanizm się nie obraca i nie wiem co jest tego przyczyną. Próbowałem zmieniać płytkę z arduino na klona, serwomechanizm od forbota na inny, sprawdzałem wszystkie połączenia kilka razy. Nawet kod skopiowałem, żeby wyeliminować ewentualny błąd z mojej strony. Za każdym razem jak podłącze wszystko i prześle program słyszę jakieś brzęczenie jakby próbował pracować, ale efektu brak.  Te "ramiona" z serwomechanizmu zdjąłem bo myślałem, że może się gdzieś blokują. (Serwo sprawny w innym kursie Forbota przy sterowaniu potencjometrem działa)  😕 

20240705_093935.jpg

Działa powodem była bateria o zbyt niskim napięciu.

  • 2 tygodnie później...

Zadanie 5.1 (Spróbuj uprościć powyższy program, tak aby nie trzeba było korzystać z instrukcji warunkowej if. Podpowiedź: zastanów się jaki wpływ na działanie programu ma typ zmiennej wypełnienie.)

To zadanie wyszło mi trochę przypadkowo i nie do końca rozumiem dlaczego działa 🤔 Wyświetliłam w terminalu aktualne wypełnienie i okazuje się, że rośnie ono nieustannie w nieskończoność (a właściwie rośnie do 32000, zmienia znak na minus i rośnie dalej). Mimo to dioda zachowuje się dokładnie tak samo jak w przykładzie z użytą instrukcją warunkową if, czyli powoli rozświetla się w pętli. Czy chodzi tu w jakiś sposób o wielokrotność liczby 255?

#define diodaPIN 3
  int wypelnienie = 0;

void setup() {
  pinMode(diodaPIN, OUTPUT); //konfiguracja pinu jako wyjscia
}

void loop() {
  wypelnienie = wypelnienie + 5; //zwieksza wypelnienie
  analogWrite(diodaPIN, wypelnienie); //generuje sygnal o zadanym wypelnieniu
  delay(50);
}  

 

@CoyotesPawRanch faktycznie to jeszcze większy przypadek, że ten program działa - nawet nie pomyślałem o takim wariancie. Zastanów się jakie zakresy mogą pomieścić konkretne typy zmiennych np. int (który używasz) i byte (który sprawdzi się tutaj lepiej) 😉 

Zamieniłam int (zakres od -32768 do 32767) na byte, w którym mieści się dokładnie tyle, ile potrzeba, czyli 0-255. Teraz wygląda to bardziej elegancko i co najważniejsze nadal działa 🙂

Pozostałe zadania zrobiłam następująco:

5.2 (Napisz program, który po zwiększeniu wypełnienia do 255 zacznie je stopniowo zmniejszać do zera (i tak w koło). (...) )

#define diodaPIN 3
int wypelnienie = 0;
int zmiana = 5;
boolean wzrasta = false; //czy wypelnienie aktualnie wzrasta czy maleje?

void setup() {
  pinMode(diodaPIN, OUTPUT); //konfiguracja pinu jako wyjscia
}

void loop() {
  analogWrite(diodaPIN, wypelnienie); //generuje sygnal o zadanym wypelnieniu
  if (wzrasta == false) { 
    wypelnienie = wypelnienie + zmiana; //zwieksza wypelnienie
    if (wypelnienie == 255) {           //do osiagniecia maksymalnej wartosci
      wzrasta = true;
    }
  } else if (wzrasta == true) {
      wypelnienie = wypelnienie - zmiana; //zmniejsza wypelnienie
      if (wypelnienie == 0) {             //do osiagniecia minimalnej wartosci
        wzrasta = false;
      }
    }
  delay(50);
}  

 

5.4 (Napisz program, który obraca serwomechanizm do pozycji przesłanej do Arduino przez UART. Przesyłane liczby musza mieścić się w zakresie 0-180, w przeciwnym wypadku należy wyświetlić stosowny komunikat.)

#include <Servo.h> //biblioteka odpowiedzialna za serwa
Servo serwomechanizm; //tworzy obiekt, dzięki któremu możemy odwołać się do serwa

String podanaLiczba = ""; //schowek na podaną przez UART liczbę
int pozycja = 0; //schowek na przekonwertowaną liczbę, czyli pozycja 0-180
boolean wyslano = false; //kontrola komunikatów

void setup() {
  Serial.begin(9600); //rozpoczyna komunikację z PC
  serwomechanizm.attach(9); //przypisuje pin 9 do serwomechanizmu
}

void loop() { 
  if (wyslano == false) { //jeśli jeszcze nie wysłano komunikatu
    Serial.println("Podaj pozycję w zakresie 0-180"); //wysyła komunikat
    wyslano = true; //zaznacza, że wysłano
  }
  if (Serial.available() > 0) { //jeśli podano liczbę
    podanaLiczba = Serial.readStringUntil('\n'); //czyta i zapisuje w schowku
    pozycja = podanaLiczba.toInt(); //konwertuje zebrane dane na liczbę zrozumiałą dla programu
    if (pozycja <= 180) { //jesli liczba mieści się w zakresie
      serwomechanizm.write(pozycja); //przemieszcza ramię serwa na podaną pozycję
    } else { //jeśli podana liczba nie mieści się w zakresie
      Serial.println("Podano liczbę spoza zakresu. Podaj liczbę mieszczącą się w zakresie 0-180"); //wysyła komunikat
    }
  }
}

 

5.5 (Do układu podłącz potencjometr w roli dzielnika napięcia. Następnie wykorzystaj przetwornik ADC  do pomiaru napięcia ustawionego na potencjometrze. Im będzie ono większe tym serwo powinno znajdować się bliżej swojej skrajnej, prawej pozycji.)

#include <Servo.h> //biblioteka odpowiedzialna za serwa
Servo serwomechanizm; //tworzy obiekt, dzięki któremu możemy odwołać się do serwa
int odczyt = 0; //odczyt z ADC
int pozycja = 0; //przeskalowany odczyt

void setup() {
  serwomechanizm.attach(9); //przypisuje pin 9 do serwomechanizmu
}

void loop() {
  odczyt = analogRead(A5); //zapisuje odczyt z ADC
  pozycja = map(odczyt, 0, 1023, 0, 180); //skaluje odczyt
  serwomechanizm.write(pozycja); //przemieszcza ramię serwa na zadaną pozycję
}

Po zrobieniu tego zadania szybko okazało się, że "skrajna prawa pozycja" jest pojęciem względnym, bo zależy od tego z której strony na serwo patrzeć 😅 Dlatego zrobiłam dodatkowo alternatywną wersję - lustrzane odbicie powyższego programu, który obraca ramię serwa w odwrotnym kierunku. Należy zmienić dwie linijki:

  pozycja = map(odczyt, 0, 1023, -180, 0); //skaluje odczyt
  serwomechanizm.write(-pozycja); //przemieszcza ramię serwa na zadaną pozycję

 

  • 1 miesiąc później...

Mam problem z dokładnym zrozumieniem tematu zasilania serwo z innego źródła niż zasilanie Arduino.

Nie zaleca się podłączania serwo do tego samego źródła co Arduino

915776269_Serwozasilanie.thumb.png.9e6a76755f7255db73a869cf62a976f6.png

Następnie pokazano praktyczną realizację. I tu niespodzianka, Arduino i serwo są zasilane z tego samego źródła.

84460388_Serwowpraktyce.thumb.png.7bd377e1c88799589b229862ed36fa35.png

Zgoda, do takiej realizacji jest dołączone stosowne uzasadnienie, ale jak wyglądałoby połączenie Arduino i serwo do odrębnych źródeł zasilania?
Czu GND obu źródeł powinny być połączone, czy nie? Czy w obwodzie zasilania serwa powinien być wówczas stabilizator LM7805? A co jeśli serwo wymagałoby innego niż 5Vnapięcia zasilania? Czy amplituda 5V sygnału sterującego wychyleniem serwo jest wartością standardową, czy może zależeć od modelu serwa i co wówczas zrobić?

@Sylba serwo i Ardu mogą być zasilane z tego samego źródła, chodzi o to żeby nie zasilać serwa ze stabilizatora Arduino bo ma on mała wydajność prądowa...oczywiście jeśli źródło napięcia z którego zasilacz całość jest inna (większa) niż max napięcie Serwatko stabilizator jest potrzebny...gnd musisz połączyć żeby erwo działało prawidłowo...jeśli serwo jest na inne napięcie niż 5v to taki stabilizator/przetwornicę trzeba dobrać...serwa standardowo działają na logikę (sygnały) 5v, ale też radzą sobie z logiką 3.3v która jest popularniejsza...

  • Pomogłeś! 1
4 godziny temu, Sylba napisał:

Czu GND obu źródeł powinny być połączone, czy nie

Hm... pomyślmy.

  • Serwo ma trzy końce.
  • Arduino i serwo muszą być połączone dwoma kabelkami.
  • Zasilacz i serwo muszą byś połączone dwoma kabelkami.

Spróbuj narysować schemat połączeń, gdzie Arduino i zasilacz nie łączą się w żadnym punkcie...

 

8 godzin temu, ethanak napisał:
  • Serwo ma trzy końce.
  • Arduino i serwo muszą być połączone dwoma kabelkami.
  • Zasilacz i serwo muszą byś połączone dwoma kabelkami.

Spróbuj narysować schemat połączeń, gdzie Arduino i zasilacz nie łączą się w żadnym punkcie...

Pytania z pozoru wydają się naiwne. W kursie opisany jest bardzo prosty przykład jednego małego serwa. Można sobie wyobrazić trochę bardziej skomplikowany przypadek urządzenia, w którym kontroler Arduino steruje nie jednym, a kilkoma serwami lub urządzeniami i odbiera sygnały z kilku przetworników. W takim urządzeniu może być równocześnie realizowane kilka funkcji. Awaria jednego źródła zasilania może spowodować, że nic nie będzie działało. Aby zmniejszyć ryzyko takiego zdarzenia można zastosować odrębne źródła zasilania dla kontrolera, serw czy mechanizmów wykonawczych, a jeszcze inne dla ważnych sensorów. Awaria lub wyczerpanie się np. źródła zasilania serwa wyłączy tylko to serwo, ale układ może jeszcze realizować jakieś inne funkcje awaryjne.

Stąd pytanie jak to wszystko połączyć by prawidłowo działało. Intuicyjnie wydaje się, że elementy elektroniczne składające się na system sterowania i kontroli powinny mieć wspólny punkt odniesienia np. GND. Rozumiem więc, że twoja odpowiedź potwierdza to, co napisał farmaceuta kontroler i źródła zasilania muszą mieć wspólny GND oraz sygnał sterujący PWM najczęściej 3,3 lub 5V.

12 minut temu, Sylba napisał:

kontroler i źródła zasilania muszą mieć wspólny GND oraz sygnał sterujący PWM najczęściej 3,3 lub 5V.

Zgadza się...w 99% przypadków masy logiki, czujników,elementów wykonawczych są połączone...jednak są wyjątki kiedy potrzebujemy separacji galwanicznej, wtedy nie łączymy mas bo zależy nam na tym żeby np. Przebicie tranzystora czy zwarcie wysokiego napięcia nie uszkodziło nam stopnia sterującego które z reguły lata na małych napięciach (3.3/5v)

  • Pomogłeś! 1
  • 3 miesiące później...

Zadanie domowe 5.2

#define PIN3 3

int wypelnienie = 0;
int zmiana = 5;

void setup() {
pinMode(3, OUTPUT); // pin 3 jako wyjscie
}

void loop() {

analogWrite(PIN3, wypelnienie); // wygeneruj sygnal (gdzie, jakie wypełnienie)

if (wypelnienie < 255) { //Jeżeli wypełnienie jest mniejsze od 255 czyli 100% to:
wypelnienie = wypelnienie + zmiana; // zwiekszamy wypelnienie od drugiej petli
delay(25);
}


else{ //jesli wypelnienie jest powyzej 255
wypelnienie = 255;
while (wypelnienie > 0) { // jezeli wypelnienie nie jest rowne 0
  analogWrite(PIN3, wypelnienie); // wygeneruj sygnal (gdzie, jakie wypełnienie)
  
  (wypelnienie = wypelnienie - zmiana);
delay(25);
}}
delay(50); //opoznienie zeby zobaczyc efekty
}

Wszystko działa płynnie. Jednak przy zmianie z 5 na"

int zmiana = 10;

"

dioda rozświetla się prawidłowo. Następnie gaśnie prawidłowo potem jest mrugniecie jak by włączenie diody na 100% na dosłownie 1/10 sekundy i znów zaczyna się rozjaśniać prawidłowo. Cykl jest prawidłowy po za nie kontrolowanym mignięciem po zgaśnięciu. (przy zmiana=10. przy zmiana=5 nic takiego nie widać)

Nic dziwnego - w pewnym momencie wypełnienie osiąga wartość 260, a po obcięciu do ośmiu bitów wychodzi 4 (czyli dioda nie będzie świecić zbyt mocno).

Jako ćwiczenie przerób program tak, aby działał:

  1. Z wartością 10
  2. Z dowolną wartością.

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