Poti mit Schrittmotor

#4738215
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.
Gast #4738271
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.
#4738310
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);
Gast #4738340
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
Gast #4738350
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.
#4738908
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
#4738918
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.
#4738928
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren