Po zlutowaniu nowego PCB, zgodnie z planem opisanym poprzednio, przystąpiłem do strojenia regulatorów silników. O ile z ruchem postępowym poszło szybko – w końcu robiłem to już któryś raz – tak z ruchem obrotowym natrafiłem na kolejne problemy. Jako sprzężenie zwrotne dla regulatora używam żyroskopu i okazało się, że odczyty są mocno zaszumione. Zakłócenia są obecne tylko przy podłączonych silnikach. Głównym podejrzanym jest pole elektromagnetyczne generowane przez silniki. W ruch poszła więc tytułowa folia aluminiowa. Efekty były dosyć komiczne.
Trochę teorii
Celem regulatora ruchu obrotowego jest utrzymanie odpowiedniej orientacji robota w przestrzeni. W tym konkretnym wypadku będzie to przestrzeń 2D, a orientację wyrażamy jako kąt pomiędzy linią wyznaczoną przez przód robota a osią x układu współrzędnych. Można to zobrazować na rysunku.
Trochę informacji o regulatorach zawarłem w jednym z wcześniejszych wpisów. W tym wypadku wartością zadaną będzie najprawdopodobniej prędkość kątowa (druga możliwość to położenie kątowe), a sprzężenie zwrotne zapewnią odczyty z żyroskopu. Innymi możliwymi źródłami sprzężenia zwrotnego są enkodery, akcelerometr i magnetometr. W przyszłości pewnie również wykorzystam ich odczyty. Przy czym wykorzystanie mangetometru może być problematyczne ze względu na bliskość silników, a akcelerometru ze względu na przyspieszenie robota.
Żyroskop skonfigurowałem na zakres +/- 2000 dps (degree per second – stopni na sekundę) i czas próbkowania 1666 Hz. Jednak w programie próbki odczytuję co 10ms. Program testowy uruchamia silniki po naciśnięciu przycisku i po sekundzie je wyłącza. Następnie zebrane w ciągu tej sekundy pomiary są wysyłane przez port COM na Bluetooth.
Walka z zakłóceniami
Żyroskop zwykle charakteryzuje się niewielkim szumem i dryftem – czyli offsetem zmieniającym się w czasie. Tak też było podczas pierwszych testów. Jednak przy włączonych silnikach odczyty były mocno zakłócone. Maksymalna amplituda sięgała 100°/s. Nie mam z tego żadnych wykresów. Pomiary drukowałem na terminal COM i gołym okiem widziałem, że coś jest z nimi nie tak. Dlatego nie traciłem czasu na ładne przedstawienie śmieciowych wyników. Zamiast tego zacząłem się zastanawiać nad możliwymi przyczynami.
Pierwszym podejrzanym były zakłócenia na zasilaniu, które są dosyć częste, jeżeli w tym systemie pracują silniki będące generatorami zakłóceń i czujniki wymagające do wychwycenia niewielkich zmian obserwowanego sygnału bardzo stabilnego zasilania. Z problemem zakłóceń na zasilaniu już walczyłem i dlatego układ zasilania przewiduje, że silniki biorą napięcie bezpośrednio z baterii, a zasilanie logiki dodatkowo przechodzi przez przetwornicę step down i stabilizator 3.3V. Więcej o układzie zasilania można przeczytać tutaj.
Jak widać na schemacie modułu IMU, zawiera on na zasilaniu VDD kondensatory 100 nF, 1 nF i 4.7nF. Postanowiłem więc dodać jeszcze większy kondensator 47 nF, a potem nawet 220 nF. Nie przyniosło to żadnej poprawy. Poza testami z modułem wpiętym do płytki, sprawdziłem również wyniki przy podłączeniu za pomocą dodatkowych przewodów. Zakłócenia wtedy wyraźnie zmalały. Oznacza to, że przyczyną nie są zakłócenia zasilania.
Ekranowanie
Moje podejrzenia padły od razu na zakłócenia EMI (electromagnetic interference), czyli zakłócenia elektromagnetyczne generowane przez pracujące silniki. Aby się przed nimi bronić potrzebowałem klatki Faradaya. Mogłem więc wykorzystać to samo zjawisko, co tutaj:
Moje zastosowanie nie było co prawda tak spektakularne i zamiast kolczugi, użyłem wspomnianej wcześniej folii aluminiowej. Aby po raz kolejny nie spalić płytki, folię postanowiłem otoczyć dwiema warstwami papieru, który robił za izolator.
Niestety izolacja nie okazała się wystarczająca – na krawędziach czasem wystawała folia. Prawdopodobnie dlatego co chwila paliły mi się stabilizatory 3.3V. Była to niezła złośliwość biorąc pod uwagę fakt, że akurat tego jednego układu zapomniałem ostatnio kupić. Musiałem więc zbezcześcić zwłoki i wylutować stabilizator ze starych wersji płytki. Uzbierało się już ich całkiem sporo.
Próbowałem różnych wariantów – owinięcie folią samego czujnika, owinięcie silników, a nawet w akcie desperacji przewodów od silników. Niby była minimalna poprawa, ale spodziewałem się lepszych efektów. Na pamiątkę została mi poniższa sesja fotograficzna.
Nawet jeżeli ekrany domowej roboty nie były idealne, spodziewałem się jakiejś poprawy. Jej brak oznaczał, że może przyczyna jednak leży jeszcze gdzie indziej.
Inna możliwa przyczyna
Podczas kolejnych testach z kabelkami czujnik umieściłem blisko silników, a zakłócenia były zdecydowanie mniejsze (max 20°/s), a w końcu pole magnetyczne powinno działać tak samo. Czy to możliwe więc, że przyczyną nie jest EMI, tylko drgania mechaniczne?
Kiedy płytka IMU jest bezpośrednio w złączu, drgania lepiej się przenoszą na czujniki. Kabelki natomiast amortyzują. Amplituda 100° na sekundę oznacza, że w jednym okresie próbkowania dla częstotliwości 1666 Hz to tylko 0.06° – wcale nie tak dużo. W następnej kolejności spróbuję zmniejszyć częstotliwość próbkowania i może dodać jakąś amortyzację pod mocowanie silników. Ale to już następnym razem, najpierw po raz kolejny muszę wymienić spalony stabilizator.
28 października 2017 at 22:59
Próbowałeś analizować widmo tych zakłóceń?
29 października 2017 at 03:37
Nawet nie zapisywałem tych danych, więc nie robiłem żadnej obróbki. Ale obstawiam, że to biały szum o wartości oczekiwanej 0. Zrobiłem za to teraz tak jak pisałem na końcu – zmniejszyłem częstotliwość próbkowania i pomogło. Czyli to jednak drgania mechaniczne.
29 października 2017 at 08:25
Z tymi MEMSami zawsze jest problem… Wystarczy, że układ zmieni swoją temperaturę podczas pracy i już pomiary się rozjeżdżają.
29 października 2017 at 11:30
Na szczęście znalazłem przyczynę. Bo już przez chwilę myślałem że trzeba będzie wszystko przeprojektować, żeby uodpornić na zakłócenia. Ale walka z memsami dopiero się zaczyna dopiero przy regulatorze obrotów i filtrze kalmana fajne kwiatki mogą wyjść 😀
29 października 2017 at 12:25
Czekam na relację! 🙂