Drehschalter für Lautstärke

Hallo Forum,

nachdem der Standard-Aufbau funktioniert, probiere ich mich jetzt an Varianten und „Extras“. Ich habe den Affenbox-Fork von @marco-117 aufgespielt und alles läuft mit fünf Buttons reibungslos. Jetzt möchte ich einen Drehencoder einbauen. Ich habe hier den KY-040 liegen und benötige beim Anschluss Hilfe:

  • In der Configuration.h schalte ich wieder um auf 3 Buttons, richtig? Ich möchte ja nur noch Play/Pause, vor und zurück.
  • Dafür schalte ich #define ROTARY_ENCODER ein.
  • Noch Änderungen am Code, die ich nicht gesehen habe?
  • Wie schließe ich die drei Buttons und insb. den Drehencoder (clk, dt, sw, +, gnd) nun an meine Classic-Platine?
  • Was müsste ich noch anpassen, um den Click des Drehencoders als Start/Pause zu verwenden? Oder führt das zu irgendwelchen größeren Problemen?

Vielen Dank schonmal!
HK

Schau Mal hier zum Anschließen

1 „Gefällt mir“

So ganz komme ich damit noch nicht hin. Ich habe jetzt das so angeschlossen, wie in dem Post genannt.

Platine = KY040
D5 = CLK
D6 = Data
A0 = SW (und den alten Pausebutton damit ersetzt)
GRD = GRD
+5V = +

Damit bin ich nicht ganz zum erwarteten gekommen.

Funktionieren tut es jetzt mit folgendem Aufbau:

  • Ground, + und SW wie oben.
  • DT und CLK an A1 und A2.
  • Vor und zurück an A3 und A4.
  • #define FIVEBUTTONS

Zuerst hatte ich DT und CLK mit vor und zurück vertauscht. Damit konnte ich dann über den Drehregler vor und zurück gehen. Ok, also umgedreht. Da hatte ich dann aber keine Reaktion des Drehreglers. Hmmm…

Hab schlussendlich gemerkt, dass der Regler die Lautstärke nur sehr langsam ändert. Ungefähr eine Umdrehung = 1 Schritt. Kann man die Empfindlichkeit irgendwo ändern? Hätte jetzt vermutet, dass das hierüber geht #define ROTARY_ENCODER_STEPS 4. Allerdings scheinen weder größere noch kleinere Werte hier etwas wesentlich zu ändern.

Ach, und ich bin mir nicht so ganz sicher… Die LED „L“ am Arduino flackert nun. Ich meine, dass sie das vorher nicht getan hat. Normal?

Mich verunsichert, dass hier von 5V und Digitalpins geschrieben wird

Und dort von 3,3V und Analogpins

Das ist ein Aufbau mit AiO-Platine, die läuft zu großen Teilen mit 3,3V. Der Arduino Nano aber mit 5V.
Das Beispiel was du verlinkt hast nutzt digitale Pins in den Codebeispielen.

Beispielsketch

#include <Encoder.h>    // Verwendung der  Bibliothek 

const int CLK = 6;      // Definition der Pins. CLK an D6, DT an D5. 
const int DT = 5;
const int SW = 2;

Deshalb schreiben die natürlich auch, dass man den Drehencoder an diese Pins anschließen soll.
Marco hingegen nutzt in seinem Fork als Standard Analoge. Deshalb das A davor. Passt ja auch ganz gut, weil die Taster ja auch dortangeschlossen werden. Du kannst die Po s dortaber auch ändern, deshalb gibt es nicht nur eine funktionierende Möglichkeit den Encoder anzuschließen.

Hab mal debugging eingeschaltet. Beim Drehen in eine Richtung zeigt es mir vol-Werte an, die immer z.b. zwischen 15 und 14 wechseln und nur ab und zu mal wirklich um eins weiter springen. Dadurch ändert sich die Lautstärke nur seeeehr langsam. Liegt das an einem defekten drehregler?

@Gute_Laune
Danke für die Erläuterung!

So sieht die Debug-Ausgabe aus, nachdem ich 5 Rastungen in eine (dieselbe) Richtung gedreht habe.

vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18

Das Spiel kann ich weiter spielen. Irgendwann macht es dann auch mal

vol up 19
vol down 18
vol up 19
vol up 20
vol down 19
vol up 20

Dann springt es zwischen 19 und 20, bis es irgendwann weiter auf 21 springt.

Edit: Nochmal genauer mit Debug-Modus für den Rotary-Encoder. Zweimal drehen liefert

vol down 17
encoder direction clockwise
vol up 18
vol down 17
encoder direction clockwise
vol up 18

In die entgegengesetzte Richtung liefert

vol up 19
encoder direction conterclockwise
vol down 18
encoder direction conterclockwise
vol down 17
vol up 18

Die Richtung wird also wohl schon erkannt. Aber die Reaktion der Software ist etwas merkwürdig.

Du kannst versuchen die Anzahl der steps beim drehen zu ändern

#define ROTARY_ENCODER_STEPS 4

Also statt 4 z.B. 3

Das habe ich auch schon probiert. Ändert leider nichts am grundsätzlichen Verhalten :frowning:

Ich verstehe nicht, warum der Code bei einer Drehung erst das Volume hoch zählt (vol up 19), dann die Drehung erkennt (encoder direction conterclockwise) und dann das Volume wieder runter zählt (vol down 18).

Die Reihenfolge der Anzeige „Drehung“ und „Volumeänderung“ ist mir ja egal. Aber warum wird das Volume direkt wieder geändert, obwohl laut Debug keine erneute Drehung erkannt wurde?

Bin nochmal zurück zur dev gewechselt, hab aber den KY-040 angeschlossen gelassen. Damit funktioniert es nicht gut aber besser als mit der Affenbox von @marco-117 . :thinking:

Ich werd mal einen anderen Encoder bestellen und anschließen. Mal sehen…

Ich blicke nicht mehr durch… Ich habe diesen Sketch auf meiner Hardware getestet und alles läuft wunderbar. An einem fehlerhaften Encoder scheint es also nicht zu liegen.

https://chome.nerpa.tech/mcu/reading-rotary-encoder-on-arduino/

Beim Affenbox-Fork springt meine Lautstärke immer hoch bzw. runter und wieder zurück auf den Ausgangwert, so dass sie sich faktisch nicht ändert. Hier sind meine Eingaben in der Configration.h.

Configuration.h
//===========================================================================
//================================ All in One ===============================
//===========================================================================
/*
*Bei Verwendung der All in One Baugruppe, (genannt AiO) aktivieren
*https://www.leiterkartenpiraten.de/produkt/tonuino-all-in-one/
*/

//#define AiO

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//===========================================================================
//============================= Hardware Features ===========================
//===========================================================================
/** 
*Nachfolgend sind alle möglichen Hardware erweiterungen aufgelistet und die dazugehörigen Konfigurationsmöglichkeiten.
*Um eine Funktion zu aktivieren das entsprechende "#define" auskommentiern. Dazu die beiden "//" davor entfernen.
*Alles weiter steht bei den entsprechenden Punkten
*/

//===========================================================================
//================================= Buttons =================================
//===========================================================================

/** 
 * Konfiguration der Standard Button Pins 
 */
 
/**
*Sample Classic
*/
#define buttonPause A0
#define buttonUp A1 
#define buttonDown A2


/**
*Sample All in One
*/
// #define buttonPause A0
// #define buttonUp A4
// #define buttonDown A3

/**
*Sample Affenbox Pocket
*https://discourse.voss.earth/t/pocket-tonunio-affenbox-v2/4906?u=marco-117 
*/
// #define buttonPause A2
// #define buttonUp A0 
// #define buttonDown A1

/** 
 * Konfiguration eines separten power buttons
 */
//#define buttonPower A0

//===========================================================================
//============================= FIVEBUTTONS =================================
//===========================================================================
/**
*Für die Verwendung von fünf Buttons, statt drei.
*/
#define FIVEBUTTONS    

#if defined FIVEBUTTONS
/**
*Sample Classic
*/
#define buttonFourPin A3
#define buttonFivePin A4

/**
*Sample All in One
*/
//#define buttonFourPin A2
//#define buttonFivePin A1

#endif
//===========================================================================
//============================= PUSH_ON_OFF =================================
//===========================================================================
/** 
*+++Bei AiO standardmäßig aktiv +++
*Ein-/Ausschalten des TonUINO über langen Druck des Pausetasters. 
*Setzt Hardware vorraus, die das Ausschalten unterstüzt,
*z.B.: 
*- Pololu-Switch -> https://discourse.voss.earth/t/pololu-als-power-switch-einsteiger/2099
*- Powerbank mit automatischer Abschaltung -> https://discourse.voss.earth/t/intenso-s10000-powerbank-automatische-abschaltung-software-only/805/5
*/

//#define PUSH_ON_OFF    

#if defined PUSH_ON_OFF

/* 
*Angabe des Anschlusspins für die PUSH_ON_OFF Funktion.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define PUSH_ON_OFF_PIN 7

#endif

//===========================================================================
//============================= SPEAKER_SWITCH ==============================
//===========================================================================
/**
*+++Bei AiO standardmäßig aktiv +++
*Bei verwendung einer externen Lautsprecherschaltung, zur unterdrückung des Einschaltgeräusches,
*sowie des Leerlaufrauschens.
*https://discourse.voss.earth/t/geraeusch-beim-start-der-box-allerdings-nicht-bei-jedem-start/1357/34?u=marco-117 
*/

//#define SPEAKER_SWITCH  

#if defined SPEAKER_SWITCH

/* 
*Angabe des Anschlusspins für den Lautsprecherschalter.
*Es kann jeder freie Ausgang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.*
 */
#define SPEAKER_SWITCH_PIN 8

#endif


//===========================================================================
//============================= ANALOG_INPUT ================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit mehreren Tastern über einen analogen Eingang zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*TonUINO Button Board (bereits vorkonfiguriert)
*https://www.leiterkartenpiraten.de/produkt/tonuino-button-board-3x3/
*
*Für eigene Aufbauten weitere Informationen:
*https://github.com/bxparks/AceButton/tree/develop/examples/LadderButtons
*
*Bitte beachten: die AiO verwendet andere Referenspegel als der Arduino Nano!
*/

//#define ANALOG_INPUT

#if defined ANALOG_INPUT

/**
*Angabe des Anschlusspins für die analogen Signale.
*Es kann jeder freie analoge Eingagn gewählt werden.
*Ausgeschlossen sind folgende Pins: A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ANALOG_INPUT_PIN A3

/** 
*Menge der analogen Signale/Buttons.
 */
#define ANALOG_INPUT_BUTTON_COUNT 9

/** 
*Liste der analogen Werte für jeden Button.
*Es muss für jeden Button ein Wert angegeben werden, plus der Wert wenn kein Button gedrückt ist.
*Dieser Nullwert muss an erster Stelle stehen.
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*!!Zur erfassung der Werte hilft "#define ANALOG_INPUT_PRINT"!!
 */
static const uint16_t ANALOG_INPUT_LEVELS[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
 #if defined AiO  // values for AiO (2,048V reference, 12bit ADC), TU_BB_3x3 v1.0
  0,    //Null
  490,  //Button 1
  945,  //Button 2
  1494,
  1949,
  2480,
  2937,
  3373,
  3691,
  4064  //Button 9
#else// values for Arduino Nano (5V reference, 10bit ADC), TU_BB_3x3 v1.0
  0,
  92,
  194,
  307,
  405,
  512,
  608,
  698,
  773,
  1023
#endif
};

/** 
*Liste der Funktion für jeden analogen Wert.
*Es muss für jeden analogen Wert eine Funktion festgelegt werden, inklusive dem Nullwert.
*Die Reihenfolge der Funktionen muss der Reihenfolge der analogen Werte entsprechen.
*D.h. Analogwert 3 == Funktionswert 3
*
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*
* Folgende Werte können angegeben werden:
   Null                = 0,
   Pause               = 1,
   Next                = 2,
   Next +10            = 4,
   Previous            = 5,
   Previous +10        = 6,
   VolumeUp            = 7,
   VolumeDown          = 8,
   Abort/Shutdown      = 9,
   AdminMenu           = 10,
   Reset Playback Mode = 11,
   Shortcut No.1 to 12 = 12 bis 24
 */
//#define ANALOG_INPUT_SUPPLY_PIN 6 //Nur verwenden, wenn es unbedingt nötig ist!Der Referenzpegel kann auch von einem IO Pin kommen.
static const uint8_t ANALOG_INPUT_BUTTON_MAP[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
  0,  //Null
  12, //Shortcut No. 1
  13, //Shortcut No. 2
  14, 
  15,
  16,
  17,
  18,
  19,
  20  //Shortcut No. 9
};

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
//#define ANALOG_INPUT_PRINT

/*
*Gibt die analogen Werte so schnell wieder wie möglich. 
*Falls die analogen Werte der Taste nicht bekannt sind können sie hiermit ermittelt werden.
*/
//#define ANALOG_INPUT_PRINT_ANALOGREAD

#endif

//===========================================================================
//============================= IRREMOTE ====================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit einer IR Fernbedienung zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*IR Infrarot Remote Receiver / Empfänger TSOP38238 
*https://www.berrybase.de/bauelemente/aktive-bauelemente/leds/infrarot-leds/ir-infrarot-remote-receiver/empf-228-nger-tsop38238

*Infrarot Fernbedienung mit 17 Tasten (bereits vorkonfiguriert)
*https://www.berrybase.de/raspberry-pi/raspberry-pi-computer/eingabegeraete/infrarot-fernbedienung-mit-17-tasten
*/

//#define IRREMOTE

#if defined IRREMOTE

/* 
*Angabe des Anschlusspins für den Data Pin des IR Empfängers.
*Es kann jeder freie digtale Eingang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define IRREMOTE_PIN 6


/*
*Falls das Protokoll der gewünschten Fernbedienung beakannt ist, sollte NUR DAS ENTSPRECHENDE PROTOKOLL auskommentiert werden. 
*Das spart wertovllen Speicher.
*Falls das Protokoll nicht bekannt ist, keines der Prtoolle auskommentiern!
*"#define IRREMOTE_PRINT" hilft bei der identifizierung des Protokolls.
*/
//#define DECODE_DENON        // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
#define DECODE_NEC          // Includes Apple and Onkyo
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6

//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

//#define DECODE_HASH         // special decoder for all protocols


/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
//#define IRREMOTE_PRINT

#endif


//===========================================================================
//============================= ROTARY_ENCODER ==============================
//===========================================================================
/**
*Gibt die Möglichkeit die Lautstärke der Affenbox über eine Drehencoder zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*KY-040 Drehwinkelgeber/Drehgeber
*https://www.az-delivery.de/products/drehimpulsgeber-modul?_pos=1&_sid=85bb51922&_ss=r
*/

#define ROTARY_ENCODER   

#if defined ROTARY_ENCODER

/* 
*Angabe der Anschlusspins für den Data und Clock Pin des Drehgebers.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ROTARY_ENCODER_PIN_A A1 
#define ROTARY_ENCODER_PIN_B A2  

/* 
*Anzahl erkannter Steps pro Klick des Drehgebers.
*Falls der Wert falsch eingestellt ist, werden eventuell mehr als ein Schritt pro Klick erkannt.
 */
#define ROTARY_ENCODER_STEPS 4

/* 
*Nur verwenden, wenn es unbedingt nötig ist! 
*Die Versorgung des Rotary Encoder kann auch von einem IO Pin kommen.
 */
//#define ROTARY_ENCODER_PIN_SUPPLY 8 

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
#define ROTARY_ENCODER_PRINT

#endif



//===========================================================================
//===================== POWER_ON_LED(EXPERIMENTEL!!) ========================
//===========================================================================
//--------POWER_ON_LED(EXPERIMENTEL!!)--------
/*
*Gibt die Möglichkeit eine simple Status LED einzufügen.
*Als zusätzliche Funktion, kann diese durch fading den Staus genauer wiedergeben.
*/

//#define POWER_ON_LED    

#if defined POWER_ON_LED

/* 
*Angabe des Anschlusspins für die LED.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define POWER_ON_LED_PIN 5

//#define FADING_LED 

#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= NFCgain =====================================
//===========================================================================
/**
*Um Probleme bei der Erkennung von RFID Tags zu beheben, kann die Verstärkung des RFID Reader/Writer geändert werden.
*Ein unnötiges Hochsetzen der Empfindlichkeit kann ebenfalls zu Problemen bei der Erkennung führen.
*/
//#define NFCgain_max   // Maximale Empfindlichkeit
#define NFCgain_avg   // Mittlere Empfindlichkeit
//#define NFCgain_min   // Minimale Empfindlichkeit


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= Debugging ===================================
//===========================================================================
/*
*Aktiviert Standard Debug Asugaben
*/
#define DEBUG  

/*
*Aktiviert Shortcut Debug Ausgaben
*/
//#define SHORTCUTS_PRINT

/*
*Aktiviert die Ausgabe der Queue
*/
//#define QUEUE_PRINT 

/*
*Aktiviert DFPlayer Debug Ausgaben
*/ 
//#define DFPLAYER_PRINT

/*
*Aktiviert die Ausgabe des EEPROMS zu beginn
*/
//#define EEPROM_PRINT

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Ich benutze die Classic-Platine und den besagten KY-040 zusammen mit zwei weiteren Buttons für vor und zurück. Den Encoder habe ich an A0 bis A2 angeschlossen (und an die Stromversorgung), an A3 und A4 hängen die beiden anderen Buttons.

Hier die vollständige Debug-Ausgabe, nachdem ich einen Tag aufgelegt und anschließend zweimal im und zwei mal gegen den Uhrzeigersinn gedreht habe (Ich habe zur besseren Lesbarkeit ein paar mal das „TonUINO by Thorsten…“ am Anfang gelöscht).

Debug
rom TonUINO by Thorsten forked from TonUINO by Thorsten forked from TonUINO by Thorsten forked from TonUINO by Thorsten forked from TonUINO by Thorsten forked from TonUINO by Thorsten forked from TonUINO by ThorstenInformation and contribution https://tonuino.de.

Firmware Version: 0x92 = v2.0
set stby timer
milis 64002
nxt track
abort
ReadCardSerial fin
Card UID 
 A3  3C  8E  1D 
PICC type MIFARE 1KB
Authenticating Classic using key A...
 FF  FF  FF  FF  FF  FF 
0
Read block4
data on card 
folder 2
mode 2
special 25
special2 11
special3 0
special4 0
2
2
new tag
Album
disable stby timer

20 mp3 in folder 2
play mp3 1
tag gone
vol down 17
encoder direction clockwise
vol up 18
vol down 17
encoder direction clockwise
vol up 18
vol up 19
encoder direction conterclockwise
vol down 18
vol up 19
encoder direction conterclockwise
vol down 18

Hast du spaßeshalber Mal versucht den encoder auf Pin A3 und A4 zu legen und die vor und zurück taste auf A1 und A2.
Denk dran die Pin Belegung im Code zu ändern

Hab ich gerade mal versucht. Zunächst mal ohne eine Änderung im Code. Dann wird ja vor und zurück über den Drehregler gesteuert und die Lautstärke über Tasten. Da passiert dasselbe. Die Tracks springen recht wahllos vor und zurück, wenn ich drehe.

Wenn ich im Code die entsprechenden Änderungen mache, dann springt wieder die Lautstärke wie bei der alten PIN-Belegung.

:frowning:

Hab irgendwie das Gefühl, dass irgendetwas im Code hier zweimal aufgerufen wird, da mir das Debugging ja beim Drehen erst eine Vol-Änderung anzeigt, dann die Drehung und dann nochmal eine Vol-Änderung zurück. Andererseits bin ich sicher nicht der erste, der so einen Aufbau hat.

Ist denn meine Befüllung der Config richtig?

Mach doch Mal ein Foto vom Aufbau

Versuch mal, ob sich was ändert, wenn du #define FIVEBUTTONS deaktivierst und dafür die Pins der 3 Taster anpasst. Ich kann mir vorstellen das im Moment zum einen der Drehencoder die Lautstäke ändert und zusätzlich das Signal als Taster gewertet wird, weil A1 und A2 ja für beides als Pin angegeben sind.

Mir hat es auch einmal geholfen den Sketch komplett zu löschen und neu aufzuspielen