Chester11-86 Napisano Luty 5, 2019 Udostępnij Napisano Luty 5, 2019 (edytowany) Witam Wszystkich Forumowiczów, Przekopałem troszkę forum i niestety nie znalazłem żadnych informacji, które w "łopatologiczny" sposób wyjaśnią w jaki sposób sterować bardzo popularnym silnikiem krokowym (28byj-48) za pomocą Arduino. W jaki sposób należy podłączyć silnik oraz za pomocą jakiego układu nie będę się rozpisywał ponieważ w sieci można znaleźć pełno schematów w tym temacie 😀 Prawdopodobnie w samouczku na forbocie też się pojawi taki schemat ale to na pewno w części III 👍 Ważne jest aby w układzie ULN wejście IN1 połączyć z pinem 8 w Arduino, IN2 - 9, IN3 - 10, IN4 - 11, natomiast w programie zmieniamy tą kolejność co widać w załączonym kodzie. Producent informuje Nas, że jeden obrót samego silnika to 32 kroki. Dodatkowo silnik wyposażony jest w przekładnie, która składa się z 64 stopni. Podsumowując aby zauważyć pełny obrót silnika razem z przekładnią należy wykonać: 32*64=2048 kroków. W związku z tym, poniżej przedstawiam taki oto kod, który jest zlepkiem informacji jakie udało mnie się znaleźć w tym temacie w sieci razem z ponownym przeczytaniem kursów forbot'a: // Kod sterujący silnikiem krokowym na Arduino #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 } void loop () { if (digitalRead (4) == LOW) //jeśli przycisk 4 jest wciśnięty wykonaj jeden pełen obrót { val = 2048; stepper.step (val); Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 2048 kroków w lewo } if (digitalRead (5) == LOW) //jeśli przycisk 5 jest wciśnięty wykonaj jeden pełen obrót { val = -2048; stepper.step (val); Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 2048 kroków w prawo ponieważ jest znak minus "-" } } Niestety pojawił się mały problem ponieważ po wykonaniu obrotu przez silnik, w układzie ULN zawsze świeciły 2 ostatnie diody co oznaczało, że na silniki dalej podawane jest napięcie w efekcie po kilku minutach silnik był bardzo ciepły. Rozwiązałem to w ten sposób: if (digitalRead (4) == LOW) //jeśli przycisk 4 jest wciśnięty wykonaj jeden pełen obrót { val = 2048; stepper.step (val); Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 2048 kroków w lewo } else { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } Za każdym wykonaniem odpowiedniej ilości kroków na pinach nie pojawiało się żadne napięcie i silnik nie grzał się niepotrzebnie. Efekt osiągnięty, pytanie czy poprawnie? Na tym etapie się zatrzymałem, chciałbym Was prosić o pomoc abyście mogli spojrzeć na kody powyżej i wypowiedzieć się czy jest to poprawnie napisane. ewentualne komentarze oraz krytyka mile widziana. Kolejnym krokiem będę chciał wdrożyć sterowanie RC5 zamiast pinów, itd..... (aż powstanie to co sobie wymyśliłem)😀 Z góry dziękuję za pomoc! Edytowano Luty 5, 2019 przez Chester11-86 Poprawa literówek Cytuj Link do komentarza Share on other sites More sharing options...
msalamon Luty 6, 2019 Udostępnij Luty 6, 2019 Jak mu wyłączysz wszystkie napięcia to może nie trzymać swojej pozycji. Cytuj Link do komentarza Share on other sites More sharing options...
Chester11-86 Luty 6, 2019 Autor tematu Udostępnij Luty 6, 2019 (edytowany) Ma przekładnie więc ręcznie jest ciężko obrócić wałem, myśle, że nie powinno być problemu, ale dziękuję za zwrócenie uwagi👍😀 Przerobiłem sobie program na sterowanie za pomocą pilota RC5: // Kod sterujący silnikiem krokowym na Arduino #include <Stepper.h> // Biblioteka do sterowania silnikiem #include <IRremote.h> // Biblioteka do rc5 #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 IRrecv irrecv(4); // Pin 4 odczyt komend rc5 decode_results results; int val = 0; // dodanie zmiennej void setup () { Serial.begin (9600); //chcemy odczytywać kroki na ekranie komputera stepper.setSpeed (800); // prędkość silnika (1 - 1000) irrecv.enableIRIn(); } void loop () { if (irrecv.decode(&results)) { switch (results.value) { case 0xFFA25D: val = 2048; stepper.step (val); Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 2048 kroków w lewo delay (200); break; case 0xFF629D: val = -2048; stepper.step (val); Serial.println (val); // wydrukuj na ekranie komputera czy wykonał 2048 kroków w prawo ponieważ jest znak minus "-" delay(200); break; } irrecv.resume(); }else { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } } Działa jak sobie to wyobraziłem, ale... Co mam zrobić jeżeli podczas wykonywania obrotu silnika chciałem go zatrzymać w dowolnej chwili? Niestety nic nie mogę wymyślić, wszystkie moje pomysły nie działają 😐 Proszę o pomoc w nakierowaniu mnie gdzie mam szukać? Jakiej komendy szukać, jaką bibliotekę wykorzystać? Z góry dzięki! Edytowano Luty 6, 2019 przez Chester11-86 Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Luty 7, 2019 Udostępnij Luty 7, 2019 Cześć, pierwszym postem było pytanie niedoświadczonego użytkownika o typowe i najprostsze sposoby sterowania silnikiem krokowym za pomocą 'normalnych' kroków i trzeba było przedstawić to jako pierwsze (przebiegi przesunięte w fazie) - potem można było mówić o zaawansowanych sposobach zwiększania rozdzielczości takich silników. Ja wyraźnie zaznaczyłem, że silnik krokowy powinien być traktowany jako jeden układ razem ze swoim sterownikiem - co wyraźnie zaznaczyłem. Nie widzę sensu stosowania takich metod dla nowoczesnych silników krokowych, gdzie większość takich zadań spełnia sterownik zintegrowany z silnikiem (i ukrywa to przed użytkownikiem). Liczba kroków w takich silnikach jest w pełni wystarczająca i nie trzeba kombinować z mikro=krokami (połówkami, ćwiartkami, ósemkami itd.). Zawsze wychodzę z założenia, że podstawy trzeba przedstawić jako pierwsze w prosty sposób, a dopiero potem można mówić o zaawansowanych metodach poprawy parametrów takich silników. Pozdrawiam 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Chester11-86 Luty 7, 2019 Autor tematu Udostępnij Luty 7, 2019 Panowie potrzebuję pomocy, Stworzyłem sobie program wykorzystując bibliotekę AccelStepper.h i niestety nic nie działa. Pojechałem po bandzie i na żywca z internetu wgrałem dwa różne kody (poniżej), i też nie działają, nawet nie chcą się zaświecić chociaż na chwilę te diody na płytce z układem ULN2003. Proszę powiedzcie co robię źle 😞 /* Stepper Motor Demonstration 2 Stepper-Demo2.ino Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver Uses Accelstepper Library DroneBot Workshop 2018 https://dronebotworkshop.com */ // Include the AccelStepper Library #include <AccelStepper.h> // Define Constants // Define step constants #define FULLSTEP 4 #define HALFSTEP 8 // Define Motor Pins (2 Motors used) #define motorPin1 8 // Blue - 28BYJ48 pin 1 #define motorPin2 9 // Pink - 28BYJ48 pin 2 #define motorPin3 10 // Yellow - 28BYJ48 pin 3 #define motorPin4 11 // Orange - 28BYJ48 pin 4 #define motorPin5 4 // Blue - 28BYJ48 pin 1 #define motorPin6 5 // Pink - 28BYJ48 pin 2 #define motorPin7 6 // Yellow - 28BYJ48 pin 3 #define motorPin8 7 // Orange - 28BYJ48 pin 4 // Define two motor objects // The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8); void setup() { // 1 revolution Motor 1 CW stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(50.0); stepper1.setSpeed(200); stepper1.moveTo(2048); // 1 revolution Motor 2 CCW stepper2.setMaxSpeed(1000.0); stepper2.setAcceleration(50.0); stepper2.setSpeed(200); stepper2.moveTo(-2048); } void loop() { //Change direction at the limits if (stepper1.distanceToGo() == 0) stepper1.moveTo(-stepper1.currentPosition()); if (stepper2.distanceToGo() == 0) stepper2.moveTo(-stepper2.currentPosition()); stepper1.run(); stepper2.run(); } Drugi kod: #include <AccelStepper.h> #define HALFSTEP 8 // Motor pin definitions #define motorPin1 8 // IN1 on the ULN2003 driver 1 #define motorPin2 9 // IN2 on the ULN2003 driver 1 #define motorPin3 10 // IN3 on the ULN2003 driver 1 #define motorPin4 11 // IN4 on the ULN2003 driver 1 // Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup() { stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(100.0); stepper1.setSpeed(500); stepper1.moveTo(20000); }//--(end setup )--- void loop() { //Change direction when the stepper reaches the target position if (stepper1.distanceToGo() == 0) { stepper1.moveTo(-stepper1.currentPosition()); } stepper1.run(); } Z góry wielkie dzięki! Cytuj Link do komentarza Share on other sites More sharing options...
narbej Luty 8, 2019 Udostępnij Luty 8, 2019 Może to: https://www.instructables.com/id/BYJ48-Stepper-Motor/ bez biblioteki? Cytuj Link do komentarza Share on other sites More sharing options...
wmaker Luty 8, 2019 Udostępnij Luty 8, 2019 (edytowany) W nauce jestem może 1/32 kroku przed Tobą 😉 walcząc z krokowymi i biblioteką AccelStepper musisz zadeklarować jaki sposób sterowania masz (4Wire, 8Wire, DRIVER, itd), biblioteka AS głównie przewiduje sterowanie bezpośrednie z Arduino, a Ty wykorzystujesz driver z ULN2003 więc zadeklaruj np tak: // Define some steppers and the pins the will use AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN); ww. kod jest fragmentem programu którym rozkminiałem DRV8825 z przykładowej biblioteki AccelStepper: https://www.airspayce.com/mikem/arduino/AccelStepper/DualMotorShield_8pde-example.html Edytowano Luty 8, 2019 przez wmaker Cytuj Link do komentarza Share on other sites More sharing options...
kaczakat Luty 9, 2019 Udostępnij Luty 9, 2019 ULN2003 to żaden driver (w sensie DRV8825), steruje się to normalnie stanem pinów Arduino, jak w ogóle ledy nie migają to albo coś upalone, albo nie tak podłączone zasilanie, przy złej kolejności silnik by się nie kręcił, ale ledy by migały. Przykłady z biblioteki ruszają od strzału, tylko trzeba podpiąć w dobrej kolejności pod zdefiniowane piny. 1 Cytuj Link do komentarza Share on other sites More sharing options...
wmaker Luty 10, 2019 Udostępnij Luty 10, 2019 12 godzin temu, kaczakat napisał: ULN2003 to żaden driver (w sensie DRV8825), steruje się to normalnie stanem pinów Arduino, jak w ogóle ledy nie migają to albo coś upalone, albo nie tak podłączone zasilanie, przy złej kolejności silnik by się nie kręcił, ale ledy by migały. Przykłady z biblioteki ruszają od strzału, tylko trzeba podpiąć w dobrej kolejności pod zdefiniowane piny. Jak napisałem wiem nie wiele więcej od Chestera i chętnie dowiem się więcej w temacie. Przyjąłem że Chester ma sterownik z ULN2003 na pokładzie (np taki: https://abc-rc.pl/product-pol-6405-Modul-sterownika-ULN2003-V2-do-silnikow-krokowych-Arduino.html) więc DRV8825 będzie podobny w działaniu gdy są podłączone (sterowany stanami pinów) do Arduino? Wg. mnie dla obu układów sterowanie jest podobne a różne możliwości na wyjściu - natężenie i mikrokroki. 1 godzinę temu, wmaker napisał: Jak napisałem wiem nie wiele więcej od Chestera i chętnie dowiem się więcej w temacie. Przyjąłem że Chester ma sterownik z ULN2003 na pokładzie (np taki: https://abc-rc.pl/product-pol-6405-Modul-sterownika-ULN2003-V2-do-silnikow-krokowych-Arduino.html) więc DRV8825 będzie podobny w działaniu gdy są podłączone (sterowany stanami pinów) do Arduino? Wg. mnie dla obu układów sterowanie jest podobne a różne możliwości na wyjściu - natężenie i mikrokroki. Doczytałem że przykładowy, przytoczony z abc-rc sterownik z ULN2003 potrzebuje podania sterowania na każdą fazę osobno w odróżnieniu od DRV8825 gdzie sterujemy tylko częstotliwością i kierunkiem kroku tak więc kaczakat ma rację co do możliwej różnicy w układach i właściwej deklaracji typu sterowania w bibliotece AccelStepper. Zamieszałem Chesterowi więc sorry, sama dyskusja mi się przydała, w gestii Admina pozostaje czy dla porządku można ją wyciąć... Cytuj Link do komentarza Share on other sites More sharing options...
kaczakat Luty 10, 2019 Udostępnij Luty 10, 2019 ULN2003 to tylko kilka tranzystorów w jednym scalaku, konkretnie 7xDARLINGTON, potrafi po prostu wzmacniać sygnał i omija ograniczenia pinu Arduino - 5V/20mA (bezpiecznie zakładając), może podać spokojnie na coś tam kilkadziesiąt V i 500mA - choć raczej nie jako 7x500mA. Czymś może być zarówno silnik, przekaźnik, LED o większej mocy, ale "driverem" jest Arduino. Jest uniwersalny, nie jest przeznaczony do silników w szczególności. Co innego DRV8825, który jest już prostym driverem, pinami z Arduino wybierasz tryb pracy (ile kroków, jakie kroki/mikrokroki), kierunek i rytm, a resztę robi driver. Przynajmniej ja to tak rozróżniam. Cytuj Link do komentarza Share on other sites More sharing options...
Chester11-86 Luty 10, 2019 Autor tematu Udostępnij Luty 10, 2019 Spokojnie wmaker, nikt nikomu nie namieszał 🙂 po to jest forum aby dyskutować ze sobą, wymieniać swoje zdanie lub wiedzę a jeżeli ta wiedza jest błędna będzie na forum poprawiona. Przeczytałem dokładnie wszystko kilkukrotnie co napisaliście i tutaj kolega kaczakat miał rację, błąd leżał po mojej stronie i źle zainstalowanej bibliotece, problem rozwiązany i jak to było wspomniane wcześniej: 19 godzin temu, kaczakat napisał: Przykłady z biblioteki ruszają od strzału, Dlatego wszystko już działa i zaczynam uczyć się dalej 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Chester11-86 Luty 15, 2019 Autor tematu Udostępnij Luty 15, 2019 Witam po krótkiej przerwie, działamy dalej 🙂 Udało mnie się troszkę rozgryźć bibliotekę AccelStepper.h i stworzyłem taki program: #include <AccelStepper.h> //biblioteka do sterowania silnikiem krokowym #define FULLSTEP 4 //sterowanie pełnymi krokami // Zdefiniowanie pinów silnika #define motorPin1 8 // IN1 w układzie ULN2003 #define motorPin2 9 // IN2 w układzie ULN2003 #define motorPin3 10 // IN3 w układzie ULN2003 #define motorPin4 11 // IN4 w układzie ULN2003 // Inicjalizacja pinów AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup() { stepper1.setMaxSpeed(500.0); //maksymalna predkosc stepper1.setAcceleration(100.0); //przyspieszenie silnika stepper1.setSpeed(100); //ustalenie predkosci pinMode(4, INPUT_PULLUP); // pin 4 obrót w dol pinMode(5, INPUT_PULLUP); // pin 5 obrót do gory } void loop() { if (digitalRead (4) == LOW && stepper1.distanceToGo() == 0) //spelnij dwa warunki { stepper1.moveTo(4096); //jedz silnikiem na pozycje 4096 } else if (stepper1.currentPosition() == 4096) //jezeli osiągnie pozycje wylacz zasilanie na pinach { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } if (digitalRead (5) == LOW && stepper1.distanceToGo() == 0) //tego nie rozumiem ???!!! { stepper1.moveTo(0); } else if (stepper1.currentPosition() == 0) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } stepper1.run(); //uruchom silnik } Program zachowuję się tak jak tego oczekuję w tej chwili. Po wciśnięciu pinu nr 4 silnik wykonuje dwa obroty w "dół" do osiągnięcia pozycji 4096 kroków i jest stop. Jeżeli wcisnę jeszcze raz ten sam przycisk silnik nie reaguje. Natomiast po wciśnięciu pinu nr 5 silnik wykonuje dwa obroty w "górę" do osiągnięcia pozycji 0 kroków i jest stop. 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"?? Z góry dzięki za odpowiedź 🙂 W kolejnych etapach będę próbował sterować za pomocą RC5. Zobaczymy co z tego wyjdzie 😅 1 Cytuj Link do komentarza Share on other sites More sharing options...
Chester11-86 Luty 16, 2019 Autor tematu Udostępnij Luty 16, 2019 Halo halo, jest tu kto ? 🙂 Udało mnie się stworzyć program, w którym za pomocą pilota steruje ruchem silnika nawet z możliwością zatrzymania w danej chwili. Program przedstawiam poniżej: #include <AccelStepper.h> //biblioteka do sterowania silnikiem krokowym #include <IRremote.h> //biblioteka do rc5 #define FULLSTEP 4 //sterowanie pełnymi krokami // Zdefiniowanie pinów silnika #define motorPin1 8 // IN1 w układzie ULN2003 #define motorPin2 9 // IN2 w układzie ULN2003 #define motorPin3 10 // IN3 w układzie ULN2003 #define motorPin4 11 // IN4 w układzie ULN2003 // Inicjalizacja pinów AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4); IRrecv irrecv(4); //pin 4 odczyt komend rc5 decode_results results; void setup() { irrecv.enableIRIn(); //uruchomienie odczytu rc5 stepper1.setMaxSpeed(500.0); //maksymalna predkosc stepper1.setAcceleration(350.0); //przyspieszenie silnika stepper1.setSpeed(100); //ustalenie predkosci } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0x3434827D: stepper1.moveTo(4096); //jedz silnikiem na pozycje 4096 delay (200); break; case 0x34347887: stepper1.moveTo(0); //jedz silnikiem na pozycje 4096 delay (200); break; case 0x343433CC: stepper1.stop(); delay (200); break; } irrecv.resume(); } else if (stepper1.currentPosition() == 4096) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } else if (stepper1.currentPosition() == 0) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } stepper1.run(); //uruchom silnik } Dodatkowo zrobiłem wersję z dwoma silnikami: #include <AccelStepper.h> //biblioteka do sterowania silnikiem krokowym #include <IRremote.h> //biblioteka do rc5 #define STEP1 4 //sterowanie pełnymi krokami #define STEP2 4 // Zdefiniowanie pinów silnika 1 #define motorPin1 6 // IN1 w układzie ULN2003 #define motorPin2 7 // IN2 w układzie ULN2003 #define motorPin3 8 // IN3 w układzie ULN2003 #define motorPin4 9 // IN4 w układzie ULN2003 // Zdefiniowanie pinów silnika 2 #define motorPin5 13 // IN1 w układzie ULN2003 #define motorPin6 12 // IN2 w układzie ULN2003 #define motorPin7 11 // IN3 w układzie ULN2003 #define motorPin8 10 // IN4 w układzie ULN2003 // Inicjalizacja pinów AccelStepper stepper1(STEP1, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper2(STEP2, motorPin5, motorPin7, motorPin6, motorPin8); IRrecv irrecv(4); //pin 4 odczyt komend rc5 decode_results results; void setup() { irrecv.enableIRIn(); //uruchomienie odczytu rc5 stepper1.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 1 stepper1.setAcceleration(350.0); //przyspieszenie silnika nr 1 stepper1.setSpeed(100); //ustalenie predkosci silnika nr 1 stepper2.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 2 stepper2.setAcceleration(350.0); //przyspieszenie silnika nr 2 stepper2.setSpeed(100); //ustalenie predkosci silnika nr 2 } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0x3434827D: stepper1.moveTo(4096); //jedz silnikiem na pozycje 4096 delay (200); break; case 0x34347887: stepper1.moveTo(0); //jedz silnikiem na pozycje 0 delay (200); break; case 0x343433CC: stepper1.stop(); delay (200); break; case 0x343442BD: stepper2.moveTo(4096); //jedz silnikiem na pozycje 4096 delay (200); break; case 0x343455AA: stepper2.moveTo(0); //jedz silnikiem na pozycje 0 delay (200); break; case 0x3434748B: stepper2.stop(); delay (200); break; } irrecv.resume(); } else if (stepper1.currentPosition() == 4096) { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } else if (stepper1.currentPosition() == 0) { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } else if (stepper2.currentPosition() == 0) { digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } else if (stepper2.currentPosition() == 4096) { digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } stepper1.run(); //uruchom silnik 1 stepper2.run(); //uruchom silnik 1 } Tutaj napotkałem na problem. Dlaczego nie ustawiają się piny na "0" przy silniku nr 2? Przy silniku nr 1 nie ma najmniejszego problemu gdy osiągnie dwie pozycje, natomiast przy dodaniu kolejnego silnika jest problem. Proszę o pomoc w rozwiązaniu tego zagadnienia. Z góry dzięki 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 17, 2019 Udostępnij Luty 17, 2019 @Chester11-86, a sprawdzałeś jakie wartości konkretnie zwraca stepper2.currentPosition()? Podejrzyj wartości w terminalu, to może zobaczysz jakieś nieprawidłowości 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Chester11-86 Luty 17, 2019 Autor tematu Udostępnij Luty 17, 2019 Poszedłem za Twoją radą i stworzyłem coś takiego: #include <AccelStepper.h> //biblioteka do sterowania silnikiem krokowym #include <IRremote.h> //biblioteka do rc5 #define STEP1 4 //sterowanie pełnymi krokami #define STEP2 4 // Zdefiniowanie pinów silnika 1 #define motorPin1 6 // IN1 w układzie ULN2003 #define motorPin2 7 // IN2 w układzie ULN2003 #define motorPin3 8 // IN3 w układzie ULN2003 #define motorPin4 9 // IN4 w układzie ULN2003 // Zdefiniowanie pinów silnika 2 #define motorPin5 13 // IN1 w układzie ULN2003 #define motorPin6 12 // IN2 w układzie ULN2003 #define motorPin7 11 // IN3 w układzie ULN2003 #define motorPin8 10 // IN4 w układzie ULN2003 // Inicjalizacja pinów AccelStepper stepper1(STEP1, motorPin1, motorPin3, motorPin2, motorPin4); AccelStepper stepper2(STEP2, motorPin5, motorPin7, motorPin6, motorPin8); IRrecv irrecv(4); //pin 4 odczyt komend rc5 decode_results results; void setup() { irrecv.enableIRIn(); //uruchomienie odczytu rc5 stepper1.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 1 stepper1.setAcceleration(350.0); //przyspieszenie silnika nr 1 stepper1.setSpeed(100); //ustalenie predkosci silnika nr 1 stepper2.setMaxSpeed(500.0); //maksymalna predkosc silnika nr 2 stepper2.setAcceleration(350.0); //przyspieszenie silnika nr 2 stepper2.setSpeed(100); //ustalenie predkosci silnika nr 2 Serial.begin (9600); } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0x3434827D: stepper1.moveTo(4096); //jedz silnikiem na pozycje 4096 Serial.println(stepper1.currentPosition()); delay (200); break; case 0x34347887: stepper1.moveTo(0); //jedz silnikiem na pozycje 0 Serial.println(stepper1.currentPosition()); delay (200); break; case 0x343433CC: stepper1.stop(); delay (200); break; case 0x343442BD: stepper2.moveTo(4096); //jedz silnikiem na pozycje 4096 Serial.println(stepper2.currentPosition()); delay (200); break; case 0x343455AA: stepper2.moveTo(0); //jedz silnikiem na pozycje 0 Serial.println(stepper2.currentPosition()); delay (200); break; case 0x3434748B: stepper2.stop(); delay (200); break; } irrecv.resume(); } else if (stepper1.currentPosition() == 4096) { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } else if (stepper1.currentPosition() == 0) { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } else if (stepper2.currentPosition() == 0) { digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } else if (stepper2.currentPosition() == 4096) { digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } stepper1.run(); //uruchom silnik 1 stepper2.run(); //uruchom silnik 1 } Ale nie wiem czy w prawidłowym miejscu to umieściłem bo zwraca mi wartości dokładnie takie jakie umieściłem w programie. Jeszcze jedną rzecz zauważyłem. Jeżeli poruszam się silnikiem nr 2 to diody nie gasną (że tak się wyraże), natomiast jeżeli w każdym przypadku gdy po ruchu silnika nr 2, silnik nr 1 zakończy swoją pracę to wtedy wszystkie diody zgasną - jak to sobie umyśliłem. Jeżeli natomiast silnik nr 2 sam pracuje lub ostatni zakończy pracę diody dalej świecą. Nie wiem gdzie leży błąd jestem w kropce 😥 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!