PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Steuerung eines Stepper-Motors



WaFi
05.03.2016, 14:30
Hallo zusammen,
Ich bin neu hier, und habe nur geringe Kenntnisse in der Programmierung.

Endlich im Ruhestand versuche ich jene Projekte nachzuholen, für die mir in den letzten Jahren keine Zeit blieb. (Am Ende meiner Studienzeit (TGM; Wien), gab es gerade einmal IC´s :) )

Entschuldigt daher meine - für euch sicher - Trivial-Fragen.

Auch bin ich mit der Arbeit auf einer Plattform noch nicht so vertraut. Sollte ich Blödsinn verbreiten bitte ich um milde Rügen.

Ein Traum von mir war immer einen Steppermotor richtig steuern zu können.

Dazu besitze ich:
einen ARDUINO UNO
ein Motor Shield von LinkSprite
http://linksprite.com/wiki/index.php5?title=Motor_Shield
einen Steppermotor (2 Phasen)
Demo-Programm: LinkSprite Stepper Motor Control (siehe Anhang)

Der Test mit o .g. Software war erfolgreich.
Auch habe ich es geschafft die Drehrichtung über ein Analogeingang (A2) von "außen" du beeinflussen.

Was ich aber absolut nicht schaffe ist
- die Geschwindigkeit
- die Anzahl der Steps
Von außen z. B. mittels Poti über einen Analogeingang zu bestimmen.

Für ein paar Zeilen Code wäre ich sehr dankbar!

Anbei noch das Derzeit in Verwendung stehende Programm:

#include <Stepper.h>

const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8,11,12,13);

void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
}

void loop() {
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);

step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}

Herzlichen Dank
Walter

inka
05.03.2016, 17:18
hallo Walter,




Ein Traum von mir war immer einen Steppermotor richtig steuern zu können.

Dazu besitze ich:
einen ARDUINO UNO
ein Motor Shield von LinkSprite
http://linksprite.com/wiki/index.php5?title=Motor_Shield
einen Steppermotor (2 Phasen)
Demo-Programm: LinkSprite Stepper Motor Control (siehe Anhang)


auch ich bin seit einiger zeit im "unruhestand" und elektronik bzw. digitaltechnik war nicht mein beruf. Auch gibt es hier sicher erfahrenere, als ich es bin...

- Uno ist schon mal gut
- welchen steppermotor verwendest Du genau?
- es geht auch ohne einen motorshield
- ich würde es mit der library "CustomStepper (http://playground.arduino.cc/Main/CustomStepper)" versuchen, verwende tue ich diese stepper (http://www.instructables.com/id/BYJ48-Stepper-Motor/)

ich habe hier noch etwas: ab hier (https://www.roboternetz.de/community/threads/68202-fahrzeug-mit-vier-motoren-und-vier-encodern/page3?p=621937&viewfull=1#post621937) geht es um steppermotoren als ersatz für DC-motoren bei meinem roboter

i_make_it
05.03.2016, 17:52
Momentan hast Du die Drehzahlvorgabe in der Setup Sektion.



// set the speed at 60 rpm:
myStepper.setSpeed(60);


Soll die Drehzahl variabel sein, dann muß der Wert abhängig von der Potistellung in der Hauptschleife gesetzt werden.

Soll der Motor mit einem Poti in beide Richtung steuerbar sein, dann hast Du 3 Fälle die Du unterscheiden mußt.
Linkslauf, Stop, Rechslauf.
Damit Stop nicht zu schwierig einzustellen ist, wertet man auf einen etwas größeren Bereich für Stop aus.

Bsp.
Poti 0V bis 5V = 0 digit bis 1023 digit.
Dann nimmt man 0-501 für Linkslauf.
Und 521-1023 für Rechtslauf.
502 bis 520 ist dann Stillstand.

Pseudocode
## Schleife
Abfrage Potieingang und Zuordnung zur Variable potiwert
IF potiwert < 502 Sprung zu linkslauf
IF Potiwert > 520 sprung zu rechtslauf
myStepper.setSpeed(0);
##

## Subroutine linkslauf
drehzahl = (potiwert -502)*(-1)
myStepper.setSpeed(drehzahl);
myStepper.step(-stepsPerRevolution);
##

## Subroutine rechtslauf
drehzahl = potiwert - 520
myStepper.setSpeed(drehzahl);
myStepper.step(stepsPerRevolution);
##

WaFi
05.03.2016, 18:28
als Stepper-Motor verwende ich für meine "Tests" derzeit einen Mercury Motor SM-42BYG011-25.
Er benötigt wenig Strom und kann mittels kleinem Steckernetzteil gut betrieben werden.
Ist für die Tests am Schreibtisch ideal.

das verwendete Motosshield dachte ich ist sinnvoll wegen
- dem nötigen Strom und
- den Schutzdioden
Preis war gerade einmal € 18.-

Die o. g. SW mit den wenigen Code-Zeilen läuft ja auch prima.
Ich würde nur gerne die Zeile:
const int stepsPerRevolution = 200;
derart verändern, dass ich eine Variable z. B. auf A2 einlesen und verwende kann.

- - - Aktualisiert - - -

Danke inka,
und noch einen schönen Abend.
LG
Walter

- - - Aktualisiert - - -

Ein Dank auch an i_make_it!
Werde das in den nächsten Tagen versuchen.
LG
Walter

i_make_it
05.03.2016, 18:28
const int stepsPerRevolution = 200;


das würde ich so lassen, denn für einen 1,8° Stepper stimmen 200 Schritte pro Umdrehung.



myStepper.setSpeed(60);

Hier wird die Drehzahl gesetzt. (in dem Fall auf 60 Umdrehungen pro Minute)

inka
05.03.2016, 18:53
als Stepper-Motor verwende ich für meine "Tests" derzeit einen Mercury Motor SM-42BYG011-25.

ja, der NEMA-17 ist ein schöner schrittmotor, für den brauchst du wahrscheinlich auch das shield, bei meinen war die steuerelektronik schon dabei, und für vier habe ich gerade 9 Eur gezahlt. Allerdings hätte ich stärkere lieber gehabt, die NEMA 17 waren mir aber zu groß (mechanisch)...

viel spass noch im forum...

WaFi
08.03.2016, 17:43
Danke Kollegen, es hat geklappt!

weitere Fragen:

- wann kalkuliert man bei dem AD-Wandler mit 1023 und wann mit 255 ?

- wo bekommt man die günstigen 4 Stepper Motore + Steuerelektronik ?

- wo bekommt man Zahnräder, Wellen, Zahnstangen etc.?

LG
Walter

oberallgeier
08.03.2016, 18:01
.. - wann kalkuliert man bei dem AD-Wandler mit 1023 und wann mit 255 ? ..Der ADC hat nominell 10 Bit Auflösung, d.h. er gibt Werte aus zwischen 0 und 1023. Das Ergebnis steht dann in zwei Registern, weil eins nur 8 Bit fasst. Deutlich schneller kann er arbeiten (bitte dazu das Datenblatt lesen - vermutlich gibts die Option auch für arduino) und natürlich auch ausgelesen werden, wenn er nur mit 8 Bit arbeiten darf (dann wird der Registerinhalt gleich beim Wandeln "verschoben" - siehe Datenblatt) - und das sind dann 0 .. 255, also 255 Schritte.

inka
08.03.2016, 18:01
hi Walter,

glückwunsch...

wie hast es hinbekommen?


den stepper bekommst Du hier (http://de.aliexpress.com/item/New-Board-ULN2003-5-Line-4-Phase-5V-Stepper-Motor-28BYJ-48-With-Drive-Test-Module/32327223834.html?spm=2114.010208.3.20.E8J8jY&ws_ab_test=searchweb201556_7,searchweb201644_5_505 _506_503_504_301_10020_502_10001_10002_10017_10005 _10006_10003_10021_10004_10022_10018_10019,searchw eb201560_2,searchweb1451318400_-1,searchweb1451318411_-1&btsid=4abcd66c-f282-4dcd-855e-05c68f22035e), evtl. auch noch billiger...

Dauert allerdings ein paar wochen...

bei zahnrädern, wellen usw. würde ich "C" emnpfehlen, ebay, sogar bei amazon hab ich schon was gesehen...

Searcher
08.03.2016, 18:22
- wo bekommt man Zahnräder, Wellen, Zahnstangen etc.?


Im RN-Wissen gibt eine Auflistung von Bezugsquellen. Unter "Materialien" könntest Du fündig werden.
http://rn-wissen.de/wiki/index.php?title=Bezugsquellen#Materialien (http://rn-wissen.de/wiki/index.php?title=Bezugsquellen#Materialien)

Gruß
Searcher

WaFi
08.03.2016, 20:31
Danke für die Infos!

Entschuldigung, aber ich schaffe es nicht zu zitieren. Gibt es da ein Geheimnis?

Kann man doch nur "den Beitrag" markieren, dann Taste "Beitrag zum markieren auswählen" und nachher "Zitieren" auswählen ????????????

inka
08.03.2016, 21:35
du kannst wählen zwischen "antworten" und "zitieren". Zitieren auswählen und dann die tags für (quote) und (/quote) so kopieren und verteilen, dass das eine immer an anfang und das andere am ende des zu zitierten textes ist...

WaFi
10.03.2016, 16:43
"wie hast es hinbekommen?"

ich hab die Vorschläge von i_make_it aufgenommen und weiter experimentiert ! :-)

i_make_it
11.03.2016, 05:47
bla bla eigener Text



Entschuldigung, aber ich schaffe es nicht zu zitieren. Gibt es da ein Geheimnis?


bla bla eigener Text



Kann man doch nur "den Beitrag" markieren, dann Taste "Beitrag zum markieren auswählen" und nachher "Zitieren" auswählen ????????????


und noch mehr bla bla


Da das mit dem Zitieren anscheneind noch nicht klappt, mal mit Bildern.
Um das wie oben hinzubekommen:
31420
Bei dem Beitrag den man zitieren möchte den Zitieren Knopf drücken.

31421
Die Zitat Quotas identifizieren

31422
Und den Post so formatieren wie man ihn haben will.

fredyxx
08.04.2016, 16:00
hallo Walter,

- ich würde es mit der library "CustomStepper (http://playground.arduino.cc/Main/CustomStepper)" versuchen, verwende tue ich diese stepper (http://www.instructables.com/id/BYJ48-Stepper-Motor/)



Hallo Inka,

ich verwende den gleichen Stepper und die gleiche Treiberelektronik, auf den/ die du verweist.
Mit dem Programm Stepper_oneRevolution aus den Beispielen gelingt es mir zwar den Motor zum Drehen zu bewegen, aber er ändert seine Drehrichtung nicht.

Ich muss noch ergänzen, dass ich den Eindruck habe, dass die LED's auf der Platine ihre Reihenfolge ändern.

Kennst du das Problem?

Was ist da falsch?

vG

fredyxx

inka
08.04.2016, 16:26
hallo fredyxx,


ich verwende den gleichen Stepper und die gleiche Treiberelektronik, auf den/ die du verweist.
Mit dem Programm Stepper_oneRevolution aus den Beispielen gelingt es mir zwar den Motor zum Drehen zu bewegen, aber er ändert seine Drehrichtung nicht. ich finde in den beispielen der lib nur ein beispiel "stepper"

Ich muss noch ergänzen, dass ich den Eindruck habe, dass die LED's auf der Platine ihre Reihenfolge ändern.
Kennst du das Problem?

nein das problem kenne ich nicht, bei mir blinken die LED's nur...

kannst Du den code posten?

fredyxx
08.04.2016, 16:56
hallo fredyxx,
ich finde in den beispielen der lib nur ein beispiel "stepper"


nein das problem kenne ich nicht, bei mir blinken die LED's nur...

kannst Du den code posten?

Stepper ist schon richtig. Dahinter sind dann 4 Varianten. eine davon ist Stepper_oneRevolution


/*
Stepper Motor Control - one revolution

This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.

The motor should revolve one revolution in one direction, then
one revolution in the other direction.


Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe

*/

#include <Stepper.h>

const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
}

void loop() {
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);

// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}


Ich bin mir auch gar nicht sicher, ob es sich um einen Uni - oder Bipolaren Stepper handelt!!

- - - Aktualisiert - - -


hallo fredyxx,

nein das problem kenne ich nicht, bei mir blinken die LED's nur...



Um die LED's erkennen zu können, muss man die Geschwindigkeit sehr langsam einstellen.

inka
08.04.2016, 17:10
beim dem beispiel handelt es sich um ein beispiel aus der "standard" arduino library, nicht aus der "customstepper". Mit dieser habe ich mich bisher nicht beschäftigt, kann also nicht so auf die schnelle helfen...

kommen die meldungen cw und ccw beide im serialmonitor an? Evtl. die delays vergrößern?

fredyxx
08.04.2016, 17:31
beim dem beispiel handelt es sich um ein beispiel aus der "standard" arduino library, nicht aus der "customstepper". Mit dieser habe ich mich bisher nicht beschäftigt, kann also nicht so auf die schnelle helfen...

kommen die meldungen cw und ccw beide im serialmonitor an? Evtl. die delays vergrößern?

ja, kommen beide an!

inka
08.04.2016, 18:12
für den unrugigen lauf (darauf deuten die unregelmäßig leuchtenden led's hin) könnte das hier (https://blog.thesen.eu/es-geht-doch-schrittmotor-28byj-48-mit-der-original-arduino-stepper-library/) abhelfen. Das andere weiss ich nicht...

fredyxx
08.04.2016, 18:15
Hallo Inka,

ich hab's nun mit dem CustomStepper versucht und es funktioniert damit

Mit dem ersten Programm nahmen die LEDs nur 4 verschiedene Zustände an, während es mit CustomStepper 8 verschiedene sind und das Drehmoment an der Welle ist auch deutlich höher.

vG

fredyxx