04-05-2017, 18:59
Witam, napisałem kod do obsługi enkodera. Generalnie docelowo ma to być prymitywny wskaźnik wartości osi x,y,z,a cnc.
Założenie jest takie ,że po starcie programu wyświetlić mi się mają zerowe położenia każdej z osi.
Przyciskiem zdefiniowanym jako "int xyz" mam wybierać dla której osi enkoder będzie mi zmieniał wartość.
jedno naciśnięcie -oś x , drugie naciśnięcie przechodzi w oś y itd. Po przejściu na inną oś poprzednia wartosć musi zostać zachowana dopóki jej nie wyzeruje (docelowo mają być jeszcze 4 przycicki do zerowania każdej z osi).
Niestety chociaż sam enkoder działa -a przynajmniej dobrze zlicza tylko w jedną stroną (w drugą się gubi)
to przechodzenie pomiędzy osiami zupełnie nie działa. na wszystkich osiach wyświetla mi siędokładnie to samo.
Być może nie tędy droga ( instrukcja switch /case )
Nie potrafię jeszcze dobrze programować więc zwracam się z prośbą do Was o pomoc jak to ma być żeby "grało"
...oraz podpowiedź co jest nie tak ,że zliczanie enkodera działa jak działa.
Pozdrawiam.
Założenie jest takie ,że po starcie programu wyświetlić mi się mają zerowe położenia każdej z osi.
Przyciskiem zdefiniowanym jako "int xyz" mam wybierać dla której osi enkoder będzie mi zmieniał wartość.
jedno naciśnięcie -oś x , drugie naciśnięcie przechodzi w oś y itd. Po przejściu na inną oś poprzednia wartosć musi zostać zachowana dopóki jej nie wyzeruje (docelowo mają być jeszcze 4 przycicki do zerowania każdej z osi).
Niestety chociaż sam enkoder działa -a przynajmniej dobrze zlicza tylko w jedną stroną (w drugą się gubi)
to przechodzenie pomiędzy osiami zupełnie nie działa. na wszystkich osiach wyświetla mi siędokładnie to samo.
Być może nie tędy droga ( instrukcja switch /case )
Nie potrafię jeszcze dobrze programować więc zwracam się z prośbą do Was o pomoc jak to ma być żeby "grało"
...oraz podpowiedź co jest nie tak ,że zliczanie enkodera działa jak działa.
Pozdrawiam.
Kod:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int encoderA = 2;
int encoderB = 3;
int encoder0PinALast = 0;
int pozycja_x = 0;
int pozycja_y = 0;
int pozycja_z = 0;
int pozycja_a = 0;
long int n = 0;
int xyz =4;
int zerowanie =5;
long int licznik =0;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
lcd.begin(20, 4);
lcd.setCursor(0,0);
lcd.print("os X :");
lcd.setCursor(0,1);
lcd.print("os Y :");
lcd.setCursor(0,2);
lcd.print("os Z :");
lcd.setCursor(0,3);
lcd.print("os A :");
}
int obsluga_enc (){
n = digitalRead(encoderA);
if((encoder0PinALast == LOW) && (n == HIGH)) {
if(digitalRead(encoderB) == LOW) {
licznik--;
}
else {
licznik++;
}
}
encoder0PinALast = n;
return licznik;
}
void loop (){
int n = digitalRead(xyz);
for ( n =0 ; n<4 ; n++){
switch (n)
{
case 0:
lcd.setCursor(7,0);
lcd.print(pozycja_x+(obsluga_enc ()));
break;
case 1:
lcd.setCursor(7,1);
lcd.print(pozycja_y+(obsluga_enc ()));
break;
case 2:
lcd.setCursor(7,2);
lcd.print(pozycja_z+(obsluga_enc ()));
break;
case 3:
lcd.setCursor(7,3);
lcd.print(pozycja_y+(obsluga_enc ()));
break;
}
}
}