Skocz do zawartości

Sterowanie silnikiem krokowym - 28byj-48 + ULN2003


Chester11-86

Pomocna odpowiedź

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 przez Chester11-86
Poprawa literówek
Link do komentarza
Share on other sites

(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 przez Chester11-86
Link do komentarza
Share on other sites

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

  • Lubię! 1
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

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!

Link do komentarza
Share on other sites

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 przez wmaker
Link do komentarza
Share on other sites

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.

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

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ąć...

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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 🙂 

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

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 😅

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

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 🙂 

Link do komentarza
Share on other sites

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 😥

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.