Party-Modus erstellt immer die selbe Queue

Moin!
Ich habe bei meiner AiO-Plus das o.a. interessante Phänomen festgestellt.
Der Nachwuchs hört z.Zt. immer die selbe Karte, programmiert im Party-Modus auf einen Ordner mit 47 Hörspielen. Beim ersten Auflegen der Karte nach dem Einschalten „würfelt“ die Box die Hörspiele immer in die selbe Reihenfolge: 18, 33, 4, 25, 27, 8, 16, 13…
Diese Reihenfolge wird gehört bis z.B. Pause gedrückt wird. Dann greift irgendwann der StandbyTimer und die Box schaltet ab. Nach dem erneuten Einschalten wird besagte Karte wieder aufgelegt und die Titel werden wieder in der Reihenfolge 18, 33, 4 usw. abgespielt.
Ein zweites Auflegen der Karte erstellt eine andere Queue, aber auch die ist reproduzierbar beim zweiten Auflegen immer die selbe.
Mir ist klar, dass das mit dem Zufall seine Grenzen hat, aber das Phänomen tritt bei meiner classic-Variante nicht auf und auch bei der AiO ohne Plus konnte ich das bisher nicht feststellen.
Installiert ist auf der Box die originale 2.2 Firmware vom online Update.
Ich habe auch schon die 2.2 über die IDE aufgespielt und die DF-Player-lib von 1.10 auf 1.07 herabgesetzt, aber das Phänomen bleibt.

1 „Gefällt mir“

Ich hab das gerade mal bei mir getestet. Es passiert bei mir auch. Beim Hörspielmodus ist es genauso. Nach dem Anschalten wird immer der selbe Track gespielt.

Sieht so aus als würde random() nach dem Start immer das selbe ergeben. Das sollte ja durch randomSeed() verhindert werden.

Deshalb dachte ich, dass A7 an der AiO-Plus einfach nicht genug rauscht. Also habe ich mal einen anderen Pin probiert. Das ändert aber nichts. Außerdem benutzt @Boerge1 bei der TonUINO-TNG auch A7 und da tritt das Problem nicht auf.

Den Zufall konnte ich etwas verbessern in dem ich das Konstrukt

umgeschrieben habe in

ADCSeed = ADCSeed ^ ADC_LSB << (i % 32);

Jetzt kommt die o.a. Queue nicht mehr jedes Mal und es besteht eine gute Chance auf eine andere Reihenfolge auch wenn diese Reihenfolge immer noch häufiger vor kommt als andere.

off-topic:
Mir ist aber noch eine andere Sache aufgefallen: Ich kann die Lautstärke auf null setzen obwohl die minimale Lautstärke bei mir 1 ist.
In der Konsole wird auch minimal die 1 angezeigt, aber manchmal ist schon bei 4 der Lautsprecher stumm, manchmal auch erst bei 2 oder 1.
Das tritt bisher für mich nicht klar reproduzierbar auf.

Hmm, dann fehlen aber Klammern:
ADCSeed = ADCSeed ^ (ADC_LSB << (i % 32));
Aber dann wäre es auch wieder das Selbe wie oben.
Ich glaube eher, dass ein delay(1) in der obigen Schleife fehlt, damit die ADC auch wirklich Zeit hat, andere Werte zu liefern.
Außerdem Sollte ADCSeed initialisiert werden
uint32_t ADCSeed = 0;
sonst kommt ein Compiler Warning.

2 „Gefällt mir“

Das es das Selbe ist, war mir bewusst und meine Intention, aber dann unvollständig umgeschrieben. Hatte die komische Idee, dass der MegaX-Core, aus was Gründen auch immer, den Operator ‚^=‘ vielleicht nicht versteht. :face_with_hand_over_mouth:
Werde Deine Vorschläge auf jeden Fall testen und hier berichten.

Das delay war es!
Es kann so einfach sein :joy:
Auch wenn ich kein Compiler Warning hatte, habe ich auch, wie empfohlen, ADCSeed noch initialisiert.
Danke für Deine Hilfe!

Lustiger Effekt.
Wenn ich das richtig verstehe, hat das System die erste gewuerfelte Sequenz nnoch irgendwo im Speicher. Und wenn dann die Wuerfelzeit nicht reicht, werden die gespeicherten Werte genommen?

Nein, der Würfel hat nicht genügend Schwung drauf…
Durch

Liegt er immer gleich in der Hand und wenn man ihm keine Zeit gibt, lässt er den Würfel einfach fallen. Immer die gleiche Fall Bewegung, ergibt dann immer das gleiche Ergebnis.
Das Delay lässt ihm einen Zeitraum von 128ms um eine Kraft zum würfeln zu bestimmen.
In Verbindung mit dem Rauschen am offenen analog Pin kommt dann ein Zufall

2 „Gefällt mir“

Der Code für randomSeed ist in der original Software ja für alle drei Varianten gleich.

Ist also die Plus „schneller“ im Abarbeiten des Code als die beiden anderen Varianten, so dass das fehlende delay nur bei ihr ins Gewicht fällt?!

Klingt kurios, könnte aber durchaus sein.
Ich hatte mich aber auch mal mit befasst, dass der Zufall bei mir in der classic kein Zufall war.
Ich hatte damals den Zufall immer neu berechnet, als eine Karte aufgelegt wurde, dann hatte man den Zeit faktor als Zufall. Der ist beim Starten ja immer gleich

Es ist tatsächlich so, dass die AiOPlus deutlich schneller ist. Merkt man schon an der Startzeit des Tonuino. Den gleichen Effekt hatte ich schon beim Klassik mit Arduino Every. Der hat die gleiche MCU.

Also sollte das delay am besten bei allen Hardware-Varianten ergänzt werden.

Wie kommt der Fix denn jetzt am besten ins online-update?

Wie Groß hast du das Delay gesetzt? Und innerhalb der for Schleife im Setup ? Habs jetzt mal mit 100 probiert.

 for (uint8_t i = 0; i < 128; i++)
  {
    ADC_LSB = analogRead(RandomPin) & 0x1;
    ADCSeed ^= ADC_LSB << (i % 32);
    delay(100);
  }
  randomSeed(ADCSeed);

Das ist viel zu groß, dann dauert es ja 12 Sekunden. Delay(1) sollte reichen.

Ja ok. Hatte ich mir dann auch überlegt.War dann auf 10 gegangen. Werde das mal durchprobieren, wie weit man da runtergehen kann.

Genau.
Habe auch nur ein delay(1) genommen.

Habs eben auch noch mal gesehen. Wer lesen kann ist klar im Vorteil. :see_no_evil: :see_no_evil: :see_no_evil:

1 „Gefällt mir“