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.
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
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.
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
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
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.
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
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
Ja das letztere habe ich auch gerade gemerkt aber ja ich werde mal schauen. Trotzdem vielen Dank
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.