Hallo,
ich möchte meine beiden Diskettenlaufwerke zum Musikspielen bringen, und
zwar soll je nach Ansteuerungsfreqeunz des Schrittmotors im
Diskettenlaufwerk ein Ton in dieser Freqeuenz erzeugt werden. Sprich:
1000 Schritte pro Sekunde ergeben einen 1000 Hz Ton.
Mit einem Laufwerk klappt das wunderbar, ich habe dazu eine Funktion
geschrieben (nenne ich einfach mal spieleTonFloppy1(int Dauer, int
Frequenz) welche ich in der Hauptschleife dann einfach so abspiele:
spieleTonFloppy1(halbeNote, 220)
spieleTonFloppy1(viertelNote, 440)
spieleTonFloppy1(halbeNote, 200)
... u.s.w.
Jetzt frage ich mich: Wie kann ich 2 Laufwerke gleichzeitig ansteuern?
Wenn ich in der Funktion von oben einfach abwechselnd das erste und dann
das zweite Floppy ansteuere, müssen ja beide Floppys Töne gleicher Dauer
abspielen, da sonst das zweite Laufwerk schon den nächsten Ton abspielen
müsste während das erste noch am letzten Ton ist.
Habt ihr eine Idee was ich da machen könnte? Falls es hilfreich ist: Ich
habe die spieleTonFloppy1 Funktion mit Hilfe der micros() Funktion
geschrieben, um die Zeit zwischen 2 Schritten und der Tondauer zu
bestimmen, es werden also keine delays benutzt, welche den Controller
ganz anhalten.
Grüße
Quaditz
Vielen Dank für eure Antworten :)
Mit der Stepper Library scheints nicht zu klappen, da die Funktion step
alles andere blockiert, d.h. wenn ich Step auf einen Motor ausführe
führt das Program die Steps aus, kann aber in der Zeit nichts anderes
machen, also auch keine Step befehle an einen zweiten Motor geben (Zitat
aus der Stepper Reference: This function is blocking; that is, it will
wait until the motor has finished moving to pass control to the next
line in your sketch.)
Den Quellcode habe ich mal als Anhang angehängt. Mit dem Programm geht
es soweit ganz gut Hänschen Klein mit einem Diskettenlaufwerk
abzuspielen. Nur das Richtungsumschalten muss ich noch verbessern, im
Moment stößt der Motor bei langen Tönen ans Gehäuse. Nur kann ich mit
diesem Prinzip halt nur Ton für Ton abspielen und das Programm bleibt in
der "spieleTon" Funktion hängen, wenn ich einen Ton abspiele, es ist so
also nicht möglich zeitgleich ein zweites Laufwerk anzusteuern.
Mit DDS Schleifen habe ich mich noch nicht beschäftigt, bzw höre zum
ersten mal von denen :) Guck ich mir morgen an, wäre natürlich klasse
wenn es damit klappt!
Grüße
Quaditz
Mit dieser IDE:
http://arduino.cc/en/Main/Software
Ich hab den Code nochmal als .txt angehängt ;-)
DDS ist allerdings zu komplex für mich, da möchte ich als
Elektronikneuling nicht sofort in solche Sachen einsteigen ;-)
Mit der Stepper Library die bei der oben gennanten IDE dabei war geht es
wie gesagt nicht, aber ich habe eine gefunden mit der man zumindest
mehrere Laufwerke ansteuern kann. Die Library nennt sich AccelStepper.
Habe gerade nur kurz das Beispielprogramm abgespielt und beide Laufwerke
machen zeitgleich irgendwelche Geräusche, das macht mir Hoffnung, dass
es morgen damit klappen könnte :)
Aber ich würde trotzdem sehr gerne wissen, wie man 2 Laufwerke steuern
kann, ohne auf vorgefertigte Librarys zurückzugreifen, am besten als
Ergänzung zu meinem eigenen Code, wenn das überhaupt möglich ist.
Wenn ich mir die Funktionen in der AccelStepper Lib anschaue, werde ich
leider nicht schlau. Vielleicht könnte jemand prinzipell erklären, wie
ein Controller mit einer einzigen Befehlsabfolge es schafft, 2 Laufwerke
gleichzeitig zu steuern. Ich kann mir das nur über Timerinterrupts
vorstellen, aber wie ich mit Hilfe von Timerinterrupts beide Laufwerke
unabhängig voneinander steuere ist mir im Moment noch ein Rätsel
Vielen Dank nochmals für eure Antworten bisher!
Grüße
Quaditz
Quaditz schrieb:> DDS ist allerdings zu komplex für mich
Das ist nur Addition!
Du hast 4 Zahlen.
Die ersten beiden representieren die gewünschten Frequenzen.
Die anderen beiden dienen als Addierregister.
Du startest einen Timer z.B. mit 100kHz (bzw. alle 10µs).
Bei jedem Timerinterupt addierst Du Zahl 1 auf Zahl 3 drauf.
Und Du addierst Zahl 2 auf Zahl 4 drauf.
Das MSB der Zahlen 3 und 4 sind Dein Ausgang.
Du änderst im Hauptprogramm also nur die Zahlen 1 und 2 zum
entsprechenden Zeitpunkt und der Rest passiert von selbst - keine
Funktion aufrufen!
Je größer der Zahlenumfang (Bitbreite), desto mehr Auflösung und
Genauigkeit bekommst Du.
Easy - oder?
Gruß
Jobst
Ah, vielen Dank Jakob!
Das Funktioniert also so: Nehmen wir einen Timer mit Interrupt alle 10
µs. Wenn ich z.B. ein Register mit 8 Bits nehme, und bei jedem
Timerinterrupt die Zahl um 1 erhöhe, hätte ich 128 Interrupts eine 0 am
Ausgang und weitere 128 Interrupts eine 1, was einer PWM Periodenlänge
von 256*10 µs = 2,5 ms entspricht, was eine Frequenz von 400 bedeutet!
Je nachdem wieviele Bits ich in meiner Zählervariable zur Verfügung habe
kann ich also feinere Frequenzen wählen! Und wenn mein Timer Interrupts
in kürzen Abständen erlaubt kann ich auch höhere Frequenzen erzeugen.
Als ich nach DDS gegooglet habe dachte ich erst, dass das eine extrem
komplizierte Sache sei, aber mit der Erklärung von Dir wirds mir jetzt
auch klar :)
Vielen Dank dafür!!