Skocz do zawartości
Chester11-86

Sterowanie silnikiem krokowym - 28byj-48 + ULN2003

Pomocna odpowiedź

(edytowany)

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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Kolego wmaker dziękuje za podpowiedzi ale też już tak sprawdzałem odczyt i nic 😞 

Dalej jestem w kropce...

Edytowano przez Chester11-86

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
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ź!

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Jednak czeka mnie jeszcze więcej testów i nauki, na chwilę obecną dziękuję za uwagi, proszę o nie zamykanie tematu 🙂

Pozdrawiam serdecznie!

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

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