• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Serwo nie współpracuje z ESP8266
#1
Question 
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 0 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.

Kod:
#include <Servo.h>

Servo servo; 
void setup() {
  servo.attach(4);
  pinMode(A0, INPUT);
}

int pot, kat, ost_kat;

void loop() {
  pot = analogRead(A0);
  kat = map(pot, 0, 1024, 0, 180);
  if (kat != ost_kat){
    servo.write(kat);          
    ost_kat=kat;
  }
  delay(100);                
}




Załączone pliki Miniatury
   
 
Odpowiedź
#2
Nie ma idealnego serwa w sensie że nie każde jest robione tak samo, każde ma +i- odchyłki a programy i biblioteki tego nie uwzględniają..

To że do biblioteki wysyłasz 0-180st wcale nie oznacza że tyle się obróci... Musisz skorygować ustawić min/max zasięg.. Czyli timer 900-2100ms tak jak pisałem wyżej 900ms nie zawsze jest 0st a 2100 to 180st.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Problem rozwiązany. 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.
Na szczęście na nowszych jest odpowiednie polecenie więc nie trzeba instalować starszych. Należy użyć polecenia:
servo.attach(pin, min, max);
Gdzie za min wpisujemy 544, a za max 2400.

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

   
 
Odpowiedź
#4
W każdym serwie jest ten problem. Dlatego potrzebna jest kalibracja...

servo.attach(pin, min, max);
Gdzie za min wpisujemy 544, a za max 2400.

I to właśnie wykonałeś...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości