Seite 1 von 1

Floppy-Orgel

Verfasst: Mo 8. Jul 2019, 18:05
von Heinrichs
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:

Step_Signal.jpg
Step-Signal
Step_Signal.jpg (4.27 KiB) 20640 mal betrachtet

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

Anschluesse_klein.jpg
Anschlüsse (schematisch)
Anschluesse_klein.jpg (17.36 KiB) 20639 mal betrachtet

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:

anschluesse.jpg
Anschlüsse bei meinem Laufwerk
anschluesse.jpg (76.06 KiB) 20638 mal betrachtet

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:

aufsicht.jpg
Aufsicht der Verkabelung
aufsicht.jpg (53.62 KiB) 20636 mal betrachtet

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.

floppy_organ_nur_3_toene_V2_WMV V8.wmv
Video: nur 3 Töne. Hier wurde statt unserer Attiny-Platine eine Nano-Platine benutzt
(2.83 MiB) 2103-mal heruntergeladen

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:

star_wars_WMV V8.wmv
Star Wars
(2.65 MiB) 2093-mal heruntergeladen
.
hummelflug_WMV V8.wmv
Hummelflug
(1.94 MiB) 2112-mal heruntergeladen