marcelh2o Napisano Wrzesień 25, 2016 Udostępnij Napisano Wrzesień 25, 2016 Cześć bawie sie dalej z arduino silnikiem i joystickiem i mam taki problem gdy mam podłączony tylko jedną oś x lub y (jeden potencjometr) to fajnie steruje silnikiem w przód albo w tył, ale jeśli dodaje drugą oś i kolejne dwie funkcje void left() i void right() to silnik się dziwnie zachowuje mianowicie: po przesunieciu joysticka w jedną strone normalnie się kręci, w drugą strone piszczy, w trzecią stronę kręci się bardzo powoli, a w czwartą nic nie robi albo też piszczy 😃 kod wygląda tak: #define joystick A0 //przypisuje joystickom piny #define joystickk A5 #define motor11 7 // przypisuje silnikom piny #define motor12 8 int odczyt; int odczytt; void setup() { pinMode(motor11, OUTPUT); pinMode(motor12, OUTPUT); } void loop() { odczyt = analogRead(joystick); if (odczyt <300) { forward(); } else if (odczyt > 800) { backward(); } else { stopp(); } //----------------------------------------------- odczytt = analogRead(joystickk); if (odczytt <300) { left(); } else if (odczytt > 800) { right(); } } //----------------------------------------------- void forward() { digitalWrite(motor11, LOW); odczyt = map(odczyt, 506, 0, 0, 255); digitalWrite(motor12, odczyt); } //----------------------------------------------- void backward() { digitalWrite(motor12, LOW); odczyt = map(odczyt, 512, 1023, 0, 255); digitalWrite(motor11, odczyt); } //----------------------------------------------- void stopp() { digitalWrite(motor11, LOW); digitalWrite(motor12, LOW); } //----------------------------------------------- void right() { digitalWrite(motor11, LOW); odczytt = map(odczytt, 506, 0, 0, 255); digitalWrite(motor12, odczytt); } //----------------------------------------------- void left() { digitalWrite(motor12, LOW); odczytt = map(odczytt, 512, 1023, 0, 255); digitalWrite(motor11, odczytt); } Dlaczego po dodaniu dwóch nowych funkcji wszystko się sypie? Cytuj Link do komentarza Share on other sites More sharing options...
Marooned Wrzesień 25, 2016 Udostępnij Wrzesień 25, 2016 Zakładam, że chciałeś użyć analogWrite a nie digitalWrite, skoro przekazujesz wartość pomiędzy 0 a 255, to raz. A dwa, to Ty masz jeden silnik sądząc po kodzie i na przemian na wyjściach zmieniasz 0 na 1 i z powrotem, bo wszystkie 4 funkcje operują na tych samych 2 wyjściach. Wygląda na mocny chaos po całości. Nazwij sobie lepiej zmienne a nie odczyt i odczytt bo może wizualnie Ci się wszystko przez to myli. Cytuj Link do komentarza Share on other sites More sharing options...
marcelh2o Wrzesień 25, 2016 Autor tematu Udostępnij Wrzesień 25, 2016 Tak dokładnie chcę sterować na tą chwilę tylko jednym silnikiem. A tym "map" chyba zmieniłem zakres z tam z 0 -1024 do 0 -255. Uczę się dopiero języka C i c++ niedawno zamówiłem swoją pierwszą książkę (poza jedną o arduino). I ogólnie program działał na tym zakresie analogowym ale po dodaniu funkcji right i left coś silnik zaczął świrować. Po zmianie silnika na wyjścia analogowe i zmianie digitalWrite na analogWrite sytuacja jest taka sama. Cytuj Link do komentarza Share on other sites More sharing options...
Marooned Wrzesień 25, 2016 Udostępnij Wrzesień 25, 2016 Ale sam sobie odpowiedz w jaki sposób chcesz sterować jednym silnikiem w 4 strony? Tak, funkcja map() robi to co mówisz, ale poczytaj o funkcji digitalWrite() oraz analogWrite() i zrozumiesz, że to nie do końca ma sens. Obecnie podając do digitalWrite wartość z przedziału 0..255 oznacza, że dla 0 będzie 0, a dla 1 do 255 będzie 1, a raczej nie tego oczekujesz. No i jak wspomniałem, góra/dół walczą z lewo/prawo bo operują na tych samych pinach, stąd Twoje buczenie zamiast oczekiwanego rezultatu. Cytuj 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
marcelh2o Wrzesień 26, 2016 Autor tematu Udostępnij Wrzesień 26, 2016 Ale sam sobie odpowiedz w jaki sposób chcesz sterować jednym silnikiem w 4 strony?Tak, funkcja map() robi to co mówisz, ale poczytaj o funkcji digitalWrite() oraz analogWrite() i zrozumiesz, że to nie do końca ma sens. Obecnie podając do digitalWrite wartość z przedziału 0..255 oznacza, że dla 0 będzie 0, a dla 1 do 255 będzie 1, a raczej nie tego oczekujesz. No i jak wspomniałem, góra/dół walczą z lewo/prawo bo operują na tych samych pinach, stąd Twoje buczenie zamiast oczekiwanego rezultatu. 1. Logiczne że nie chce nim sterować w 4 strony. joystick to dwa potencjometry więc wychylam potencjometrA w góre to silnik kręci się lewo wychylam w dół to kręci się w prawo. Wychylam potencjometrb w góre to silnik kręci się w lewo wychylam w dów to kręci się w prawo. Serio tak ciężko to było zrozumieć czy tylko tak próbowałeś dogryźć? 2. Jak mogą walczyć o to samo skoro ruszam dwoma różnymi potencjometrami niezależnymi od siebie? Cytuj Link do komentarza Share on other sites More sharing options...
Marooned Wrzesień 26, 2016 Udostępnij Wrzesień 26, 2016 Sorry, ale o żadnym dogryzaniu nie ma tu mowy. Przeczytaj jeszcze raz co napisałeś. Jeśli wychylisz A w górę i B w prawo to jak ma się kręcić silnik. W lewo czy w prawo? Albo jeden potencjometr = jeden silnik albo musisz zrobić fuzję 2 sygnałów z obu potencjometrów (jakaś suma, różnica, whatever) i takim jednym sygnałem sterować. Przeanalizuj swój kod dla wartości: odczyt > 800 odczytt < 300 czyli joy w dół i w lewo i napisz tu jakie wartości przyjmie port motor11 i motor12 wg Ciebie. Cytuj Link do komentarza Share on other sites More sharing options...
marcelh2o Wrzesień 26, 2016 Autor tematu Udostępnij Wrzesień 26, 2016 Problem rozwiązałem w ten sposób, działa dla jednego silnika poźniej sprawdzę dla 4 odczytX=analogRead(joystickX); odczytY=analogRead(joystickY); if ((odczytX<300) || (odczytY<300)) forward(); else if ((odczytX>600) || (odczytY>600)) backward(); else stopp(); Cytuj Link do komentarza Share on other sites More sharing options...
Marooned Wrzesień 26, 2016 Udostępnij Wrzesień 26, 2016 Od razu czytelniej i z sensem. Gratuluję. Zakładam, że digitalWrite (btw, polecam digitalWriteFast) i analogWrite już rozróżniasz i to też poprawiłeś. Cytuj Link do komentarza Share on other sites More sharing options...
marcelh2o Wrzesień 26, 2016 Autor tematu Udostępnij Wrzesień 26, 2016 Od razu czytelniej i z sensem. Gratuluję.Zakładam, że digitalWrite (btw, polecam digitalWriteFast) i analogWrite już rozróżniasz i to też poprawiłeś. Tak wszystko już śmiga ale zamierzam pójść o lvl wyżej i sterować tym przez nrf24l01 ale czuje że to dopieo będzie "zabawa".... Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!