Elektroda.pl
Elektroda.pl
X
BotlandBotland
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino - Nie działa silnik sterowany pilotem

09 Mar 2016 10:43 1179 19
  • Poziom 14  
    Witam
    Mam pilot z czujnikiem podczerwieni i silnik krokowy.
    Potrzebuję podłączyć silnik krokowy w taki sposób, żeby strzałką do góry na pilocie silnik zaczął się obracać, następnie gdy obraca sie to strzałką w dół go zatrzymać i gdy silnik jest nieruchomy to strzałką w dół zacząć go obracać w przeciwną stronę. Wie ktoś jak to mozna rozwiązać? Próbowałem za pomocą instrukcji if, switch case i nie mi działa. Jedyne co działa to to, że po każdym naciśnieciu klawisza w pilocie silnik wykonuje jeden krok.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/code]
  • BotlandBotland
  • Użytkownik usunął konto  
  • BotlandBotland
  • Poziom 14  
    Szczerze to sam tego nie rozumiem. Zasugerowałem sie diodami, moj poprzedni projekt i tamto dzialało w ten sposób. Kompilator miał łzy w oczach :P
  • Użytkownik usunął konto  
  • Poziom 14  
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Takie coś mi się skompilowało i działa tylko nie tak jak chcę. Problemem jest to, że naciśniecie klawisza na pilocie powoduje, że silnik wykonuje jeden krok a chce żeby cały czas sie obracał. Po ponownym kliknięciu przycisku zatrzymywał się. Próbowałem na wszystkie sposoby i bezskutecznie.
  • Poziom 14  
    Nie jestem jeszcze dobry w programowaniu, ale żeby silnik kręcił się cały czas, musisz napisać inny program. Chodzi o to, że silnik krokowy to nie dioda LED i potrzebuje cały czas impulsów.
    Najłatwiej było by się wyposażyć w sterownik silnika krokowego. Wykonuje on kroki za ciebie, Ty musisz tylko podać impuls na odpowiednie wejście. Proponuję trochę poczytać o zasadach działania silników krokowych.

    Po pierwsze, zatrzymanie silnika krokowego polega po prostu na nie zmienianiu stanów. Silnik wykona ostatnio zadany krok i jeśli nie dostanie kolejnego "rozkazu" zostanie w tym samym miejscu.
    Ja bym spróbował tak napisać program, by uzależnić działanie silnika od jakiejś zmiennej. Np. jeśli zmienna wynosi 0 nierób nic, jeśli wynosi 1 kręć w prawo, jeśli 2 to w lewo. Zmianę tej zmiennej uzależnić od odczytu z odbiornika IR. Jeśli strzałka w górę zmienna kierunek 1, jeśli strzałka w dół zmienna 0(brak instrukcji w przypadku zmiennej kierunek == 0, powoduje zatrzymanie silnika).
    To tak jak na razie, może nie jest to super rozwiązanie, ale już jakoś to będzie działać.

    Mogę Ci pomóc trochę w pisaniu tego programu, jeśli dasz dużo od siebie :)
  • Poziom 14  
    Próbowałem właśnie zrobić coś w tym stylu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Skompilowało się ale dalej jest to samo. Wykonuje tylko jeden krok. A skoro dałem pętlę to chyba powinno działać co nie?
  • Pomocny post
    Poziom 14  
    Problem polega na tym, że uzależniasz działanie silnika od sygnału z odbiornika :) Program wykona jedną akcje po tym jak naciśniesz guzik na pilocie. Silnik się zakręci jeśli kontroler otrzyma sygnał IR, jeśli go nie otrzymuje to się nie kręci. To dlatego, że if odpowiedzialny za kręceniem silnika jest zawarty w "if (irrecv.decode(&results)) {"

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodałem komentarze do twojego kodu, przeczytaj ze zrozumieniem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mniej więcej tak to powinno wyglądać, popoprawiaj jak by wyskoczyły jakieś błędy. Ten program będzie kręcił silnikiem po wciśnięciu strzałki w górę. Będzie nim kręcił do puki nie naciśniesz strzałki w dół. Na razie uruchom to i wtedy będziemy myśleć, żeby kręcić silnikiem w drugą stronę. Tak w ogóle testowałeś samo kręcenie silnikiem, bez odbiornika IR ?
  • Poziom 14  
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Zrobiłem coś w tym stylu, i kolejny problem... Czemu gdy chcę skręcać platformą i ustawiam opóźnienie na jednym kole a na drugim nie to w efekcie opóźnienie działa na oba koła?

    Dodano po 16 [minuty]:

    I wgle monekx dziękuję Ci za pomoc :)
  • Poziom 14  
    Podaj cały kod. Pewnie coś nie tak w funkcji. Przy czym zaznaczę, że estetyczniej jest dodawać funkcje jak "void kroki_przod" na końcu kodu. Wtedy nie trzeba tyle przewijać ;)

    Zwróć też uwagę na "if(zmienna == 1)", są tam spacje miedzy zmienna, a == i miedzy == i 1. Reszta if'ów jest bez spacji. Być może to ma jakiś wpływ. Powinno być ze spacjami.

    Do tego zalecam użycie monitora portu szeregowego do sprawdzenia, czy program przechodzi w funkcje w prawo/lewo. W tym celu musisz do void setup() dodać Serial.begin(9600);

    Po każdym odczytaniu kodu np. case 0xFF18E7: //strzałka w góre musisz dopisać Serial.println("przód"); i adekwatnie do każdego tył, zatrzymaj, prawo, lewo. Wtedy, będziesz mógł sprawdzić w monitorze portu szeregowego, czy program odpowiednio interpretuje naciśnięcie guzika na pilocie. Możesz też dodać podobną komendę, przy if'ach Serial.println("jade do przodu"); itp. w reszcie. Będziesz widział, czy program dochodzi do tego momentu.

    Oczywiście to jest tylko do diagnozy, bo silniki mogą lekko przerywać z powodu zajętości procesora przez komende Serial.println.
  • Poziom 14  
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mój kod, coś bede dalej kombinował. Jak Ty byś go zoptymalizował?
  • Poziom 14  
    Po pierwsze, daj jakieś zdjęcie jak wygląda twój projekt. W pierwszym poście pisałeś o sterowaniu silnikiem krokowym. Teraz gdzieś się wplatają jakieś koła, nie zostało to przez Ciebie wyjaśnione.
    Po drugie przeczytaj mój poprzedni post, zastosuj się do wskazówek i zamieść poprawiony kod. Napisz swoje własne spostrzeżenia.
  • Poziom 14  
    Poprawiłem kod. Moje uwagi. Nie wiem czemu ale koła nie obracają się płynnie tylko są takie jakby przeskoki. Jeśli chodzi o pilot to działa. Wyświetlaja sie komunikaty ma monitorze. Jeśli chodzi o koła, nie mówiłem nic o tym wcześniej. Zwykły kawałek plastiku do tego 3 koła. Jedno obraca sie i dwa z silnikami krokowymi. Sterowniki do silników mam podłączone. Na początek chce zeby zaczeło to jeździć. Przód tył, na boki. Nic szczególnego. Potem mam zamiar to rozbudować ale to dopiero w przyszłości.

    Poprawiony kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 11 [minuty]:

    Próbowałem też zmieniać wartość delay silników stosując opóźnienie do wolniejszego obracania silnikiem. A drugi powinien normalnie się obracać. Nie wiem czemu ale zmiana opóźnienia wpływa na te dwa silniki jednocześnie. Nie powinno ich odczytywać oddzielnie skoro w funkcji wpisuję je oddzielnie?
  • Pomocny post
    Poziom 14  
    Testowałem program też u mnie i niby wszystko chodzi. Spróbuj dać większe opóźnienie, może skręt jest niezauważalny.

    Możesz, też spróbować kręcić jednym kołem do tyłu, a drugim do przodu podczas skręcania.
  • Użytkownik usunął konto  
  • Poziom 14  
    Tak jak pisałeś jedno koło przód jedno tył działa. Jeśli chodzi o opóźnienie to było dobre tylko problem polegał na tym, że opóźniało to oba koła jednocześnie. Wolniej jechał cały do przodu.

    Jeszcze jedna kwestia, mianowicie czemu on tak przerywa, nie jedzie płynnie? Stosowałem kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I w Nim silnik obracał się płynnie. Twój silnik też tak wolno się obraca? Jaką można ustawić maksymalną szybkość?
  • Poziom 14  
    Sprawdzałem sam program, czy przechodzi w odpowiednie funkcje itp. Program wygląda dobrze, występują odpowiednie opóźnienia. Niestety nie jestem w stanie ot tak powiedzieć, gdzie jest problem. Przerywać, może z uwagi na Serial.println. Spróbuj bez tego.
  • Poziom 14  
    Próbowałem i nic z tego, a jakbym może spróbował zamienić silnik krokowy na silnik dc? Może łatwiej się nim steruje i osiąg ma lepsze?
  • Poziom 14  
    Na pewno łatwiej sterować silnikiem dc. Silniki krokowe lepsze, jeśli zależy Ci na dokładności.
  • Poziom 14  
    Właśnie nie wiem czy nie zainwestować w nie, myślę że aż taka dokładność nie jest mi potrzebna, a chce mieć platformę jężdżącą i ma mieć inne ciekawe rzeczy czujnik odległośći ognia itp. Bardziej na tym będzie mi zależało ale krokowca i tak gdzieś wykorzystam. Wgle monekx dzięki za cenne wskazówki :)