Arduino Motor Shield Schrittmotor

Hallo,

erst einmal vorweg, ich bin noch komplett unerfahren im Bezug auf die Arduino-Programmierung und muss/möchte mich jetzt im Zuge eines Uniprojektes damit auseinandersetzen.

Dabei scheitere ich leider schon an einer vermutlich einfachen Aufgabe, der Ansteuerung eines Stepper Motors über das Arduino Shield.

Ich habe es mithilfe dieses Tutorials versucht http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/?ALLSTEPS, bekomme den Motor aber einfach nicht zum Laufen. Anstatt zu rotieren, bewegt er sich lediglich minimal vor- und zurück. Ich denke, dass es an der Polung des Motors liegt.
Könnt ihr mir sagen in welcher Reihenfolge ich den Schrittmotor anschließen muss? Er ist bipolar, hat somit ja 4 Kabel. Am Shield gibt es 2 Channel mit je "+" und "-". Wie muss ich die Kabel nun verbinden?

Hier nochmal der kopierte Code des zuvor angesprochenen Tutorials:

/*************************************************************
Motor Shield Stepper Demo
by Randy Sarafan

For more information see:
http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/

*************************************************************/

int delaylegnth = 30;

void setup() {

//establish motor direction toggle pins
pinMode(12, OUTPUT); //CH A -- HIGH = forwards and LOW = backwards???
pinMode(13, OUTPUT); //CH B -- HIGH = forwards and LOW = backwards???

//establish motor brake pins
pinMode(9, OUTPUT); //brake (disable) CH A
pinMode(8, OUTPUT); //brake (disable) CH B

}

void loop(){

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, HIGH); //DISABLE CH B

digitalWrite(12, HIGH); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

delay(delaylegnth);

digitalWrite(9, HIGH); //DISABLE CH A
digitalWrite(8, LOW); //ENABLE CH B

digitalWrite(13, LOW); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

delay(delaylegnth);

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, HIGH); //DISABLE CH B

digitalWrite(12, LOW); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

delay(delaylegnth);

digitalWrite(9, HIGH); //DISABLE CH A
digitalWrite(8, LOW); //ENABLE CH B

digitalWrite(13, HIGH); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

delay(delaylegnth);

}

Vielen Dank! :slight_smile:

Julian

julian_n:
... Ich habe es mithilfe dieses Tutorials versucht ...

Hat die Referenz keine Codebeispiele für das, was Du tun möchtest?

Gruß

Gregor

Hallo Julian,
willkommen im Forum!

Meine Lieblingsseite zum Thema.

julian_n:
Könnt ihr mir sagen in welcher Reihenfolge ich den Schrittmotor anschließen muss? Er ist bipolar, hat somit ja 4 Kabel. Am Shield gibt es 2 Channel mit je "+" und "-". Wie muss ich die Kabel nun verbinden?

Zunächst mußt Du herausfinden, welche Kabel zu einer Spule gehören (siehe "Wie identifiziert man die Leitungen wenn man kein Datenblatt zum Motor hat?"). Die Kabel einer Spule schließt Du an A+ und A- an, die andere Spule an B+ und B-. Welches Kabel Du an + oder - anschließt, bestimmt die Drehrichtung, ist für den ersten Versuch aber egal.

Super, schon mal vielen Dank für eure Hilfe.

In der Referenz hab' ich leider nur etwas für den Arduino an sich gefunden, jedoch nicht in Verbindung mit dem Motor Shield.

Welche Kabel zusammengehören habe ich denke ich schon rausgefunden, indem ich je auf 2 Kabel Strom gegeben habe und dann geschaut habe, ob sich der Motor noch drehen lässt bzw. ob nen Haltemoment spürbar ist.

Morgen werde ich dann mal versuchen sie korrekt anzuschließen, mal schauen ob es dann mit dem Beispielcode hinhaut.

Schönen Abend noch! :slight_smile:

julian_n:
Welche Kabel zusammengehören habe ich denke ich schon rausgefunden, indem ich je auf 2 Kabel Strom gegeben habe und dann geschaut habe, ob sich der Motor noch drehen lässt bzw. ob nen Haltemoment spürbar ist.

Das misst man mit einem Multimeter:

http://rn-wissen.de/wiki/index.php?title=Schrittmotoren#Wie_identifiziert_man_die_Leitungen_wenn_man_kein_Datenblatt_zum_Motor_hat.3F

Bei 4 Kabeln gibt es den Common Anschluss nicht, aber da hast du auch jeweils zwei Kabel wo man einen Widerstand misst. Wenn man zwei Kabel in der Hand hat die zu unterschiedlichen Spulen gehören ist der Widerstand unendlich

Hallo,

habe es heute nochmal probiert, leider wieder erfolglos. Die Motorverkabelung habe ich definitiv richtig, habe es über den Widerstand erneut getestet. Der Motor fängt auch an zu zucken, allerdings scheint dabei immer nur eine Spule zu arbeiten.
Ich habe mir die einzelnen Werte mal ausgeben lassen, das ist dabei rumgekommen:

Schritt 1
1
1
1000
983
Schritt 2
1
0
1009
983
Schritt 3
0
0
914
0
Schritt 4
0
1
898
0

Die ersten beiden Werte stehen dabei jeweils für die Richtung der Channel, der 3. sowie 4. Wert für das Signal zum Drehen, also die PWM Signale.
Dabei wundert mich, dass bei Schritt3 sowie Schritt 4 kein Signal anliegt, obwohl es doch eines geben müsste?

Hier noch einnmal der verwendete Code:

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, LOW); //ENABLE CH B

digitalWrite(12, HIGH); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

digitalWrite(13, HIGH); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

Serial.println("Schritt 1");
Serial.println(digitalRead(12));
Serial.println(digitalRead(13));
Serial.println(analogRead(3));
Serial.println(analogRead(11));

delay(delaylegnth);

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, LOW); //ENABLE CH B
digitalWrite(12, HIGH); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

digitalWrite(13, LOW); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

Serial.println("Schritt 2");
Serial.println(digitalRead(12));
Serial.println(digitalRead(13));
Serial.println(analogRead(3));
Serial.println(analogRead(11));

delay(delaylegnth);

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, LOW); //ENABLE CH B
digitalWrite(12, LOW); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

digitalWrite(13, LOW); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

Serial.println("Schritt 3");
Serial.println(digitalRead(12));
Serial.println(digitalRead(13));
Serial.println(analogRead(3));
Serial.println(analogRead(11));

delay(delaylegnth);

digitalWrite(9, LOW); //ENABLE CH A
digitalWrite(8, LOW); //ENABLE CH B

digitalWrite(12, LOW); //Sets direction of CH A
analogWrite(3, 255); //Moves CH A

digitalWrite(13, HIGH); //Sets direction of CH B
analogWrite(11, 255); //Moves CH B

Serial.println("Schritt 4");
Serial.println(digitalRead(12));
Serial.println(digitalRead(13));
Serial.println(analogRead(3));
Serial.println(analogRead(11));

delay(delaylegnth);

Viele Grüße

So,

ich habe versucht einen simplen DC Motor über die Channel zum Laufen zu bringen mithilfe des folgenden Beispielcodes:

const int
PWM_A = 3,
DIR_A = 12,
BRAKE_A = 9,
SNS_A = A0;

void setup() {
// Configure the A output
pinMode(BRAKE_A, OUTPUT); // Brake pin on channel A
pinMode(DIR_A, OUTPUT); // Direction pin on channel A

// Open Serial communication
Serial.begin(9600);
Serial.println("Motor shield DC motor Test:\n");
}

void loop() {

// Set the outputs to run the motor forward

digitalWrite(BRAKE_A, LOW); // setting brake LOW disable motor brake
digitalWrite(DIR_A, HIGH); // setting direction to HIGH the motor will spin forward

analogWrite(PWM_A, 255); // Set the speed of the motor, 255 is the maximum value

delay(5000); // hold the motor at full speed for 5 seconds
Serial.print("current consumption at full speed: ");
Serial.println(analogRead(SNS_A));

// Brake the motor

Serial.println("Start braking\n");
// raising the brake pin the motor will stop faster than the stop by inertia
digitalWrite(BRAKE_A, HIGH); // raise the brake
delay(5000);

// Set the outputs to run the motor backward

Serial.println("Backward");
digitalWrite(BRAKE_A, LOW); // setting againg the brake LOW to disable motor brake
digitalWrite(DIR_A, LOW); // now change the direction to backward setting LOW the DIR_A pin

analogWrite(PWM_A, 255); // Set the speed of the motor

delay(5000);
Serial.print("current consumption backward: ");
Serial.println(analogRead(SNS_A));

// now stop the motor by inertia, the motor will stop slower than with the brake function
analogWrite(PWM_A, 0); // turn off power to the motor

Serial.print("current brake: ");
Serial.println(analogRead(A0));
Serial.println("End of the motor shield test with DC motors. Thank you!");

while(1);
}

Sofern ich die Anschlüsse auf den Channel B abändere funktioniert alles hervorragend, bleiben sie auf A passiert einfach gar nichts. Weder die LEDs auf dem Shield, noch ein Messgerät misst irgendwas. Ich vermute dann mal, dass der Channel A irgendwie zerschossen ist... Kann man da etwas machen oder muss nen' neues Shield her?

Viele Grüße

julian_n:
... Kann man da etwas machen oder muss nen' neues Shield her?

Uff. Dein Posting ist länglich :slight_smile: Gut.

Deine Folgerung scheint mir zu stimmen. Falls das Shield kaputt ist: Garantie checken. Wenn da nichts geht, neues kaufen.

Alternative: Du machst Dich ganz klein, den Lötkolben auch. Dann brauchst Du nur noch ein bisschen Mut :slight_smile:

Gruß

Gregor

Es lag am Shield. -.- Konnte noch ein anderes auftreiben und nun läuft der Schrittmotor 1A. Ärgerlich, wenn man so viel Zeit damit verbrät, aber kann man nunmal nicht ändern....

Vielen Dank für eure Hilfe!