Floppy-Orgel
Verfasst: Mo 8. Jul 2019, 18:05
Inzwischen findet man im Internet zahlreiche Videos, in denen Floppy-Orgeln vorgestellt werden. Hier einige Links dazu:
https://www.youtube.com/watch?v=Oym7B7YidKs
https://www.youtube.com/watch?v=LdgzsF_O7oI
https://www.youtube.com/watch?v=g6LewmKnFdU
https://www.youtube.com/watch?v=BfFFL0tE-3s
https://www.youtube.com/watch?v=dmoDLyiQYKw
In allen Fällen wird der Schrittmotor eines oder mehrerer Diskettenlaufwerke zur Erzeugung eines Tones eingesetzt. Meist wird in den Videos auch erläutert, wie man eine solche Floppy-Orgel selbst bauen kann. Dabei wird aber letztlich auf fertige Software-Komponenten zurückgegriffen; wie genau dieser Schrittmotor angesteuert wird, wird leider nicht gezeigt. Dabei ist das gar nicht so schwer. Hier wollen wir nun zeigen, wie es funktioniert.
1. Der Schrittmotor
Bei einer Diskette werden die Daten auf konzentrischen Kreisen gespeichert. Diese Kreise werden Spuren (engl.: Tracks) genannt. Ein Diskettenlaufwerk hat zwei Motoren: Einer versetzt die Diskette in Drehung; der andere bewegt den Schreib-/Lesekopf von Spur zu Spur. Bei diesem Motor handelt es sich um einen Schrittmotor. Damit der sich bewegt, benötigt er einen Step-Puls; die zugehörige Signalleitung wird mit /STEP bezeichnet Bei jedem Puls bewegt er sich um einen bestimmten Winkel (Step bzw. Schritt) weiter. Dieser Winkel ist immer gleich groß. Über einen Schneckentrieb wird nun der Schreib-/Lesekopf bei jedem Step-Puls zur nächsten Spur bewegt. Ein solcher Step macht sich akustisch durch ein Knacken bemerkbar.
2. Die Töne
Folgen mehrere Steps in rascher Folge aufeinander, nimmt man dies als einen Ton dar. Dies entspricht in etwa der Schallerzeugung bei einer schwingenden Lautsprechermembran. Je kleiner der Zeitabstand zwischen den Steps, desto höher ist der Ton. Dieser Zeitabstand ist die Schwingungsdauer T des Tons; der Kehrwert f = 1/T gibt die Frequenz an. Bei vielen Laufwerken ist der Abstand zwischen aufeinander folgenden Step-Pulsen nach unten begrenzt: Ist er kleiner als ca. 3 ms, wird kein Step durchgeführt. Das begrenzt die Frequenz auf maximal 330 Hz.
3. Die Step-Richtung
Der Schrittmotor darf sich nicht beliebig oft in ein- und dieselbe Richtung drehen; denn irgendwann ist der Schreib-/Lesekopf bei der letzten Spur angekommen. Dann müssen wir die Drehrichtung wechseln. Die Drehrichtung (direction) wird durch eine Steuerleitung /DIR festgelegt. Liegt an dieser Leitung ein High-Signal (1) an, dann bewegt sich der Kopf RUNTER, also zu eine niedrigeren Spur, bei einem Low-Signal (0) zu einer höheren.
4. Die Track-Kontrolle
Zu Beginn der Ton-Erzeugung sollte der Kopf über der Spur 0, der untersten Spur stehen. Meist stellt das Laufwerk den Kopf bei der Initialisierung von sich aus auf diese Spur. Man kann allerdings auch nachkontrollieren, ob der Kopf gerade über der Spur 0 steht. Das Laufwerk liefert nämlich über seinen Ausgang /TRK00 ein Low-Signal (0), wenn der Kopf über der Spur 0 liegt, ansonsten ein High-Signal (1). Will man also mit einem Mikrocontroller den Kopf zur Spur 0 bringen, dann muss er das Laufwerk nur so lange Steps mit der Richtung "RUNTER" durchführen lassen, bis /TRK00 den Wert 0 annimmt. Man beachte, dass am zugehörigen Eingang des Mikrocontrollers ein Pullup vorliegen muss!
5. Das Step-Signal
Das Step-Signal sieht so aus:
Wie auch schon bei den anderen Signalen besitzt auch dieses Signal eine invertierte Logik; der Ruhe-Pegel ist High (1). Der Wert von t1 darf nicht zu klein sein, ich habe den konstanten Wert 10 us gewählt. Da die Gesamtdauer T = t1 + t2 mindestens 3 ms betragen muss, stimmt die Schwingungsdauer in guter Näherung mit t2 überein.
6. Das Anschließen des Laufwerks
Auf der linken Seite wird die elektrische Quelle mit 5 V angeschlossen; auf der rechten Seite werden die Anschlüsse für die Signalleitungen und die Masse mit dem Mikrocontroller verbunden. Die oberen Pins entsprechen Signalleitungen, sie haben gerade Nummern; die unteren sind Masse-Anschlüsse, sie haben ungerade Nummern.
Die Zuordnung ist:
18: /DIR
20: /STEP
26: /TRK00
12: /DRVSB (Drive Select B)
14: /DRVSA (Drive Select A)
Ist das Laufwerk als A-Laufwerk konfiguriert (an den Jumpern auf der rechten Seitenfläche zu erkennen), muss der Anschluss 14 mit Masse verbunden werden, am einfachsten über einen Jumper. Ist es als Laufwerk B konfiguriert, muss der Anschluss 12 mit Masse verbunden werden.
Bei meinem Laufwerk sieht das dann so aus:
Die Steuerleitungen habe ich folgendermaßen mit PortB unseres Attiny2313 verbunden:
B.0 -> /DIR (Richtung)
B.1 -> /STEI (Step)
B.2 <- /TRK00 (Track 0)
Das sieht dann so aus:
Die rote LED bei B.5 dient nur zur Kontrolle.
7. Ein einfaches BASCOM-Programm
Nach den bisherigen Erläuterungen muss das Programm dank der Kommentare nicht mehr großartig erläutert werden. Nur zwei Bemerkungen sollen an dieser Stelle erläutern, wie die Schwingungsdauer eingestellt wird: Über ein Terminalprogramm (9600 baud) wird die Schwingungsdauer an den Mikrocontroller in Zehntel Millisekunden übertragen; soll sie z. B. 5,7 ms betragen, muss die Zahl 57 gesendet werden. Der Grund dafür ist hier, dass wir der Einfachheit halber nur Bytes übertragen wollen. Der Mikrocontroller empfängt diese Bytes Interrupt-gesteuert. Sobald ein Datenbyte über die RxD-Leitung ankommt, wird der Pausenwert T im Programm entsprechend aktualisiert und die Tonhöhe angepasst.
8. Der Betrieb
In einem ersten Test wurden in zeitlichem Abstand drei verschiedene Schwingungsdauern per Terminal an den Mikrocontroller gesendet, zuerst eine geringere Schwingungsdauer, diese wird dann in zwei Schritten vergrößert. Der von dem Diskettenlaufwerk erzeugte Ton wird damit Schritt für Schritt tiefer.
Nun sollten auch Musikstücke über das Laufwerk ausgegeben werden. Dazu wurde ein MIDI-Ausgabegerät programmiert, welches zu einem Ton jeweils die zugehörige Schwingungsdauer seriell an unseren Mikrocontroller sendet. Darüber kann man nun einstimmige MIDI-Files mit einem Midi-Player über das Laufwerk ausgeben. Allerdings sind wegen des begrenzten Frequenz-Umfangs nicht alle Musikstücke gut geeignet; manchmal ist auch eine Transposition angeraten. Hier nun zwei Beispiele:
.
https://www.youtube.com/watch?v=Oym7B7YidKs
https://www.youtube.com/watch?v=LdgzsF_O7oI
https://www.youtube.com/watch?v=g6LewmKnFdU
https://www.youtube.com/watch?v=BfFFL0tE-3s
https://www.youtube.com/watch?v=dmoDLyiQYKw
In allen Fällen wird der Schrittmotor eines oder mehrerer Diskettenlaufwerke zur Erzeugung eines Tones eingesetzt. Meist wird in den Videos auch erläutert, wie man eine solche Floppy-Orgel selbst bauen kann. Dabei wird aber letztlich auf fertige Software-Komponenten zurückgegriffen; wie genau dieser Schrittmotor angesteuert wird, wird leider nicht gezeigt. Dabei ist das gar nicht so schwer. Hier wollen wir nun zeigen, wie es funktioniert.
1. Der Schrittmotor
Bei einer Diskette werden die Daten auf konzentrischen Kreisen gespeichert. Diese Kreise werden Spuren (engl.: Tracks) genannt. Ein Diskettenlaufwerk hat zwei Motoren: Einer versetzt die Diskette in Drehung; der andere bewegt den Schreib-/Lesekopf von Spur zu Spur. Bei diesem Motor handelt es sich um einen Schrittmotor. Damit der sich bewegt, benötigt er einen Step-Puls; die zugehörige Signalleitung wird mit /STEP bezeichnet Bei jedem Puls bewegt er sich um einen bestimmten Winkel (Step bzw. Schritt) weiter. Dieser Winkel ist immer gleich groß. Über einen Schneckentrieb wird nun der Schreib-/Lesekopf bei jedem Step-Puls zur nächsten Spur bewegt. Ein solcher Step macht sich akustisch durch ein Knacken bemerkbar.
2. Die Töne
Folgen mehrere Steps in rascher Folge aufeinander, nimmt man dies als einen Ton dar. Dies entspricht in etwa der Schallerzeugung bei einer schwingenden Lautsprechermembran. Je kleiner der Zeitabstand zwischen den Steps, desto höher ist der Ton. Dieser Zeitabstand ist die Schwingungsdauer T des Tons; der Kehrwert f = 1/T gibt die Frequenz an. Bei vielen Laufwerken ist der Abstand zwischen aufeinander folgenden Step-Pulsen nach unten begrenzt: Ist er kleiner als ca. 3 ms, wird kein Step durchgeführt. Das begrenzt die Frequenz auf maximal 330 Hz.
3. Die Step-Richtung
Der Schrittmotor darf sich nicht beliebig oft in ein- und dieselbe Richtung drehen; denn irgendwann ist der Schreib-/Lesekopf bei der letzten Spur angekommen. Dann müssen wir die Drehrichtung wechseln. Die Drehrichtung (direction) wird durch eine Steuerleitung /DIR festgelegt. Liegt an dieser Leitung ein High-Signal (1) an, dann bewegt sich der Kopf RUNTER, also zu eine niedrigeren Spur, bei einem Low-Signal (0) zu einer höheren.
4. Die Track-Kontrolle
Zu Beginn der Ton-Erzeugung sollte der Kopf über der Spur 0, der untersten Spur stehen. Meist stellt das Laufwerk den Kopf bei der Initialisierung von sich aus auf diese Spur. Man kann allerdings auch nachkontrollieren, ob der Kopf gerade über der Spur 0 steht. Das Laufwerk liefert nämlich über seinen Ausgang /TRK00 ein Low-Signal (0), wenn der Kopf über der Spur 0 liegt, ansonsten ein High-Signal (1). Will man also mit einem Mikrocontroller den Kopf zur Spur 0 bringen, dann muss er das Laufwerk nur so lange Steps mit der Richtung "RUNTER" durchführen lassen, bis /TRK00 den Wert 0 annimmt. Man beachte, dass am zugehörigen Eingang des Mikrocontrollers ein Pullup vorliegen muss!
5. Das Step-Signal
Das Step-Signal sieht so aus:
Wie auch schon bei den anderen Signalen besitzt auch dieses Signal eine invertierte Logik; der Ruhe-Pegel ist High (1). Der Wert von t1 darf nicht zu klein sein, ich habe den konstanten Wert 10 us gewählt. Da die Gesamtdauer T = t1 + t2 mindestens 3 ms betragen muss, stimmt die Schwingungsdauer in guter Näherung mit t2 überein.
6. Das Anschließen des Laufwerks
Auf der linken Seite wird die elektrische Quelle mit 5 V angeschlossen; auf der rechten Seite werden die Anschlüsse für die Signalleitungen und die Masse mit dem Mikrocontroller verbunden. Die oberen Pins entsprechen Signalleitungen, sie haben gerade Nummern; die unteren sind Masse-Anschlüsse, sie haben ungerade Nummern.
Die Zuordnung ist:
18: /DIR
20: /STEP
26: /TRK00
12: /DRVSB (Drive Select B)
14: /DRVSA (Drive Select A)
Ist das Laufwerk als A-Laufwerk konfiguriert (an den Jumpern auf der rechten Seitenfläche zu erkennen), muss der Anschluss 14 mit Masse verbunden werden, am einfachsten über einen Jumper. Ist es als Laufwerk B konfiguriert, muss der Anschluss 12 mit Masse verbunden werden.
Bei meinem Laufwerk sieht das dann so aus:
Die Steuerleitungen habe ich folgendermaßen mit PortB unseres Attiny2313 verbunden:
B.0 -> /DIR (Richtung)
B.1 -> /STEI (Step)
B.2 <- /TRK00 (Track 0)
Das sieht dann so aus:
Die rote LED bei B.5 dient nur zur Kontrolle.
7. Ein einfaches BASCOM-Programm
Code: Alles auswählen
' Datei für Attiny-Platine
' Über die zu zugehörige Konfigurationsdatei werden automatisch Voreinstellungen
' für die Kompilierung übernommen; diese betreffen z. B. die Taktfrequenz, die
' Baudrate, die Anschlüsse von LCD, I2C- und SPI-Modulen.
' LED an PortB.5 (zur Kontrolle)
' B.0 -> Richtung
' B.1 -> Step
' B.2 <- Track 0
' DRVSB (Pin 12) auf Masse!
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$baud = 9600 'Standardbautrate für Terminal
'**********************************************************
'******************* Deklarationen ************************
Const Maxtrack = 79 'Max. Tracknummer
Dim Track As Byte 'Track-Nummer
Dim T As Word 'Periodendauerdauer in Zehntel ms
Declare Sub Drive_step 'führt einen Step beim Schrittmotor aus
'**********************************************************
'****************** Initialisierung ***********************
On Urxc Receive_t 'URXC-Einsprungadresse wird mit receive_t-Routine verbunden
Enable Urxc 'aktiviert URXC-Interupt (bei rxc-Flag)
Enable Interrupts 'Intterrupts global aktivieren
Ddrb = &B00100011 'Bits 0, 1 und 5 als Ausgang, der Rest als Eingang
Portb.2 = 1 'Pullup für Eingang /Trk00 erforderlich
'Testsignal
Portb.5 = 1 'Test-LED
Wait 1
Portb.5 = 0
'**********************************************************
'******************** Hauptprogramm ***********************
Portb.1 = 1 'Standardpegel
' Auf Track 0 zurücksetzen, falls erforderlich
Portb.0 = 1 'Richtung auf RUNTER setzen
While Pinb.2 = 1 'Steps nach UNTEN, solange Pinb.2 = 1, d. h. Track <> 0
Portb.1 = 0
Portb.5 = 0 'LED zur Kontrolle
Waitms 3
Portb.1 = 1
Portb.5 = 1
Waitms 7
Wend
T = 0
Do
If T <> 0 Then Call Drive_step 'ein Step, wenn Periodenlänge ungleich 0
Loop
'**********************************************************
'******************* Unterprogramme ***********************
Sub Drive_step
If Pinb.2 = 0 Then 'Wenn Track = 0 ...
Track = 0
Portb.0 = 0 'Richtungsumkehr auf HOCH
End If
If Track >= Maxtrack Then
Portb.0 = 1 'Richtungsumkehr auf RUNTER
End If
'Step-Signal
Portb.1 = 0
Portb.5 = 0 'LED zur Kontrolle
Waitus 10
Portb.1 = 1
Portb.5 = 1
Waitus T
'Track updaten
If Portb.0 = 0 Then 'wenn Richtung auf HOCH ...
Incr Track
Else
Decr Track
End If
End Sub
'**********************************************************
'******************Interruptroutinen***********************
Receive_t:
T = Udr * 100 'Periodendauer empfangen (s. o.) und in us umrechnen
Return
'**********************************************************
Nach den bisherigen Erläuterungen muss das Programm dank der Kommentare nicht mehr großartig erläutert werden. Nur zwei Bemerkungen sollen an dieser Stelle erläutern, wie die Schwingungsdauer eingestellt wird: Über ein Terminalprogramm (9600 baud) wird die Schwingungsdauer an den Mikrocontroller in Zehntel Millisekunden übertragen; soll sie z. B. 5,7 ms betragen, muss die Zahl 57 gesendet werden. Der Grund dafür ist hier, dass wir der Einfachheit halber nur Bytes übertragen wollen. Der Mikrocontroller empfängt diese Bytes Interrupt-gesteuert. Sobald ein Datenbyte über die RxD-Leitung ankommt, wird der Pausenwert T im Programm entsprechend aktualisiert und die Tonhöhe angepasst.
8. Der Betrieb
In einem ersten Test wurden in zeitlichem Abstand drei verschiedene Schwingungsdauern per Terminal an den Mikrocontroller gesendet, zuerst eine geringere Schwingungsdauer, diese wird dann in zwei Schritten vergrößert. Der von dem Diskettenlaufwerk erzeugte Ton wird damit Schritt für Schritt tiefer.
Nun sollten auch Musikstücke über das Laufwerk ausgegeben werden. Dazu wurde ein MIDI-Ausgabegerät programmiert, welches zu einem Ton jeweils die zugehörige Schwingungsdauer seriell an unseren Mikrocontroller sendet. Darüber kann man nun einstimmige MIDI-Files mit einem Midi-Player über das Laufwerk ausgeben. Allerdings sind wegen des begrenzten Frequenz-Umfangs nicht alle Musikstücke gut geeignet; manchmal ist auch eine Transposition angeraten. Hier nun zwei Beispiele:
.