Rysowanie prostej

0

Witam. Problem jest chyba stosunkowo prosty, jeżeli ktoś go przeniesie do działu Newbie, to się nie obrażę. Zaznaczam, że nie jest to żadne zadanie domowe, ani nic w tym stylu.

Znam

  • współrzędne punktu początkowego: curX, curY.
  • współrzędne punktu końcowego: tarX, tarY.

do dyspozycji mam:

  • czas całkowity tc
  • czas przerwy X pauseX
  • czas przerwy Y pauseY.

Pisak przez tc sekund* w odstępach pauseX sekund wykonuje kroki wzdłuż osi X i w odstępach pauseY sekund wykonuje kroki wzdłuż osi Y...

*) oczywiście słowo "sekunda" zostało użyte umownie.

Jeżeli to zbyt zagmatwane, to przykład:
tc = 199; pauseX = 20; pauseY = 50

Pisak w 20 i 40 sekundzie przesuwa się wzdłuż osi X
w 50 sekundzie wzdłuż osi Y
w 60, 80 sekundzie wzdłuż osi X
w 100 sekundzie X i Y
w 120,140 sekundzie X
i tak dalej

powstaje nam mniej-więcej taka linia:

**
 **
   ***
     **
       ***
         **

Problem polega na takim ustawieniu wartości tc, pauseX, pauseY, aby pisak przemieścił się z punktu początkowego do końcowego (w praktyce - aby przesunął się o zadany wektor), rysując po drodze maksymalnie prostą linię.

Ograniczenia: wartości tc, pauseX, pauseY są całkowite. Czas tc powinien być w miarę możliwości jak najkrótszy*. Czasy pauseX, pauseY nie mogą być mniejsze, niż 20 dla osi X, i 30 dla osi Y.

*)Najkrótszy, z akcentem na "w miarę możliwości".

Jeżeli ktoś ma jakiś pomysł, jak to wyliczyć, albo chociaż podsunie hasło do googla, to będę wdzięczny.

Jeżeli komuś się problem spodobał, to mam dla niego kolejny.

0

Jak dobrze zrozumiałem to albo masz zamiar albo już zrobiłeś ploter i teraz chciałbyś go oprogramować. Szkoda że nie napisałeś jak wygląda sterowanie nim - czy masz może dwa niezależne napędy krokowe (jeden dla osi X a drugi dla osi Y). Gdybyś miał 2 takie niezależne napędy to sprawa jest bardzo prosta. Tylko nie rozumiem po co określać czas rysowania i odstępy między przeskokami (może nie tyle je określać ile zadawać). Czasy te są z góry określone przez napędy a dokładniej przez ich bezwładność. No chyba że ty masz jakiś inny mechanizm. Ale wracając do tych dwóch napędów jeśli masz pozycje (X, Y) początkową i (X,Y) końcową to wystarczy obliczyć tylko ilość kroków jaka jest potrzebna dla osi X i osi Y i ją wykonać. Tylko oczywiście nie wszystkie ktoki na raz. Musisz obliczyć stosunek X do Y. Np. Masz pozycje początkową (0,0) i koncową (100, 10) - czyli wyszło ci że w osi X wykonasz 100 a w osi Y 10 kroków, i stosunek 100/10 = 10 co oznacza że na każde 10 kroków w osi X wykonujesz jeden krok w osi Y (a więc na 100 kroków w osi X wykonasz tylko 10 w osi Y). Czyli żadne czasy cie nie interesują bo kroki wykonujesz z maksymalną prędkością określoną przez możliwości napędów. Interesuje cie tylko stosunek X/Y lub Y/X w zależności która odległość jest większa (bo operujesz na liczbach całkowitych).

0
Gość napisał(a)

Jak dobrze zrozumiałem to albo masz zamiar albo już zrobiłeś ploter i teraz chciałbyś go oprogramować.

Zgadza się.

Szkoda że nie napisałeś jak wygląda sterowanie nim

To właśnie starałem się wyjaśnić w poprzednim poście. Starałem się jednak maksymalnie uprościć problem i sprowadzić go, w miarę możliwości, do poziomu "matematycznego".

czy masz może dwa niezależne napędy krokowe (jeden dla osi X a drugi dla osi Y). Gdybyś miał 2 takie niezależne napędy to sprawa jest bardzo prosta. Tylko nie rozumiem po co określać czas rysowania i odstępy między przeskokami (może nie tyle je określać ile zadawać).

Program będzie wykonywany przez mikrokontroler. A timery i system przerwań w mikrokontrolerze działa właśnie tak, jak to opisałem.

Czasy te są z góry określone przez napędy a dokładniej przez ich bezwładność.

Przerwania mam zamiar wywoływać co 0.1ms. Eksperymentalnie określiłem maksymalną prędkość silników krokowych - i wyszło mi, że kolejne kroki mogę zadawać nie częściej, niż co 2ms. Stąd też jedno z ograniczeń.

Na "najniższym" poziomie sterowanie silnikiem krokowym sprowadza się właśnie do tego - wykonaj krok, poczekaj chwilę, wykonaj krok, poczekaj chwilę. Od tego, ile trwa "chwila" zależy prędkość obrotów silnika.

No chyba że ty masz jakiś inny mechanizm. Ale wracając do tych dwóch napędów jeśli masz pozycje (X, Y) początkową i (X,Y) końcową to wystarczy obliczyć tylko ilość kroków jaka jest potrzebna dla osi X i osi Y i ją wykonać. Tylko oczywiście nie wszystkie ktoki na raz. Musisz obliczyć stosunek X do Y. Np. Masz pozycje początkową (0,0) i koncową (100, 10) - czyli wyszło ci że w osi X wykonasz 100 a w osi Y 10 kroków, i stosunek 100/10 = 10 co oznacza że na każde 10 kroków w osi X wykonujesz jeden krok w osi Y

Owszem, przesunięcie o wektor [2,4] może się odbywać tak:

krokX - pauza - krokX - pauza - krokY - pauza - krok X - pauza - krokX - pauza - krokY - pauza - kroX
  |               |                               |                |                               |
  |<-----2ms----->|<-------------4ms------------->| <-----2ms----->|<-------------4ms------------->|

ale wtedy występują 2 problemy:

  1. silnik w osi X obraca się nierównomiernie (właściwie jemu to nie przeszkadza, gorzej, że wtedy całe urządzenie wpada w wibracje i jest strasznie głośno).
  2. ponieważ całość trwa dłużej, niż mogłaby trwać - całość będzie trwać 12ms, podczas gdy mogłaby trwać 8ms. W przypadku tak krótkich przesunięć, to nie jest żaden problem, ale u mnie 1 krok to 0.2mm.

Jeżeli jedna liczba jest całkowitą wielokrotnością drugiej, to wszystko jest trywialne.

Ale co, jeżeli te wartości mają stosunek np. 2:5 ? Albo 11:13? Nie chodzi mi o wartości, bo wartości samemu potrafię wyznaczyć metodą kombinowania - gorzej z wymyśleniem jakiegoś algorytmu, do ich wyznaczania.

0
yakhub napisał(a)
  1. ponieważ całość trwa dłużej, niż mogłaby trwać - całość będzie trwać 12ms, podczas gdy mogłaby trwać 8ms. W przypadku tak krótkich przesunięć, to nie jest żaden problem, ale u mnie 1 krok to 0.2mm.

No nie dokońca. Podstawowa zasada to taka, że silniczki pracują niezależnie i równolegle !!!.

i wtedy masz coś takiego:

|| - krok


dla silniczka w osi X
<---2ms--->||<---2ms--->||<---2ms--->||<---2ms--->||<---2ms--->||<---2ms--->||<---2ms--->||<---2ms--->
dla silniczka w osi Y
<----------4ms--------->||<----------4ms--------->||<----------4ms--------->||<----------4ms--------->

czyli nie ma sumowania czasów pracy obu silników. Nie wiem ile lini sterujących ma jeden twój silnik ale jesli 4 to możesz spokojnie za pomocą jednego portu równolegle obsługiwać 2 silniczki.

yakhub napisał(a)

Jeżeli jedna liczba jest całkowitą wielokrotnością drugiej, to wszystko jest trywialne.

Ale co, jeżeli te wartości mają stosunek np. 2:5 ? Albo 11:13? Nie chodzi mi o wartości, bo wartości samemu potrafię wyznaczyć metodą kombinowania - gorzej z wymyśleniem jakiegoś algorytmu, do ich wyznaczania.

Proponuje wykorzystać liczby zmiennoprzecinkowe dla obliczania stosunku. Nie wiem w jakim języku programujesz mikrokontroler ale jeśli w C, BASICU to sprawa jest prosta, jeśli w Asemblerze to na necie jest pełno bibliotek od liczb zmiennoprzecinkowych.

A jak masz stosunek (x/y) 2/5 to zamień go na (y/x) 5/2 i wtedy wykonuj jeden krok w osi X na daną liczbę kroków w osi Y.

1 użytkowników online, w tym zalogowanych: 0, gości: 1