Vyskúšaj tento kód. Mal by počítať kroky bez ohľadu na točenie v smere / proti smeru hodinových ručičiek.
Je tam prerušenie, ktoré zareaguje na stav prechodu z LOW do HIGH (RISING hrana signálu).
Stále si myslím, že je potrebné mať oba výstupy v programe.
Pretože ten priebeh výstupov v smere hodinových ručičiek je:
a proti smeru hodinových ručičiek je priebeh následovný:
Ten kód o ktorý sa snažíš zareaguje až na každý druhý krok z dôvodu, že sa mení pri následujúcom kroku po detekcii druhý výstup a prvý (detekovaný programom) ostáva v pôvodnom stave. Teda 180 pulzov by to malo namerať až na celú otáčku enkódera o 360°.
Edit: Vyskúšal som ten program v simulátore a funguje to, počíta to každý krok. Som z toho prekvapený
Po krokoch enkódera je priebeh jedného signálu: 0 0 1 1 v smere hod. ručičiek, resp. 1 0 0 1 oproti. Ak by to šlo striedavo 1 0 1 0 tak by som to ešte chápal, že to funguje.
Kód: Vybrat vše
volatile unsigned int counter = 0;
unsigned int temp = 0;
void setup() {
Serial.begin (9600);
pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
pinMode(12, OUTPUT);
attachInterrupt(0, ISR_routine, RISING); //interrupt 0 = D2
}
void loop() {
if ( counter != temp ) { //pocitadlo krokov --> vypis pri zmene
Serial.println (counter);
temp = counter;
}
if (counter >= 180) {
counter = 0;
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
}
}
void ISR_routine() {
counter++;
}