PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie ist das Schema zur Ansteuerung dieses Motors?



fredyxx
04.05.2016, 00:51
Hallo,

in diesem Angebot für einen Schrittmotor findet man weit unten einen Link auf ein Video, das vermittelt, dass dieser kleine Motor mit Spindel doch relativ strak ist.


http://http://www.ebay.de/itm/DC5v-2-phase-4-wire-Stepper-Motor-Schrittmotor-long-linear-screw-slider-Stages-/311555041045?hash=item488a20a715:g:pusAAOSwu4BVwDJ 4 (http://www.ebay.de/itm/DC5v-2-phase-4-wire-Stepper-Motor-Schrittmotor-long-linear-screw-slider-Stages-/311555041045?hash=item488a20a715:g:pusAAOSwu4BVwDJ 4")

Ich habe so einen Motor, der mir aber viel schwächer erscheint und ich vermute, dass ich den nicht richtig ansteuere.

Die Ansteuerung kann ich in meinem Programm beliebig festlegen durch eine Folge von 4 Bit.
(byte[]){8, B1000, B1010, B0010, B0110,B0100,B0101,B0001,B1001}
Die 8 gibt die Anzahl der B.... an (es können auch weniger sein) und die 4 Stellen hinter dem B stehen für die 4 Anschlüsse des Motors bzw. die Ausgänge eines Treibers.

Welche Kombination muss ich für diesen Motor wählen?

Gru?

fredyxx

Peter(TOO)
04.05.2016, 02:37
Hallo fredyxx,

in diesem Angebot für einen Schrittmotor findet man weit unten einen Link auf ein Video, das vermittelt, dass dieser kleine Motor mit Spindel doch relativ strak ist.

Stark ist etwas anderes!
Das zeigt nur, dass die Linearführung eine relativ kleine Reibung hat :-)
Macht aber mächtig Eindruck bei den Kunden!

So einen Motor findest du in jede CD/DVD-Laufwerk für die Kopfpositionierung.

Schon mal einen beladenen Eisenbahnwagen von Hand geschoben oder ein grosses Schiff von der Kaimauer weggedrückt?
Geht eigentlich recht leicht.


Welche Kombination muss ich für diesen Motor wählen?
Kommt drauf an, wie das verdrahtet ist und welche Drehrichtung gewünscht wird.

Der Motor hat 4 Anschlüsse, zwischen jeweils 2 befindet sich eine Spule.
Jetzt muss du erst mal rausfinden, welche zwei Bit für jeweils eine Spule zuständig sind.

Und dann liest du das hier:
http://rn-wissen.de/wiki/index.php?title=Schrittmotoren

MfG Peter(TOO)


MfG Peter(TOO)

fredyxx
04.05.2016, 06:32
Hallo Peter,

das war mir schon alles bekannt. Die Spalten Common in den Tabellen haben mich aber davon abgehalten, diese genauer zu betrachten, weil ich doch bei diesen Motoren keinen Commonanschluss habe.
Naja, war ja auch schon ziemlich spät / früh. Heute Morgen habe ich das dann anders gesehen.

Melde mich wieder, wenn ich weiter experimentiert habe!

Gruß

fredyxx

fredyxx
05.05.2016, 00:00
Hallo Peter,
nach einigen Versuchen kenne ich den Motor nun etwas besser.
Er kann sowohl im Voll- als auch im Halbschrittverfahren an einem Treiber L293D betrieben werden.
Man kann Spannung, Strom und Drehzahl stark variieren. Maximalwerte, die ich probiert habe sind:
10 V Vcc am Treiber; 900 mA Gesamtstrom; Zugkraft am Schlitten der Spindel bis 0,53 N.
Dabei muss man wissen, dass das keine Sinusströme/-spannungen sind. Die Spannung an einer Wicklung sieht auf einem Oszilloskop sehr anders aus.

Es ist möglich, dass diese Zugkraft für meinen Anwendungsfall ausreicht.

Gruß

fredyx

Klebwax
05.05.2016, 01:11
Hallo,

in diesem Angebot für einen Schrittmotor findet man weit unten einen Link auf ein Video, das vermittelt, dass dieser kleine Motor mit Spindel doch relativ strak ist.


http://http://www.ebay.de/itm/DC5v-2-phase-4-wire-Stepper-Motor-Schrittmotor-long-linear-screw-slider-Stages-/311555041045?hash=item488a20a715:g:pusAAOSwu4BVwDJ 4 (http://www.ebay.de/itm/DC5v-2-phase-4-wire-Stepper-Motor-Schrittmotor-long-linear-screw-slider-Stages-/311555041045?hash=item488a20a715:g:pusAAOSwu4BVwDJ 4")

Das ist, wie Peter schon schrieb, ein Motor aus einem CD bzw DVD Laufwerk. Ich würde aber keine Sekunde verschwenden, ihn mit einem so alten Chip wie dem L293D zu betreiben. Dieser gehört wie auch der L298 auf den Müllhaufen der Geschichte, das ist Technologie von vor 30 Jahren. Da sollte auch der Artikel im RN-Wissen mal angepasst werden. Bipolare Schrittmotore werden heutzutage über Treiber mit integriertem Stromchopper angesteuert. Durch die Popularität der 3D-Drucker gibt es auch kein Mangel an solchen Treibern zu kleinen Preisen.

Hier mal ein Beispiel (http://www.ebay.de/itm/5pcs-Geeetech-Stepper-Driver-DRV8825-with-heatsink-for-RepRap-Prusa-3D-Printer-mm/281802283799?hash=item419cb99b17:g:WBkAAOxyrM5TIrg 6). Ich hab das mit genau solchen Motoren vor kurzem probiert und es funktioniert gut. Man hat eher das Problem, den Maximalstrom klein genug einstellen zu können, daß der Motor nicht auf Dauer überhitzt. Um die Schrittfolge muß man sich keine Gedanken machen, auch Mikroschritt ist mühelos möglich. Und mit dem Stromchopper kann man sicher sein, alles an Speed und Drehmoment herauszuholen, was das Motörchen so hergibt.

MfG Klebwax

Peter(TOO)
05.05.2016, 03:41
Hallo, fredyx,

Zugkraft am Schlitten der Spindel bis 0,53 N.

Es ist möglich, dass diese Zugkraft für meinen Anwendungsfall ausreicht.

Komischerweise hängt die Antwort von den Anforderungen der Anwendung ab!

[] Ja
[] Nein
[] Vielleicht
[] Vielleicht eher nicht
Zutreffendes bitte selbst ankreuzen.

MfG Peter(TOO)

fredyxx
05.05.2016, 09:28
Danke für eure Tipps.

Ich werds wohl probieren.

Gruß
fredyxx

fredyxx
14.05.2016, 18:18
Hier mal ein Beispiel (http://www.ebay.de/itm/5pcs-Geeetech-Stepper-Driver-DRV8825-with-heatsink-for-RepRap-Prusa-3D-Printer-mm/281802283799?hash=item419cb99b17:g:WBkAAOxyrM5TIrg 6). Ich hab das mit genau solchen Motoren vor kurzem probiert und es funktioniert gut. Man hat eher das Problem, den Maximalstrom klein genug einstellen zu können, daß der Motor nicht auf Dauer überhitzt. Um die Schrittfolge muß man sich keine Gedanken machen, auch Mikroschritt ist mühelos möglich. Und mit dem Stromchopper kann man sicher sein, alles an Speed und Drehmoment herauszuholen, was das Motörchen so hergibt.

MfG Klebwax

Hallo Klebwx,

ich habe nun die DRV 8825.

Wo kann ich eine Erläuterung der Anschlusspins finden?

Gruß

fredyxx

- - - Aktualisiert - - -

Ich habe bei Popolu was gefunden

Gruß

fredyxx

Manf
14.05.2016, 21:40
Würde das schon helfen oder geht es um weitere Erläuterungen?

https://www.pololu.com/product/2132

31601 (https://www.pololu.com/product/2132)

Klebwax
14.05.2016, 22:25
Würde das schon helfen oder geht es um weitere Erläuterungen?

https://www.pololu.com/product/2132

31601 (https://www.pololu.com/product/2132)

Ist schon mal ein guter Start. Nach "DRV8825" googlen fördert noch mehr, unter anderem das Datenblatt zu Tage.

MfG Klebwax

fredyxx
14.05.2016, 22:57
das hat schon manches klarer gemacht. Ich habe aber noch nichts gefunden über den Eingang STEP.
Muss da für jeden Schritt ein Signalwechsel erfolgen, also eine Pulsfolge?
Mit welchem Befehl im Arduino erzeugt man das am einfachsten?

Gruß
fredyxx

021aet04
15.05.2016, 09:05
Bei jeden low-high (oder high-low bin mir nicht sicher steht aber im DB) Flankenwechsel erfolgt ein Schritt. Also musst du für 2 Schritte 4 Flankenwechsel ausführen (low-high-low-high)

MfG Hannes

fredyxx
15.05.2016, 09:36
Mit welchem Befehl im Arduino erzeugt man das am einfachsten? Geht z.B. ton()?


Gruß
fredyxx

021aet04
15.05.2016, 10:34
Mit Arduino kenne ich mich leider nicht aus, programmiere in C.

MfG Hannes

fredyxx
15.05.2016, 11:06
Mit Arduino kenne ich mich leider nicht aus, programmiere in C.

MfG Hannes

Welchen würdest du in C benutzen?

Nebenbei! Wo erzeugt man in diesem Forum eine Signatur?

Gruß

fredyxx

Rabenauge
15.05.2016, 12:34
Arduinos kann man genauso in C programmieren, dazu haben sie ja die ISP-Schnittstelle.
Und wenn du nicht weisst, wie du ein high-low-high-low Signal erzeugst, wird dir C auch nich weiter helfen. Hier fehlen mal wieder Basics...
Die aber lernst du mit der Arduino-IDE schneller.
Nachdenken: wie bring ich eine LED zum blinken? Genauso....

i_make_it
15.05.2016, 18:25
PWM liefert beim Arduino ja leider nur eine feste Frequenz.
https://www.arduino.cc/en/Reference/AnalogWrite
Was in einer festen Drehzahl des Steppers resultieren würde.

Es gibt schon fertige Stepper Libraries, das ist der einfachste Weg.
Oder mit DigitalWrite in einer ISR die per TimerInterrupt aufgerufen wird. Der Timerwert (die Häufigkeit des ISR Aufrufs) bestimmt dann die Drehzahl.

Natürlich geht es auch wie beim LED Beispiel mit Delay, aber dann macht das Teil auch nichts mehr anderes als warten und den Pin Status zu ändern.
https://www.arduino.cc/en/tutorial/blink


void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}


https://www.arduino.cc/en/Reference/HomePage
Ist ganz empfehlenswert als Infoquelle.
Und wenn es darum geht einen PIN zu togglen, dann dort:
https://www.arduino.cc/en/Reference/Boolean
Da dann !(not)

Tip: Boolean Hilfsvariable.
hilfsvariable = !hilfsvariable
Ausgang setzten auf Zustand der hilfsvariable.

fredyxx
15.05.2016, 18:35
Arduinos kann man genauso in C programmieren, dazu haben sie ja die ISP-Schnittstelle.
Und wenn du nicht weisst, wie du ein high-low-high-low Signal erzeugst, wird dir C auch nich weiter helfen. Hier fehlen mal wieder Basics...
Die aber lernst du mit der Arduino-IDE schneller.
Nachdenken: wie bring ich eine LED zum blinken? Genauso....

Hallo Rabenauge,

ganz blöde bin ich ja auch nicht, auch wenn du das offensichtlich so siehst.

Ich erhoffe mir von den für dich vielleicht simplen Fragen, dass ich aus dem Forum bessere Lösungen erhalte, als sie mir auf die Schnelle einfallen und ich dann später doch auf bessere Lösungen komme.

Natürlich bekomme ich eine LED zum Blinken, aber dann erhalte ich wieder irgendwo den Hinweis, dass man doch in einem Programm delay möglichst nicht verwenden soll. Die Methode mit millis() kenne ich auch.
Schöner wäre, wenn du mir die Frage beantworten würdest, ob es was Besseres gibt als ton().
Dieser Hinweis: Only one tone can be generated at a time
läßt mich aber vermuten, dass ich damit nicht mehrere Motortreiber gleichzeitig ansteuern kann.

Also was ist nun dein kluger Rat??

Der Thread von i_make_it kam während ich das schrieb. Den muss ich mir nun erst mal zu Gemüte führen.

Gruß

fredyx

i_make_it
15.05.2016, 18:48
Übrigens nutzt Arduino den AVR GCC. Arduino Language ist also schon "C" (ein C Dialekt).
Und C++ geht wohl auch mit der Arduino IDE.

Um beim LED Beispiel zu bleiben, gibt es hier die Variante mit Timer Interrupt.
http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary

Timer1.initialize(alle_x_sekunden*1000000);
macht man dann in der Hauptschleife, da man ja gerne auch mal die Drehzahl ändern möchte.

https://www.arduino.cc/en/Reference/Stepper
ist aber erst mal der einfachere Weg um was in Bewegung zu setzen.
Zum Lernen ist der "selbermachen Weg" aber besser.

fredyxx
15.05.2016, 18:54
Es gibt schon fertige Stepper Libraries, das ist der einfachste Weg.

Ich teste gerade den oben so gelobten Treiber DRV8825, der als Ansteuerung eben nur eine Frequenz und ein Richtungssignal benötigt (Vorteil: belegt nur 2 Ausgänge des Arduino statt 4). Wenn ich das richtig sehe, dann hilft da keine Library oder?


Oder mit DigitalWrite in einer ISR die per TimerInterrupt aufgerufen wird. Der Timerwert (die Häufigkeit des ISR Aufrufs) bestimmt dann die Drehzahl.

was meinst du mit ISR?

Gruß

fredyxx

- - - Aktualisiert - - -

Klebwax bezeichnet den L293D ja als "Technologie von vor 30 Jahren". Daher dieser neue Versuch.

i_make_it
15.05.2016, 19:14
ISR = Interrupt Service Routine
https://www.arduino.cc/en/Reference/AttachInterrupt

Eigentlich müssten es 3 Pins sein: Step Direction und Enable.
Oft wird Enable aber dauerhaft auf High gelegt.

Eine Stepper Library die die einzelnen Spulenpins direkt ansprechen nutzen da dann nichts.
Aber mann kann sich die trotzdem mal ansehen um zu sehen wie das Ganze dort programmiert wurde. Grade was Interrupts angeht.

In dem Code unten, sieht man ganz am Ende (nach dem Ende von void loop) zwei ISRs mit denen ich zwei US Sensoren auswerte.
Der Code ist noch etwas ungelenk da es mein zweites Arduino Programm überhaupt war. Trotzdem nehme ich konstruktive Kritik und Verbesserungsvorschläge gerne an, da ja jeder anders an so was geht und man ja nie auslernt. Eventuell fallen Verbessungen an, an die ich noch nicht gedacht habe.



//Zielplatform Arduino Nano
//Nutzt beide Interrupteingänge
const int us1_echo = 2;
const int us2_echo = 3;
const int us1_trig = 4;
const int us2_trig = 5;
const int lf_le = 8;
const int lf_ce = 9;
const int lf_ri = 10;
int lf_le_state = LOW;
int lf_ce_state = LOW;
int lf_ri_state = LOW;
unsigned long us1_echo_st;
unsigned long us2_echo_st;
unsigned long us1_echo_et;
unsigned long us2_echo_et;
volatile unsigned long us1_srt;
volatile unsigned long us2_srt;
unsigned long us1_dist;
unsigned long us2_dist;
unsigned long prev1micros = 0;
const long toggleinterval = 1000;
int togglestate = LOW;
volatile int us1_flag = 0;
volatile int us2_flag = 0;
char* string_[]={"Linefollow:", "US-Echo1:", "US-Echo2:", "Cycletime:"};
unsigned long prev2micros = 0;

void setup() {
Serial.begin(9600);
pinMode(us1_echo, INPUT);
pinMode(us2_echo, INPUT);
pinMode(us1_trig, OUTPUT);
pinMode(us2_trig, OUTPUT);
pinMode(lf_le, INPUT);
pinMode(lf_ce, INPUT);
pinMode(lf_ri, INPUT);
attachInterrupt(0, US1_ISR, CHANGE);
attachInterrupt(1, US2_ISR, CHANGE);
}

void loop() {
lf_le_state = digitalRead(lf_le);
lf_ce_state = digitalRead(lf_ce);
lf_ri_state = digitalRead(lf_ri);
unsigned long cur1micros = millis();
if (cur1micros - prev1micros >= toggleinterval) { //alle 10ms umschalten
prev1micros = cur1micros;
if (togglestate == LOW){
togglestate = HIGH;
digitalWrite(us1_trig, HIGH);
digitalWrite(us2_trig, LOW);
us1_echo_st = 0;
us1_flag = 0;
}else{
togglestate = LOW;
digitalWrite(us1_trig, LOW);
digitalWrite(us2_trig, HIGH);
us2_echo_st = 0;
us2_flag = 0;
}
}
us1_dist = (us1_srt / 58); // Umrechnung des Sensorwerts, ungefähr in cm (für 343m/s bei trockner Luft und 20° wäre 58,3 der genaue Wert)
us2_dist = (us2_srt / 58);
//=== Beginn Ausgabe ===
Serial.print(string_[1]);
Serial.println(us1_dist);
Serial.print(string_[2]);
Serial.println(us2_dist);
Serial.print(string_[0]);
Serial.print(lf_le_state);
Serial.print(lf_ce_state);
Serial.println(lf_ri_state);
unsigned long cur2micros = micros(); //Zykluszeit Messung
Serial.print(string_[3]);
Serial.println(cur2micros - prev2micros);
prev2micros = cur2micros;
//=== Ende Ausgabe ===
}

void US1_ISR(){
if (us1_echo_st == 0) {
us1_echo_st = micros();
} else {
us1_echo_et = micros();
++us1_flag;
}
if (us1_flag == 1) {
us1_srt = (us1_echo_et - us1_echo_st);
}
}

void US2_ISR(){
if (us2_echo_st == 0) {
us2_echo_st = micros();
} else {
us2_echo_et = micros();
++us2_flag;
}
if (us2_flag == 1) {
us2_srt = (us2_echo_et - us2_echo_st);
}
}



PS: Das DRV8825 breakout Board ist glaube ich pinkompatibel zu dem vom A4988. Da sollte der selbe Code gehen.
http://forum.arduino.cc/index.php?topic=133894.0

fredyxx
16.05.2016, 00:09
Hallo i_make_it,

danke für deine konkrete Hilfe. Ich brauche noch etwas Zeit um dein Programm zu verstehen.

Da du nach Alternativen fragst, hier mein Testprogramm für eine Ultraschallsensor der KT-Elektronik.



/* Diese Programm gibt die Entfernung des US-Sensors von einem Gegenstand an den Seriellen Monitor
in Mikrosekunden aus.
Es funktioniert mit diesen delays,

aber auch ohne

und reagiert auch auf einen Schalterimpuls am Eingang "Trig"
Bei delay (1) ist der Triggerimpuls 1ms und wiederholt sich nach 15ms????
ohne delay
*/
double Pulslaenge; // definiert die Variable als double; damit bei ungültigem Signal die fast 200 ms
// = 200.000 Mikrosekunden für Störung Sensor erfasst werden können.
void setup()
{
pinMode (13, OUTPUT); // Ausgang für das Triggersignal

Serial.begin (250000);


}

void loop()
{

delay (20);
digitalWrite (13, LOW); //negative Flanke für Triggersignal

Pulslaenge = pulseIn(4, HIGH); // gibt die Pulslänge in Mikrosekunden zurück
// während der Messung geht der Programmlauf **** nicht ***** weiter
// sondern wird real für 15, theoretisch für 20 ms angehalten

Serial.println (Pulslaenge);
Serial.print("PU ");
delay (20);

digitalWrite (13, HIGH); // Triggersignal zurück auf High setzen

}


Für mich sieht das so aus, als ob auf dem Platinchen schon was geregelt wird, was du in deinem Programm realisieren musst. Bin mir aber nicht sicher.

Ich nutze diesen Sensor: http://www.ebay.de/itm/Ultraschall-Sensor-Modul-HC-SR04-Arduino-Abstandsmesser-/181894239069?hash=item2a59bdd35d:g:SZQAAOSwrklVTON L

Gruß
fredyx

i_make_it
16.05.2016, 10:17
Mein Programm wertet zwei HC-SR04 aus und noch ein "Funduino 3 Kanal Line Traking Modul".
Alles was us1_ oder us2_ in den Bezeichnern hat gehört zu dem jeweiligen Ultraschall Sensoren.
lf_ steht für "Line Follow" und betrifft das Linienfolger Modul.

Grob starte ich US1 Messung und warte über den Interrupt auf das Echo. Nach 10 Millisekunden starte ich die Messung an US2.
Insgesammt misst jeder Sensor allle 20ms einmal und beide 10ms zeitversetzt zueinander.
Dazwichen kommt bei jedem Schleifendurchlauf einmal der Linienfolgsensor einmal drann.