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
Stell mal bitte den Quellcode rein. Dann kann man dir einfacher helfen.
Mit der Stepper Library solltest du beide gleichzeitig ansteuern können...
. ) )) ))) STEREO ((( (( ( :-) Hmmm ... 2 DDS-Schleifen ... Gruß Jobst
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
Hi
>Den Quellcode habe ich mal als Anhang angehängt.
Womit zum Teufel kann man eine .ino öffnen?
MfG Spess
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!!
Ich meinte natürlich Vielen Dank Jobst, Entschuldigung! :)
Hallo Quaditz, dieser Beitrag ist zwar schon etwas älter. Könntest du deinen neuen Code hier reinstellen? Vielen Dank im Voraus! Gruß Mike
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.