Skocz do zawartości

Sterowanie prędkościami i kierunkami silników za pomocą joysticka


koik

Pomocna odpowiedź

Witam, chcę sterować silnikiem dc ( kierunek oraz prędkość), lecz mam jakiś problem.

Oto mój kod:

const int SW_pin = 2; //switch w joysticku A2

const int Xpin = 0; // prawo/lewo A0

const int Ypin = 1; //gora/dol A1

int oy; //joystick odczyt gora dol

int war; //warotsc potencjomertu w joysticku

int war2;

void setup() {

pinMode(SW_pin, INPUT);

digitalWrite(SW_pin, HIGH);

Serial.begin(9600);

pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1

digitalWrite(6, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6

pinMode(5, OUTPUT); //Sygnał PWM silnika nr 2

digitalWrite(5, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 7

pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1

pinMode(8, OUTPUT);

pinMode(9, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 2

pinMode(10, OUTPUT);

}

void loop() {

//odczyty wysylane do monitora

Serial.print("Switch: ");

Serial.print(digitalRead(SW_pin));

Serial.print("\n");

Serial.print("X-axis: ");

Serial.print(analogRead(Xpin));

Serial.print("\n");

Serial.print("Y-axis: ");

Serial.println(analogRead(Ypin));

Serial.print("\n\n");

delay(100);

//warunki uzalezniajace ruchy silnikow w zaleznosci od polozenia joysticku

//jezeli joystick jest na srodku:

if(analogRead(Ypin)>501 && analogRead(Ypin)<510){

digitalWrite(7, LOW);

digitalWrite(8, LOW);

digitalWrite(9, LOW);

digitalWrite(10, LOW);

delay(100);}

else

// jezeli joystick jest w dole

if(analogRead(Ypin)<500){

oy = analogRead(Ypin);

war = map(oy,0,500,0,5);

digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo

digitalWrite(8, oy);

digitalWrite(9, LOW); //Silnik nr 2 - obroty w lewo

digitalWrite(10, oy);

delay(100);

}

else

//jezeli joystick jest w gorze

if(analogRead(Ypin)>511) {

oy = analogRead(Ypin);

war2 = map(oy,511,1023,0,5);

digitalWrite(7, oy); //Silnik nr 1 - obroty w prawo

digitalWrite(8, LOW);

digitalWrite(9, oy); //Silnik nr - obroty w prawo

digitalWrite(10, LOW);

delay(100);

} }

[ Dodano: 25-01-2016, 22:52 ]

Po wgraniu kodu silniki kręcą się tylko w zadanym kierunku, lecz nie mam możliwości regulowania ich prędkości. Próbowałem zamieniać

digitalWrite(8, oy);

na

digitalWrite(8, war);

ale nic to nie pomaga. Jakieś rady?

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link do komentarza
Share on other sites

AnalogWrite działa, teraz mam problem z napisaniem warunku joysticka.

joystick jest w srodkowej pozycji okolo 500, w górę jest wiecej a w dół mniej. Napisałem warunek:

if(analogRead(Ypin)>521) {

oy = analogRead(Ypin);

war = map(oy,521,1023,5,500);

analogWrite(7, oy); //Silnik nr 1 - obroty w prawo

digitalWrite(8, LOW);

analogWrite(9, oy); //Silnik nr - obroty w prawo

digitalWrite(10, LOW);

delay(50);

Silnik może nie aż tak jak chciałem, ale zmienia prędkość wraz ze zwiększeniem joystickowego potencjometru. Nie do końca zaś wiem jak napisać warunek aby w zerze jechał najszybciej tylko w drugą stronę a przy pozycji okolo 480 wolno. Oto mój kod:

if(analogRead(Ypin)<480){

oy = analogRead(Ypin);

war = map(oy,480,0,10,500);

digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo

analogWrite(8, oy);

digitalWrite(9, LOW); //Silnik nr 2 - obroty w lewo

analogWrite(10, oy);

delay(50);

Podejrzewam, że chodzi o linikję z map(). Napiszę więc jak ja to rozumiem.

Wartość jest równa położeniu potencjometru. Jezeli jest 480 to predkość jest 10 a jeżeli 0 to 500. Czy dobrze to rozumiem?

[ Dodano: 26-01-2016, 11:36 ]

Poradziłem sobie, czy to normalne, że przy niskich prędkościach silniki nie załączają mi się równocześnie?

[ Dodano: 26-01-2016, 11:42 ]

Zauważyłem, że jeden silnik działa tak jak steruję go potencjometrem, drugi zaś nie. czym to może być spowodowane?

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

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

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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