02-02-2022, 21:12
(02-02-2022, 14:34)kaczakat napisał(a): Andrzeju, nie denerwuj się, ale w ogóle nic nie zrozumiałaś jak to ma działać. Nie możesz sobie w loop wstawiać delajów w ogóle, a po 1000ms w szczególności. W żadną część kodu w sumie też nie.Na początku wydawało mi się to takie proste. Chciałem wykonać jednocześnie dwoma silnikami różne ilości kroków, odczekać jakiś czas, zrobić to ponownie zadaną ilość razy. Spędziłem już w internecie ponad 10 godzin. I wszystko jak krew w piach. Jedyne co zrobiłem to to (szkic poniżej). Silniki wprawdzie się kręcą, ale nie jednocześnie. Dlatego prosiłbym Cię bardzo, abyś wprowadził do tego kodu odpowiednie zmiany. Myślę, że w ten sposób pomożesz mi zrozumieć gdzie robiłem błędy.
stepper1.run(); ma się uruchamiać milion x na sekundę i sprawdzać czy już upłynęło te 50us (czy ile tam ma upłynąć zależnie od wybranej prędkości i przyspieszenia) by wykonać 1/pierdyliarderową obrotu. Jak wstawisz delaya 1000 to on się kręci, ale efekty kręcenia zauważysz, jak już Twoje wnuki pójdą na studia. Albo i nie jeśli inna część programu ustaliła błędnie, że stepper1.distanceToGo() == 0, ujemną prędkość lub przyspieszenie.
#include <AccelStepper.h>
const int stepPin1 = 7; // Silnik nr 1 ruch poziomy
const int dirPin1 = 6;
const int stepPin2 = 9; //Silnik nr 2 ruch obrotowy głowicy
const int dirPin2 = 8;
AccelStepper stepper1 = AccelStepper(1, stepPin1, dirPin1);
AccelStepper stepper2 = AccelStepper(1, stepPin2, dirPin2);
void setup() {
pinMode(stepPin1,OUTPUT);
pinMode(dirPin1,OUTPUT);
pinMode(stepPin2,OUTPUT);
pinMode(dirPin2,OUTPUT);
stepper1.setMaxSpeed(1000);
stepper1.setAcceleration(500);
stepper2.setMaxSpeed(1000);
stepper2.setAcceleration(500);
}
void loop() {
if(flag){
for(int i = 0; i <= 2; i++){
ruch();
delay(3000); //trzeba wpisać 100*Omk
}
flag=false;
}
}
void ruch(){
stepper1.move(1000);
stepper2.move(2000);
stepper1.runToPosition();
stepper2.runToPosition();
}