Forum: Mikrocontroller und Digitale Elektronik Poti mit Schrittmotor


von Xob T. (milirp)


Lesenswert?

Hallo.
Ich habe ein Problem mit dem Potentiometer u. dem Schrittmotor:



Stepper per(SPMU, 2,3,4,5);



void setup()

{

  pinMode (2, OUTPUT);
  pinMode (5, OUTPUT);
  pinMode (4, OUTPUT);

  pinMode (3, OUTPUT);
  potiwert = analogRead (Analogpin);





}



void loop() {
  potiwert = analogRead (Analogpin);



 if (potiwert < 342){
     per.setSpeed(400);
 per.step(100);

 }
 if (potiwert > 684){
    per.setSpeed(400);

  per.step(-100);

 }
 else
 per.step(0);
}


Mit diesem Code ändere ich die Drehrichtung des Schrittmotors u. in wenn 
ich das Poti mittig ausrichte ist der Motor aus.
Mein Plan war, dass ich so die Richtung festlege in die sich der Motor 
drehen soll, wenn ein bestimmter Zustand beim Poti erreicht wird. Aber 
dann noch die Geschwindigkeit, je weiter ich das Poti in die Richtung 
drehe, sich erhöht oder mindert.
Je nachdem.
Sozusagen wenn ich das Poti genau mittig einricht, soll nichts 
geschehen.
Wenn ich es in die eine Richtung drehe soll die Geschwindigkeit 
proportional bis zu einem Wert von 400 bei per.setSpeed haben.
Und genau dasselbe in die andere Richtung.

Ich wäre sehr dankbar für Hilfe oder Tipps.

Mili.

von Georg (Gast)


Lesenswert?

Habt gedult M. schrieb:
> else
>  per.step(0);

Das else gilt nur für die 2. Abfrage. D.h. wenn der Wert < 342 ist, wird 
zwar per.step (100) ausgeführt, aber sofort danach per.step(0).

Georg

von m.n. (Gast)


Lesenswert?

So simpel, wie es Dein Programm erledigen soll, geht es nicht.

Es sieht auf den ersten Blick für Dich übertrieben aus, aber hier kannst 
Du sehen, wie man einen Schrittmotor per Poti steuern kann. Weiter unten 
sind auch Beispiele für Arduino (.ino-Dateien): 
http://mino-elektronik.de/Generator/takte_impulse.htm#bsp3

Vielleicht gelingt es Dir die Beispiele zu verstehen. Selbst wenn nicht, 
wären sie ein erster funktionsfähiger Ansatz.

von Joe F. (easylife)


Lesenswert?

1
if (potiwert < 400) 
2
{
3
  speed = 400-potiwert;
4
  step = 100;
5
} 
6
else if (potiwert > 623) 
7
{
8
  speed = potiwert-623;
9
  step = -100;
10
}
11
else
12
{
13
  speed = 0;
14
  step = 0;
15
}
16
17
if (speed < 0) speed = 0;
18
if (speed > 400) speed = 400;
19
20
per.setSpeed(speed);
21
per.step(step);

: Bearbeitet durch User
von EGS (Gast)


Lesenswert?

Hallo,

sehe ich das richtig, das er die Werte vom Analogeingang direkt 
verarbeiten will? Da hat er zwar schön 0-1023 als Wertebereich aber 
neuen Skalierung.

Ich würde den Wert skalieren:

RawPotiVal=AnalogRead(AnalogPin)

PotiVal=map(RawPotiVal, 0, 1023, -400, 400)

So kann auch ganz gut mit den Werten erkennbar weitergearbeitet werden. 
Und alles was dann zwischen -10 und 10 liegt ist aus.

Auch würde ich die Abfrage des ADC nicht so oft machen, lieber alles 
200-500 ms, so schnell ändert sich das Poti meistens nicht. Und den 
Potiwert nur bei Wertänderungen größer Wert x  am Analogpin neu 
schreiben...

Gruß EGS

von Wolfgang (Gast)


Lesenswert?

Habt gedult M. schrieb:
> Ich wäre sehr dankbar für Hilfe oder Tipps.

Wenn du den Quellcode sauber formatierst, ist die Programmstruktur 
wesentliche einfacher zu erfassen.

Habt gedult M. schrieb:
> if (potiwert < 342){
>      per.setSpeed(400);
>  per.step(100);
>
>  }
>  if (potiwert > 684){
>     per.setSpeed(400);
>
>   per.step(-100);
>
>  }
>  else
>  per.step(0);
> }

Bei der Formatierung blickt doch keiner durch.

Guck mal, ob deine Entwicklungsumgebung über ein Werkzeug für 
automatische Formatierung verfügt?
Das ist allemal besser als diese völlig widersprüchlische Mischung aus 
Einrückungen und geschweiften Klammern.

von Xob T. (milirp)


Lesenswert?

Vielen Dank erstmal.
Ich habe den Sketch umgeschrieben und im Seriellen Monitor wird mir 
erfolgreich je nach Position eine Skala von 400 bis -400 angezeigt.
Doch als ich in set.Speed den Potiwert vorgab blieb der Motor still und 
es wurde auch nichts mehr im Seriellen Monitor angezeigt.
Hier mal der Sketch :


....
void loop() {
int RawPoti=analogRead(Analogpin);

potiwert=map(RawPoti, 0, 1023, -400, 400);
Serial.println (potiwert);
 if (potiwert < - 50){
     per.setSpeed(potiwert);
 per.step(100);

 }
 if (potiwert >= 50){
    per.setSpeed(potiwert);

  per.step(-100);

 }
 else
 per.step(0);
}


Vg. MILI

von Joe F. (easylife)


Lesenswert?

Probiere doch einfach mal den (funktionierenden) Code aus, den man dir 
schon geliefert hat. Das geht ja mit copy&paste recht schnell.
Beitrag "Re: Poti mit Schrittmotor"

Dann übst du Source-Code formatieren.

Und dann versuchst du mal zu verstehen was Georg gesagt hat:
Georg schrieb:
> Das else gilt nur für die 2. Abfrage.

Und wenn dann noch Zeit ist, guckst du mal nach, ob man per.setSpeed() 
negative Werte übergeben sollte.

: Bearbeitet durch User
von Xob T. (milirp)


Lesenswert?

Ja das letztere habe ich auch gerade gemerkt aber ja ich werde mal 
schauen.
Trotzdem vielen Dank

von Joe F. (easylife)


Lesenswert?

Ok, der Code ist nicht gut, da step(100) nach setSpeed(1) eine Minute 
blockiert.
Bei langsamen Drehzahlen dürfen also auch nur wenige Schritte gemacht 
werden, damit die Schleife nicht zu lange hängen bleibt.

Es muss also so aussehen:
1
if (potiwert < 400) 
2
{
3
  speed = 400-potiwert;
4
  per.setSpeed(speed);
5
  per.step(speed);
6
} 
7
else if (potiwert > 623) 
8
{
9
  speed = potiwert-623;
10
  per.setSpeed(speed);
11
  per.step(-speed);
12
}

Im Fall der Mittenstellung muss eigentlich nichts gemacht werden, denn 
so lange kein per.step() Aufruf erfolgt, steht der Motor.

: Bearbeitet durch User
von Xob T. (milirp)


Lesenswert?

Giebt es auch eine andere Möglichkeit das per.step() zu umgehen weil da 
das Programm auf nicht reagieren und so ist set.speed() immer 
zeiverzögert

von Ramazan U. (ramazan_u)


Lesenswert?

hast du dazz schon eine funktionierende lösung gefunden ?

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.