PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Anfänger] Schrittmotor mit Pololu A4988 und Arduino Duemilanove verbinden



Sim0n
30.12.2011, 12:10
Hey,

ich besitze ein Arduino Duemilanove-Board, den Pololu A4988 und einen Schrittmotor (den hier http://www.watterott.com/de/Schrittmotor-Bipolar-200-Steps/Rev-35x36mm-27V-1000mA-NEMA-14)
Leider fehlt mir das nötige Know-how zum Zusammenschließen der Bauteile.
Mir fehlt die Erfahrung, da ich zum ersten mal solche Bauteile benutze.

Meine Anfänge sehen so aus:
http://250kb.de/u/111230/j/iCELNLBCRwHB.JPG (http://250kb.de/9f4nFYw)

Nun fehlen mir die Bezeichnungen der Out- und Inputs für den Arduino.. da ich nicht ganz weiß, was mir die Zahlen der Digitalen Ausgänge sagen sollen...

Ich weiß nicht wie ich die Eingänge des Pololus (DIR und STEP) mit dem Arduino verbinden soll... Bedeutet DIR ..direction oder sowas in der art? Und was genau soll STEP bedeuten? - die Stepsignale?

Habe ich die Ausgänge des Pololus mit dem Motor richtig verbunden, oder müssen die Spulen anders angesteuert werden?

Ich würde mich sehr über eine Antwort freuen!

Bernd_Stein
31.12.2011, 11:30
Hey,
...
Ich weiß nicht wie ich die Eingänge des Pololus (DIR und STEP) mit dem Arduino verbinden soll... Bedeutet DIR ..direction oder sowas in der art? Und was genau soll STEP bedeuten? - die Stepsignale?

Arduino ist wahrscheinlich die Mikrocontrollerplatine. A4988 ist wahrscheinlich die Motoransteuer,- und Treiberplatine. Der Pololu der Schrittmotor.

Direction ist richtig, damit wird die Drehrichtung des Motors vorgegeben.
Step sind auch die Stepsignale, damit wird die Drehbewegung gemacht. Ein Schrittmotor macht aus einzelnen Schritten seine Drehbewegung. Der hier angegebene zum Beispiel braucht für eine Umdrehung ( 360° )
200 Schritte ( Steps ). Ein Step entspricht somit 360° geteilt durch 200 Steps = X Grad.

Auf der µC-Platine muß ein Programm laufen, das die Motortreiberplatine ansteuert. Anhand des Programms oder des dazu gehörigen Schaltplanes könnte man dann sagen welcher Pin wofür ist ( Step, Dir, usw. ). Oder halt ausprobieren. /Reset und /Enable der Motortreibersplatine müssen ebenfalls angesteuert werden bzw. fest auf High ( Pluspol ) gelegt werden.



Habe ich die Ausgänge des Pololus mit dem Motor richtig verbunden, oder müssen die Spulen anders angesteuert werden?

Für mich ist der Pololu ja der Motor.
Die Spulen bzw. Wicklungen des Motors sind vermutlich richtig an der Motortreiberplatine angeschlossen, da der Spulenanfang nicht gekennzeichnet ist bzw. ich das Anschlußbild des Motors nicht weiß.

Bernd_Stein

oderlachs
31.12.2011, 21:12
Schau mal hier: http://www.chemshapes.com/?p=410 da musst Du Dich ein bischen belesen...und vielleicht mal nach "arduino + Pololu a4988" googlen findest garantiert was

dussel07
01.01.2012, 00:53
GAAANZ Wichtig!!!
Den Pololu Treiber erst mit Spannung versorgen wenn ein Motor angeschlossen ist!! Ansonsten löst der sich sofort in Rauch auf.
Ansonsten:
Arduino mit Spannung versorgen (Buchse oder USB) -
vom Arduino +5V und Gnd zum Treiber Vdd (+5V) und Gnd -
vom Arduino Digital 01 zum Treiber DIR -
vom Arduino Digital 02 zum Treiber STEP -
Treiber Brücke von sleep zu reset -
Treiber Schrittmotor anschließen -
Treiber Spannungsversorgung für Schrittmotor anschließen -
Fertig -
Im Programm erst mal dauerhaft Digital 01 auf High oder Low setzen -
und Digital 02 toggeln (ständiges wechseln von High auf Low) -


/*
Schrittmotor
alle 200ms ein Schritt in eine Richtung.

This example code is in the public domain.
*/

void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
}

void loop() {
digitalWrite(1, HIGH); // +5V an Pin D1
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}




wenn alles richtig ist dreht sich der Motor in eine Richtung

Sim0n
01.01.2012, 21:34
Hey,

danke an alle, vor allem an Dich, Dussel07!
Deine Hilfe hat mir am meisten geholfen und somit wollte ich das Wissen gleich in die Tat umsetzen und habe eine Platine für den Pololu gezeichnet und anschließend gefräst.
Die nächsten, nahelegenden Tage wird der Motor dann getestet.

Ich werde wohl diesen Thread in einen kleinen Baubericht-Thread umwandeln. :D

Hier die Bilder:


21021
21022
21023

Frooohes Neues und einen freundlichen Gruß

Simon

Sim0n
02.01.2012, 12:23
Hey,

der Motor läuft perfekt.

Gibt es eine Möglichkeit den Motor schneller drehen zu lassen?
Ich habe bisher den Wert von delay von 100 auf 1 geändert.


Vielen Dank an euch, bei Neuigkeiten werde ich diese hier berichten.

Hier ein paar Bilder der Platine (Lötanfänger) und vom gesamten System.
21034
21033

21030

21032

21029

Freundlicher Gruß

Simon

Sim0n
05.03.2012, 17:55
Hey,

bevor ich einen neuen Thread aufmache, wollte ich euch fragen, ob mein Arduino mit dem folgenden Display:
http://www.pollin.de/shop/dt/MTEzOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TC1604A_04.html

kooperiert?

Würde mich sehr auf Eure Antworten freuen :)

oderlachs
09.03.2012, 08:47
Natürlich kannst Du dieses LCD mit dem Arduino ansteuern, nur wird es auch einige Ports belegen die Du dann nicht für andere Sachen zur Verfügung hast. Es geht aber einen I2C oder Seriellen Adapter dazwischen zu schalten, bzw an das LCD zu löten sind meist passend so gebaut. Damit sparst Du dann ein paar Ports am Ardu ein, um sie anderwärtig verwenden zu können.

Gruss Gerhard

oderlachs
09.03.2012, 10:35
GAAANZ Wichtig!!!
Den Pololu Treiber erst mit Spannung versorgen wenn ein Motor angeschlossen ist!! Ansonsten löst der sich sofort in Rauch auf.


Wieso eigendlich dieses ? Das ist doch mal ganz natürlich das mal keine Last am Ausgang vorhanden sein kann, entweder ist das eine Verkaufspolitik oder in meinen Augen eine irreale Schaltungsweise des Treiberbausteins. Ich kann mir nicht denken das ein Chip das Zeiliche segnet nur weil er unbelastet mit Betriebs- bzw. Motorspannung versehen wird.

Gerhard

mausi_mick
14.04.2012, 13:50
Hallo Sim0n,

hab da eigentlich vor kurzem was ähnliches gemacht, ein Shield für 3x 4988:
Sieht leider nicht so schön aus, da nicht gefräst, sondern die Leiterbahnen von Hand ausgeschnitten.
Hab aber die Platinchen steckbar gemacht und unter ihnen die Logik-Spannungsversorgung mit 78L05.

Mittlerweile hab ich den UNO durch ein "Metaboard" von komputer.de ersetzt (ohne USB, nur LM7805,ATMega328,und Buchsenlesiten), sodass ich den UNO für andere Sachen wieder
frei habe. Wollte die A4988 eigentlich mit 1/8 Step betreiben, hab aber den Eindruck, dass das nicht funktioniert.

Gruss mausi_mick

arduinoµthen
10.01.2014, 20:01
GAAANZ Wichtig!!!
Den Pololu Treiber erst mit Spannung versorgen wenn ein Motor angeschlossen ist!! Ansonsten löst der sich sofort in Rauch auf.
Ansonsten:
Arduino mit Spannung versorgen (Buchse oder USB) -
vom Arduino +5V und Gnd zum Treiber Vdd (+5V) und Gnd -
vom Arduino Digital 01 zum Treiber DIR -
vom Arduino Digital 02 zum Treiber STEP -
Treiber Brücke von sleep zu reset -
Treiber Schrittmotor anschließen -
Treiber Spannungsversorgung für Schrittmotor anschließen -
Fertig -
Im Programm erst mal dauerhaft Digital 01 auf High oder Low setzen -
und Digital 02 toggeln (ständiges wechseln von High auf Low) -


/*
Schrittmotor
alle 200ms ein Schritt in eine Richtung.

This example code is in the public domain.
*/

void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
}

void loop() {
digitalWrite(1, HIGH); // +5V an Pin D1
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}




wenn alles richtig ist dreht sich der Motor in eine Richtung

Genau so habe ich es gemacht. Ich nutze den Conrad Emis Schrittmotor E547-52500 12 V/DC Schrittmotor an einem Pololu A4988 und einem Arduino Uno R2
http://www.conrad.de/ce/de/product/198398/Emis-Schrittmotor-E547-52500-12-VDC-Halte-Moment-025-Nm-Phasen-Strom-max-06-A-Wellen-5-mm?

Es funktioniert!. Aber ich möchte gerne die Drehrichtung des Schrittmotors manuell durch den Druck einer Taste ändern können.
Wie muss der Sketch dann abgeändert werden bzw. wie muss der Schaltplan dann aussehen.

Wäre super nett wenn ihr einem Neuling weiterhelfen könnt!:)

mausi_mick
11.01.2014, 03:17
Ich würde eher einen Schalter an einem Digital-Pin (z.B. D2) verwenden. Wenn der Pin z.B auf Low (0V) ist , soll der Motor rechts rum drehen, falls High (5V), links rum. Brauchst dazu nur einen einpoligen Schalter und einen Widerstand. Im Arduino Forum mehrfach beschrieben.

Das obige Zitat von dussel07 ist - wie ich leider anfangs schmerzhaft feststellte - für den A4988 lebenswichtig !

Gruss mausi_mick

robots4-ever
11.01.2014, 11:22
int richtung = 1;void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
digitalWrite(1, HIGH); // +5V an Pin D1
}


void loop() {
do{
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
} while (digitalRead(3) == LOW);
if (richtung == 0){
richtung = 1;
digitalWrite(1, HIGH);
}
else{
richtung = 0;
digitalWrite(1, LOW);
}
delay(10);

}

Das müsste eigentlich gehen.
Du musst nur einen Taster an Pin3 anschließen http://www.arduino-tutorial.de/2010/06/digital-in/.

arduinoµthen
12.01.2014, 12:12
Das müsste eigentlich gehen.
Du musst nur einen Taster an Pin3 anschließen http://www.arduino-tutorial.de/2010/06/digital-in/.

vielen dank, aber bis jetzt geht leider noch nix.

ich habe jetzt einen taster und einen widerstand hergenommen und diesen code ausprobiert. der motor gibt nur ein hochfrequentes fiepen von sich.

ich bin total verzweifelt, da ich das unbedingt hinkriegen muss.

nasenbär1
12.01.2014, 12:50
huhu

gieb den Motor mal 5 ms als delay. bei 100ms sieht man ka kaum das sich da was bewegt.
tut sich dann immer noch nichts sieht es nach falsch angeschlossenem Motorwiklingen aus.
haste ein ossy da?

Gruß
Andreas

Edit: du willst doch auf die taste drücken und er soll los laufen oder?

robots4-ever
12.01.2014, 12:57
Hmmm

ich habe alles so wie in diesem Thread beschrieben aufgebaut und bei mir geht es.
Hast du alles richtig angeschlossen?

arduinoµthen
12.01.2014, 13:08
ich werde in ner std mal posten wie ich es verdarhtet habe, vllt. habe ich ja was falsch gemacht.

ich wollte, dass mit tasterdruck die drehrichtung solange geändert wird, bis wieder gedrückt wird.

wiegesagt, der sketch in meinem Beitrag von 21:01 Uhr funktioniert aber. insofern müssten doch die wicklungen richtig angeschlossen sein?

nasenbär1
12.01.2014, 13:15
richtig schreib mal vor das im loop

eine if schleife die den Taster abfragt und bei high bin d1 high setzt und im else d1 low setzt, dann sollte die Drehrichtung schon mal ändern können.


edit1:


void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}

void loop() {

Taste = digitalRead(3);

if (Taste == HIGH) {
digitalWrite(1, HIGH); // +5V an Pin D1
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}else {
digitalWrite(1, LOW); // +5V an Pin D1
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}

}


so müsste das ungefähr aussehe programmiere die Dinger normal im avr-studio in c da ist der code etwas andert


edit2: hoffe das mit der schleife vor dem loop wird was klare durch edit1 war etwas unglücklich ausgedrückt sorry dafür.

robots4-ever
12.01.2014, 13:27
Das mit der IF Verknüpfung vor der loop Schleife verstehe ich nicht ganz.

mausi_mick
12.01.2014, 13:51
hallo,

mit den Tatern ist das wegen des "Prellens" etwas kritisch, daher einen debounce einbauen , z.B. aus

http://forum.arduino.cc/index.php?topic=170643.0




void loop()
{
reading = digitalRead(inPin);

// Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit:
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
time = millis();
Tue irgendwas
}

// Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
if (reading == LOW && previous == HIGH && millis() - time > debounce) {
time = millis();
Tue irgendwas anderes
}
previous = reading;
}

arduinoµthen
12.01.2014, 15:24
previous was not declared in this scope. Ich habe da einfach keine ahnung, um das entsprechend zu adaptieren. es läuft einfach nix.
DIR habe ich an Digital 3, STEP an Digital 2 und den Knopf an Digital 4 und 5V, weiterhin den Widerstand zwischen Digital 4 und GND

Den ersten Code in meinem Beitrag von 21:01 habe ich genauso kopiert, obwohl hier Digital1 und Digital 2 als Ausgang hergenommen wird und bei mir dieses ja 2 und 3 sind. Das ist schonmal das Erste, was ich nicht verstehe. Aber immerhin funktionierte das. GErade eben habe ich es nocheinmal getestet. Es funktioniert immer noch, also der Motor ist heile, und müsste folglich auch korrekt am Polololu angeschlossen sein.

der betirag von nasenbär von 14:54 entsprechend mithilfe des Links http://www.arduino-tutorial.de/2010/06/digital-in/ auf Arduino umgeschrieben, da Arduino "Taste" nicht kennt:

const int buttonPin = 4;

int buttonState = 0;


void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(2, HIGH); // +5V an Pin D1
digitalWrite(3, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(3, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde

}
else {
digitalWrite(2, LOW); // +5V an Pin D1
digitalWrite(3, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(3, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}
}


nix geht und ich kann mir da nicht helfen. muss ich vielleicht einen schalter statt eines tasters nehmen?

- - - Aktualisiert - - -

Hallo, jetzt geht es.

bei obigem Code muss man 2 durch 3 und 3 durch 2 ersetzen, dann geht es. DIR is bei mir auf 3 und STEP auf 2, also jeweils anderes herum wie in den geposteten Codes

- - - Aktualisiert - - -

aber den Taster muss ich durch einen Schalter ersetzen, da der Motor sich nur solange in die Gegenrichtung bewegt, wie ich die Taste drücke?

- - - Aktualisiert - - -

müssen nur Taster oder auch Schalter entprellt werden? UNd was ist "entprellen" in einfachen Worten?

Geistesblitz
12.01.2014, 15:36
Dafür musst du gucken, ob der Ausgang schon auf High ist oder nicht.
Mal in Pseudocode ausgedrückt:


if Taste==High and Dir==High
Dir=Low;
elseif Taste==High and Dir==Low
Dir=High;


Das sorgt dann dafür, dass bei Tastendruck umgeschaltet wird, allerdings schaltet der dann immer um, wenn er die Schleife aufruft, hält man also länger gedrückt, wechselt es immer zwischen vor und zurück. Daher müsstest du wohl noch eine Variable einführen, die in der Schleife gesetzt wird und dann ein erneutes Umschalten verhindert.
Quasi so:


if Taste==High and Dir==High and Bla==Low
Dir=Low;
Bla=High;
elseif Taste==High and Dir==Low and Bla==Low
Dir=High;
Bla=High;
elseif Taste==Low and Bla==High
Bla=Low;


Edit: Schalter entprellen? Hmm, das weiß ich ehrlich gesagt auch nicht, bei Tastern muss es aber sein. Entprellen bedeutet, dass beim Drücken der Kontakt nicht sofort geschlossen wird, sondern eventuell durch irgendwelche Effekte noch ein zweites Mal auslöst. Dies lässt sich entweder durch einen Kondensator zwischen Eingang und Gnd lösen, der das Spannung für die kurze Zeit hält, oder man macht das softwareseitig, indem man nach dem ersten Kontakt ein Weilchen wartet, bis der Eingang wieder abgefragt wird. Das Entprellen macht aber auch nur Sinn, wenn durch den Taster ein Interrupt ausgelöst wird, wenn du ihn eh nur alle 100ms abfragst, ist die Chance sehr gering, dass er ausgerechnet in dem Moment, wo er abgefragt wird, prellt.

nasenbär1
12.01.2014, 19:17
wundert mich das der code funktioniert hat war einfach mal so hin geschrieben. auch hier wieder einfach um das Schema zu verdeutlichen. Bei fragen fragen :P
schau dir mal externe Interrupts an das wäre wahrscheinlich die eleganteste Lösung dazu.
versuch mal :

const int buttonPin = 4;
const int Dir = 3;
const int Step = 2;

int buttonState = 0;
int merker=0;

void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {

buttonState = digitalRead(buttonPin);

if ((buttonState == HIGH)&&(merker==0))
{
digitalWrite(Dir, HIGH); // +5V an Pin D1
merker=1;
}

if ((buttonState == LOW)&&(merker==1))
{
merker=2;
}

if ((buttonState == HIGH)&&(merker==2))
{
digitalWrite(Dir, LOW); // +5V an Pin D1
merker=3;
}
if ((buttonState == LOW)&&(merker==3))
{
merker=0;
}


}

digitalWrite(Step, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(Step, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde


}


gruß

Andreas

mariere
14.07.2015, 18:22
Hi, eine ganz doofe Frage ich habe folgenden Sketch benutzt. Der Motor dreht sich nun 1 Milisekunde rechts....Pause....und 1 Milisekunde links. Wie kriege ich es hin, dass sich der Motor länger in die eine Richtung und dann länger in die andere Richtung dreht?

Ich weiß, dass das für euch alle wahrscheinlich sehr simpel ist. Würde mich sehr freuen....


/*
Schrittmotor
alle 200ms ein Schritt in eine Richtung.

This example code is in the public domain.
*/

void setup() {
// setzen der Digitalpins 1 und 2 als Ausgang.
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
}

void loop() {
digitalWrite(1, HIGH); // +5V an Pin D1
digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde
}

dussel07
14.07.2015, 21:34
Du hast die Kabel vertauscht -
Pin 1 muß an Richtung
Pin 2 an Tackt

digitalWrite(1, HIGH); // +5V an Pin D1 läßt den Motor in eine Richtung drehen, dauerhaft
digitalWrite(1, LOW); // Gnd an Pin D1 läßt ihn in die andere Richtung drehen, dauerhaft

Dann wird in der Schleife Pin 2 dauerhaft getoggelt (umgeschaltet von +5V auf Gnd und zurück)
Dieser Wechsel ist der Tackt in dem der Motor dreht.

digitalWrite(2, HIGH); // +5V an Pin D2
delay(100); // warte eine zehntel Sekunde
digitalWrite(2, LOW); // Gnd an Pin D2
delay(100); // warte eine zehntel Sekunde

Wenn Du die delayzeit verkleinerst dreht der Motor schneller
wenn Du sie vergrößerst dreht er langsamer - - -

daNnyTigA
15.08.2016, 19:45
hallo,

ich bin gerade dabei einen nema 17 mit dem pololu anzusteuern. habe bisher auch alles angeschlossen bis auf den motor power supply...kann mir jemand empfehlen, was ich da kaufen sollte?

danke und viele grüße
danny