(26-06-2024, 19:28)anszun napisał(a): Ze stykami można poradzić sobie pozaprogramowo. Niestety zmieniony programik nie działa właściwie. Po podaniu napięcia na sterownik rusza z kopyta i nie ma ochoty się zatrzymać. Po wciśnięciu guzika 13 nie tyle co się zatrzymuje, ale cyka po jednym kroku... i tu robi się ciekawie: po każdym następnym kliknięciu mamy efekt zwiększania szybkości.
Może podaj cały kod, bo zachowanie, które podałeś wygląda dziwnie. Podejrzewałem, że w sytuacje, gdy silnik nie dostał jeszcze żadnego polecenia, metoda runSpeed() od razu zwraca false i moveTo(0) coś robi, ale sprawdziłem u siebie (jednak używam run()) - nic się nie robi, wypisuje się tylko komunikat, ale silnik ani drgnie. Ja mam silnik podłączony prosto do pinów procka przez ULN200x, który robi za driver, więc mam inaczej zainicjowany obiekt AccelStepper. Płytka Pro Micro 16MHz/5V.
Mój kod:
Kod:
AccelStepper motX( AccelStepper::HALF4WIRE, .... );
void setup() {
Serial.begin(9600); // szybkość nieistotna - to USB
motX.setMaxSpeed(400);
motX.setSpeed(200);
motX.setAcceleration(100);
//motX.moveTo(0);
}
void loop() {
if (motX.run() == false)
{
Serial.println("Koniec");
motX.moveTo(0);
}
}
Natomiast taki kod dale "wahadłowy" ruch silnika - raz w lewo 30000 kroków, raz w prawo.
Kod:
AccelStepper motX(AccelStepper::HALF4WIRE, .... );
long pox = 0;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
motX.setMaxSpeed(1800);
motX.setSpeed(200);
motX.setAcceleration(200);
motX.moveTo(pox);
}
void loop() {
if (motX.run() == false)
{
pox = 30000 - pox;
Serial.print("Koniec ");
Serial.println(motX.currentPosition());
motX.moveTo(pox);
}
}
Wykorzystuje metodę run() - która daje płynne przyspieszanie do prędkości roboczej i zwalnianie, metoda runSpeed() daje dziwny efekt - tak jakby ciągle zwracała false. Trochę to wygląda tak, jak opisałeś, pewnie w tym jest problem. Trzeba to jeszcze sprawdzić.
Tak ogólnie to silniki krokowe mają prędkość graniczną, przy które mogą wystartować i zatrzymać się od razu w jednym kroku. Zależy ona nie tylko od silnika, ale też tego co napędza - liczy się łączny moment bezwładności. Płynne/stopniowe przyspieszanie/hamowanie umożliwia osiągnięcie większej prędkości. U mnie doszło do 1800 kroków/sec.
Z tym, że MultiStepper umożliwia tylko ruch ze stałą prędkością (robi runSpeed() na silnikach) więc tak czy inaczej problem trzeba rozwiązać.