Skocz do zawartości

Arduino + silnik + joystick


marcelh2o

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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();
Link do komentarza
Share on other sites

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"....

Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.