Theorie


Für Schüler der Klasse 9
In der Welt der kleinsten Bausteine unserer Materie, der Atome, Elektronen und Lichtteilchen gelten andere Gesetze, als wir sie in unserem normalen Leben kennen. Teilchen können durch Wände tunneln oder an nicht vorhersehbaren Orten auftauchen. Es gibt sogar "Geisterteilchen", die aus dem Nichts entstehen. Eine merkwürdige Welt ist das. So merkwürdig, dass sogar Einstein nicht an alles glauben mochte, was die Physiker darüber aussagten. Ihm wird der Spruch "Gott würfelt nicht" in den Mund gelegt. Heute wissen wir, das Gott doch würfelt und ein solcher Würfel können wir sogar nutzen. In der Praxis ist dafür ein großer experimenteller Aufwand nötig.



Photonen sind die kleinsten Bestandteile des Lichtes, die Lichtteilchen. In einem speziellen Kristall kann man Lichtteilchen erzeugen, die exakt zu 50% eine Eigenschaft mit sich tragen und 50%, die eine andere Eigenschaft haben. Dabei ist es völlig zufällig, welche Eigenschaft das jeweilige Lichtteilchen hat, erst wenn man eine große Anzahl betrachtet, kann man das Verhältnis 50:50 bestimmen. In zwei Detektoren (das sind die beiden schwarzen Kästen rechts im Bild) wird geschaut, welche Eigenschaft das jeweilige Lichtteilchen hat. Der einen Eigenschaft wird dann der Binärwert "0" und der anderen Eigenschaft der Binärwert "1" zugeordnet. Aus drei dieser Binärwerten kann man dann die Zahlen 1 bis 6 erzeugen, die Zahl 0 und 7 wird verworfen. Unser Würfel ist fertigt. Ein solches Experiment kostet ungefähr 20.000€ und benötigt für den Aufbau zwei Schultische.



Für Schüler der Oberstufe
Photonen haben neben ihrer Energie (Wellenlänge) noch die Eigenschaft der Polarisation. Licht aus einer Glühlampe schwingt immer in alle Richtungen des Raumes, das Licht ist unpolarisiert. Laser erzeugen dagegen Licht, das nur in eine Richtung schwingt, ein solches Licht wird polarisiert bezeichnet. In der Optik gibt es spezielle Kristalle, die aus einem Photon zwei erzeugen. Da die Energieerhaltung streng gilt, haben beide Photonen exakt die Hälfte der Energie des eingestrahlten Photons (es gibt auch Kristalle mit anderen Teilungsverhältnissen der Energie). Interessant für uns ist, dass es völlig zufällig ist, welche Polarisation die Photonen dabei haben. Ist das Experiment exakt justiert, werden 50% horizontal polarisierte und 50% vertikal polarisierte Photonen erzeugt. Diese Photonen werden auf einen polarisierenden Strahteilerwürfel geschickt.  Dieser lässt z.B. alle horizontal polarisierten Photonen gradlienig passieren und lenkt alle vertikal polarisierten um 90° ab. Diese Photonen werden nun von zwei Detektoren nachgewiesen. Alle horizontalen Photonen bekommen dabei den binären Wert "0" zugewiesen, die vertikalen Photonen den Wert "1". Aus drei Messungen können die Dezimalzahlen 0 bis 7 erzeugt werden. Unter dem Wegfall von 0 und 7 hat man damit die Würfelzahlen 1 bis 6 erzeugt.  Um Messfehler auszuschließen, werden zwei Sätze Detektoren eingesetzt. Da beide Photonen zeitgleich (<5ns Zeitunterschied) erzeugt werden, erreichen sie die Detektoren auch zeitgleich. Alle Messereignisse, die nicht zeitgleich erfolgen werden einfach verworfen.



ALICE erzeugt in unserem Fall die Zufallszahlen. BOB dient hier nur zum Ausschluss der Messfehler. Nur wenn ALICE und BOB innerhalb von 5ns ein Photon detektieren, wird die Messung verwendet, alle anderen Ereignisse werden als Messfehler eliminiert.



Technische Umsetzung:

Die technische Umsetzung beruht auf dem Mikrocontroller Attiny2313 und dem EEPROM AT24C512 der Firma ATMEL. Beide Bausteine sind für den harten industriellen Einsatz konzipiert, ein schützendes Gehäuse ist daher nicht erforderlich. Damit der Würfel mit einer 9V Blockbatterie betrieben werden kann, muss die Spannung mit einem Spannungsregler MC78M05 auf 5V geregelt werden. Die beiden 100nF Kondensatoren verhinden den Eintrag von Störimpulen von außen. Das EEprom wird über eine I2C-Schnittstelle ausgelesen. Die beiden 1,8kOhm-Widerstände sind für die Schnittstelle erforderlich. Anjeweils 3 Ausgänge sind zwei Dioden in Reihe geschaltet, der vierte Ausgang treibt die 7. Leuchtdiode in der Mitte des Würfels an. Beim Betätigen des Tasters wird eine neue Würfelzahl erzeugt und kurz angezeigt. Die Widerstände an den Leuchtdioden sind abhängig von den verwendeten Dioden und müssen ggf. angepasst werden.


BASCOM-Programm:

Die Daten sind im EEPROM in fortlaufender Reihenfolge bitweise gespeichert. Für die Erzeugung der Zahlen 1 bis 6 werden jeweils 3 Bit benötigt. Aus dem EEProm können aber nur 8bit = 1 byte ausgelesen werden. Um nicht die überschüssigen 5 bit zu verwerfen, werden 3x8 = 24 bit bzw. 3Byte ausgelesen und daraus insgesamt 8 Würfe erzeugt. Diese 3 Byte werden in der Variabel D0 gespeichert. Durch Rotation werden immer wieder 3 bit nach vorne geschoben, diese ausgelesen und daraus die Würfe erzeugt.
Da alle Schüler den gleichen Datensatz im EEPROM haben, würden alle Würfel genau das Gleiche anzeigen. Um dies zu verhindern wird bei der Erstbenutzung durch zweimaliges Drücken des Tasters ein zufälliger Startwert (16bit Länge) erzeugt. Da jeder Schüler zu unterschiedlichen Zeiten den Taster drückt ist diese 16bit-Zahl zufällig und jeder Würfel damit individuell. Der Startwert wird im internen EEPROM des Attiny2313 abgelegt. Bei jedem Wurf wird dieser Wert erhöht, so dass insgesamt rund 110.000 Würfe erzeugt werden können. Das reicht locker für ein Spielerleben aus!

Der Quellcode und die Binärdatei ist im Download zu finden.

'*****************************************************
'* Quantenwürfel von Jörn Schneider Version 1.0      *
'* Copyright Jörn Schneider 2014                     *
'* Nachbau ausdrücklich gestattet.                   *
'* Diese Software ist OpenSource und darf kostenlos  *
'* genutzt werden. Verkauf oder kommerzielle Nutzung *
'* ist untersagt!                                    *
'* eMail joern999@aol.com                            *
'*****************************************************

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 1000000                                          '1 MHz

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen


'**********************************************************
'******************* Deklarationen ************************

Config Scl = Portb.6                                        'I2C-Schnittstelle SCL an Portb.6
Config Sda = Portb.7                                        'SDA an PortB.7
I2cinit

Const Awrite = 160                                          'Schreibadresse AT24C512
Const Aread = 161                                           'Leseadresse AT24C512

Dim Adrhigh As Byte
Dim Adrlow As Byte
Dim Adresse As Word
Dim Wert As Byte
Dim J As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D1 As Dword
Dim D0 As Dword

'Deklaration der Subroutinen

Declare Sub E_read(byval Adrlow As Byte , Adrhigh As Byte , A As Byte , B As Byte , C As Byte)

Declare Sub Wurf(byval D1 As Dword)


Waitms 500                                                  'Einschaltverzögerung

' Initialisierung des Würfels beim ersten Benutzen
' Adrlow  = Lowbyte des EEProms AT24C512
' Adrhigh = Highbyte des EEPROMS AT24C512

Readeeprom Adrlow , 2                                       'EEProm des Attiny2313 Byte 2 auslesen
Readeeprom Adrhigh , 3                                      'EEProm des Attiny2313 Byte 3 auslesen
Readeeprom J , 4                                            'EEprom des Attiny2313 Byte 4 auslesen


If J = 255 Then                                             'Wenn J=255 dann war der Würfel noch nicht benutzt worden

= 0


Do                                                          'Durch Drücken des Tasters Zufallszahl erzeugen

Incr Adrlow

If Pind.= 0 Then

Writeeeprom Adrlow , 2                                      'Zufallszahl in EEPROM des Attiny speichern

Portb.= 1
Portb.= 1                                                 'Alle LEDs kurz einschalten als Bestätigung
Portb.= 1
Portb.= 1

Waitms 250

Portb.= 0
Portb.= 0
Portb.= 0
Portb.= 0

Goto Zweite

End If


Loop

Zweite:

Do                                                          'Gleicher Vorgang für das Highbyte

Incr Adrhigh

If Pind.= 0 Then

Writeeeprom Adrhigh , 3

Portb.= 1                                                 'Alle LEDs kurz einschalten als Bestätigung
Portb.= 1
Portb.= 1
Portb.= 1

Waitms 250

Portb.= 0
Portb.= 0
Portb.= 0
Portb.= 0

Goto Dritte

End If

Loop


Dritte:

Writeeeprom J , 4                                           'EEprom Byte 4 auf Null setzen

End If


'Hauptprogramm

Do

Readeeprom Adrlow , 2                                       'Lowbyte aus EEPROM Attiny2313 auslesen
Readeeprom Adrhigh , 3                                      'Highbyte aus EEProm Attiny2313 auslesen

Adresse = Adrhigh * 256                                     'Sprungadresse berechnen
Adresse = Adresse + Adrlow


Call E_read(adrlow , Adrhigh , A , B , C)                   '3 Bytes aus dem AT24C512 holen


D0 = A                                                      'Diese 3 Bytes hintereinander in die Variabel D0 speichern

D1 = B

Rotate D1 , Left , 8

D0 = D0 + D1

D1 = C

Rotate D1 , Left , 16

D0 = D0 + D1


Adresse = Adresse + 3                                       'Adresse um 3 erhöhen für den nächsten Zugriff

Adrhigh = High(adresse)
Adrlow = Low(adresse)

Writeeeprom Adrlow , 2                                      'Lowbyte im EEPROM Attiny2313 ablegen
Writeeeprom Adrhigh , 3                                     'Highbyte im EEProm Attiny2313 ablegen



For J = 1 To 8                                              'Aus den 24bit können 8 Würfe erzeugt werden

Anfang:
                                                        'Taster gedrückt, dann Wurf erzeugen
If Pind.= 0 Then


D1 = D0 And &B00000111                                      'UND-Verknüpfung damit nur die unteren 3 Bits genutzt werden

If D1 = 0 Or D1 = 7 Then Goto Weiter                        'Wurfwerte 0 und 7 aussortieren

Call Wurf(d1)                                               'Wurfwert ausgeben

Waitms 100

Weiter:

Rotate D0 , Right , 3                                       '3 Bits nach rechts rotieren für den nächsten Wurf

Else

Goto Anfang

End If



Next J


Loop


End


'Ausgabe Wurf

Sub Wurf(byval D1 As Dword)



 If D1 = 1 Then Portb.= 1
 If D1 = 2 Then Portb.= 1
 If D1 = 3 Then
  Portb.= 1
  Portb.= 1
 End If

 If D1 = 4 Then
  Portb.= 1
  Portb.= 1
 End If

 If D1 = 5 Then
  Portb.= 1
  Portb.= 1
  Portb.= 1
 End If

 If D1 = 6 Then
  Portb.= 1
  Portb.= 1
  Portb.= 1
 End If

Wait 1

Portb.= 0
Portb.= 0
Portb.= 0
Portb.= 0

End Sub



' Leseroutine über I2C aus dem AT24C512
'
Sub E_read(byval Adrlow As Byte , Adrhigh As Byte , A As Byte , B As Byte , C As Byte)

    I2cstart                                                'Einsprungadresse übertragen
    I2cwbyte Awrite
    I2cwbyte Adrhigh
    I2cwbyte Adrlow
    I2cstart
    I2cwbyte Aread                                          '3 Bytes auslesen und in A,B,C speichern
    I2crbyte A , Ack
    I2crbyte B , Ack
    I2crbyte C , Nack
    I2cstop                                                 '
End Sub