• 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
Silnik krokowy Arduino
#1
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);}}
 
Odpowiedź
#2
Znajdź sobie bibliotekę AccelStepper, naucz się jej obsługiwać. Albo dodawaj jeszcze więcej delay w loop, jak wolisz.
 
Odpowiedź
#3
(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.
 
Odpowiedź
#4
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ł.
 
Odpowiedź
#5
(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?
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#6
(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);

}}}
 
Odpowiedź
#7
(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.
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
#8
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.
 
Odpowiedź
#9
(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".
Pomagam (nie prowadzę kursów), tylko, gdy w poście załączone są niezbędne materiały (kod, schemat) a pytający zna podstawy.

Na kod z Delay szkoda czasu.
Kod wymaga komentowania.
Kod bez WDT jest niepewny.



 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości