Hi,
ich bin gerade mal wieder an meinem Cuadcopter am tüfteln. Um die PIDS einzustellen, gibt es da verschiedene Möglichkeiten, am bequemsten ist natürlich vom Sender aus. Das geht über einen Dreistufenschalter, nach vorne erhöht er den Wert, nach hinten vermindert er den Wert. Besser wäre ein 3-Stufen Taster.
Am besten wäre ein Rotary Encoder
Was ich bisher habe und auch läuft:
3-Wege-Schalter durch 2x Optokoppler ersetzt.
Rotary Encoder, dekodiert (per %4 habe ich pro Klick einenImpuls) und gibt bei Linksdrehung einen Impuls von 60ms und 60ms Pause auf Pin11, bei rechts das gleiche auf Pin12. Pin13 blitzt paralell auf
Auf Pin 11 und 12 sind die OK, welche mir den 3-Wegetaster simulieren.
Das ganze funktioniert, wenn man langsam dreht, weil ich ja auf das übertragen warten muss mit delay ), sprich pro Klick 120ms, schneller geht es hardwaremässig nicht.
Was ich nun bräuchte:
Denkanstoss/ansatz dafür:
Ich will die Rotary Klicks puffern, und sie dann übertragen. Die Übertragung sollte idealerweise nichtblockierend mit dem ersten Klick schon beginnen. Falls ich während der Übertragung in die andere Richtung drehe, sollte die Übertragung sofort abgebrochen werden und die neue anfangen.
Irgendwie mit hochzählen und dann beim übertragen zurückzählen oder so. Ich denk bestimmt schon 5 Minuten drüber nach, aber der entscheidende Klick fehlt.
Hier der Code, den ich habe:
//#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
Encoder Encoder1(2, 3);
int warten = 60; // impuls/pause beim übertragen
void setup() {
Serial.begin(115200);
Serial.println("Basic NoInterrupts Test:");
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
long position = -999;
void loop() {
long neuePosition = Encoder1.read();
if (neuePosition != position) {
if (position % 4 == 0 && position > neuePosition) {
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
delay(warten);
digitalWrite(11, LOW);
digitalWrite(13, LOW);
delay(warten);
}
if (position % 4 == 0 && position < neuePosition) {
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
delay(warten);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(warten);
}
position = neuePosition;
Serial.println(position / 4);
}
}