Pages: [1] 2   Go Down
Author Topic: random Seed ohne analog read  (Read 1495 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hy,
ich habe ein Arduino Uno und möchte auf meinem 4x4x4 led cube mittels Zufallszahlen eine Animation laufen lassen...
Habe aber Probleme mit random Seed, also zufällige "Startpunkte" für die "pseudo" Zufallszahlen:
 - srand(time(NULL)); kann man ja leider in der arduino IDE nicht nutzen
 - alle I/O Pins sind belegt durch den cube, daher kein analogread möglich (oder können andere Pins "missbraucht" werden ?! )
 - und randomSeed(millis()); bringt auch immer wieder die gleiche Animation smiley-sad

welche (einfache) möglichkeiten gibt es noch, zufällige "seeds" zuerzeugen ?

mfg

hobo
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Könntest du nicht einfach beim Start des Sketches ein paar Werte über die analogen Eingänge lesen und nur die jeweils niedrigstwertigen Bits verwenden? Die sollten eigentlich immer ziemlich rauschen, egal was an den Eingängen hängt...
Die Bits könntest du dann alle hintereinander schreiben und die daraus entstandene Zahl an randomSeed weitergeben.
Das dürfte ja eigentlich auch in Sekundenbruchteilen machbar sein, fällt also nicht auf.

Irgendwie soetwas: (ungetestet)
Code:
int i;
long int seed = 0;

for (i = 0; i<64; i++)
{
   seed |= (analogRead(A0) & 0x01) << i;
}

analogSeed(seed);
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Könntest du nicht einfach beim Start des Sketches ein paar Werte über die analogen Eingänge lesen und nur die jeweils niedrigstwertigen Bits verwenden? Die sollten eigentlich immer ziemlich rauschen, egal was an den Eingängen hängt...
Die Bits könntest du dann alle hintereinander schreiben und die daraus entstandene Zahl an randomSeed weitergeben.
Das dürfte ja eigentlich auch in Sekundenbruchteilen machbar sein, fällt also nicht auf.
Das weiß hoboPowa bereits; sein Problem ist daß er keine Analogen Eingänge frei hat da er alle Eingänge für den LED-Würfel braucht.
Viele Grüße Uwe
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmm ok, nach einem kleinen Test muss ich zugeben, dass ich mit meiner Idee wirklich falsch lag. Ich meine nämlich irgendwo mal gelesen zu haben, dass das letzte Bit beim ADC eigentlich immer kräftig rauscht... Scheint aber wohl doch nicht der Fall zu sein.
Logged

Berlin
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mh, ich hätte da ne Idee, ob und wie´s funktioniert weis ich allerdings nicht.
Der ATmega hat soweit ich weis einen internen Temperatursensor, der sollte doch einen gewissen zufälligen Wert liefern.
Wenn gewünscht, dann würd ich auch helfen den Ansatz weiter auszuarbeiten.
MfG Jago
Logged

Nothing is impossible ^^

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der bringt aber auch nicht wirklich zufällige Werte da der Arduino ja meist Raumtemperatur hat und deswegen nicht sonderlich unterschiedlich mißt.
Das einzige was mir einfällt ist einen analogen Eingang oder das interne Temperatur messen und nur das niederwertigsten oder die beiden niederwertigsten Bits der Messung zu nehmen und aus mehreren Messungen einen 8 oder 10 Bit Wert zusammenstellen. Der müßte dann ziemlich zufällig sein.
Grüße Uwe
 
Logged

Berlin
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaub wir komm der Lösung näher. Hab grad mal ins Datenblatt geschaut. Der interne Temperatursensor ist super ungenau +-10°C und gibt 380mV bei 85°C raus. 0,7 Vref an einer Diode abgegriffen dürfte den A/D Wandler ordentlich zum rauschen bring und wenn man dann noch die unteren Bits nimmt, dann sollte der Wert wirklich zufällig sein.
Und? Lösung oder nicht Lösung?
MfG Jago

PS.: Besser noch ne Germaniumdiode, die dürfte bei 0,3V oder so liegen (bei 25°C sinds 314mV muss man ggf schauen das der A/D Wandler nicht übersteuert wird.)
« Last Edit: May 04, 2012, 04:57:53 pm by Jago » Logged

Nothing is impossible ^^

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jago, wie montiert man eine Germaniumdionde in den Atmega rein?
Grüße Uwe
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aref ist kein Output-pin und sollte damit trotz aller belegten Pins noch für eine externe Beschaltung zu gebrauchen sein.
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmm in wiefern würde denn ein Rauschsignal an Aref helfen?
Und kann es nicht den ADC beschädigen, wenn die Spannung, die anliegt höher ist als die Referenzspannung?
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aref ist kein Output-pin und sollte damit trotz aller belegten Pins noch für eine externe Beschaltung zu gebrauchen sein.
Ich bin heut schwer von Begriff. Was soll mit Aref gemacht werden?

Aref ist der Ausgang der Referenzspannung für den A/D-Wandler. Dieser wird beim ATmega328 intern auf die Versorgungsspannung, eine interne 1,1V Referenz oder gar nicht geschaltet. Im Falle daß er gar nicht beschaltet ist kann von außen eine Referenzspannung angelegt werden. Ein 0,1µF-Kondensator dient zur Stabilisation.
Man kann eine "Zufallsspannung" als externe referenz anlegen und darum einen fixe Spannung wie zB von den LED als Zufälliges Meßergebnis lesen. Dazu muß aber die Referenzspannung größer als die Meßspannung sein.

Da fine ich es einfacher mehrere Meßungen zu mache und nur das niederwertigste Bit zu nehmen, da dazu keine zusätzliche Elektronk notwendig ist.

Viele grüße Uwe
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aref kriegt nicht das Rauschen selbst, nur eine niedrige Spannung damit eine rauschende interne Größe stärker ins Gewicht fällt.
Konsultieren wir das ATmega328P-Datenblatt (http://www.atmel.com/Images/doc8161.pdf), sehen wir in Kapitel 23.8, dass sich ein interner Temperatursensor über den ADC messen lässt, also lässt sich eine Größe ohne Verbrauch von Pins messen. Wenn man die Referenzspannung weiter reduziert (externe Diode an AREF), wird die Abtastgenauigkeit und damit die Schwankungsbreite weiter erhöht.
Weiterhin sagt das Datenblatt "Single ended channels that exceed VREF will result in codes close to 0x3FF." (23.5.7), d.h. es ist möglich zu hohe Spannungen zu messen, der gemessene Wert wird aber irgendwo beim Maximum liegen.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen dank für die vielen hilfreichen Antworten  smiley-lol
Hatte leider die letzten 2 Tage keine Zeit zum lesen und antworten...
Außerdem stand ich beim schreiben des threads total aufm schlauch  smiley-red
Man kann ja einfach im setup (oder sogar im Hauptprogramm) einen der analogen Pins oder der digtalen Pins mit PWM als input definieren, Seed bestimmen und danach wieder als output definieren und verwenden ... die Geschichte mit dem Temperaturfühler, Aref und dem A/D wandler werd ich mir anschauen, wenn ich mich tiefer in die ganze Materie eingearbeitet habe

MfG hobo

PS: sorry für den verwirrenden thread titel, ich war, ka warum, davon ausgegangen, dass ich die Pins nicht als input nutzen kann (weil der cube dran hängt)   smiley-confuse
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Man kann ja einfach im setup (oder sogar im Hauptprogramm) einen der analogen Pins oder der digtalen Pins mit PWM als input definieren, Seed bestimmen und danach wieder als output definieren und verwenden ... die Geschichte mit dem Temperaturfühler, Aref und dem A/D wandler werd ich mir anschauen, wenn ich mich tiefer in die ganze Materie eingearbeitet habe
Ich würde sagen nein, den Zufallswert für Seed kannst Du so nicht erhalten.
Die Theorie einen Anfangs-Zufallswert zu bekommen ist einen unbeschalteten analogen Eingang auszulesen. Dieser fängt wie eine kleine Antenne elektromagnetische Störungen ein und gibt einen nicht vorhersagbaren Wert aus.
Mit den PWM-Ausgängen geht das auf keinen Fall.

Da Du aber die analogen Eingänge beschalten hast ( Du hast den Schaltplan uns nie gegeben, darum muß ich den schlechtesten Fall annehmen, daß die Beschaltung das Pin, das als Eingang definiert wird, durch irgenwelche Widerstände oder Diodenstrecken auf ein definiertes Potential gebracht wird) kannst Du keinen zufälligen Wert lesen.

Deshalb mein Vorschlag, einen Analogen Eingang 8 mal zu lesen und das niederwertigste Bit jeder Messung, das ziemlich instabil ist, zu einer 8 Bit zahl zusammenzufassen und so einen Zufallswert zu erhalten. Dieser Vorschlag funktioniert auch bei einem beschaltenen Pin.
Grüße Uwe
 
Logged

Berlin
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na da habt ihr ja doch noch rausbekommen was ich meinte...  smiley-kiss
Bin zur Zeit ein wenig in Zeitnot... ....Umzug....
MfG Jago

PS.: Eine "zufällige" Referenzspannung zu erzeugen ist nicht wirklich ein großer schaltungstechnischer aufwand. Spannungsteiler mit NTC, PTC oder LDR sollte da eigentlich ausreichen.
Logged

Nothing is impossible ^^

Pages: [1] 2   Go Up
Jump to: