![Zitat](images/misc/quote_icon.png)
Zitat von
Sinnloserknopf
Moin Moin,
ich habe mal folgende Lib probiert:
RotaryEncoder.h
Damit kann ich schon mal zuverlässig Vor und Zurück erkennen. Der Uno ist also schnell genug hab es nur scheiße programmiert....
werde es weiter versuchen
![Smile](https://www.roboternetz.de/phpBB2/images/smiles/icon_smile.gif)
Hi, in dein Code hat noch Schwächen:
- Ein Motor kann auch stehen
- Überflüssige Variable: Position
- Die Zeilen 'if (newPos == 66) delay(6600);' sind sinnlos
- Test 'if(newPos < position) ...': Die Variable newPos läuft irgendwann über. Dann ist einmal newPos kleiner als pos -> Test liefert einmalig falsche Richtung.
Vorschlag:
Code:
#include <RotaryEncoder.h>
// Setup a RoraryEncoder for pins A2 and A3:
RotaryEncoder encoder(A2, A3);
enum {zurueck =-1, still, vor}; // Motorrichtung
sign(int x) { return (x>0)-(x<0); } // Vorzeichen einer Zahl : -1, 0, +1
void setup() {
Serial.begin(9600);
Serial.println("SimplePollRotator example for the RotaryEncoder library.");
// Interrupt für Encoder festlegen
PCICR |= (1 << PCIE1);
PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);
}
// Interrupt Service Routine für Pin Change Interrupt 1
ISR(PCINT1_vect) { encoder.tick(); }
void loop() {
static int pos = 0;
int newPos = encoder.getPosition();
int richtung = sign(newPos - pos);
switch(richtung) {
case zurueck:
Serial.println("Zurueck!"); break;
case still:
Serial.println("Still!"); break;
case vor:
Serial.println("Vor!"); break;
}
Serial.println();
pos = newPos;
}
}
Lesezeichen