Skocz do zawartości

Arduino + silnik + joystick


Pomocna odpowiedź

Napisano

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?

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.

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.

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.

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?

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.

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();
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"....

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