mefiu Napisano Wrzesień 9, 2016 Udostępnij Napisano Wrzesień 9, 2016 Witam,udało mi się połączyć bezprzewodowo(HC 05) dwa mikrokontrolery(Arduino Mega z Micro). Jednak zastanawia mnie fakt, dlaczego silnik stracił na "kulturze" pracy. Wg mnie, gdy silnik krokowy sterowany jest bezprzewodowo traci na stabilności i prędkości oraz wydaje inne dźwięki z siebie. Czy może tylko mi się to wydaje? Tutaj filmy: sterowanie przez guziki przewodowo: sterowanie bezprzewodowe: Do tego programy: przewodowo: bezprzewodowo: master: slave: Może należy zmienić coś w programie? Dodam również, że wcześniej robiłem sterowanie bezprzewodowe na modułach radiowych 433MHz, ale silnik w tym przypadku chodził tak strasznie(szarpał, był spowolniony), że z nich zrezygnowałem. Również, gdy steruje bezprzewodowo z joysticka, to rezultaty nie są najlepsze(guziki w porównaniu do sterowania analogowego joysticka wypadają lepiej - w przypadku łączności bezprzewodowej). Link do komentarza Share on other sites More sharing options...
Pitlab Wrzesień 10, 2016 Udostępnij Wrzesień 10, 2016 Tego typu sterowanie jest bardzo prymitywne, bo w jednej pętli masz jednocześnie obsługę komunikacji jak i bezpośrednie sterowanie taktem silnika. Prawdopodobnie komunikacja zajmuje odpowiednio więcej czasu niż prosty odczyt stanu wejść i dlatego pętla działa wolniej. Poza tym widzę takie rzeczy że możliwe jest kręcenie silnikiem jednocześnie w obu kierunkach: między if prawo-lewo nie ma else, więc jeżeli oba warunki będą spełnione to silnik będzie szarpał w obie strony. Zdecydowanie źle będzie to wpływało na "kulturę" jego pracy. W pierwszej kolejności do generowania sygnału "step" użył bym timera a w pętli głównej jedynie uaktualniał bym rejestry sterujące timerem i kierunkiem pracy. Po takiej zmianie, sterowanie nie powinno już wpływać na pracę silnika, bo będzie ona zależała wyłącznie od stabilności pracy timera a to można osiągnąć odpowiednio wysokim priorytetem przerwań. Zresztą każde przerwanie, nawet niskopriorytetowe będzie o niebo stabilniejsze od takiej pętli. Link do komentarza Share on other sites More sharing options...
mefiu Wrzesień 10, 2016 Autor tematu Udostępnij Wrzesień 10, 2016 Okej, z tymi przyciskami, to wiem, że można dwa na raz nacisnąć, to był szybki program do demonstracji w filmach. A jeżeli chodzi o samą ideę, to na pewno masz racje i żeby to rozwiązać, to trzeba zrobić dodatkowe funkcje obsługujące każdy silnik. Nie jestem zaawansowany w programowaniu, ale trzeba zrobić coś według tych screenów, które pochodzą z jednego filmu na internecie?: oraz program podobny do tego, czyli dodatkowa funkcja poza pętlą główną loop. Timery są w stanie coś takiego zrobić i chodziło by tu o to, aby wywoływać dany timer(i program za nim stojący) po przez np. analog(joystick) lub zwykłe przyciski? A sam timer miałby powtarzać instrukcje co 1ms w przypadku silników krokowych(step)? I drugie pytanie czy może spróbować zrobić, to na zwykłych przerwaniach(mam na nich zrobione dwa czujniki krańcowe). jakiś program z tego filmiku(widoczna funkcja loop oraz dodatkowa od timera): Link do komentarza Share on other sites More sharing options...
Pitlab Wrzesień 10, 2016 Udostępnij Wrzesień 10, 2016 Nie jestem zaawansowany w programowaniu, ale trzeba zrobić coś według tych screenów, które pochodzą z jednego filmu na internecie? Ja znów nie znam tego języka (arduino?), ale rysunek dobrze oddaje to co trzeba zrobić czyli uniezależnić generowanie impulsów od sterowania generowaniem. Timery są w stanie coś takiego zrobić i chodziło by tu o to, aby wywoływać dany timer(i program za nim stojący) po przez np. analog(joystick) lub zwykłe przyciski? A sam timer miałby powtarzać instrukcje co 1ms w przypadku silników krokowych(step)? I drugie pytanie czy może spróbować zrobić, to na zwykłych przerwaniach(mam na nich zrobione dwa czujniki krańcowe). Timer to jest licznik sprzętowy, który odlicza do zadanej przez użytkownika wartości i generuje przerwanie. Czujniki krańcowe masz podpięte pewnie pod wejścia INT0, INT1 i to jest zupełnie inne przerwanie. Ogólnie przerwań jest wiele, są od timerów, UART-ów, PWM, SPI, ADC itd. Nie pamiętam ile jest tego w ATMedze, ale pewnie kilkanaście rodzai z czego pewnie kilka od samych timerów (zwykle od przepełnienia licznika, compare od generowania okresów czasu i capture od pomiaru długości impulsów). Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
mefiu Wrzesień 10, 2016 Autor tematu Udostępnij Wrzesień 10, 2016 Tak, to język z Arduino. Nie za bardzo wiem jak przerwanie od timerów miało by pomóc w tym konkretnym przypadku. W sensie, trzeba stworzyć funkcje wykonujące się w pętli poza pętlą główną. Prawdopodobnie, to zadziała i chciałem podziękować za pomysł, bo to może być to. 🙂 A myślę nad tym, żeby te funkcje dodatkowe, nie były koniecznie na przerwaniach(chociaż można jakieś wykorzystać[iNT0,INT1,...], bo jest ich aż 6 w Arduino Mega). Po prostu jak przyjdzie wiadomość z nadajnika, to sprawi ona, że program wyjdzie z pętli głównej i odwoła się do jakiejś innej, sterującej silnikiem, a zawierającej tylko, krótki kod sekwencji sterowania(STEP) i jego kierunkiem(DIR). Link do komentarza Share on other sites More sharing options...
grg0 Wrzesień 10, 2016 Udostępnij Wrzesień 10, 2016 Może w spróbuj w Masterze dopisać warunek wysyłający 0 kiedy żaden z przycisków nie jest naciśnięty, a w Slavie wyrzucić przypisanie state = 0. Link do komentarza Share on other sites More sharing options...
mefiu Wrzesień 10, 2016 Autor tematu Udostępnij Wrzesień 10, 2016 Może w spróbuj w Masterze dopisać warunek wysyłający 0 kiedy żaden z przycisków nie jest naciśnięty, a w Slavie wyrzucić przypisanie state = 0. Mówisz o czymś takim mniej więcej: a co do mastera, to jak jest typ danych, to: int state=0; to jest już przypisane. Na jakiej zasadzie, miało by pomóc? Pytam poważnie, bez żadnych pretensji. Po prostu nie wiem. Ale spróbuję również tego użyć. Link do komentarza Share on other sites More sharing options...
grg0 Wrzesień 11, 2016 Udostępnij Wrzesień 11, 2016 Odnosiłem się do programów z pierwszego posta. Jak działa program z przyciskami podłączonymi przewodami? Podczas wciśnięcia przycisku mniej więcej co 1 ms wykonuje się sekwencja zapisana w warunki if. Przycisk nie wciśnięty nic się nie zmienia na pinach mikrokontrolera. Jak działa program z komunikacją bezprzewodową? Nie wiadomo. Pitlab, pisał o czasie komunikacji. Nie wiadomo ile czasu trwa zapełnienie bufora odbiorczego. W związku z tym nie za każdym przejściem pętli głównej odczytamy wartość zmiennej state. Dlatego w zmiennej state trzeba pamiętać poprzednią odebraną wartość, żeby warunki wykonywały się za każdym razem przejścia pętli głównej aż do do nowego wczytania zmiennej state. To wszystko co napisałem to tylko domysły na podstawie pokazanych programów z pierwszego posta. Nie mam dużego doświadczenia z Arduino. Nigdy nie sterowałem silnikiem krokowym i nie wiem czy Twój sposób jest dobry czy nie. EDIT: Może być też tak, że obsługa bufora odbiorczego w znaczący sposób spowalnia pętlę główną. Wtedy pewnie zupełnie inaczej trzeba napisać program. Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »