Mein Frage wäre schon fast was fürs Analogforum, aber ich denke sie ist
doch hier besser platziert.
Ich bin dabei elektronische Glühwürmchen zu basteln, die ich im Garten
in die Sträucher hängen will (ATtiny13, LED + Batterie). Programmiert
habe ich das mit LunaAVR (ähnlich Bascom).
Damit das Ganze nicht aussieht wie eine synchron blinkende Lichterkette,
sollen die ATtiny13 unterschiedlich schnell starten. Der Start soll
zwischen 0 und 50 Sekunden dauern. Das heißt ich brauche beim Start eine
echte Zufallszahl.
Wie mache ich das am besten?
Mit seed und rnd() geht das nicht. Und für jedes Modul eine anderen
seed-Wert anzugeben macht wenig Sinn und bringt auch kein gutes
Ergebnis.
1
seed11845
2
wartezeit=rnd()
3
waitwartezeit
Meine Idee wäre ein Rauschgenerator am ADC-Eingang gewesen. Allerdings
läuft meine Schaltung mit 2,5-3V. Keine Ahnung wie ich da ein Rauschen
erzeugen soll. Ich habe es wie in oben gezeigter Schaltung mit
verschiedenen Germaniumdioden versucht, aber ich konnte selbst mit 9V
keiner ein messbares Rauschen entlocken.
Eine 1N34A soll bei 3V angeblich 30mV rauschen:
https://noisio.de/blog/small-voltage-noise-source
Ich habe daran irgendwie Zweifel. Bei meinem Versuchsaufbau passierte
nämlich gar nichts. Wenn das wirklich so ginge, bräuchte ich ja nur eine
Diode zwischen zwei Ports klemmen.
Der Schaltungsaufwand sollte auch gering bleiben. Sonst könnte ich einen
Port nutzen und mittels Drossel beim Start für ein paar Sekunden eine
höhere Spannung erzeugen und einen Rauschenerator damit speißen. Dann
wäre aber das Hühnerfutter teurer und größer als das ganze Huhn.
Eine andere Idee wäre die Spannung an einem LDR zu messen, den ich
gleichzeitig nutzen könnte um am Tag Strom zu sparen.
Wozu der Aufwand?
Schaffst Du es tatsächlich z.B. 10 Blinkedinger exakt zur gleichen Zeit
einzuschalten?
Oder schaltest Du sie einen nach dem anderen ein und das mit
"menschlicher" Genauigkeit?
Tim D. schrieb:> Das heißt ich brauche beim Start eine> echte Zufallszahl.
Du weißt sicher nicht, was du da sagst.
Für den Blinkefummel reicht irgendwas.
Sebastian S. schrieb:> Schaffst Du es tatsächlich z.B. 10 Blinkedinger exakt zur gleichen Zeit> einzuschalten?
Sie schalten sich bei Dunkelheit automatisch ein.
michael_ schrieb:> Du weißt sicher nicht, was du da sagst.> Für den Blinkefummel reicht irgendwas.
Natürlich reicht "irgendwas", aber das muss erst mal da sein. Ein
Pseudozufallsgenerator bringt beim Start immer das gleiche Ergebnis.
Da der ATiny13 mit internem R/C-Clock arbeitet, laufen die Oszillatoren
ganz von selbst nach kurzer Zeit auseinander.
Ansonsten lass einfach einen ADC-Eingang in der Luft hängen und fang Dir
so irgendeinen Startwert ein.
Tim D. schrieb:> Sie schalten sich bei Dunkelheit automatisch ein.
Was will man mehr? Es muss nur jeder seinen eigenen LDR haben.
Oder STM32G041J6M. Erzeugt im SO-8 Gehäuse auf dem Chip ziemlich echte
Zufallszahlen.
Du brauchst garnichts tun. Solange du keine externen Quarze oder
Oszillatoren verwendest, werden die Teile in wenigen Sekunden bereits
mit dem bloßen Auge sichtbar asynchron laufen. Nach ein paar Minuten
dann komplett. Hatte das "Phänomen" neulich mit einigen STM32, die den
gleichen Code haben und parallel eingeschaltet werden und bei den alten
AVR-Dingern wird es noch viel schlimmer sein.
Hermann Kokoschka schrieb:> Da der ATiny13 mit internem R/C-Clock arbeitet, laufen die Oszillatoren> ganz von selbst nach kurzer Zeit auseinander.
Wenn die wirklich so driften, wäre das ja super. Jedenfalls für meine
Anwendung. Ich probiere es später mal aus.
Stefan+ schrieb:> Hallo,> bedenke aber:> "männliche Glühwürmchen betören die Damen mit Blinken im Gleichtakt"
Ja, das bei meiner Anordnung zeitlich unterschiedliche Aufleuchten
entspricht nicht dem natürlichen Verhalten von Leuchtkäfern. An meinem
alten Wohnort konnte ich sie in der Natur beobachten. Vor ein paar
Wochen habe ich mir noch Videos angesehen. Sie fliegen auch umher und da
ich meine Platinen nicht fliegen lassen kann, soll wenigstens der
Eindruck entstehen, dass sie sich bewegen. Das versuche ich durch
zeitversetztes Aufleuchten sowie durch den Einsatz von zwei LEDs je
Schaltung. Wenn die Dinger fertig sind, zeige ich Fotos bzw. ein Video
und die Schaltung mit Code.
Wie jetzt? Weil die Natur keine Glühwürmchen bietet, basteln wir uns
Elektromüll? Ist es echt schon so weit?
"Erst wenn der letzte Baum gerodet, der letzte Fluss vergiftet, der
letzte Fisch gefangen ist, werdet ihr merken, dass man Geld nicht essen
kann."
SCNR
Man könnte den ADC mit kleiner Referenz betreiben, um das
Quantisierungsrauschen zu nutzen. Z.B. mit 3 Widerständen Uref = 100mV,
Uin = 50mV.
Oder nen ATtiny25 nehmen und dessen Temperatur auslesen.
Tim D. schrieb:> Wenn die wirklich so driften, wäre das ja super. Jedenfalls für meine> Anwendung.
Nicht nur das. Wenn jedes 'Glühwürmchen' sich über z.B. einen eigenen
LDR lichtabhängig einschaltet, wirst du nie ein synchrones Verhalten
erreichen. Die Bauteiltoleranzen und auch die Ausrichtung des LDR werden
dafür sorgen, dass das zu deutlich unterschiedlichen Zeiten passiert,
u.U. im Minutenbereich.
hm
Bei den meisten Programmiersprachen kann man RND angeben.
Bei BASCOM Gibst du ein Bereich an in den die Zufallszahl liegt.
Also zwischen 0 - "deine Wahl"
wartezeit=rnd(50)
Gibt einen Wert von 1 bis 50 aus.
Hier nachzulesen.
https://avrhelp.mcselec.com/index.html?rnd.htm
Wenn du den Wert also in einer Schleife neu berechnen solltest jedes mal
sollte das mit Sicherheit zufällig genug sein.
Nachtrag bevor einer meckert.
Ich weiß nicht ob RND bei 0 oder mit 1 als kleinste Zahl ausgibt.
Das machen die Programmiersprachen wie sie Laune haben. Bei vielen
Basic-Versionen liegt der RND-Wert zwischen 0 und 1. und man muss ihn
mit den Wunschfaktor mal nehmen und dann integer setzen. Da ist genau 0
nicht möglich.
Schlaumaier schrieb:> Nachtrag bevor einer meckert.
Wir meckern trotzdem, weil Du die Problematik nicht verstanden hast.
Beim Einschalten hat der Seed auf jedem Controller den gleichen Wert,
weswegen RND immer mit dem selben Wert startet.
Ich meckere jetzt aber doch: Die Natur von Pseudozufallszahlen ist dir
bekannt? Selber Seed, selbe Zahlen? Wenn jetzt auf jedem µC das selbe
Programm mit dem selben Seed läuft ist genau nichts erreicht. Hat ja
auch der OP schon geschrieben...
Mario M. schrieb:> Wir meckern trotzdem, weil Du die Problematik nicht verstanden hast.> Beim Einschalten hat der Seed auf jedem Controller den gleichen Wert,> weswegen RND immer mit dem selben Wert startet.
Stimmt. In einem Spiel hab ich den Pseudozufallsgenerator immer im 100Hz
Interrupt mitlaufen. Wenn dann Eingaben kommen und das Spiel beginnt,
ist der Wert "echt" zufällig, weil der Startzeitpunkt unmöglich auf 10ms
genau getroffen oder reproduziert werden kann.
Falk B. schrieb:> Mario M. schrieb:>> Wir meckern trotzdem, weil Du die Problematik nicht verstanden hast.>> Beim Einschalten hat der Seed auf jedem Controller den gleichen Wert,>> weswegen RND immer mit dem selben Wert startet.
Doch habe ich.
Ich habe nur nicht gewusst das der SEED immer gleich ist. Da mir dieser
Befehl noch nicht untergekommen ist.
Bei einigen Basic-Dialekten setze ich "Randomize Timer" als Befehl
davor. Damit wird das was du als SEED bezeichnest , durch den Timer
zufällig verwusselt.
Im Prinzip das selbe wie FALK macht.
Ist halt alles ein Klimmzug weil es keine Mathematische Unlogik gibt.
Weshalb Verschlüsselungssystem PI so gern mögen. ;)
ziege schrieb:> Wenn jetzt auf jedem µC das selbe> Programm mit dem selben Seed läuft ist genau nichts erreicht. Hat ja> auch der OP schon geschrieben...
Ist natürlich so.
Aber er hat auch einen LDR, der Tag und Nacht erkennt. Vor dem
Abschalten am Morgen kann er ja die nächste generierte Zufallszahl als
neues Seed zwischenspeichern und dann am nächsten Abend daraus eine
Zufallsfolge starten. Immer vorausgesetzt, die laufen mit unabhängigem
Takt (das würde schon reichen) und erst recht mit der
Tag-/Nacht-Erkennung.
Ich sag mal so: wenn er die Aufgabe hätte, n autonome
'Glühwürmchen'-Einheiten mit der Tag-/Nacht-Erkennung absolut synchron
laufen zu lassen, dann hätte er ein Problem!
Also ich nehme dafür gerne einen in der Luft hängenden ADC Pin, gerne
den Reset weil der eh übrig ist und den dann noch mehrfach mit der
Differenz zwischen Watchdog und Main Clock geschoben.
Um die Zeiten noch "zufälliger" zu machen, kannst Du den
Watchdog-Oszillator als Systemtakt verwenden. Der streut noch viel
extremer. Allerdings sind 128 kHz nominal schon ziemlich langsam. Aber
fürs LED Blinken könnte das noch reichen.
Als seed kann man auch noch denken an
- Startup Counter in EEPROM *1
- Wert von OSCCAL
- Alle benuztte und unbenutzte ADC kanaele
Vorzugsweise combination von diese und alle genennte seed-Quellen
*1 : Beim Programmieren kann man bewusst jeden Prozessor einen anderen
Startup Counter geben durch mehrmals ein/ausschalten
Patrick aus die Niederlaende
freitag ist frei schrieb im Beitrag #7021148:
> Warum kannst du die Zufallszahl bei den paar Dingern nicht "hart" in den> Quellcode hauen?
Weil die Zufallszahl immer auf einer Berechnung einer Grundlage Basiert.
Ist die Grundlage gleich ist es die "Zufallszahl" auch.
Wie geschrieben , ES GIBT KEIN MATHEMATISCHEN ZUFALL.
Die einfachste Lösung ist (bei Arduinos z.b. weil die kleinen
Flash-Speicher haben) die letzte Zufallszahl in den Flash zu schreiben,
und die beim Neustart als neue SEED o.s. zu benutzen. Also als Grundlage
der Berechnung der neuen Zufallszahlen.
Moin, -
ein richtig guter Ansatz waere der Einsatz einer Lava-Lampe (siehe z.B.
Wikipedia). Das Flackern der Lampe kannst Du dann als Seed fuer Deinen
Pseudo-Zufallzahlen-Generator benutzen (Cloudflare benutzt Lava-Lampen
https://www.cloudflare.com/learning/ssl/lava-lamp-encryption/)
Gruesse
Th.
P.S.: Wie Du das mit Deinem Gluehwuermchen verheiratest -> groesseres
Projekt
>ein richtig guter Ansatz waere der Einsatz einer Lava-Lampe
Absolut! Man nehme eine grüne Lampe, lackiere sie komplett schwarz und
kratze ein kleines Loch frei. Ergibt ins Gebüsch gestellt die perfekte
Illusion.
Schlaumaier schrieb:> Ist die Grundlage gleich ist es die "Zufallszahl" auch.
Würfel kaufen.
@TE: Wie soll das Konstrukt eigentlich gleichzeitig eingeschaltet
werden, wenn das batteriebetriebene und voneinander unabhängige
Einheiten sind?
Schaltest du die manuell ein?
→ Verzögerung automatisch vorhanden
Laufen die einfach durch und gehen nach x Stunden aus/an?
→ Verzögerung durch ungenauen internen Takt nach etwas Laufzeit
vorhanden
Steuerst du das über einen LDR?
→ Verzögerung durch LDR-Toleranzen, ADC-Rauschen, bewegliche
reflektierende Blätter etc. vorhanden
freitag ist frei schrieb im Beitrag #7021148:
> Warum kannst du die Zufallszahl bei den paar Dingern nicht "hart" in den> Quellcode hauen?
Oder einen mehrfachen DIP-Schalter am Anfang abfragen.
Oder verschiedene Quarze einsetzen.