arduino stepper projekt für schule

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.

Mit freundlichen Grüßen
Martin :slight_smile:

... 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.

Grüße
Nighti

hi Nighti!

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);
  } 
}

mfg martin

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.

Hey :slight_smile:

@Nighti
Wir hatten auch schon überlegt die taster mit debounce zu steuern und werden es probieren.

@MaFu
ja wir wollen die Taster gedrückt halten und wollten diese auch an analogRead() ranhängen.

Vielen Dank für eure Antworten

mfg
Martin

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 :wink:

(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 ...

Hallo Leute,

Heute haben wir wieder weiter gearbeitet und wollen nun auch einen Poti verbauen.

Was haltet ihr von dem Programm?

#include <Stepper.h>

int forward = 2;
int reverse = 3;

Stepper motor(200, 10,11,12,13);            

void setup() {
  pinMode(forward,INPUT);
  pinMode(reverse,INPUT);
    Serial.begin(9600);
}

void loop() {
  int Speed = analogRead(A0);
  int RPM = map(Speed, 0, 1023, 0, 100);
  int f = digitalRead(forward);
  int r = digitalRead(reverse);
  if(f == 1 && r == 0 && RPM > 1){
  motor.step(1);
    motor.setSpeed(RPM);
    delay(.01);
  }
  if(r == 1 && f== 0  && RPM > 1){
    motor.step(-1);
    motor.setSpeed(RPM);
        delay(.01);
  }
  delay(5);
    Serial.println(RPM);
}

Allerdings funktioniert es irgendwie nicht. Der Motor dreht sich man kann auch den Poti einstellen nur der Schalter geht nicht.

Mit freundlichen Grüßen
Martin :slight_smile:

[EDIT] Code Tags hinzugefügt. grüße Uwe[/EDIT]

Vielleicht hast du den bzw. die Schalter oder Taster falsch angeschlossen, soll ja auch mal vorkommen. :wink: 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.

Was haltet ihr von dem Programm?

  1. 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 ...

  1. Warum ruft ihr
motor.step(1);
motor.setSpeed(RPM);

in dieser Reihenfolge auf ?

  1. Für jeden Schritt des Motors eine Ausgabezeile, ist ein bisschen viel für meinen Geschmack.

  2. 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 :wink:

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 ?