Witam jestem początkującym i potrzebuję kodu który opiera się na sterowaniu silnikiem krokowym NEMA 17 z sterownikiem A4988.
Program ma polegać na tym iż od samego startu programu silnik ma poruszać się w jedną stronę aż do momentu kiedy trafi na ogranicznik czyli w moim przypadku przycisk. gdy ten przycisk zostanie kliknięty motor ma przesunąć się powiedzmy o 2000 kroków w drugą stronę i się zatrzymać. Kod ma sie wykonać tylko raz na samym początku a nie zapetlać. Jeśli toś jest w stanie napisać dla mnie ten kod, lub po prostu cos pomoc byłbym bardzo wdzięczny. Wydaje mi się że nie jest on jakoś bardzo skomplikowany jednakże nie potrafię sobie z nim poradzić. Dodam ze ruszalem juz silnikiem jednakze nie potrafie napisac tego wlasnie kodu.
Przykłady kodu do poczytania:
https://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-motor-with-a4988-driver-and-arduino/
To tylko jako pomoc dla kogoś kto ma na to czas.
ccwrc napisał(a):
Przykłady kodu do poczytania:
https://howtomechatronics.com/tutorials/arduino/how-to-control-stepper-motor-with-a4988-driver-and-arduino/
zaznajomilem sie z tym kiedyś jednakze nie pomoglo mi w dojsciu do tego jak zrobic by polecenie wykonalo sie tylko raz
S4t napisał(a):
Czyli szukasz gotowca. To przeżuć w ogłoszenia drobne ale nie sądzę żeby ktoś się pochylił nad takim niszowym problemem.
Nawet nie tyle gotwca co pomocy. Gdy w void loop napisze polecenie
DigitalRead(dir,HIGH)
FOR(X = 0; x<200: x++)
{
DigitalRead(Step,High)
DelayMicrosecond(200)
DigitalRead(Step,LOW)
DelayMicrosecond(200)
}
To sie to zapetla i nie wiem jak zrobic by po tych 200 krokach sie zatrzymał i koniec
Ignacy Grabowski napisał(a):
To sie to zapetla i nie wiem jak zrobic by po tych 200 krokach sie zatrzymał i koniec
To przerwij pętlę. To się robi za pomocą takich słów jak break; exit(0); lub coś innego w tym języku.
Warunek przerwania pętli przypuszczalnie możesz umieścić w zwykłym if typu if(warunek) {tu zrób coś lub przerwij}
Ignacy Grabowski napisał(a):
S4t napisał(a):
Czyli szukasz gotowca. To przeżuć w ogłoszenia drobne ale nie sądzę żeby ktoś się pochylił nad takim niszowym problemem.
Nawet nie tyle gotwca co pomocy. Gdy w void loop napisze polecenie
DigitalRead(dir,HIGH)
FOR(X = 0; x<200: x++)
{
DigitalRead(Step,High)
DelayMicrosecond(200)
DigitalRead(Step,LOW)
DelayMicrosecond(200)
}To sie to zapetla i nie wiem jak zrobic by po tych 200 krokach sie zatrzymał i koniec
a próbowałeś coś takiego:
bool run = true; // jakaś zmienna globalna, statyczna czy jaki tam język jest
// zakładam że loop działa jak main loop w grach i jest wywoływany w każdym cyklu procesora
// więc aby go "przerwać" niech metoda loop nic nie robi.
void loop() {
if(run){
DigitalRead(dir,HIGH)
FOR(X = 0; x<200: x++)
{
DigitalRead(Step,High)
DelayMicrosecond(200)
DigitalRead(Step,LOW)
DelayMicrosecond(200)
}
run = false;
}
}
``
Jak to ma się raz wykonać to możesz to po prostu wrzucić do setup, a nie do loop
Ignacy Grabowski napisał(a):
Nawet nie tyle gotwca co pomocy. Gdy w void loop napisze polecenie
DigitalRead(dir,HIGH)
FOR(X = 0; x<200: x++)
{
DigitalRead(Step,High)
DelayMicrosecond(200)
DigitalRead(Step,LOW)
DelayMicrosecond(200)
}To sie to zapetla i nie wiem jak zrobic by po tych 200 krokach sie zatrzymał i koniec
Nawet nie wiem jakim cudem do się odpala, ale w for masz duże X do którego przypisujesz zero oraz małe x do którego porównujesz, dodatkowo zamiast średnika ; masz dwukropek :
Polecam najpierw pozwać podstawy języka, później zobaczyć jak działają pojedyncze komendy do sterowania i jakie one skutek wywołują powodują, a na końcu pisać co masz napisć.