Skocz do zawartości
Chester11-86

Sterowanie silnikiem krokowym - 28byj-48 + ULN2003

Pomocna odpowiedź

Napisano (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 przez Chester11-86
Poprawa literówek

Udostępnij ten post


Link to post
Share on other sites

Jak mu wyłączysz wszystkie napięcia to może nie trzymać swojej pozycji.

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

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!

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

@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 🙂

Udostępnij ten post


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

Udostępnij ten post


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

×