Forum: Mikrocontroller und Digitale Elektronik Zwei Schrittmotoren gleichzeitig über Arduino


von Quaditz (Gast)


Lesenswert?

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

von Andreas F. (beanie)


Lesenswert?

Stell mal bitte den Quellcode rein. Dann kann man dir einfacher helfen.

von Marius P. (marius_p)


Lesenswert?

Mit der Stepper Library solltest du beide gleichzeitig ansteuern 
können...

von Jobst M. (jobstens-de)


Lesenswert?

.                        ) )) ))) STEREO ((( (( (

:-)

Hmmm ... 2 DDS-Schleifen ...


Gruß

Jobst

von Quaditz (Gast)


Angehängte Dateien:

Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

>Den Quellcode habe ich mal als Anhang angehängt.

Womit zum Teufel kann man eine .ino öffnen?

MfG Spess

von Quaditz (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?

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

von Quaditz (Gast)


Lesenswert?

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!!

von Quaditz (Gast)


Lesenswert?

Ich meinte natürlich Vielen Dank Jobst, Entschuldigung! :)

von Mike (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.