Skocz do zawartości

Sterowanie silnikiem krokowym - 28byj-48 + ULN2003


Chester11-86

Pomocna odpowiedź

potraktuj proszę moją "analizę" jako wspólną naukę, nie jako głos ekspercki - też gniotę sterowanie krokowymi tyle że przez sensory środowiskowe i gdy docieram do "ściany" sprawdzam efekty NIEdziałania kodu zgodnie z praktyczną sugestią Trekera  (czyli wyświetleniem czegoś z danej pętli/warunku), poza tym jakiś czas z dala od komputera pomaga spojrzeć na kod świeżym okiem 😉.

Sprawdzenie czy steper2 dotarł na wyznaczone miejsce dał bym tak:

  case 0x343442BD:
   stepper2.moveTo(4096); //jedz silnikiem na pozycje 4096
   delay (200); // zakładam że zawieszenie(delay) następuje po zrealzowaniu przez AcelStepper komendy czyli silnik dojeczał do końca
 	Serial.println(stepper2.currentPosition()); // sprawdzam czy koniec jest faktycznie na 4096, jeżli nie to coś fizycznie zatrzymuje silnik w innym punkcie np. blokada, albo bezwładność dokręca go dalej
   break;

No i komunikat dał bym TYLKO w jednym miejscu albo rozróżnił je w każdym case jakimś indeksem np. Serial.println("Krokowy 2 poz.4096"); 

Edytowano przez wmaker
  • Lubię! 2
Link do komentarza
Share on other sites

Dnia 15.02.2019 o 21:35, Chester11-86 napisał:

Nie rozumiem i tutaj proszę o pomoc w zrozumieniu tej kwestii programu:


if (digitalRead (5) == LOW && stepper1.distanceToGo() == 0) 

Dlaczego muszę znowu w tym momencie ustalić pozycję "0" a nie tą którą osiągnąłem wcześniej czyli "4096"??

Nie wiem czy to już "masz" więc dopisuję. Funkcja distanceToGo () jest tu warunkiem logicznym funkcji if, operator == nie przypisuje/ustala wartości 0 lecz sprawdza czy ma wartość zero.

Sama funkcja distanceToGo () sprawdza czy silnik nie ma jeszcze jakieś kroki do "zrobienia". Rozumem to tak że gdyby nie było tego warunku możliwe było by wykonanie komendy ruchu przed ukończeniem jazdy silnika i wtedy "rozjechało" by się liczenie kroków pomiędzy krańcowymi miejscami postoju.

Edytowano przez wmaker
  • Lubię! 1
Link do komentarza
Share on other sites

12 godzin temu, Chester11-86 napisał:

Dalej jestem w kropce...

Moim zdaniem, powinieneś wrócić do podstaw, do opanowania sterowania jednym silnikiem. Właściwie, powinieneś zacząć nawet od dogłębnego opanowania przycisku i włączania i wyłączania diody. Drugą sprawą do opanowania to podstawy programowania. Podejrzewam, że jesteś "absolwentem" jakiegoś wideo-kursu programowania, w którym autor obiecuje, że po obejrzeniu całego kursu, zostanie się programistą, że kurs "przeszło" już tysiące czy tego podobne bzdurne obietnice. Może właśnie dlatego, twój kod staje się coraz bardziej nieczytelny. Ale to jest tylko moje zdanie i mogę się mylić więc jeżeli tak jest to wybacz.

Edytowano przez narbej
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

Dla formalności jeszcze zamienił bym programowo silniki przez zmianę deklaracji pinów:

AccelStepper stepper1(STEP1, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(STEP2, motorPin5, motorPin7, motorPin6, motorPin8);

na:

AccelStepper stepper2(STEP1, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper1(STEP2, motorPin5, motorPin7, motorPin6, motorPin8);

to sprawdzi warstwę fizyczną połączeń, jeżeli są ok to teraz problem "przeniesie" się na drugi silnik jeżeli problem zostanie na starym silniku to...

...kabelkologia.

usunąłem komentarz o różnych deklaracjach sterowania STEP1 i STEP2 - doczytałem że mają zdefiniowaną tą samą wartość

A tak...

AccelStepper stepper1(AccelStepper::FULL4WIRE, motorPin1, motorPin3, motorPin2, motorPin4)
AccelStepper stepper2(AccelStepper::FULL4WIRE, motorPin5, motorPin6, motorPin7, motorPin8)

jak bym wszystko wiedział to prowadził bym forum 🙂 🙂😉  a że nie wiem to czytam bibliotekę AccelStepper i porównuję to z twoim programem i wychodzi mi że zmiksowałeś deklarację z funkcją. Gdzie deklarujesz rodzaj silnika (ilość połączeń)? W bibliotece nie spotkałem jednoczesnej deklaracji  mikrokroków i pinów, a tak odczytuję u Ciebie...

Mam nadzieję że nie piszę idiotyzmów, a jeżeli tak to będę mógł...

...usunąć post 🙂

Edytowano przez wmaker
Link do komentarza
Share on other sites

narbej wybaczam Ci 🙂

wmaker dziękuję Ci za podpowiedzi, też czytałem tą bibliotekę ale ja to miałem rozwiązane w inny sposób i Twoje podpowiedzi są słuszne (moja opinia) ale nie rozwiązało to problemu 🙂

 

Natomiast w kodzie pozbyłem się przedrostków "else" i wszystko działa jak to sobie wyobraziłem (trochę jeszcze pomodziłem):

if (stepper1.currentPosition() == 4096 || stepper1.currentPosition() == 0)
  {
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
  }
  if (stepper2.currentPosition() == 4096 || stepper2.currentPosition() == 0)
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
  }

Kod gotowy w 80% brakuję mi jeszcze jednej funkcji, po odcięciu zasilania ustawianie/zapamiętywanie pozycji silnika.

Jak ktoś ma jakieś ciekawe podpowiedzi z chęcią wysłucham 🙂

Pozdrawiam serdecznie!

Link do komentarza
Share on other sites

11 godzin temu, Chester11-86 napisał:

w kodzie pozbyłem się przedrostków "else" i wszystko działa

no tak, spełnienie warunków na pierwszym silniku zamykało warunek i program nie dochodził do drugiego silnika - w programach jest to fascynujące że rozwiązania stają się oczywiste PO ich znalezieniu 🙂 

11 godzin temu, Chester11-86 napisał:

czytałem tą bibliotekę ale ja to miałem rozwiązane w inny sposób

wyjaśnij proszę jak.

Link do komentarza
Share on other sites

(edytowany)

Szukałem, aby podlinkować stronę na której się wzorowałem, kojarze, że było coś z forum arduino. Tam wyjaśnione było jak używać accelstepper do silników unipolarnych oraz bipolarnych przy użyciu odpowiednich układów sterujących. 

Zauważ w moim kodzie na początku zdefiniowałem sobie STEP1 oraz STEP2. Przy takich silnikach jakie wykorzystuję wpisanie cyfry 4 oznacza pełne kroki ponieważ tak wynika z budowy samego silnika. Obliczając sobie z danych silnika żę do pełnego obrotu jest 32 kroki gdzie przekładnia jest 64 "krokowa" daje nam to na jeden pełny obrót wałem 2048 kroków. 

Niektórzy (może się spotkasz) wpisują na sztywno w taki sposób:

AccelStepper stepper1(4, motorPin1, motorPin3, motorPin2, motorPin4);

Jeżeli zamiast cyfry 4 wpiszesz cyfrę 8 czyli każdy step podzielisz na pół wyjdą Ci półkroki czyli wykonując obliczenia powyżej będziesz musiał na jeden pełny obrót zrobić 4096 kroków.

Ja to zrozumiałem w ten sposób podpatrując forum arduino/forbot oraz starać się zrozumieć samą bibliotekę razem z przykładami umieszczonymi programie. Jeżeli coś namieszałem to proszę mnie poprawić aby nie szerzyć głupot a mój post skasować.

Testowałem to kilkukrotnie i wszystko się sprawdzało dlatego taka moja odpowiedź 🙂 

 

Panowie, podpowiedzcie w którę stronę iść, chciałbym zrealizować program aby po włączeniu zasilania arduino wykonało pewne zadanie (tylko jednokrotnie) i dopiero przeszło do pętli loop(). 

Tyle już przeczytałem, że... 😫 proszę o malutką wskazówkę 🙂 

Edytowano przez Chester11-86
Link do komentarza
Share on other sites

11 godzin temu, Chester11-86 napisał:

chciałbym zrealizować program aby po włączeniu zasilania arduino wykonało pewne zadanie (tylko jednokrotnie) i dopiero przeszło do pętli loop(). 

Wstaw, dodaj,  to zadanie do bloku setup{}

Edytowano przez narbej
Link do komentarza
Share on other sites

Hmmm, zadam takie dziwne pytania:

1. Czy jest możliwość w pętli setup zrobić przejście do jakiejś inne pętli niż loop?

2. Czy można w jednym programie używać biblioteki stepper.h oraz accelstepper.h?

Z góry dzięki za odpowiedź!

Link do komentarza
Share on other sites

Ale o co chodzi? Nazwa loop Ci nie pasuje? 

A gdybym Ci powiedział, że loop tak na prawdę nie jest potrzebne w programie?

morfeusz.thumb.jpg.5958336b3872ea0d3791f130fbeabb2f.jpg

Możesz sobie wszystko wykasować z nowego szkicu i zrobić tak jak w C :


int main()
{
  while(1)
  {
    
  }
}

Tylko że zniknie to co daje Arduino lajkonikom, np. millis() i micros().

Wewnątrz loop możesz jednak sobie zrobić swoje loopy wg powyższego wzoru, wstawiając w loop dowolną ilość pętli while(1) i nigdy ich nie uruchamiając (oprócz pierwszego while) jeśli nie będzie break. Możesz wstawić swoją funkcję w której będzie for(;;) i też program tu zostanie. Albo wstaw w loop "return;" i program się zakończy w tym miejscu. Można while(1) czy inną pętle nieskończoną wstawić też w setup i program tu zostanie na zawsze, loop nigdy się nie uruchomi.

Jak chcesz cały program wykonać tylko raz po podaniu prądu lub resecie to można też:


int main()
{
 
}

Ograniczenia są tylko w naszych głowach.

Bibliotek teoretycznie można używać wielu do tego samego, ale nawet użycie różnych bibliotek do różnych peryferiów już wymaga trochę planowania, by całość chodziła jak trybiki w zegarku. Programy pokazane w przykładach to dema, połączenie wielu takich przykładów w działający projekt wielozadaniowy wymaga wiedzy jak takie programy tworzyć. 

 

  • Lubię! 1
Link do komentarza
Share on other sites

20 godzin temu, Chester11-86 napisał:

1. Czy jest możliwość w pętli setup zrobić przejście do jakiejś inne pętli niż loop?

Tak.

20 godzin temu, Chester11-86 napisał:

2. Czy można w jednym programie używać biblioteki stepper.h oraz accelstepper.h?

Jak się nie pogryzą, a pewnie nie, to tak. Inna sprawa, to jaki to ma sens. No i problem sprawdzenia czy się gryzą spoczywa na tobie. Możesz to sprawdzić albo analizując kody obu bibliotek, albo wstawiając obie biblioteki, jeżeli widzisz taką potrzebę, do swojego kodu i testując go. Wygląda, że chyba nikt przed tobą nie wpadł jeszcze na taki pomysł, bo nie ma odpowiedzi.

Link do komentarza
Share on other sites

Wstawiam swój program wraz z filmem dla osób które będą szukały pomocy przy nauce sterowania silnikami krokowymi

#include <Stepper.h> // Biblioteka do sterowania silnikiem

#define STEPS 32 // Liczba kroków silnika 

Stepper stepper (STEPS, 8, 10, 9, 11); // tworzenie instancji klasy steppera za pomocą kroków i pinów 

int val = 0; // dodanie zmiennej

void setup () { 
  Serial.begin (9600); //hcemy odczytywać kroki na ekranie komputera
  stepper.setSpeed (800); // prędkość silnika (1 - 1000)
  pinMode(4, INPUT_PULLUP); // pin 4 obrót w lewo
  pinMode(5, INPUT_PULLUP); // pin 5 obrót w prawo
  pinMode(3, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);

}

void loop () {
  if (digitalRead (4) == LOW) //jeśli przycisk 4 jest wciśnięty wykonaj 32 kroki w lewo
  { 
    val = 32; // val to kroki, 32 to liczba krokow, brak minusa lub minus przed liczba krokow oznacza kierunek
    stepper.step (val); 
    Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 32 kroki w lewo
  }
  
 if (digitalRead (5) == LOW) //jeśli przycisk 5 jest wciśnięty wykonaj 32 kroki w prawo
  { 
    val = -32; 
    stepper.step (val); 
    Serial.println (val); // wyswietl na ekranie komputera czy wykonał 32 kroków w prawo ponieważ jest znak minus "-"
  }
  if (digitalRead (3) == LOW)
  {
    val = 8;
  stepper.step (val); 
    Serial.println (val);
    delay(500);//spowolnienie umozliwi dokladne ustawienie silnika
  }

  if (digitalRead (2) == LOW)
  {
    val = -8;
    stepper.step (val); 
    Serial.println (val);
    delay(500); //
  }else {
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
  }
}

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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!

Anonim
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.