Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Solved] Serwo nie współpracuje z ESP8266

Krismir102 07 Sep 2021 16:29 537 15
  • #1
    Krismir102
    Level 3  
    Witajcie. Z góry przepraszam za mój brak doświadczenia ale to moja pierwsza próba sterowania serwem z NodeMCU V2. Już na samym starcie trafiłem na problem, którego nie rozumiem. Prostym kodem chcę sterować serwem za pomocą potencjometru, lecz serwo przemieszcza się tylko w zakresie ok 90 stopni (mniej więcej od 45 do 135). To samo się dzieje gdy wgram przykład "Swap" z biblioteki Servo.h.
    Nie rozumiem co zrobiłem źle, prądu raczej mu nie brakuje, masy są wspólne, potencjometr podpinałem pod 5V jak i 3,3V, a serwo sterowałem również poprzez tranzystor i podłączałem na różne piny, kopiowałem przykłady i schematy z internetu... ciągle to samo. Na serial monitorze wartości z potencjometru pokazuje mi 13-1024, czyli raczej ok. Zmienna kat także operuje między 2 i 180.

    Podłączałem też serwo MG90 i zachowywało identycznie.
    Po podpięciu wszystkiego do Arduino Uno i wgraniu tego samego kodu wszystko działa jak należy więc to raczej coś z NodeMCU.

    Zastanawiałem się czy to może biblioteka Servo.h źle współpracuje z ESP8266 ale we wszystkich przykładach jakie znalazłem ludzie ją wykorzystują z sukcesem. Instalowałem starsze wersje Servo.h ale też nie pomogło.

    Używam NodeMCU V2, serwo MG995 oraz potencjometr 10k.

    Poniżej zamieszczam link do filmu i screen kodu:

    https://www.youtube.com/watch?v=UPR1Ny_D6Fo

    Serwo nie współpracuje z ESP8266
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    khoam
    Level 41  
    Krismir102 wrote:
    Zastanawiałem się czy to może biblioteka Servo.h źle współpracuje z ESP8266

    O jaką konkretnie bibliotekę chodzi? Link?
  • #3
    Krismir102
    Level 3  
    khoam wrote:
    Krismir102 wrote:
    Zastanawiałem się czy to może biblioteka Servo.h źle współpracuje z ESP8266

    O jaką konkretnie bibliotekę chodzi? Link?


    https://www.arduino.cc/reference/en/libraries/servo/

    Też zauważyłem że nie ma tam ESP ale wszystkie poradniki o połączeniu serwa z Node jakie znalazłem wykorzystują właśnie ją. Przynajmniej tak mi się wydaje ponieważ w każdym kodzie (na ESP też) jest dołączone:
    #include <Servo.h>
    Jeśli to niepoprawna biblioteka to nie mam pojęcia jaką inna użyć.
  • #4
    khoam
    Level 41  
    Arduino Core dla ESP8266 ma już własną bibliotekę Servo w pakiecie i nie ma potrzeby instalacji dodatkowej w Arduino IDE (najlepiej ją odinstalować).
    Link
  • #5
    Krismir102
    Level 3  
    khoam wrote:
    Arduino Core dla ESP8266 ma już własną bibliotekę Servo w pakiecie i nie ma potrzeby instalacji dodatkowej w Arduino IDE (najlepiej ją odinstalować).
    Link


    Rzeczywiście jest biblioteka dla ESP z serwem. Tamtą usunąłem. Niestety po wgraniu przykładu z biblioteki o której mówisz zachowanie serwa się nie zmieniło.
  • #6
    khoam
    Level 41  
    Spróbuj uruchomić przykład "Sweep" z tej biblioteki: Link
    Trzeba dopasować numer GPIO do Twojej konfiguracji.
  • #7
    Krismir102
    Level 3  
    khoam wrote:
    Spróbuj uruchomić przykład "Sweep" z tej biblioteki: Link
    Trzeba dopasować numer GPIO do Twojej konfiguracji.


    Niestety dalej to samo. Nie obraca się bardziej niż w zakresie 90 stopni. Wychodzi na to, że bibliotekę mam prawidłową.
  • #8
    khoam
    Level 41  
    Jak wygląda podłączenie serwa przez ten tranzystor? Jaki to tranzystor? Może umieść jakiś schemat, nawet odręczny.
  • #9
    Krismir102
    Level 3  
    khoam wrote:
    Jak wygląda podłączenie serwa przez ten tranzystor? Jaki to tranzystor? Może umieść jakiś schemat, nawet odręczny.


    Tranzystor był aktem desperacji i już go usunąłem. Teraz mam przewód sygnałowy z serwa bezpośrednio podpięty pod pin w Node.

    Ale jeśli chcesz wiedzieć to wyglądało to tak:
    Serwo nie współpracuje z ESP8266
  • #10
    khoam
    Level 41  
    Serwo MG995 wymaga sygnału PWM o amplitudzie 5V na wejściu sterującym, z pinu ESP8266 jest 3V3.
  • #11
    Krismir102
    Level 3  
    khoam wrote:
    Serwo MG995 wymaga sygnału PWM o amplitudzie 5V na wejściu sterującym, z pinu ESP8266 jest 3V3.


    Sprawdziłem analizatorem stanów logicznych sygnał PWM który podaje Node. Jest wzorowy. Sygnał sterujący poprowadziłem teraz przez transoptor i sprawdziłem, ma 5V. Na zasilaczu podczas ruchu serwa napięcie spada z 5V na 4,8V.
    Niestety serwo nadal porusza się w ograniczonym zakresie. Wszystko jest sprawne, a nie działa... Może jakieś zakłócenia?
  • #12
    khoam
    Level 41  
    Krismir102 wrote:
    Na zasilaczu podczas ruchu serwa napięcie spada z 5V na 4,8V.

    Jaką wydajność prądową ma ten zasilacz? Czy zasilasz z niego również NodeMCU?
  • #13
    Krismir102
    Level 3  
    Ha! Problem rozwiązany. Coś niesamowitego. Okazuje się, że wszystko działa jak należy tylko że biblioteka do serwa z środowiska ESP podaje ZBYT DOKŁADNY sygnał PWM.
    Odkryłem to analizatorem stanów logicznych, którym sprawdziłem podawany sygnał PWM przez Node i Arduino Uno. Przypominam, że na Node serwo poruszało się w ograniczonym zakresie, a na Uno w pełnym.
    Biblioteka z Node generowała wręcz wzorowy sygnał PWM, w którym najkrótszy czas wypełnienia wynosił 1 ms, a najdłuższy 2 ms i wszystko z dokładnością do setnych części ms. Biblioteka z Uno generowała sygnał PWM o najkrótszym czasie wypełnienia 0,5 ms, a najdłuższym ok 2,4 ms!! Przynajmniej obie zgadzają się co do okresu 20 ms.
    Zainstalowałem starszą bibliotekę środowiska ESP8266 i nagle wszystko zaczęło działać! Po odczytaniu przebiegu PWM ukazało mi się, że teraz mój Node, na starszej bibliotece, generuje sygnał o wypełnieniu w zakresie od 0,5 ms do 2,4 ms w okresie 20 ms. W takim zakresie wypełnienia 1 ms dla mojego serwa to ok 75 stopni, a 2 ms to ok 150 stopni. I rzeczywiście mniej więcej w takim stopniu mi się przemieszczał.

    Szkoda że dokumentacja na jaką trafiłem podaje prawidłowe wypełnienia jako 1 ms i 2 ms...

    Nie wiem jak z innymi modelami serw ale serwa Tower Pro SG90 oraz MG995 wymagają biblioteki środowiska ESP8266 wersji 2.7.4 lub starszej. Wersje 3.0 i nowsze generują nieodpowiedni sygnał PWM dla tych serw.

    Poniżej grafika pokazująca sposób działania mojego serwa. Pewnie w serwie za 200 zł i jakiś najnowszych tego problemu nie będzie ale moje za trzy dyszki z allegro ma takie wymagania ;)

    Serwo nie współpracuje z ESP8266
    Serwo nie współpracuje z ESP8266
  • #14
    khoam
    Level 41  
    Jest wersja funkcji attach() w bibliotece Servo z dodatkowymi argumentami, które pozwalają na określenie minimalnego oraz maksymalnego cyklu pracy. Faktycznie domyślnie to jest 1000us oraz 2000us w Core 3.0, ale to można zmienić właśnie funkcją attach():
    Code: c
    Log in, to see the code
    Wersja tej funcji jest dostępna od Core 2.7.3.
    Link

    Krismir102 wrote:
    Okazuje się, że wszystko działa jak należy tylko że biblioteka do serwa z środowiska ESP podaje ZBYT DOKŁADNY sygnał PWM.

    Jest to wartość określona przez autora kodu, jako "uncalibrated default". Do kalibracji służy wyżej wspomniana funkcja attach().
  • #15
    Krismir102
    Level 3  
    khoam wrote:
    Jest wersja funkcji attach() w bibliotece Servo z dodatkowymi argumentami, które pozwalają na określenie minimalnego oraz maksymalnego cyklu pracy. Faktycznie domyślnie to jest 1000us oraz 2000us w Core 3.0, ale to można zmienić właśnie funkcją attach():
    Code: c
    Log in, to see the code
    Wersja tej funcji jest dostępna od Core 2.7.3.
    Link

    Krismir102 wrote:
    Okazuje się, że wszystko działa jak należy tylko że biblioteka do serwa z środowiska ESP podaje ZBYT DOKŁADNY sygnał PWM.

    Jest to wartość określona przez autora kodu, jako "uncalibrated default". Do kalibracji służy wyżej wspomniana funkcja attach().


    O dobrze wiedzieć o tej funkcji na pewno ją przetestuję. Dzięki za pomoc i poświęcony czas, zamykam temat ;)
  • #16
    Krismir102
    Level 3  
    khoam wrote:
    Jest wersja funkcji attach() w bibliotece Servo z dodatkowymi argumentami, które pozwalają na określenie minimalnego oraz maksymalnego cyklu pracy. Faktycznie domyślnie to jest 1000us oraz 2000us w Core 3.0, ale to można zmienić właśnie funkcją attach():
    Code: c
    Log in, to see the code
    Wersja tej funcji jest dostępna od Core 2.7.3.
    Link

    Krismir102 wrote:
    Okazuje się, że wszystko działa jak należy tylko że biblioteka do serwa z środowiska ESP podaje ZBYT DOKŁADNY sygnał PWM.

    Jest to wartość określona przez autora kodu, jako "uncalibrated default". Do kalibracji służy wyżej wspomniana funkcja attach().


    O dobrze wiedzieć o tej funkcji na pewno ją przetestuję. Dzięki za pomoc i poświęcony czas, zamykam temat ;)

    Dodano po 2 [minuty]:

    Ha! Problem rozwiązany. Coś niesamowitego. Okazuje się, że wszystko działa jak należy tylko że biblioteka do serwa z środowiska ESP podaje ZBYT DOKŁADNY sygnał PWM.
    Odkryłem to analizatorem stanów logicznych, którym sprawdziłem podawany sygnał PWM przez Node i Arduino Uno. Przypominam, że na Node serwo poruszało się w ograniczonym zakresie, a na Uno w pełnym.
    Biblioteka z Node generowała wręcz wzorowy sygnał PWM, w którym najkrótszy czas wypełnienia wynosił 1 ms, a najdłuższy 2 ms i wszystko z dokładnością do setnych części ms. Biblioteka z Uno generowała sygnał PWM o najkrótszym czasie wypełnienia 0,5 ms, a najdłuższym ok 2,4 ms!! Przynajmniej obie zgadzają się co do okresu 20 ms.
    Zainstalowałem starszą bibliotekę środowiska ESP8266 i nagle wszystko zaczęło działać! Po odczytaniu przebiegu PWM ukazało mi się, że teraz mój Node, na starszej bibliotece, generuje sygnał o wypełnieniu w zakresie od 0,5 ms do 2,4 ms w okresie 20 ms. W takim zakresie wypełnienia 1 ms dla mojego serwa to ok 75 stopni, a 2 ms to ok 150 stopni. I rzeczywiście mniej więcej w takim stopniu mi się przemieszczał.

    Szkoda że dokumentacja na jaką trafiłem podaje prawidłowe wypełnienia jako 1 ms i 2 ms...

    Nie wiem jak z innymi modelami serw ale serwa Tower Pro SG90 oraz MG995 wymagają biblioteki środowiska ESP8266 wersji 2.7.4 lub starszej. Wersje 3.0 i nowsze generują nieodpowiedni sygnał PWM dla tych serw.

    Pewnie w serwie za 200 zł i jakiś najnowszych tego problemu nie będzie ale moje za trzy dyszki z allegro ma takie wymagania

    EDIT
    Na nowszych bibliotekach problem rozwiązuje również użycie polecenia, które kolega polecił powyżej:
    servo.attach(pin, min, max);
    Gdzie za min wpisujemy 544, a za max 2400

    Serwo nie współpracuje z ESP8266 Serwo nie współpracuje z ESP8266