Strona 1 z 19

RAMPA na ARDUINO

: 12 kwie 2012, 20:19
autor: markcomp77
RAMPA na ARDUINO
-------------------------------

Zapraszam do rozważań nad realizacją przyśpieczania i hamowania z poziomy ARDUINO.

pozwalam sobie wstawić fajny przyczynek do tej dyskusji w wykonaniu Kolegi Pitsa
z wątku:
https://www.cnc.info.pl/topics65/silnik ... t35539.htm

pitsa pisze:Kształt S ma krzywa prędkości gdy ustalona jest rampa "trapezowa" dla przyspieszenia.

Obrazek

Tu jest to ładnie wyjaśnione: http://people.mech.kuleuven.be/~bruynin ... n-api.html

A ten rysunek przedstawia kolejne pochodne drogi:

Obrazek

"Jerk" to jest właśnie zryw, pochodna zrywu to udar.

Kim La w swoim oprogramowaniu nie tylko operuje na przyspieszeniach ale i na zrywie. Stąd rekreacyjnie tym się bawię.

Obrazek

Zastanawiam się jak pokazać efekt rampy trapezowej i "wygładzonej". Może na osi zamocować talerzyk z wodą? Może coś z pomysłów , tylko bez enkodera?

Re: RAMPA na ARDUINO

: 12 kwie 2012, 20:52
autor: pitsa
Nie zauważyłem gdy się pojawił ten wątek. Robię teraz kilka rzeczy jednocześnie. Szykuję zestaw na wycieczkę i tutaj: https://www.cnc.info.pl/download.htm?id ... special=65 wrzuciłem arkusz z prymitywną rampą /1.2 (na start) lub */1.2 (na stop).

: 12 kwie 2012, 21:07
autor: markcomp77
pitsa pisze:. Szykuję zestaw na wycieczkę
ooo... - jakaś ciewkawa?
ładna pogoda się zaczyna... i by się człowiek wybrał gdzieś
a i długi łikend... już tuż tusz
--

opracowanie oprogramowania rampy dla arduino może wspomóc wiele pomniejszych projektów

--

przykład do realizacji: OSCYLATOR silnika...

1. ustawiana prędkość max, np. potencjometrem, jednak odczyt realnej prędkości na wyświetlaczu (ew. nawet z enkodera)

2. ustawiana wartość akceleracji - również potencjometrem.. i możliwość odczytania jego wartości na wyświetlaczu

2.a. krztałt rampy

3. ustawienie amplitudy oscylacji lewo/prawo - również potencjometr... i zrzut na wyświetlacz

4. obsługa krańcówek (choć to można zrobić po prostu przerywając sygnał STEP)

OSCYLATOR przypomina moduł kontroli silnika w kreatorze stepconf linuxcnc

takie malutki moduł OSCYLATORa nadawał by się do strojenia serv... do testowania zmęczeniowego osi maszyny (ew. trzy lub więcej takich modułów do badaniu paru osi na raz)

: 12 kwie 2012, 22:03
autor: pitsa
No to robimy. :-)

Zamiast regulacji potencjometrem może być przełącznik inkrementalny i standardowy wyświetlacz LCD lub coś takiego wystarczy: http://www.dealextreme.com/p/8x-digital ... 73?item=41 Są nawet takie zabawki jak mini joystick: http://www.dealextreme.com/p/repair-par ... 340?item=4

: 12 kwie 2012, 22:43
autor: markcomp77
można oczywiście dokupować moduły...
ale potencjometry - podpinamy do wejść analogowych - i już...
albo można dać przyciski lewo/prawo (takie od szyby w aucie... do kupienia za grosze)

a wyświetlacz - dać typowy--- HD-coś tam (najczęściej występujący... w wielu odmianach, rozmiarach, kolorach)

no to lecim z rampowaniem

: 13 kwie 2012, 00:13
autor: pitsa
Wyświetlacz http://nettigo.pl/products/216 - zgodny z HD44780.

Najprostsze sterowanie to 2 lub 3 przyciski, ale jeden potencjometr do zmiennej szybkości jakiegoś nastawu prędkości lub czasu może być ciekawe. Ale na początek wystarczy sama płytka Arduino.
Próba rampy: http://youtu.be/Q-80IXh8vf4
Kod:

Kod: Zaznacz cały

#define enable 4     
#define DIR_PIN 5 
#define STEP_PIN 6

int  podzial=8;      // testowe ruchy silnika ustawione na pełny obrót

void setup() 
{ 
  pinMode(enable, OUTPUT); 
  pinMode(DIR_PIN, OUTPUT); 
  pinMode(STEP_PIN, OUTPUT); 
} 

void loop() { 
delay(4000); 
 for(int hyhy=25 ; hyhy > 2 ; hyhy = hyhy - 1){ 
   rampa(200*podzial, 10000, 30+hyhy*10); 
   rampa(-200*podzial, 10000, 30+hyhy*10); 
 } 
 for(int hyhy=2 ; hyhy < 25 ; hyhy = hyhy + 1){ 
   rampa(200*podzial, 10000, 30+hyhy*10); 
   rampa(-200*podzial, 10000, 30+hyhy*10); 
 } 
} 

void rampa(int steps, int startsteps, int speedm){ 
  // steps - liczba kroków do wykonania - ujemna liczba zmiana kierunku 
  // startsteps - czas startowego kroku us np. 20000
  // speedm - minimalny czas us między krokami na pełnej prędkości
  int przerwa = 20; 
  int licz = 0;       // licznik zrobionych kroków
  int krokirampy= 0;  
  int korekta= 6;     // trzeba jeszcze kroki doliczyć - tymczasowa poprawka 
  int pip = 20;                      // 20us - impuls step
  int dir = (steps > 0)? HIGH:LOW; 
  steps = abs(steps);                // wyciągnięcie kierunku z podanej liczby kroków.
  digitalWrite(DIR_PIN,dir);         // ustaw kierunek

  for(int i= startsteps; i > 1 ; i = i / 1.09 - 1){ 
    licz=licz+1; 
    przerwa=i; 
    if (przerwa < speedm) {przerwa = speedm ; } ; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  } 
    krokirampy=licz; 
  for(int i=0; i < (steps-2*krokirampy-korekta); i++ ) { 
    licz=licz+1; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(speedm); 
  } 
  for(int i=1; i < startsteps; i = i * 1.09 + 1){ 
    licz=licz++; 
    przerwa=i; 
    if (przerwa < speedm) {przerwa = speedm ; } ; 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(pip); 
    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(przerwa); 
  } 
 } 

Źródło kodu bazowego: http://arduino.cc/forum/index.php?topic=94102.0

: 13 kwie 2012, 01:09
autor: GSM
O! Nowy temat o samych rampach. Nie będzie śmiecenia w drugim wątku.
markcomp77 pisze:OSCYLATOR silnika
Czy takie urządzenie jest faktycznie potrzebne? Do testów można przecież zaprząc komputer z EMC/Machem.

pitsa nie podoba mi się to dzielenie int-a przez float-a w pętli.
Tracisz część po przecinku. W tym przypadku wielkiej różnicy to nie robi ale potem się możesz naciąć przypadkiem.

Pozdrawiam,
GSM

: 13 kwie 2012, 03:12
autor: blue_17
GSM pisze:pitsa nie podoba mi się to dzielenie int-a przez float-a w pętli.
Ciekawy jaki kompilator to jest bo pewnie GCC grzmiało by :)

Jak dla mnie to prostsze jest GCC i robienie wszystkiego "ręcznie" , po jakimś czasie i po zebraniu bibliotek chyba dochodzi się do tego samego :)

Pozdrawiam

: 13 kwie 2012, 03:29
autor: GSM
blue_17 pisze:Jak dla mnie to prostsze jest GCC i robienie wszystkiego "ręcznie" , po jakimś czasie i po zebraniu bibliotek chyba dochodzi się do tego samego :)
Jestem tego samego zdania.
Do tego mój organizm nie toleruje Arduino.
blue_17 pisze:Ciekawy jaki kompilator to jest bo pewnie GCC grzmiało by :)
Nie powinno, wszystko sobie automatycznie przekonwertuje/pocastuje. Ale jeśli by to było GCC to by krzyczało na pewno o deklarację zmiennej w prologu pętli.

Pozdrawiam,
GSM

: 13 kwie 2012, 07:17
autor: pitsa
Od czegoś trzeba zacząć. Docelowo chcę dojść do opanowania zrywu. Arduino dobre jest na początek do szybkiego testowania. Tu jest prosto rozpisane sterowanie silnikiem krokowym: http://www.open.com.au/mikem/arduino/AccelStepper/
Tak wygląda kod:

Kod: Zaznacz cały

    if ((sqrSpeed / twoa) < distanceTo) 
    { 
	// Accelerate clockwise
	// Need to accelerate in clockwise direction
	if (_speed == 0.0f) 
	    requiredSpeed = sqrt(twoa); 
	else
	    requiredSpeed = _speed + abs(_acceleration / _speed); 
	if (requiredSpeed > _maxSpeed) 
	    requiredSpeed = _maxSpeed; 
    } 
    else
    { 
	// Decelerate clockwise, accelerate anticlockwise
	// Need to accelerate in clockwise direction
	if (_speed == 0.0f) 
	    requiredSpeed = -sqrt(twoa); 
	else
	    requiredSpeed = _speed - abs(_acceleration / _speed); 
	if (requiredSpeed < -_maxSpeed) 
	    requiredSpeed = -_maxSpeed; 
    }