Po dodaniu dwóch nowych funkcji silnik świruje :)

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 25 wrz 2016, 18:58

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 :D
kod wygląda tak:

Kod: Zaznacz cały

#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?

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1268
Rejestracja: 18 lis 2011, 02:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: Marhef » 26 wrz 2016, 08:53

A nie jest problemem to, że wywołujesz (prawie) jednocześnie dwie funkcje, które działają na tym samym wyjściu silnika?
Spróbuj może zrobić osobne warunki, np
if ((odczyt<300) && (odczytt<300)) left_forward();
A w funkcji left_forward(); ustawiasz raz jedną wartość prędkości silnika.
Smaczek
Młodszy majsterkowicz
Posty: 38
Rejestracja: 18 sie 2016, 09:45
Lokalizacja: Zielona Góra

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: Smaczek » 26 wrz 2016, 09:05

Witam,
Rozumię, że silnik masz jeden czy dwa?? Jeżeli jeden, takim razie jak można nim kręcić tył- przód i dodatkowo prawo- lewo?
Jeśli masz dwa silniki to dlaczego realizujesz sterowanie nimi tylko dwoma pinami, a nie czterema?
Pozdrawiam.
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 26 wrz 2016, 11:30

Marhef pisze:A nie jest problemem to, że wywołujesz (prawie) jednocześnie dwie funkcje, które działają na tym samym wyjściu silnika?
Spróbuj może zrobić osobne warunki, np
if ((odczyt<300) && (odczytt<300)) left_forward();
A w funkcji left_forward(); ustawiasz raz jedną wartość prędkości silnika.
Robiłem różne wersje i nic nie wychodziło ustawiłem tak jak napisałeś i okazało się że po przesunięciu joysticka "na skos" dopiero jakoś reagował wiec doszedłem do wnioski że zamiast i-&& ustawie lub-|| i zaczeło w końcu działać tak jak chce:) na jednym silniku zadziałało później spróbuję na 4 i jeśli się uda to skręcanie w robocie mam załatwione :) dzięki za pomoc !:)
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 26 wrz 2016, 11:32

Smaczek pisze:Witam,
Rozumię, że silnik masz jeden czy dwa?? Jeżeli jeden, takim razie jak można nim kręcić tył- przód i dodatkowo prawo- lewo?
Pozdrawiam.
z kodu wynika jak ma się kręcić ten silnik... jestem stanie wyobrazić sobie że silnik kręci się w prawo i lewo, ale przód tył... :D
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 26 wrz 2016, 11:41

dla potomnych
odczytX=analogRead(joystickX);
odczytY=analogRead(joystickY);
if ((odczytX<300) || (odczytY<300)) forward();
else if ((odczytX>600) || (odczytY>600)) backward();
else stopp();
Awatar użytkownika
ethanak
Złota rączka
Posty: 767
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: ethanak » 26 wrz 2016, 13:18

I tym postem potwierdziłeś moje przypuszczenie, że usunięcie algebry boolowskiej z ogólnego programu nauczania było złym pomysłem...
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 26 wrz 2016, 15:43

to znaczny?:D ja skończyłem technikum elektryczne i nie miałem programowania ale robotyka to moja pasja i chcąc nie chcąc muszę się go nauczyć :P
Smaczek
Młodszy majsterkowicz
Posty: 38
Rejestracja: 18 sie 2016, 09:45
Lokalizacja: Zielona Góra

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: Smaczek » 27 wrz 2016, 07:34

Witam,
Przeanalizuj sobie co zrobiłeś powyżej. Abstrahując od tego, że miałeś korzystać z czterech funkcji, a warunek korzysta z dwóch.
Dla łatwiejszego zobrazowania przypuśćmy, że analogowe odczyty są w zakresie 0-900, a wartości obsługiwane odmiennie w zakresach 0-300, 300-600, 600-900 dla każdego z joystick-ów. Daje to 9 różnych możliwości kombinacji wartości/położeń. Tobie funkcja forward() będzie działać przy 5-ciu z nich, natomiast backward() tylko przy trzech kombinacjach. Takie miałeś założenie?
Poza tym z kodu wynika, że silnik ma robić mniej więcej to samo, co prosty żołnierz przy dwóch kapralach na przemian wykrzykujących zazwyczaj sprzeczne rozkazy.
Pozdrawiam.
marcelh2o
Majsterkowicz
Posty: 103
Rejestracja: 8 wrz 2013, 11:18

Re: Po dodaniu dwóch nowych funkcji silnik świruje :)

Post autor: marcelh2o » 29 wrz 2016, 20:52

Kod: Zaznacz cały

void loop()
{
    odczytX=analogRead(joystickX);
      odczytY=analogRead(joystickY);
      
     
    
  if (odczytY<300) forward(); 
 else if (odczytY>600) backward(); 
 else if (odczytX<300) left(); 
 else if (odczytX>600) right(); 
 else stopp();
}
Wcześniejszy kod był do jednego silnika i nic tam się nie sprzeczało ze sobą.
ODPOWIEDZ

Strony partnerskie: