Schrittmotor Sanftanlauf und .....

Hallo, mein Name ist Franz und ich bin neu hier im Forum. Ich habe eine Frage? Anfang wollte ich es selbst versuchen mit dem Programmieren von einem Schrittmotor oder Servo, bei kleinen Arduino Steuerungen hab ich es ja noch kapiert aber dann mit Sanftanlauf und Bremse dachte ich mir vielleicht kann mir wer einen Arduino-Code schreiben muß auch nicht Umsonst sein. Und zwar geht es um einen Servomotor (JMC Servo iHSV57-30-18-36-21-38 AC) der eine ca.Vierteldrehung (100°)nach rechts , stop , links, stop im Loop machen soll, das ganze mit Sanftanlauf und am Ende sanft Bremsen, das ganze Schaltbar mit 3 Geschwindigkeiten ( 10 U/min, 20 U/min und 30 U/min) eventuell mit Fernbedienung und welches Arduino geeignet ist. Das ganze soll eine Flügelbewegung simulieren. Könnte mir bitte jemand helfen, Danke und Gruß Franz

Für Schrittmotoren gibt es die AccelStepper Bibliothek. Für Servos muß man die Schritte selbst anpassen.

Für bezahlte Aufträge gibt es das "Gigs and Collaborations" Forum.

... und dann ist da natürlich die obligatorische Frage nach dem Budget und was wie konfiguriert werden soll.

Hallo, Danke für die Antworten, Sorry wusste ich nicht mit "Gigs and Collaborations " mein Englisch ist nicht so gut. Budget gute Frage was könnte sowas kosten? Gruß Franz

Je besser du beschreibst was du haben willst, desto billiger. Eine Stunde professionelle Programmierung kostet das selbe wie ein Mechaniker.

Du kannst für das sanfte Anlaufen von Steppern und für das langsame Bewegen von Servos auch meine MobaTools Lib verwenden. Die kannst Du über den Bibliotheksverwalter installieren

zwieblum:
Eine Stunde professionelle Programmierung kostet das selbe wie ein Mechaniker.

Diese Aussage hat genau null Gehalt. Bestenfalls lässt sich so beantworten, warum es heißt, dass man am Code herumschraubt.

Mechaniker gibt es ab ca. 30 € pro Stunde brutto. Es gibt Werkstätten, in denen rechnet man gerne über 100 € pro Stunde netto ab. Billige und relativ ahnungslose Selbstausbeuter programmieren so ab 10 € pro Stunde, gut ausgebildete und erfahrene Programmierer sind auch mit 60 € pro Stunde noch lange nicht überbezahlt.

Zwischen „echt billich“ und „angemessen“ können Welten liegen.

Gruß

Gregor

Jup, das wollte ich zum Ausdruck bringen. Mechanikermeister hier ums Eck nimmt übrigens 189.-, da ist also durchaus Raum nach oben.

Also versuchs mal zuerst mit einer der beiden Bibliotheken (AccelStepper und MobaTools). Wenns funktioniert (auch eventuell mit unserer Hilfe) brauchst Du nicht Erfahrung mit der Bezahlung und vor allem Dingen nicht mit der notwendigen Programmier-Zeit sammeln.

Grüße Uwe

Dumme Frage: Warum eigendlich eine Steuerung übere ein Servo und nicht über z.B. Scheibenwischermotor und Schubstange (so wie beim Ornithopter oder Verbrennungsmotor)? Dann wär' das Ding ein echter Nobrainer ...

Hallo Franz, es wäre gut, wenn Du Verweise auf die verwendeten / geplanten Komponenten als anklickbare Links einstellst, dann kann man die auf allen Geräten aufrufen. Wenn hier im Forum von Servos die Rede ist, dann sind fast immer Modellbau-Servos gemeint. Bei dir ist das aber offensichtlich ein Servomotor für industriellen Einsatz. Das ist etwas ganz anderes, und mit der integrierten Steuerung wird der offensichtlich wie ein Stepper angesteuert.

Hi

Naja - Drehwinkel 100° riecht nun nicht nach einem Servo-Antrieb - so stark kann die Gewindesteigung gar nicht sein, daß man damit was anfangen kann. Also wohl doch eher Spielzeug-Servo.

Beim Stepper kommt's noch drauf an, ob's ein spannungs- oder stromgesteuertes Exemplar ist. Dafür dann den entsprechenden Treiber.

Sanftanlauf nennt man beim Stepper übrigens Rampe - wen nDiese laaang genug ist, sieht man auch, daß die Geschwindigkeit erst zunimmt. Mit den MoBaTools vom MicroBahner müsstest Du Beides entsprechend ansteuern können.

Stichwort: Der Arduino steuert nur den Kram an - den Stromversorgung für die Drehung muß extern erfolgen - Das kann der Arduino NICHT leisten!

MfG

Hallo,
Danke an MicroBahner, uwefed und postmaster-ino, habe mir durch eure Anregungen so gut es geht selbst
geholfen und diesen Code gefunden:

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define pin connections
const int dirPin = 2;
const int stepPin = 3;

// Define motor interface type
#define motorInterfaceType 1

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(300);
myStepper.setSpeed(200);
myStepper.moveTo(40);
}

void loop() {
// Change direction once the motor reaches target position
if (myStepper.distanceToGo() == 0) 
  myStepper.moveTo(-myStepper.currentPosition());

// Move the motor one step
myStepper.run();
}

Das Setup steuert jetzt einen Nema 17 mit DRV8825 (bald uStepper S) so wie ich es brauche und kann über setSpeed die Drehzahl ändern.
Meine Frage wäre kann man die Drehzahl über Poti oder Schalter extern verstellen.

Danke mit freundlichem Gruß
Franz

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hallo Franz,

efraunz:
Meine Frage wäre kann man die Drehzahl über Poti oder Schalter extern verstellen.

Das Poti über einen Analogeingang einlesen. Mit der map-Funktion kannst Du den eingelsenen Wertebereich ( 0…1024 ) auf den gewünschten Geschwindigkeitsbereich umrechenen. Damit kannst Du dann das setSpeed versorgen.
Willst Du die Geschwindigkeit kontinuierlich - auch währende der Bewegung - verändern können, oder soll das immer nur für den nächsten Bewegungsblauf gelten?
Noch etwas genauere Infos über das was Du vorhast wären schon gut. Wie willst Du bei dem Stepper den Referenzpunkt festlegen?

Hallo Franz-Peter,

während der Bewegung mit Poti 0-30 U/min.

Hallo Tommy was ist Codetags, Sorry.

Danke Gruß Franz

efraunz: Hallo Tommy was ist Codetags, Sorry.

Das habe ich Dir doch geschrieben. Wenn Du damit schon überfordert bist, ...

Gruß Tommy

Hallo Franz,
Hier ein Beipiel in Code-Tags (</> , Button rechts oben ). Die Pinnummern habe ich an meine Gegebenheiten angepasst und mal angenommern, dass der Motor 800 Steps/Umdrehung macht ( 1/4 Microstepping )

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define pin connections
const int dirPin = 5;
const int stepPin = 6;
const byte potiPin = A5;

// Define motor interface type
#define motorInterfaceType 1

int potiVal;
int speedVal;
unsigned long lastMillis;
const unsigned long messIntervall = 200;

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // set the maximum speed, acceleration factor,
  // initial speed and the target position
  myStepper.setMaxSpeed(400);   // == 30 Umdr/Min bei 800 Steps/Umdr ( 1/4 Microstepping )
  myStepper.setAcceleration(200);
  //myStepper.setSpeed(200);    // nur für runSpeed notwendig
  myStepper.moveTo(800);      // jeweils 1 Umdr vor/zurück
  lastMillis = millis();
}

void loop() {
  // read new speed value
  if ( millis() - lastMillis > messIntervall ) {
    potiVal = analogRead( potiPin );
    speedVal = map ( potiVal, 0,1024, 0, 400 );
    myStepper.setMaxSpeed( speedVal );
  }
  
  // Change direction once the motor reaches target position
  if (myStepper.distanceToGo() == 0)
    myStepper.moveTo(-myStepper.currentPosition());

  // Move the motor one step
  myStepper.run();
}

Und als Alternative mit MobaTools. Da kannst Du direkt mit Winkeln und Umdrehungsgeschwindigkeit rechnen. Beim Anlegen des Objetes musst Du dabei aber die korrekte Zahl der Steps/Umdrehung angeben.

// Include the MobaTools Library
#include <MobaTools.h>

// Define pin connections
const int dirPin = 5;
const int stepPin = 6;
const byte potiPin = A5;
int potiVal;
int speedVal;
// Define motor interface type
#define motorInterfaceType 1

// Creates an instance
MoToStepper myStepper(800, A4988);  // bei 800 Steps/Umdrehung ( 1/4 Microstepping )
MoToTimer messZeit;
const int messIntervall = 200;
void setup() {
  // set the maximum speed, length of ramp,
  // initial speed and the target position
  myStepper.attach( stepPin, dirPin );
  myStepper.setSpeed(300);      // = 30,0 Umdr/Min
  myStepper.setRampLen(200);
  myStepper.write(360);       // eine Umdrehung
  messZeit.setTime(messIntervall);
}
void loop() {
  // Change direction once the motor reaches target position
  if ( !messZeit.running() ) {
    messZeit.setTime(messIntervall);    // Poti im Takt von 'messIntervall' abfragen
    potiVal = analogRead( potiPin );
    speedVal = map ( potiVal, 0,1024, 1, 300 ); // Potibereich auf 0,1-30,0 Umdr/Min mappen 
    myStepper.setSpeed( speedVal );
    Serial.println(speedVal);
  }
  
  // Change direction once the motor reaches target position
  if (myStepper.moving() == 0)
    myStepper.write(-myStepper.read());
}

Offen ist aber immer noch, wie Du beim Stepper den Referenzpunkt bestimmen willst. Leider hältst Du mit genaueren Info’s immer noch hinter dem Berg - so kann man nicht wirklich helfen.

Hallo Franz Peter,

das mit dem Referenzpunkt bestimmen weiß ich auch noch nicht genau ich habe einen "uStepper s" bestellt das ist ein Closed Loop Stepper mit Trinamic Silent Chip ich hoffe der weiß nach dem aus/einschalten noch wo er ist, eventuell noch einen Hall Effekt Sensor. Das ganze soll einen Flügel aus Starken Papier und Bambusverstrebungen ca. 1m lang über Seilzüge realistisch auf und ab bewegen, jetzt habe ich einen Synchronmotor drinnen mit 30 U/min und einer Art Kurbelwelle ziemlich kompliziert und relativ laut das möchte ich mit dem Stepper einfach über Seilrollen die sich auf und abwickeln vereinfachen. Danke für deine Code´s da brauche ich noch eine weile bis ich das verarbeitet habe.

Tommy, ich glaub jetzt habe ich es kapiert mit Codetags.

Gruß Franz

efraunz: Tommy, ich glaub jetzt habe ich es kapiert mit Codetags.

Ja, geht doch.

Einfach die Antworten wirklich lesen und etwas darüber nachdenken vor dem erneuten Fragen.

Gruß Tommy