Arduino Polska Forum

Pełna wersja: Silnik krokowy Arduino
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam . Potrzebuję zaprogramować swój silnik krokowy tak aby obracał się o określoną liczbę kroków. niestety nie wychodzi mi to, chcialem zrobic zliczanie liczby kroków lecz co chwile wartosc w monitorze portu szeregowego jest 1,0 chociaz nie kasuje mi sie chyba w petli ta wartość. ktos ma pomysł jak to zrobić? Arduino uno, sterownik a4988, silnik krokowy jk42hs40-0504 i joystick arduino.
Kod:
#define step_pin 3  
#define dir_pin 4  
#define X_pin A0  
int direction;    
int steps = 200;
int wartosc  = 0;


void setup() {

  pinMode(dir_pin, OUTPUT);
  pinMode(step_pin, OUTPUT);
  Serial.begin(115200);  
 }  
void loop(){  
while (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 500) {
  int kroki;
     int wartosc = analogRead(A0);
     byte predkosc = map(wartosc, 512, 1, 20, 1);
     digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
     digitalWrite(step_pin, HIGH);
     delay(predkosc);
    digitalWrite(step_pin, LOW);
     delay(predkosc);  
         Serial.print("liczba kroków: ");
 Serial.print(digitalRead(kroki));
   Serial.print("\n");
     kroki = kroki +5;      }
    while (analogRead(X_pin) > 524 && analogRead(X_pin) <= 1024) {
   int wartosc = analogRead(A0);
   byte predkosc1 = map(wartosc, 512, 1023, 20, 1);
      digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
   digitalWrite(step_pin, HIGH);
   delay(predkosc1);
    digitalWrite(step_pin, LOW);
   delay(predkosc1);}}
Znajdź sobie bibliotekę AccelStepper, naucz się jej obsługiwać. Albo dodawaj jeszcze więcej delay w loop, jak wolisz.
(05-10-2018, 14:59)kaczakat napisał(a): [ -> ]Znajdź sobie bibliotekę AccelStepper,  naucz się jej obsługiwać. Albo dodawaj jeszcze więcej delay w loop, jak wolisz.

Szukałem też, ale wszystkie przyklady co widzialem sterowania steruje sie kazda cewka osobno (4 piny),a tutaj steruje tylko jednym jako kroki i jednym jako kierunek obrotu i nie wiem jak to powiązac.
OK, nie zauważyłem, że używasz sterownika a4988, do tego ta biblioteka nie jest potrzebna, bo już to samo robi ten driver. Nie mniej jednak zajrzyj do niej i zobacz w jaki sposób jest realizowane obsługa czasu. Ewentualnie w kursie na forbot poczytaj o millis, micros. Nie rób tego na delay. Docelowo to robi się w przerwaniu, tak by ruch był płynny i niezależny od tego w czym dłubie akurat pętla loop. 
Ewentualnie do samego sterownika też są biblioteki, np. laurb9 
https://github.com/laurb9/StepperDriver wszystko masz tu opisane ze schematami.
Nie wiem co tym chciałeś osiągnąć poza 0 i 1 - Serial.print(digitalRead(kroki));
Pewnie cały kurs by Ci nie zaszkodził.
(05-10-2018, 15:34)Gizior napisał(a): [ -> ]przyklady co widzialem sterowania steruje sie kazda cewka osobno (4 piny),a tutaj steruje tylko jednym jako kroki i jednym jako kierunek obrotu i nie wiem jak to powiązac.

Znasz rodzaje i zasadę działania silników krokowych i układu a4988?
(05-10-2018, 16:13)kaczakat napisał(a): [ -> ]OK, nie zauważyłem, że używasz sterownika a4988, do tego ta biblioteka nie jest potrzebna, bo już to samo robi ten driver. Nie mniej jednak zajrzyj do niej i zobacz w jaki sposób jest realizowane obsługa czasu. Ewentualnie w kursie na forbot poczytaj o millis, micros. Nie rób tego na delay. Docelowo to robi się w przerwaniu, tak by ruch był płynny i niezależny od tego w czym dłubie akurat pętla loop. 
Ewentualnie do samego sterownika też są biblioteki, np. laurb9 
https://github.com/laurb9/StepperDriver wszystko masz tu opisane ze schematami.
Nie wiem co tym chciałeś osiągnąć poza 0 i 1 - Serial.print(digitalRead(kroki));
Pewnie cały kurs by Ci nie zaszkodził.

Oki zajrzę, nie mniej jednak chciałem sobie rozłożyć to i docelowo chciałnbym sterowac joystickiem plynnie obrót silnika krokowego ale chciałbym mu zrobić tzw. blokade. Chciałem to wykonać w ten sposób, lecz cały czas x się zeruje i nie mam pojęcia jak zrobić tak aby po np. 200 krokow pomimo ze jostick jest w pozycji bocznej zatrzymało krokowca choćby nie wiem co.
Kod:
#define step_pin 3  
#define dir_pin 4  
#define X_pin A0

void setup() {
 pinMode(dir_pin, OUTPUT);
 pinMode(step_pin, OUTPUT);
 Serial.begin(115200);  
}

void loop() {
 for(int x = 0 ; x < 200; x++) {
   Serial.print("liczba kroków: ");
 Serial.println(digitalRead(x));
   int wartosc = analogRead(A0);
     int predkosc = map(wartosc, 512, 1, 15, 1);
   
    if (analogRead(X_pin) >= 0 && analogRead(X_pin) <= 500) {
     digitalWrite(dir_pin, HIGH);
     digitalWrite(step_pin, HIGH);
     delay(predkosc);
    digitalWrite(step_pin, LOW);
     delay(predkosc);

}}}
(05-10-2018, 16:32)Gizior napisał(a): [ -> ]nie mam pojęcia jak zrobić tak aby po np. 200 krokow pomimo ze jostick jest w pozycji bocznej zatrzymało krokowca choćby nie wiem co.
Zliczaj kroki, jak osiągną liczbę 200 to nie steruj silnikiem.
To że coś chcesz to żaden problem, ale na razie nie rozumiesz do czego służą podstawowe polecenia w Arduino. Idź sobie przećwicz kurs. Niby co teraz ma robić to:
Kod:
for(int x = 0 ; x < 200; x++) {
  Serial.print("liczba kroków: ");
Serial.println(digitalRead(x));
?
Wygląda to jak pisane przez kota wrzuconego do wanny.
(05-10-2018, 22:08)kaczakat napisał(a): [ -> ]Niby co teraz ma robić to:
Kod:
for(int x = 0 ; x < 200; x++) {
  Serial.print("liczba kroków: ");
Serial.println(digitalRead(x));

Zamierzeniem autora kodu, z pewnością było wyświetlenie stanu wszystkich wejść Arduino na terminalu. Niestety, autor zapomniał, że ŻADNE Arduino, nawet na ARM, nie ma 200 wejść :-)

A może program pisany metodą prób i błędów? Uda się, nie uda. U człowieka uda są dwa, jak na razie jest jednak to "nieudo".