Tonoino für die Kita

Du könntest einen Drehschalter verwenden und über Spannungsteiler verschiedene Tracks oder Ordner wählen, ich Versuch mal was zu zeichnen.

Mit einem Rotary Encoder fehlt das Feedback, was gerade gewählt wurde.

Ich hab hier einen Drehschalter mit 12 Stellungen gefunden.

Wenn man zwischen jedem Schaltkontakt einen 1kOhm Widerstand lötet und den ersten Pin an 5V, sowie den letzten an GND, hat man einen Spannungsteiler mit ca 0,4V Schritten.

Die Spannng kann man an einem Analogen Eingang (z.B. A0) einlesen und auswerten.

Ich hoffe der Plan ist lesbar. Das Runde ist der Drehschalter mit 12 Kontakten außen und einen in der Mitte.

Ich weiß nicht wie große der Schalter im obigen Link ist, aber eventuell kann man die Widerstände direkt an den Schalter löten, das spart Platz.
Edit:
So wie hier
serveimage

1 „Gefällt mir“
#define ROT_SWITCH_POS_NUM 12
#define ROT_SWITCH_PIN  A0

uint8_t currentPos = 0;
analogReference(INTERNAL);

uint8_t getSwitchPosition ()
{
  float analogValue = analogRead(ROT_SWITCH_PIN);
  float stepMin = (5/ROT_SWITCH_POS_NUM) - ((5/ROT_SWITCH_POS_NUM)*0.15);
  float stepMax = (5/ROT_SWITCH_POS_NUM) - ((5/ROT_SWITCH_POS_NUM)*0.15);
  
   for (uint8_t x = 0; x <= ROT_SWITCH_POS_NUM; x++)
  {
    if (analogValue > stepMin*x && analogValue < stepMax*x)
      return x;
  }
}

Hier ein Codebeispiel um die Position des Schalters auszuwerten.
Der ist allerdings nicht gestestet.
Es stellt sich noch die Frage, wie man die einzelnen Positionen abspielt. Generell als Album oder im Partymodus?

Edit:
Mir fällt gerade auf, dass mein Code nicht ganz zu dem Schaltplan passt.
Für den Code sollte man die Reihenfolge der Pins am Drehschalter umdrehen.
Sprich, Pin 1 sollte bei GND anfangen, und nicht bei 5V. Das ergibt an sich auch mehr Sinn, da mit steigender Positionszahl, auch die analoge Spannung steigt.

Edit2:
Hab einen kleinen Logikfehler in der if Abfrage entdeckt und behoben. Es sollte UND und nicht ODER sein.

1 „Gefällt mir“

Wow, der Hammer. Hier wird sofort geliefert. :grinning: :+1:
Vielen Dank. Werde gleich mal bestellen. Brauche sowieso noch Lautsprecher.
Bin mal gespannt ob ich es schaffe deinen Code zu implementieren.
Hatte ja schon erwähnt das meine Programmierfähigkeiten gegen null tendieren. :sweat:

Ich werde das auch aufbauen und testen, da es mich auch interessiert.
Ich würde bei mir nur verschiedene Modis wählen wollen. Ich habe drei Spiele programmiert, plus den Stoptanz, der schon existiert.

Vergiss die Widerstände nicht mit zu bestellen.

Staffelpreis beachten! Ab 100 Stk 0,019€/Stk

Update:
Das Material kam, ich hoffe ich kann es bald testen.

Update2:

Das Programm läuft!
Ich habe es wie folgt umgesetzt:
Grundlegend werden der verwendete Pin, Parameter wie Anzahl Stellungen des Schalters und Schwellwerte die eine Schrittänderung erkennen, über #defines festgelegt.

#define ROTARY_SWITCH_PIN  A3
#define ROTARY_SWITCH_POSITIONS 12
#define ROTARY_SWITCH_TOLERNACE 0.15
#define ROTARY_SWITCH_REF_VOLTAGE 5.0
#define ROTARY_SWITCH_STEP_MIN ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS) - ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS)*ROTARY_SWITCH_TOLERNACE))
#define ROTARY_SWITCH_STEP_MAX ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS) + ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS)*ROTARY_SWITCH_TOLERNACE))

Dann benötigt es ein paar globale Variablen, darunter ein Array, in dem alle Daten wie auf den RFID Karten abgelegt sind. Sowie ein Enum, der lesbarkeithalber.

uint8_t RotSwCurrentPos = 0;

typedef enum Enum_PlayMode
{
  Hoerspiel_1 = 1,
  Album_2 = 2,
  Party_3 = 3,
  Einzel_4 = 4,
  Hoerbuch_5 = 5,
  Hoerspiel_von_bis_7 = 7,
  Album_von_bis_8 = 8,
  Party_von_bis_9 = 9,
};

//Array Slot [x,0] = Folder No., Array[x,1] = Play Mode, Array[x,2] = Special, Array[x,3] = Special2.
uint8_t RotSwMap [ROTARY_SWITCH_POSITIONS][4];

Im „void setup()“ muss das Array mit Werten gefüllt werden, die interne Spannungsreferenz gesetzt und die aktuelle Schalterstellun gelesen werden.

Hier wird es interressant.
Man muss das Array so befüllen, wie die RFID Karten.
Man schreibt in

  • RotSwMap[x][0] die Nummer des Ordners
  • RotSwMap[x][1] den Abspielmodus, hier kann man die Enumwerte verwenden, zur lesbarkeit
  • RotSwMap[x][2] den Special Wert, je nach Modus steht hier der Einzeltrack oder bei „von bis“ der von-Track
  • RotSwMap[x][3] den Special2 alias „bis“-Wert
    „x“ steht für die Position des Schalters.

Lasst euch durch die Werte in dem Beispiel nicht verwirren, das kommt aus meine Fork, in dem schon einiges ergänzt wurde.

    analogReference(DEFAULT);

      // Enum_PlayMode
      //        Hoerspiel_1 = 1,
      //        Album_2 = 2,
      //        Party_3 = 3,
      //        Einzel_4 = 4,
      //        Hoerbuch_5 = 5,
      //        Hoerspiel_von_bis_7 = 7,
      //        Album_von_bis_8 = 8,
      //        Party_von_bis_9 = 9,
     
      //              |Folder No.|                 |Mode|                               |Special|                  |Special2|
      RotSwMap[0][0] =     1;     RotSwMap[0][1] =  Album_2;             RotSwMap[0][2] = 0;         RotSwMap[0][3] = 0;
      RotSwMap[1][0] =     2;     RotSwMap[1][1] =  Album_2;             RotSwMap[1][2] = 0;         RotSwMap[1][3] = 0;
      RotSwMap[2][0] =     3;     RotSwMap[2][1] =  Party_3;             RotSwMap[2][2] = 0;         RotSwMap[2][3] = 0;
      RotSwMap[3][0] =     4;     RotSwMap[3][1] =  Party_3;             RotSwMap[3][2] = 0;         RotSwMap[3][3] = 0;
      RotSwMap[4][0] =     5;     RotSwMap[4][1] =  Party_3;             RotSwMap[4][2] = 0;         RotSwMap[4][3] = 0;
      RotSwMap[5][0] =     6;     RotSwMap[5][1] =  Party_3;             RotSwMap[5][2] = 0;         RotSwMap[5][3] = 0;
      RotSwMap[6][0] =     7;     RotSwMap[6][1] =  Party_3;             RotSwMap[6][2] = 0;         RotSwMap[6][3] = 0;
      RotSwMap[7][0] =     8;     RotSwMap[7][1] =  Party_3;             RotSwMap[7][2] = 0;         RotSwMap[7][3] = 0;
      RotSwMap[8][0] =     0;     RotSwMap[8][1] =  FreezeDance_2;       RotSwMap[8][2] = 0;         RotSwMap[8][3] = 0;
      RotSwMap[9][0] =     0;     RotSwMap[9][1] =  PuzzleGame_8;        RotSwMap[9][2] = 1;         RotSwMap[9][3] = 0;
      RotSwMap[10][0] =    0;     RotSwMap[10][1] = QuizGame_9;          RotSwMap[10][2] = 1;        RotSwMap[10][3] = 0;
      RotSwMap[11][0] =    0;     RotSwMap[11][1] = ButtonSmash_10;      RotSwMap[11][2] = 5;        RotSwMap[11][3] = 5;

      RotSwCurrentPos = RotSwGetPosition();

Jetzt braucht es noch ein paar Methoden, welche die Arbeit machen. Die erste liest die Position des Drehschalters, die zweite startet nach Position und Inhalt des Arrays, den entsprchenden Ordner.

uint8_t RotSwGetPosition ()
{
  float analogValue = (analogRead(ROTARY_SWITCH_PIN) * ROTARY_SWITCH_REF_VOLTAGE) / 1024.0;

  for (uint8_t x = 0; x <= ROTARY_SWITCH_POSITIONS; x++)
  {
    if (analogValue > (ROTARY_SWITCH_STEP_MIN * x) && analogValue < (ROTARY_SWITCH_STEP_MAX * x)) {
          return x+1;          
    }   
   }
}

void RotSwSet (uint8_t RotarySwitchPosition) {
    folderSettings myRotSw;
    
    if (RotSwMap[RotarySwitchPosition-1][0] != 0) {
    
      myRotSw.folder = RotSwMap[RotarySwitchPosition-1][0];
      myRotSw.mode = RotSwMap[RotarySwitchPosition-1][1];
      myRotSw.special = RotSwMap[RotarySwitchPosition-1][2];
      myRotSw.special2 = RotSwMap[RotarySwitchPosition-1][3];
      myFolder = &myRotSw;
      playFolder();
      
    } 
}

Damit es auch funktioniert muss noch ein kleiner Teil in den „void loop()“ inerhalb der „do“ Schleife. Es wird nur bei Änderung der Stellung der Inhalt der neuen Stellung abgespielt.

Bei Start der Box passiert erst einmal nichts, man muss mindestens einmal drehen. Falls man das ändern will, muss man den Aufruf „RotSwCurrentPos = RotSwGetPosition();“ im „void setup()“ entfernen.

if (RotSwCurrentPos != RotSwGetPosition()) {
  RotSwCurrentPos = RotSwGetPosition();
      Serial.print("Current Rotary Switch Position: ");
      Serial.println(RotSwCurrentPos);
  RotSwSet(RotSwCurrentPos);
}

Ich plane noch weiter Funktionen umzusetzen:

  • Auswahl von Modifier wie den Pausetanz
  • Systembefehle wie z.B. Lautstärke oder Ausschalten
  • Ein bestätigung der Auswahl über einen Trigger. Entweder einen Knopfdruck oder nach ablauf einer gewissen Zeit, sodass man nicht jeden Inhalt sofort anspielt, wenn man mehrere überspringen muss/will.

So ich hoffe der Einbau klappt, sonst einfach nochmal melden.
@revilo du wohnst ja um die Ecke, ich kann dir damit auch persöhnlich helfen.

Meine Bestellung müsste auch die nächsten Tage eintreffen. Habe mich für die nächste Zeit noch mit Arduinos und Zubehör eingedeckt. Werde eventuell länger frei haben (keine Quarantäne ):wink:.
Dann werde ich auch starten.
Denke das ich beim Code einfügen etwas Probleme bekommen könnte, dann werde ich eventuell noch Hilfe brauchen.

Bin gespannt auf deine fertige Box.

Gerne können wir uns auch persönlich austauschen.
Würde gerne noch ein paar Boxen zum verschenken oder verkaufen bauen.
Bin momentan dran die Arbeitsgänge zu optimieren und habe meine Bastelwerkstatt aufgerüstet.

Meine Box ist ja eigentlich schon fertig und soll aufgerüstet werden.

Ich bin mir momentan nur noch über das wie unschlüssig.

Es soll noch ein Rotary Encoder für die Lautstärke dazu kommen.

Gute Idee. Mir kam gerade der Gedanke, dass es schön wäre, wenn man adhoc andere Abspielmodi auswählen könnte, z.B. Zufallswiedergabe. AFAIK gibt es dafür allerdings keine Modifier Karten…

Das handling mit den restlichen Abspielmodis wäre hier leider zu komplex.

Ich habe jetzt das Programm um einige Funktionen erweitert.
Es gibt jetzt einen zeitlichen Trigger. Das bedeutet, das der Drehschalter eine Zeit x auf der Position verharren muss, bevor diese aktzeptiert wird.

Es gibt jetzt auch die Möglichkeit den Drehschalter mit Modifiertags zu belegen.

Und es gibt die Möglichkeit Systembefehle auf die Positionen zu legen.

Ich werde aber keine Änderungsanweisung dafür online stellen, da der Umbau der Originalsoftware zu komplex ist.
Stattdessen werde ich meinen Fork hier posten sobald er komplett fertig ist.

Ich habe meinen Fork soweit das ich ihn veröffentlichen möchte:

Bitte meldet mir Fehler, ich habenicht die Zeit alles im Detail zu testen.

UPDATE:

Ich habe meinen Fork weiter verbessert/verändert.

Es ist jetzt möglich, den Drehschalter im Admin Menü zu konfigurieren.
Neben normalen Short Cuts zu Ordnern, sind auch Modifikationen oder System Befehle konfigurierbar.

Alle weiteren Features sind im GitHub Repository beschrieben.

Kurzes Update zu meiner „Revolverbox“
Die einzelnen Positionen haben Nummern bekommen, diese werde ich noch durch kleine Bilder ersetzen . Für die Lautsprecher habe ich eine Abdeckung, Marke Eigenbau angebracht.!
Ich habe mir einen einstellbaren Kreisbohrer zugelegt. Mit diesem wird der große Ring ausgebohrt. Der kleinere Ring wird mit einem Steckdosenbohrer hergestellt. Ein Stück Stoff dazwischen, das ganze mit Heißkleber fixiert, ringsherum den überschüssigen Stoff abschneiden und fertig.
(Der Ring auf dem Bild ist leider gebrochen)

@marco-117: Habe den Drehregler und jede Menge China Arduino Nano geliefert bekommen. Werde als nächstes deine elektronische Version umsetzen.






6 „Gefällt mir“

Gute Idee mit den Ringen

1 „Gefällt mir“

die KIta meines Kindes erlaubt nichtmal das man da 2 Bögen Bastelpapier spendet…hinterletzter Sauverein… wär so cool sowas da abzugeben…aber… ja…

Für fast jede Regel gibt es einen (guten) Grund. Damit wird wahrscheinlich vermieden, dass jeder seinen „Schrott“ in der Kita entsorgt :slight_smile:

Bei uns gibt es einen Förderverein der sich darum kümmert, was für die Kita angeschafft wird. Die verwalten auch die Spenden. Leider konnte ich mich nicht durchsetzen und es wurden Tonieboxen angeschafft… hinterletzter Sauverein :joy:


Die Kita Box sieht richtig toll aus und die Idee mit den Ringen ist grandios. Toll wie viele schöne Anregungen man hier findet. Ich finde diese Lautsprechergitter gar nicht schön. Ich hab dafür 288 kleine Löcher ins Holz gebohrt und dabei ist mir mein Lidl Akkuschrauber abgebraucht :frowning:

Die Wahlscheibe würde ich vielleicht etwas flacher machen, kann aber auf dem Foto auch täuschen. Wie wurde die Box denn angenommen? Funktioniert alles wie gewünscht?

Gruß
Papa

Man darf nicht vergessen, dass da auch sowas wie Haftung und Konformität eine Rolle spielen.

Ein Produkt das auf dem deutschen Markt vertrieben wird braucht minimum eine CE Kennzeichnung und der Hersteller und / oder Verkäufer müssen im Schadensfall haften.

Das bietet ein DIY TonUINO nicht.

Spannend, die voll mechanische Lösung. Wie so eine alte Jukebox, nur das hiet keine Vinyls durch den Wechsler laufen, sondern RFIDs.

Eigentlich brauchst du für dein Konzept mit der Drehscheibe gar kein Tonuino. Der DF Player kann über die AD Key Eingänge bis zu 14 Titel direkt anwählen. Du könntest also einfach den Drehschalter vom Marco nehmen und mit den Widerständen aus dem DF Payer Handbuch beschalten. Das ganze direkt an den DF Player und es gibt einen Low Budget Tonuino.

1 „Gefällt mir“

Schon klar. Hier ging es aber um die Spende von Bastelpapier. In meinem Fall kannten zwei Väter die Toniebox und schwärmten davon. Vom Tonuino hatte noch nie jemand etwas gehört und bei „selbst gebaut“ war die Hälfte auch gleich skeptisch.

Auch eine gute Idee.

Jetzt weis ich auch, was ich noch mit dem DF Player anfangen kann, bei dem ich die Serielle geschossen habe.

Ein Gnadenbrot für DF Player mit Verbindungsstörungen.

Quasi der Lowbudgoino als Upcycling Initiative.

Hab das grad mal getestet. Oben erwähnter DF-Player, alter USB Stick, Lautsprecher aus der Restekiste, Drehschalter zur Auswahl und drei Taster. Dazu je ein gutes Dutzend 100K, 10K und 1K Widerstände, fertig. Der Drehschalter ist das teuerste an dem Ganzen.

Geht sogar ganz gut. Mit dem Wahlrad den richtigen Widerstand auswählen und auf Tastendruck (Play) kurz gegen Gnd ziehen. Lang drücken ist gewählter Titel in Dauerschleife.

Dann noch zwei Buttons für Laut und Leise, und fertig ist die Kiste.

An/Aus bringt die Powerbank schon mit. Den kann man mechanisch durchs Gehäuse raus legen (Abgesägter Bleistift mit Radiergummi am Ende als Puffer).

Einschränkung ist max. 14 Titel und ein bisschen doof ist, dass man Laut/Leise und Next/Prev bei dem Ding nicht trennen kann. Das geht bei den HW Eingängen über langes und kurzes drücken. Wobei laut/leise eben lang ist. Jetzt kann man leider nicht verhindern, dass jemand kurz auf die Taste drückt, und damit den nächsten Titel anspringt.

Aber sonst die günstige Alternative für ganz einfache Anwendungen.