Nano ESP erkennt Signale des Rotary Encoders nicht sauber

Mit einem Nano ESP zeigt der Rotary Encoder einr sehr merkwürdiges Verhalten. Dabei erkennt er häufig (meistens) die Drehrichtung nicht, womit die Lautstärkeeinstellung echte Glückssache ist.

Die Gegenprobe mit einem Nano V3 zeigt allerdings keine Auffälligkeiten und die Lautstärkeeinstellung funktioniert einwandfrei.

Das Schaltverhalten des Rotary Encoders:

  • CLK (an A3) = HIGH und DT (an A4) = LOW ==> Lauter
  • CLK = LOW und DT = LOW ==> Leiser
    Bilde ich die beiden Signale über Drucktaster nach, funktioniert die Erkennung auch beim Nano ESP problemlos.

Hier kommt es bei der Firmware für den Nano ESP anscheinend zu einem Timingproblem, um die Signalzustände des Rotary Encoders sauber zu trennen und in der gewünschten Reihenfolge zu verarbeiten.

Hier die Bitte an @Boerge1 einen Blick auf dieses Problem zu werfen.

Ich konnte das Problem nachstellen. Kümmere mich in den nächsten Tagen darum. Vielleicht funktionieren die Interrupts nicht richtig auf dem esp32 nano.

1 „Gefällt mir“

Ich habe mehrere Probleme dabei erkannt und versucht zu lösen:

  • Ich hatte den Pin-Mode bei den beiden Pins CLK und DT auf INPUT_PULLUP gesetzt. Bei einigen Encodern ist das auch notwendig (bei denen ohne Leiterplatte und Widerständen). Aber bei den anderen ist das dann zu viel PullUp. Das ist jetzt konfigurierbar in der Datei constants.hpp (default: kein PullUp)
  • Ich weiß nicht, wie du den + Pin verbunden hast. Beim ESP32 solltest du den mit 3.3V verbinden, dann läuft es auch besser.
  • Zusätzlich habe ich noch einen Debounce Timer eingefügt. Damit ist es noch stabiler geworden.

Das Ganze ist auf dem Branch issue_324 implementiert. Gib mal Rückmeldung, wie das damit läuft, vielleicht auch mit anderer HW.

Hallo Boerge1, habe gerade deinen Branch issue_324 umgesetzt und bekomme leider folgende Fehlermeldung. Ich muss aber sagen, dass es einen Unterschied in der Zeilen-Nummerierung in der rotary_encoder.cpp um 5 Zeilen gibt.

D:\Thore-Box\TonUINO-TNG\src\rotary_encoder.cpp: In member function 'void RotaryEncoder::init()':
D:\Thore-Box\TonUINO-TNG\src\rotary_encoder.cpp:43:32: error: 'rotaryEncoderPullup' was not declared in this scope
   pinMode(rotaryEncoderDtPin , rotaryEncoderPullup ? INPUT_PULLUP : INPUT);
                                ^~~~~~~~~~~~~~~~~~~
D:\Thore-Box\TonUINO-TNG\src\rotary_encoder.cpp:43:32: note: suggested alternative: 'rotaryEncoderPullUp'
   pinMode(rotaryEncoderDtPin , rotaryEncoderPullup ? INPUT_PULLUP : INPUT);
                                ^~~~~~~~~~~~~~~~~~~
                                rotaryEncoderPullUp
exit status 1

Compilation error: 'rotaryEncoderPullup' was not declared in this scope

Was ist zu tun??

Günter

Hast du auch alle Dateien neu heruntergeladen. Die Datei constants.hpp scheint falsch zu sein.

Nein habe ich nicht, nur die Änderungen wie im Branch angegeben. Ok, ich lade die komplette Version neu herunter.

Ich habe in unterschiedlichen FW-Konfigurationen getestet.
Bei allen gemeinsam war es von entscheidendem Vorteil, den + Pin des Encoders (mit integr. PullUp Widerständen) auf 3,3 V zu legen.

Der erste Versuch mit folgender Konfiguration lief stabil.

TonUINO TNG Konfiguration
ESP32 Nano,
DF-Player mit HW Serial
DF-Player Chip GD3200B
Rotary Encoder mit Long Press Simulation
Neo-Pixel with 12 LED (extended)
Quiz Game
Memory Game
Teapot Game
Shutdown mit Tägerplatine
MFRC Gain = RxGain_33dB
Jukebox
Pause nach jedem Track
OTA possible: yes

Dann die (von mir bevorzugte) Version, bei der die 5-Tasten Variante aktiviert ist und die auf Rotay_Longprss verzichtet.

TonUINO TNG Konfiguration
ESP32 Nano, 5 Tasten
DF-Player mit HW Serial
DF-Player Chip GD3200B
Rotary Encoder
Neo-Pixel with 12 LED (extended)
Quiz Game
Memory Game
Teapot Game
Shutdown mit Tägerplatine
MFRC Gain = RxGain_33dB
Jukebox
Pause nach jedem Track
OTA possible: yes

Der Rotary Encoder übernimmt nun einzig die Lautstärkeeinstellung. Für den Titelsprung gibt es 2 separate Tasten. Damit es hier nicht zu einem Steuerungskonflikt mit den Rotary-Signalen kommt, habe ich die Tastenbelegung in den Zeilen 760 - 763 der constants.hpp angepasst.

inline constexpr uint8_t   buttonUpPin     = A1;
inline constexpr uint8_t   buttonDownPin   = A2;
inline constexpr uint8_t   buttonFourPin   = A3;
inline constexpr uint8_t   buttonFivePin   = A4;

Auch hier läuft es wunschgemäß stabil obwohl sich gelegentlich noch ein Lautstärkesprung un die faqlsche Richtung einschleicht. Das aber kann durchaus mit dem Encoder selbst zusammenhängen und scheint auch von der Drehgeschwindigkeit abzuhängen.
In der Praxis ist das kein Problem, ist eben nur bei Beobachtung des Logs aufgefallen. (Anpassung der debounce-Zeit um + / - 10 ms hat keine wirkliche Änderung gezeigt)

Den Gegentest mit einem Nano V3 konnte ich aus Zeitgründen noch nicht machen, nehme außerdem an, das dieser Test nicht mehr wirklich relevant ist(?)

Ich denke, dass @kaputtnix53 zum gleichen Ergebnis kommen wird

1 „Gefällt mir“

Hi Jungs, ihr seit prima. Danke für die Hilfe. Ich habe jetzt die Version von heute Nachmittag ausprobiert und … ich muss sagen es klappt. Der Encoder macht was er soll, sogar sauber. Ich habe die Änderungen von euch beiden übernommen und bin glücklich, dass es klappt. Jetzt kann ich die Box zumachen und übergeben.

2 „Gefällt mir“

Der Fix ist jetzt auf dem main Branch.

1 „Gefällt mir“