Brauche dringend Hilfe beim Sketch, Adafruit Motor Shield, Stepper, Poti

Hallo allerseits.
Ich bräuchte Hilfe beim weiterern erstellen des Sketches. Ich habe einen Arduino Uno R3, ein Adafruit Motor Shield V2.3, ein Stepper und ein Poti(10KOhm).
Mit dem aktuellen abgeänderten Beispielsketch dreht der Stepper. Wie bekomme ich es jetzt hin, das ganze über ein Poti laufen zu lassen. Es soll mit dem Poti nur die Drehrichtung gesteuert werden. Poti auf Mitte = 0, links drehen Stepper dreht linksherum, Poti nach rechts und Stepper dreht rechtsherum. Die Geschwindigkeit ist so wie sie jetzt ist in Ordnung. Das ganze ist für eine Modellbahndrehscheibe gedacht.
Es wäre nett wenn mir da jemand helfen könnte.
Gruß André

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); 

// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #1 (M1 and M2)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 1);


void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  myMotor->setSpeed(10);  // 10 rpm   
}

void loop() {
  Serial.println("Double coil steps");
  myMotor->step(200, FORWARD, DOUBLE); 
  myMotor->step(200, BACKWARD, DOUBLE);
}

Du hast eine Drehscheibe vor den Lokschuppen
und möchtest sie steuern, damit du die verschiedenen Schuppen mit den Lols bestücken kannst?
Oder eine Vitrine, in der ein Modell auf ner Drehscheibe steht - und der Betrachter kann sie
interaktiv links oder rechts rum drehen lassen?

Wenn die Geschwindigkeit o.k. ist, und laut dem Sketch 200 Schritte zu machen sind,
brauchst Du doch nur 2 Taster? (oder n' Wechselschalter mit 0 Stellung.

Oder planst du "später" im Falle Nr.1
Endlagenschalter für die Positionen?

Oder ist gerade nur ein Poti zur Hand?

Nicht böse sein. DIR ist klar was du machen möchtest. Und es für andere zu beschreiben ist
schwieriger als es manchmal scheint...

Stefan

Also die Poti-Lösung finde ich auch nicht sehr elegant.

Vermutlich möchte der TO damit festlegen, wie weit sich die Drehscheibe drehen soll.
Das erscheint mir allerdings mit einem Poti schwer lösbar, da die Wiederkehrgenauigkeit nicht besonders groß ist.

Aber evtl. erfahren wir hier noch mehr.

Es wäre nett wenn mir da jemand helfen könnte.

Wenn du ein Poti hast, aber keine drei Taster, warum nicht:

void loop() {
  Serial.println("Double coil steps");
  myMotor->step(200, FORWARD, DOUBLE);
  myMotor->step(200, BACKWARD, DOUBLE);
}

Von diesen 5 Zeilen musst du die 3 mittleren ändern. Dafür müsstest du erstmal verstehen was sie machen. Dann rauskriegen, wie man eine Poti-Stellung im Sketch einliest und auswertet, und wenn du soweit bist, es aber trotzdem noch nicht geht, meldest du dich mit deinem Problem-Sketch statt des funktionierenden.

Viel Spass bis dahin.

[Nachtrag:] das mit dem Poti ist einfacher als 3 Taster ( Links / Stop / Rechts ) auszuwerten, jedenfalls hier, denke ich :wink:

Nabend,
Da habe ich mich vielleicht etwas blöd ausgedrückt. Die Drehscheibe ist schon in der Anlage eingebaut und damit sollen die Loks entsprechend rein- und rausfahren. Also auf die Drehscheibe und in den Schuppen und umgekehrt.
Der Teil mit dem Poti, also die 200 Schritte sind aus einem Bespielsketch. Bei soll die Drehscheibe frei drehen können und das möchte ich mittels Poti steuern. Durch den Poti lässt sich ja die Drehgeschwindigkeit noch etwas beeinflussen, also um so weiter ich den Poti rechts- bzw. linksherum drehe um so schneller dreht dreht der Stepper.
Gruß André

Bon1978:
...durch den Poti lässt sich ja die Drehgeschwindigkeit noch etwas beeinflussen, also um so weiter ich den Poti rechts- bzw. linksherum drehe um so schneller dreht dreht der Stepper.
Gruß André

ähm... nein...

setspeed beeinflusst die Geschwindigkeit.
mit dem step Befehl erklärst du den Motor wie viele Schritte er mit welcher Auflösung in welche Richtung tun soll.

Ich weiß ehrlich gesagt nicht so ganz was ich dir jetzt zuerst raten soll.
Programmtechnisch würde ich mich an deiner Stelle erst einmal mit dem Auslesen eines Potis beschäftigen. Mit dem ausgelesenen Wert kannst du ja schon einiges anfangen.
Man könnte ihn in die Geschwindigkeitsvariable einsetzen. Oder aber festlegen, wie viele Schritte der Stepper sich bewegen soll.

Vielleicht solltest du aber zuerst, oder nachdem du die ersten Versuche gemacht hast, deine Konstruktion noch einmal grundlegend überdenken.
Ein Schrittmotor ist wirklich ideal für deinen Anwendungszweck. Richtig angesteuert wird der Schrittmotor genau die Strecke zurücklegen die du benötigst. Also von einem Gleisanschluss zum nächsten. Du musst nur durch Testen herausfinden wie viele Schritte er gehen muss hierfür.
Die Geschwindigkeit scheint mir hier bei eher Geschmackssache zu sein. Groß ändern brauchst du sie während der Fahrt sicherlich nicht.

Versteh mich nicht falsch, die Sache verhält sich folgendermaßen...
Niemand hier wird dir einen Sketch fertig schreiben.
Alle werden Dir gerne dabei helfen, deine eigenen Tests und Versuche mit Ratschlägen oder Fehlerbeseitigungen zu verbessern.

Arbeite doch einfach noch ein paar Beispiel Sketche durch und versuche durch beobachten zu verstehen, wie sie funktionieren.

Stefan

Ja das ist mir schon kar. Ich habe einen Stepper zum testen auf einem Brett montiert, ebenso den Arduino, das Poti usw.
Ich hatte das ganze schon mal mit einem TB6560 und dem Arduino getestet mit dem Beispielsketch für den Stepper und das funktionierte gut. Daher kann ich auch sagen das der Motor langsamer dreht, je näher er in Richtung 0 kommt.
Ich hätte nur gern das Adafruit Motor Shield integriert, anstatt des TB6560. Beide Sketche abwandeln, das hatte ich schon versucht, es hat aber leider nicht funktioniert.
Ich möchte ja auch keine Gleisvorwahl haben, nur ganz simpel die Drehrichtung steuern.
Gruß André

Hallo,
Poti verdrahtest Du aber selbst. Kannst ja mal probieren.

const int potPin = 0;
int ledPin = 13;

void setup()
{
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int val;
  int Schritt;

  val = analogRead(potPin);
  Schritt = map(val,0,1023,-200,200);
  digitalWrite(ledPin, HIGH);
  delay(Schritt);
  digitalWrite(ledPin, LOW);
  delay(200 - Schritt);
  Serial.println(Schritt);
}

Gruß und Spaß
Andreas

Schritt = map(val,0,1023,-200,200);

Netter Kniff :slight_smile:
eigentlich logisch, dass auch negative Zahlen
möglich sind. Selbst drauf gekommen bin ich noch nicht. Danke!
Stefan

map() arbeitet mit INT LONG darum sind auch negative Zahlen zulässig. Für long, unsigned long und float muß man sich die Funktion selber zusammenbauen.
Grüße Uwe

map() arbeitet mit INT

Lt. Reference arbeitet map mit long.
Und begrenzt das Ergebnis nicht, d.h. wenn der Eingang ausserhalb der Eingangsgrenzen liegt, ist das Ergebnis auch ausserhalb des Bereichs (toLow .. to High)

(Wenn das überhaupt relevant ist, weil es meist auf analogRead angewandt wird)

Danke Andreas,
dann kann ich mich ja mal ausprobieren.
Gruß André

michael_x:
Lt. Reference arbeitet map mit long.

Ich bitte um Verzeihung für die falsch Information.
Grüße Uwe