• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie dwoma silnikami-Arduino Micro
#1
Witam forumowiczów Smile
Od jakiegoś czasu próbuję napisać programik do sterowania dwoma silniczkami dc za pomocą Joysticka oraz mostka H 
i zawracam się o pomoc,sugestię i wszelkie konstruktywne opinie. Oto programik dodam że weryfikacja z poziomu Arduino IDE wypadła pomyślnie ale silniczki stoją w miejscu i nie reagują na ruchy Joysticka :

Kod:
#define POT1_pin A0 // pin3 - sterowanie silnikiem 1
#define MOT1_pin 10 //pin1 - wyjscie na silnik 1
#define MOT2_pin 9 //pin0 - wyjscie na silnik 2
#define POT2_pin A1//pin4 - sterownie silnikiem 2

const int x_mid=490;
const int y_mid=490;
const int center_hist=30; //wartosci histerezy po przekroczeniu której zaczyna sie cos dziac

void setup() {

  pinMode(MOT1_pin, OUTPUT); 
  pinMode(MOT2_pin, OUTPUT);
  pinMode(POT1_pin, INPUT); // joystick pozycja X
  pinMode(POT2_pin, INPUT); // joystick pozycja Y
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
}
void loop() {

  int x=analogRead(POT1_pin); //odczyt wartosci
  int y=analogRead(POT2_pin);
  
  //sterowanie do przodu  

  if (x>(x_mid+center_hist)||(y=y_mid+center_hist))  {  
                
  pinMode(A2, HIGH);
  pinMode(A3, HIGH);
  pinMode(A4, LOW);
  pinMode(A5, LOW);

  byte predkosc1 = map(x, 1023, 460, 51, 230);
  analogWrite(MOT1_pin, predkosc1);
  analogWrite(MOT2_pin, predkosc1);

  delay(15);

  }

  //sterowanie do tylu
  
  if (x<(x_mid+center_hist) ||(y=y_mid+center_hist)) {

  pinMode(A2, LOW);
  pinMode(A3, LOW);
  pinMode(A4, HIGH);
  pinMode(A5, HIGH);

  byte predkosc2 =map(x, 520, 0, 51, 230);
  analogWrite(MOT1_pin, predkosc2);
  analogWrite(MOT2_pin, predkosc2); 

  delay(15);
 
  }

  //sterowanie w prawo 

  if (y<(y_mid+center_hist) ||(x=x_mid+center_hist)) {

  pinMode(A2, HIGH);
  pinMode(A3, LOW);
  pinMode(A4, LOW);
  pinMode(A5, LOW);

  byte predkosc3 =map(y, 460, 0, 51, 200);
  analogWrite(MOT1_pin, predkosc3);
  
  delay(15);

  }

  //sterowanie w lewo

  if (y>(y_mid+center_hist) ||(x=x_mid+center_hist)) {


  pinMode(A2, LOW);
  pinMode(A3, HIGH);
  pinMode(A4, LOW);
  pinMode(A5, LOW);

  byte predkosc4 =map(y, 520, 1023, 51, 200);
  analogWrite(MOT2_pin, predkosc4);
  
  delay(15);

  }

}
Podczas sprawdzania wyjściowego stanu Joysticka to wartości wahają się mniej więcej tak:
X =488
Y =496
Tutaj pytanie czy jest w ogóle możliwość sterowania takimi silnikami używając w miarę nie skomplikowanego programu a jak tak to czy jest opcja wprowadzenia możliwości "łagodnego przejścia" np podczas jazdy prosto w skręt w którąkolwiek stronę ?   
Aaa posiadam takowy joystick:
https://botland.com.pl/joystick/2901-thu...results=46
 
Odpowiedź
#2
(02-02-2017, 22:23)Waldy napisał(a): Tutaj pytanie czy jest w ogóle możliwość sterowania takimi silnikami używając w miarę nie skomplikowanego programu a jak tak to czy jest opcja wprowadzenia możliwości "łagodnego przejścia" np podczas jazdy prosto w skręt w którąkolwiek stronę ?   
Wszystko można zrobić tylko trzeba wiedzieć jak Wink.
Program na końcu będzie skomplikowany ale jak zaczniesz stosować funkcje to będzie łatwiej.
To "pinMode" w funkcji loop() to chyba przez pomyłkę?
Czy silniki i mostek są sprawne/dobrze spięte? Sprawdzałeś ich działanie niezależnie?

Zacznij od prostego programu w którym czytasz tylko ruch przód/tył i na tej podstawie cyklicznie co 1s wysyłaj informacje na terminal. Spróbuj to zrobić z użyciem millis().
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Kod:
if (x>(x_mid+center_hist)||(y=y_mid+center_hist))  


Czy ten drugi warunek jest okej? nie chodziło Ci o przyrównanie y do sumy tych wartości? jeśli tak to brakuje "=="
Warunkiem wejścia w if'a ma być tylko zmiana x? y wówczas ma być w wartości "spoczynkowej"? Jeśli również tak to zamiast sumy logicznej "lub" użyj iloczynu logicznego "and" korzystając z && w if'ie
 
Odpowiedź
#4
Odpowiadając na pytania to tak silniczki mostek i podłączanie jest ok sprawdzałem wcześniej korzystając z całego zakresy osi x w joysticku i silniki w mirę zmiany położenia potencjometru się rozpędzały i hamowały.
"pinMode" w loopie to fakt mój błąd poprawiłem na digitalWrite i po podłączeniu zasilania silniki dały o sobie znać tyle że strasznie szarpią i kręcą się tylko w jedną stronę tak jak by nie wiedziały co mają zrobić dziwi mnie dlaczego nie stoją i czekają na sygnał zmiany położenia joysticka ale to nic będę dalej szukał błędów i próbował. Wspominałeś coś funkcjach co miałeś konkretnie na myśli ? Prosił bym o jakiś odnośnik gdzie jest to w miarę dobrze wyjaśnione jeśli taki posiadasz wiedza zawsze się przyda ^^
Piotr2393 TAK dokładnie o to mi chodziło wprowadzę poprawki i zobaczymy co z tego wyjdzie.
Dziękuje za dotychczasową pomoc i wskazówki Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości