Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?

68mustang 14 Gru 2015 23:31 2238 11
  • #1 14 Gru 2015 23:31
    68mustang
    Poziom 8  

    Witam!

    Robię urządzenie do mieszania drinków. Na wałkach jeździ wózek, na wózku szklanka. Powyżej zamocowane butelki. Serwo również zamocowane na wózku naciska nalewaki przymocowane do butelek. Próbuję napisać program, który po wybraniu drinka z menu pokieruje silnikiem krokowym aby podjechał w odpowiedniej kolejności pod różne butelki. Nie jestem programistą i chciałbym skorzystać z jakiegoś gotowego rozwiązania i przerobić go na swoje potrzeby. Aby nie rozlewać zawartości szklanki chciałbym skorzystać z biblioteki AccelStepper jednak przy użyciu przykładowych szkicy udaje mi się tylko wywołać ruch z punktu A to B i tyle albo bouncing. Nie wiem jak zaprogramować tam sekwencje kilku punktów.

    O to jak robiłem to bez użycia biblioteki AccelStepper z przykładowym przyciskiem, po którego naciśnięciu uruchamiana była sekwencja

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Wiem, że kod jest paskudny. Ale na chwilę obecną nie jestem w stanie go napisać porządniej.

    Chodzi mi o to, aby przerobić go w ten sposób, by silnik krokowy rozpędzał i wyhamowywał wózek.

    Będę wdzięczny za każdą pomoc :)

    Pozdrawiam!

    0 11
  • #2 15 Gru 2015 08:26
    Zdzicho
    Poziom 24  

    Liczbę kroków do wykonania wykorzystaj jako delay pomiędzy wykonywanymi krokami i zmniejszaj je po każdym kroku, po osiągnięciu połowy zaprogramowanych kroków, delay zaczynasz zwiększać aż do końca liczby kroków do wykonania. W ten sposób silnik będzie się płynnie rozpędzał i hamował. Oczywiście nie można całkowicie wyzerować delay bo silnik utraci ciąg.

    0
  • Pomocny post
    #3 15 Gru 2015 09:20
    namok
    Poziom 24  

    Nie kombinuj tylko poczytaj dokładnie o AccelStepper.
    Poniżej silnik jedzie do opozycji 1000, wracając do pozycji 0 zatrzymuje się na pozycjach 600 i 400.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Każde wywołanie stepper.runToPosition() blokuje program na tej funkcji. Są też funkcje ruchu bez blokady.

    0
  • #4 15 Gru 2015 12:04
    68mustang
    Poziom 8  

    Dzięki! Udało się dojść do tego etapu:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Na razie testy robię na silniczku 28BYJ-48. Docelowo będzie Nema17.

    Jeszcze sporo kombinowania przede mną ale może mi się uda :)
    Dzięki raz jeszcze!

    0
  • #5 16 Gru 2015 09:47
    68mustang
    Poziom 8  

    Testuję już na NEMA 17 + L298N, tylko silnik ma 2.8V i 1.7A. I nie wiem czy coś podłączam źle ale raz, że sterownik silnika grzeje się pierońsko (to jest ten na czerwonej płytce z radiatorem na L298N) a dwa, silnik grzeje się nawet jak nie pracuje (nie tak bardzo jak radiator na sterowniku ale jest dość ciepły).

    Radiator także grzeje się niezależnie od pracy (zanim program wywoła start silnika już jest gorący).

    Oto kod:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod



    Oto jak mam podłączone:

    Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?

    Jeśli chodzi o zasilacz to próbowałem na 6V 1A oraz na innym 3A też ustawionym na 6V.
    Nie jestem przekonany czym to powinienem zasilać bo jak pisałem na tym silniku jest podane 2.8V i 1.7A.
    Może łatwiej byłoby gdybym kupił 12V silnik 330mA?

    Chodzi mi o stabilną pracę bez nadmiaru prądu i bez niepotrzebnego grzania.

    1
  • Pomocny post
    #6 16 Gru 2015 19:21
    emarcus
    Poziom 35  

    68mustang napisał:
    Testuję już na NEMA 17 + L298N, tylko silnik ma 2.8V i 1.7A. I nie wiem czy coś podłączam źle ale raz, że sterownik silnika grzeje się pierońsko (to jest ten na czerwonej płytce z radiatorem na L298N) a dwa, silnik grzeje się nawet jak nie pracuje (nie tak bardzo jak radiator na sterowniku ale jest dość ciepły).

    Radiator także grzeje się niezależnie od pracy (zanim program wywoła start silnika już jest gorący).



    Oczywiście że silnik będzie gorący, nawet zatrzymany!!!!
    Popatrz co masz napiasne na nim cyt: 2.8V i 1.7A. Co to znaczy?
    Nie są to bynajmniej jego nominalne parametry na których winien pracowac;
    2.8V oznacza że przy tym napięciu nic złego nie stanie się silnikowi niezależnie jak długo jest w dowolnym stanie, albo kręci, albo jest zatrzymany(załączona tylko jedna z cewek).
    Silniki krokowe dopuszczają wielokrotne przekroczenie tego napięcia zasilania cewek (nawet do 30x !) pod warunkiem(!) kontrolowania przepływanego prądu.
    Uklady sterujące własnej konstrukcji mostki H lub gotowe zespolone mostki L298N tej kontroli nie posiadają, a zatem nie są stosownymi elementami w tym projekcie, gdzie zasilasz cewki ponad 2-krotnym napięciem.
    Jeżeli 'zjedziesz' z napięciem do 2.8V silnik będzie wolny i słaby (niski moment).

    Silnik krokowy w pewnym sensie możesz kojarzyc ze zmodyfikowanym konstrukcyjnie elektromagnesem (np. w przekaźniku); i co się stanie z jego cewką gdy zamiast nominalnego napięcia 5V podlączysz 12V - pewnie się zagrzeję ???
    Natomiast bezpiecznie możesz go zasilic 12V stosując PWM o odpowiednim wypełnieniu. Wybieg ten jest wykorzystany w dedykowanych driverach (układach sterujących) silników krokowych na przykład A4988 albo DRV8825.
    Zastosowanie tego typu ukladu daje nie tylko mostek H i kontrolę maxymalnego prądu, ale także zastępuje programową procedurę tworzenia komutacji, co w efekcie processor jest wykorzystany do wysterownia pinem kierunku obrotów, oraz podania impulsów na każdy krok. Dodatkową opcją jest możliwoś sterowania microkrkowego co przy dokładnym pozycjonowaniu objektu nie jest bez znaczenia.
    Więcej na ten temat:
    https://www.pololu.com/category/120/stepper-motor-drivers

    e marcus

    0
  • #7 16 Gru 2015 19:35
    68mustang
    Poziom 8  

    Dziękuję Ci serdecznie za bardzo wartościową wypowiedź! Tak się składa, że wczoraj zamówiłem DVR8825 oraz Easy Driver 4.4. Pewnie jutro przyjdzie to spróbuję to jakoś połączyć.

    Mam jeszcze jedno pytanie. Jeśli program steruje silnikiem krokowym, który przesuwa wózek na prowadnicy liniowej wykonując sekwencję i wracając do punktu startu, czy potrzebuję instalować krańcówki? Bo w spotykam się z nimi w podobnych projektach jednak silnik krokowy generalnie powinien wiedzieć w którym jest miejscu. Chyba, że chodzi o sytuacje awarii w trakcie pracy i ponownego załączenia gdzie doszło do przesunięcia wózka i startuje z innej pozycji.

    0
  • Pomocny post
    #8 16 Gru 2015 22:56
    emarcus
    Poziom 35  

    68mustang napisał:
    Jeśli program steruje silnikiem krokowym, który przesuwa wózek na prowadnicy liniowej wykonując sekwencję i wracając do punktu startu, czy potrzebuję instalować krańcówki?


    Absolutnie TAK. Przynajmniej jedną. Przecież nie ma encodera!
    Potrzebujesz stworzyc ‘Home/Park Position’ (punkt wyjściowy lub zerowy), do którego będa się odnosic wszystkie rachunki ilości zadanych kroków w konkretnym zadanym pakiecie ruchowym. Do tego punktu arbitrtalnie będziesz kierował ruch wózka podczas inicjacji układu (włączenie zasilania), bez oznaczenia ilości kroków, aż do osiągnieciu tego punktu, a w następnej kolejności wyzerujesz zmienne. Nie potrzebujesz aby processor rachował i pamiętał kroki od momentu właczenia zasilania i dokonywac ręcznej synchronizacji z miejscem parkowania, lecz liczył kroki tylko w konkretnym zadaniu. Parkowanie winno byc automatyczne, zarówno podczas inicjacji jak po wykonaniu zadanej czynności.
    Z pewnościa masz printer albo scanner. Zwróc uwagę jak zachowuje się printer/scanner podczas załączenia zasilania, a później podczas pracy. Tanie/kiepskie printery nie mają encoderów, więc muszą wszystkie ruchy inicjowac z pozycji zerowych. Zakłada się że nigdy (!) nie gubią kroków . Od momentu włączenia zasilania i inicjacji silników krokowych do pozycji zerowych, pozostalą one włączone cały czas, bez wysyłania impulsu krokowego, zachowują sie jakby były z hamulcem. Taka jest natura tych urządzeń.
    Miałem kiedyś taki printer; gdy wystąpiła gdzieś pomyłka, to reszta linii była drukowana pseudo - pochyłym drukiem. Następna już była poprawna.
    Twój układ powinien emulowac ruch głowicy printera, pomijając przewijanie papieru, do czego w zasadzie jest wykorzystany drugi stepper.

    e marcus

    0
  • #9 17 Gru 2015 17:16
    68mustang
    Poziom 8  

    Ok. W takim razie zainstaluję krańcówkę po lewej w położeniu startowym i może w setup() ustawię żeby po uruchomieniu odjechał trochę w prawo a potem pojechał w lewo aż do dotknięcia krańcówki i zapisał pozycję jako home

    Dodano po 5 [godziny] 46 [minuty]:

    A jaki silnik byłby najlepszy do tego projektu? Mam sterownik DRV8825 już na biurku tylko nie wiem czy wykorzystywać ten silnik NEMA 17 2.8V 1.7A czy może lepiej użyć jakiegoś 12V koło 330mA? Najbardziej by mi pasował NEMA 17 bo mam uchwyt mocujący w tym standardzie :) Ale zależy mi na tym, żeby był dobrze dobrany.

    Dodano po 2 [minuty]:

    i jeszcze jedno głupie pytanie. Czy radiator dołączony do DRV8825 zamontować od spodu (jest taki odkryty kawałek pola masy)? I czy zamontowanie go przy użyciu kleju termoprzewodzącego będzie prawidłowym postępowaniem?

    0
  • #10 17 Gru 2015 21:48
    emarcus
    Poziom 35  

    68mustang napisał:
    Ok. W takim razie zainstaluję krańcówkę po lewej w położeniu startowym i może w setup() ustawię żeby po uruchomieniu odjechał trochę w prawo a potem pojechał w lewo aż do dotknięcia krańcówki i zapisał pozycję jako home

    Dodano po 5 [godziny] 46 [minuty]:

    A jaki silnik byłby najlepszy do tego projektu? Mam sterownik DRV8825 już na biurku tylko nie wiem czy wykorzystywać ten silnik NEMA 17 2.8V 1.7A czy może lepiej użyć jakiegoś 12V koło 330mA? Najbardziej by mi pasował NEMA 17 bo mam uchwyt mocujący w tym standardzie :) Ale zależy mi na tym, żeby był dobrze dobrany.





    Jeżeli najbardziej odpowiada ci NEMA17 to go stosuj i pod niego dopasuj zasilanie oraz doreguluj maxymalny prąd potencjometrem na płytce drivera.
    Sposób/process regulacji i określenia prądu znajdziesz analizując video clip:
    Setting the Current Limit on Pololu Stepper Motor Driver Carriers
    https://www.youtube.com/watch?feature=player_embedded&v=89BHS9hfSUk

    Ze względu na wymogi zasilania płytki drivera musisz miec co najmniej 8.2V
    Najbardziej optymalnym zasilaniem byby tu zasilacz o napiiu 9 do 12 V i dający się obciążyc ok 2A.
    Fakt że silnik jest na niższe napięcie, jest tu czynnikiem drugorzędnym bo masz na płytce regulację ograniczenia prądu.
    I od tego miejsca należałoby zacząc process podłączenia.
    Ponieważ parametry i wymogi napędu twojego projektu w pewnej mierze pokrywają się z przykładem na video, to możesz w zasadzie skopiowac cały process regulacji.
    Cytat:


    Czy radiator dołączony do DRV8825 zamontować od spodu (jest taki odkryty kawałek pola masy)? I czy zamontowanie go przy użyciu kleju termoprzewodzącego będzie prawidłowym postępowaniem?


    Ten 'odkryty kawałek pola masy - od spodu' spełnia rolę pierwotnego radiatora, pozostaw go w spokoju.
    Dołączony w pakiecie radiator zamontuj bezpośrednio na górze układu scalonego. Stopa radiator jest prawdopodobnie pokryta odpowiednim klejem (zabezpieczonym papierową ochrona); zdejmujesz papier, ustawiasz z grubsza na środkowym miejscu nad chip, dociskasz i tak pozostaje. Z danych technicznych dla tego drivera wynika że jeżeli obciążenie prądowe jest powyzej 1.5A to należy stosowc radiator.
    Ty prawdopodobnie ustawisz gdzieś w granicach 0.9 do 1A albo nawet niżej (zależy jak 'ciężko' musi pracowac), zatem na poczatek pozostawiłbym bez radiatora. Gdy uznasz że chip zbytnio grzeje się, to zawsze w łatwy sposób możesz go zamontowac w dwie minuty.

    e marcus

    1
  • #11 18 Gru 2015 00:42
    68mustang
    Poziom 8  

    Dzięki raz jeszcze. Muszę jeszcze kupić kondensator 100uF i będę jutro testował. Co do zasilania to chciałbym z tego samego źródła zasilać arduino mega, jedno servo, kilka LED'ów i LCD 16x2. Czy wystarczy 2A 9-12V? Czy może 3A? Dzięki wielkie za podesłanie tego filmiku. Na pewno bardzo mi pomoże!

    0
  • Pomocny post
    #12 18 Gru 2015 04:48
    emarcus
    Poziom 35  

    68mustang napisał:
    Co do zasilania to chciałbym z tego samego źródła zasilać arduino mega, jedno servo, kilka LED'ów i LCD 16x2. Czy wystarczy 2A 9-12V? Czy może 3A?

    Nie jest łatwo albo nawet możliwe dokładne określenie zapotrzebowania na pobór pradu przy napędach ze stepperem. Podczas gdy silnik jest zatrzymany, pracuje tylko jedna z cewek i prąd popłynie taki jak ustawiony potencjometrem. Natomiast podczas pracy, załączane są dwie cewki w różnym czasie, dodatkowo jeszcze zależnie od metody sterowania: pełny step albo microstepping; zatem wartośc prądu zmienia się ciągle. Niemniej jednak myślę że w 2-ch Amperach powinieneś się zmieścic, tymbardziej że servo będzie załączane gdy stepper jest zatrzymany na jednej aktywnej cewce.
    Odnośnie zasilenia wszystkiego z jednego zasilacza, to tu możesz napotkac pewne problemy.
    Oczywiście, Driver i stepper będzie zasilany z tych powiedzmy 12 Voltów.
    Arduino również akceptuje 12V, ale servo wymaga 5 do 6.5V i kilkadziesiąt lub więcej mA. Ponadto zechcesz jeszcze podłączyc panel LCD wymagający 5V i dodatkowe kilkadziesiąt lub więcej mA. W tej sytuacji przydałby się dodatkowy układ zasilający te peryferia aby nie czerpały zakłóceń ze steppera, które będa napewno wydatne. Byłoby dobrze aby te cztery przewody od drivera do silnika krokowego (zasilające cewki) były poprowadzone przewodem ekranowanym./

    e marcus

    0