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
J = 0
Do 'Durch Drücken des Tasters Zufallszahl erzeugen
Incr Adrlow
If Pind.3 = 0 Then
Writeeeprom Adrlow , 2 'Zufallszahl in EEPROM des Attiny speichern
Portb.0 = 1
Portb.1 = 1 'Alle LEDs kurz einschalten als Bestätigung
Portb.2 = 1
Portb.3 = 1
Waitms 250
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Goto Zweite
End If
Loop
Zweite:
Do 'Gleicher Vorgang für das Highbyte
Incr Adrhigh
If Pind.3 = 0 Then
Writeeeprom Adrhigh , 3
Portb.0 = 1 'Alle LEDs kurz einschalten als Bestätigung
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Waitms 250
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 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.3 = 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.0 = 1
If D1 = 2 Then Portb.1 = 1
If D1 = 3 Then
Portb.0 = 1
Portb.1 = 1
End If
If D1 = 4 Then
Portb.1 = 1
Portb.3 = 1
End If
If D1 = 5 Then
Portb.0 = 1
Portb.1 = 1
Portb.3 = 1
End If
If D1 = 6 Then
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
End If
Wait 1
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 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