Hallo wir haben ein kleines Problem mit unserem Projekt bitte helft uns!!!
Wir möchten eine Lego-kransteuerung machen.
Dazu verwenden wir einen Stepp motor und 2 push-buttons.
Wird ein Push-button betätigt soll er das Seil ablassen, wird der andere betätigt soll er das Seil aufwickeln.
Wir haben schon versucht mehrere Programme miteinander zu kombinieren kommen aber einfach nicht voran.
Das Problem ist wir können nicht gerade gut Programmieren und sind am verzweifeln.
... schon mal meinen Kaffee für neuen Kaffeesatz hol .... (insider)
Hi,
wenn ihr konkrete Hilfe haben wollt, dann müsst ihr angeben wie weit ihr gekommen seid und wo die Probleme bestehen.
Dazu gehört Quelltext und mindestens Schaltskizzen vom Projekt.
Wir verwenden nur die tutorials aber wir sind schon so weit dass sich der Motor dreht, jetzt bräuchten wir nur noch die steuerung dazu mit
den 2 push-buttons.
Das ist unser Programm wir hoffen du kannst uns weiter helfen!
#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);
int stepCount = 0; // number of steps the motor has taken
void setup() {
// initialize the serial port:
Serial.begin(9600);
}
void loop() {
// read the sensor value:
int sensorReading = analogRead(A0);
// map it to a range from 0 to 100:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution/100);
}
}
Irgendwas passt da nicht.
Du redest von Push-Buttons, also Taster. Die können nur zwei Zustände annehmen (gedrückt/nicht gedrückt) und werden demzufolge digital ausgelesen. Im Sketch wiederum hast Du ein analogRead(). Hängt da der Taster dran?
Vermutlich hängt A0 in der Luft und liefert zufällige Werte. Mal davon abgesehen, dass analogRead() zu schnell aufgerufen wird
und deswegen ebenfalls keine zuverlässigen Werte liefert. Da diese wahrscheinlich > 0 sind, läuft der Stepper.
Ich kann euch empfehlen einen zweiten Sketch zu schreiben und zwei Buttons zu implementieren. Debounce von Tastern
Anhand dessen ihr auf Serial die jeweiligen Zustände der Buttons ausgebt (Taste1 gedrückt, Taste1 losgelassen, ...).
Wenn Ihr das schafft, dann müsst ihr nur noch bei jeweiligem Zustand den Motor steuern.
Taste1 gedrückt -> Motor rechtsrum laufen lassen
Taste1 losgelassen -> Motor Stop
Taste2 gedrückt -> Motor linksrum laufen lassen
Taste2 losgelassen -> Motor Stop
Bzw. diese Bounce Lib wäre für euren Zweck sogar besser.
Die bisherige Leistung ist ja nur, den Beispielsketch stepper_speedControl um ein Serial.begin (9600); zu bereichern...
Natürlich kann man auf solche Dinge aufbauen, aber das Definieren von zwei Pins als Eingang gehört zu den einfachsten Grundlagen. Wenn euch das noch nicht bewusst ist, wird der Weg zur erfolgreichen Beendigung des Projekts sehr steinig.
martin_zangerl:
… @MaFu
ja wir wollen die Taster gedrückt halten und wollten diese auch an analogRead() ranhängen.
…
Das bringt natürlich nichts. Da der Taster ja nur zwei Zustände liefern kann, liest Du bei analogRead() auch nur zwei Werte aus: 0 oder 1023.
Häng die zwei Taster einfach an normale Digitalpins und lies den Zustand über digitalRead().
Das Problem ist wir können nicht gerade gut Programmieren
Das ist kein Problem. Ihr müsst aber mindestens verstehen, was "euer" Sketch macht...
wir wollen die Taster gedrückt halten und wollten diese auch an analogRead() ranhängen.
Ihr habt zwar genug Pins frei, aber warum nicht.
A0 müsste also 3 verschiedene Spannungen kriegen, je nach dem ob kein Taster oder der eine oder der andere gedrückt ist.
( Die beiden Taster kann man auch gleichzeitig drücken, was passiert dann ? ! )
--> Spannungsteiler (Mehrstufig ! ?)
Da ihr hoffentlich die H-Brücke richtig angeschlossen habt, könnt ihr also den mit analogRead(A0) gemessenen Wert in eine Vorwärts- und eine Rückwärts-Richtung umsetzen ...
Wollt ihr dazu die --> map Funktion, die zur Zeit einen Wert zwischen 0 und 100 liefert, anpassen ?
Das kann eine elegante Lösung werden
(MaFu hat natürlich auch recht, Taster kann man auch einfacher lesen, wenn man genug Digitalpins hat )
KISS ( Keep It Stupid Simple ) ist eine bewährte Methode.
@Nighti : Stepper::step enthält genug delay-Totzeit, um entprellen überflüssig zu machen, denke ich ...
Vielleicht hast du den bzw. die Schalter oder Taster falsch angeschlossen, soll ja auch mal vorkommen. Verwendest du externe Pullup- bzw. Pulldown-Widerstände? Kannst ja mal ein Foto deines Aufbaus machen.
Weiterhin erwartet delay() eine unsigned long-Variable für die Pause in Millisekunden, 0.01 ist hier einfach verkehrt. Wenn du 0,01 Sekunden meinst, muss daraus ein delay(10); werden.
Sieht gut aus, rein theoretisch beim Draufschauen fällt mir nichts Grobes auf, käme auf einen Versuch an. Glückwunsch !
Ich nehme mal an, das Poti soll für die Geschwindigkeit sein und kommt an A0
Ansonsten, Kleinkram:
1.Wie sth schon bemerkt hat: Schade, dass delay(.01); keinen Syntaxfehler bringt ...
Warum ruft ihr
motor.step(1);
motor.setSpeed(RPM);
in dieser Reihenfolge auf ?
Für jeden Schritt des Motors eine Ausgabezeile, ist ein bisschen viel für meinen Geschmack.
Willst du auch Kommentare zu noch kleinerem Kleinkram ? [b] const [/b] int forward = 2;
... [b] boolean [/b] f = digitalRead(forward);
n. Du hast keine Code-Tags verwendet
Ansonsten: Wenn das Programm das macht was ihr wollt, ist es gut und wartet auf Verbesserungen.
Wenn es nicht das macht, was ihr wollt, was passiert dann ?