Skocz do zawartości

Pierwszy robot jeżdzący - jakie zasilanie silników DC


Pomocna odpowiedź

Zrobiłem jeszcze test w którym ręcznie zmieniam stan na pinach kierunku poprzez `digitalWrite` a potem wywolanie `move()`.

 

Jest lepiej bo robot potrafi zareagować odpowiednio na kierunek ale zdarza się, że jakby `move` zaczyna się zanim zmieni się stan na pinie i robot jedzie w kosmos.

A tak z ciekawości: jak wywalisz bt i zrobisz prostą pętlę (sekunda do przodu, sekunda do tylu i tak dalej) będzie działać? Mój ostatni projekt bazuje na tej bibliotece i silniki chodzą jak w zegarku...

Głupie... ale czasem się sprawdza.

Sprawdż napięcie bezpośrednio na pinie DIR lewego drivera

Podmień drivery

Więcej pomysłów jak na razie nie mam 😞

Wiesz co te drivery specjalnie nie mają znaczenia.

Obecnie wyjąłem ESP całkowicie na stół i mierze napięcie bezpośrednio na goldpinach odpowiedzialnych za kierunek.

I konfiguracja dla jednego silnika ładnie skacze między 0 a 3.3v.

Dla drugiego nie - niezależnie od wyboru pinu.

(edytowany)

Konfiguracja początkowa: lewe motory na pin 14 a prawe na 27. Prawe działają poprawnie, a lewe nie.

Zmiana: prawe motory na pin 14, a lewe na 27. Tym razem lewe działają poprawnie, a prawe nie.

 

Można by więc pomyśleć że coś jest nie tak z pinem 14. Tak więc wyrzucam część kodu operującą na pinie 27. Wtedy 14 działa poprawnie 🙂Mózg rozwalony. Nie wiem co tu się odbywa.

Edytowano przez cezarg1410

No ciekawe... może akurat te piny wchodzą w jakieś interferencje...?🤔  Lub masz jakiś malutki błąd w kodzie którego nie możesz dostrzec... może zdublowana zmienna lub jakaś stała?

Myślę, że jest błąd w kodzie, ale nie w moim. Taki test właśnie wykonałem.

  if (leftStepper && rightStepper) {
    leftStepper->setDirectionPin(14);
    leftStepper->setEnablePin(ENABLE_PIN);
    leftStepper->setAutoEnable(true);
    leftStepper->setSpeedInHz(1000);       // 500 steps/s
    leftStepper->setAcceleration(500);    // 100 steps/s²

    rightStepper->setDirectionPin(27);
    rightStepper->setEnablePin(ENABLE_PIN);
    rightStepper->setAutoEnable(true);
    rightStepper->setSpeedInHz(1000);       // 500 steps/s
    rightStepper->setAcceleration(500);    // 100 steps/s²

    Serial.println("Direction pins: ");
    Serial.println(leftStepper->getDirectionPin());
    Serial.println(rightStepper->getDirectionPin());
  }

 

Czyli inicjalizacja silników. Prawy otrzymuje jako directionPin 27 a lewy 14. A na końcu wypisuję to co się ustawiło do portu szeregowego. A tutaj wynik:

Direction pins: 
27
27

😮 😮 😮 😮

(edytowany)
15 minut temu, cezarg1410 napisał:

Czyli inicjalizacja silników. Prawy otrzymuje jako directionPin 27 a lewy 14. A na końcu wypisuję to co się ustawiło do portu szeregowego. A tutaj wynik:

Sprawdź adres leftStepper i rightStepper czy są identyczne, bo obstawiam, że tak...

Edytowano przez H1M4W4R1

W taki sposób?

    Serial.println("Direction pins: ");
    Serial.println((long)&leftStepper);
    Serial.println((long)&rightStepper);
    Serial.println(leftStepper->getDirectionPin());
    Serial.println(rightStepper->getDirectionPin());

Bo wynik jest:
 

Direction pins: 
1073490016
1073489952
27
27

 

mam TO!!!!

Problemem był sposób inicjalizacji silników. Nie znalazłem na ten temat nic w dokumentacji, ale powyższy kod

FastAccelStepperEngine leftEngine = FastAccelStepperEngine();
FastAccelStepper *leftStepper = NULL;

FastAccelStepperEngine rightEngine = FastAccelStepperEngine();
FastAccelStepper *rightStepper = NULL;

był błędny.

Należy stworzyć jeden Engine i dwa Steppery do niego.

Np. w taki sposób:

FastAccelStepperEngine engine = FastAccelStepperEngine();
FastAccelStepper *leftStepper = NULL;
FastAccelStepper *rightStepper = NULL;

void setup() {
  SerialBT.begin("ESP32test"); //Bluetooth device name

  engine.init();
  leftStepper = engine.stepperConnectToPin(STEP_LEFT_PIN);
  rightStepper = engine.stepperConnectToPin(STEP_RIGHT_PIN);

  if (leftStepper && rightStepper) {
    leftStepper->setEnablePin(ENABLE_PIN);
    leftStepper->setAutoEnable(true);
    leftStepper->setSpeedInHz(1000);
    leftStepper->setAcceleration(500);
    leftStepper->setDirectionPin(DIR_LEFT_PIN);

    rightStepper->setEnablePin(ENABLE_PIN);
    rightStepper->setAutoEnable(true);
    rightStepper->setSpeedInHz(1000);
    rightStepper->setAcceleration(500);
    rightStepper->setDirectionPin(DIR_RIGHT_PIN);
  }
}

Teraz wszystko ładnie działa.

Dziękuję wszystkim za pomoc.

Jeszcze pytanko co do zasilania.

Początkowo planowałem zasilić to pakietem 4x18650. Mam już koszyk zamontowany tylko nie kupiłem baterii. Powinno to dać jakieś 14v j sensowną pracę silników.

Ale tak sobie myślę. Co gdyby kupić baterie do wkrętarki Yato 18v (bo mam do niej ładowarkę)? Nie wiem tylko czy po zdjęciu z niej obudowy będzie się dało to sensownie ładować ale zawsze to nieco więcej napięcia. 

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