Verschluss-Riegel mit Schrittmotor verstellen (Öffnen & Schliessen)

Hi, ich bin der Neue... :slight_smile:

Vorerst möchte ich nur kurz sagen (bevor ich es dann von euch gesagt bekomme): Ich bin bzgl. Arduino und vor Allem dem dazugehörigem Coding ein absoluter Noob. Ich hoffe ihr nehmt mir das nicht allzu übel und seid trotzdem bereit mir ein wenig zu helfen (Kopf schütteln könnt ihr gerne, das sehe ich ja nicht).

Also um es mal kurz zusammenfassend zu sagen: Ich möchte mit 2 Tastern einen Schrittmotor bewegen. Mit einem Taster 90° nach rechts, mit dem anderen 90° nach links. Das war´s...

Genauer:
Ich habe an dem Schrittmotor einen Riegel befestigt. Betätige ich den 1. Taster, dreht sich der Schrittmotor 90° nach rechts und bringt den Riegel damit in eine Position vor einer Tür, womit sich diese nicht mehr öffnen lässt. Betätige ich den 2. Taster dreht sich der Riegel wieder zurück, 90° nach links, und steht dem Öffnen der Tür nun nicht mehr im Weg.

Bei meinem Schrittmotor handelt es sich um einen 28BYJ-48 – 5V, welcher im Basis-Kit meines Arduino Uno (Nachbau von Miuzei) dabei war. Wie auf dem folgenden Bild zu sehen habe ich auch das zugehörige Interface welches für eben diesen Schrittmotor gedacht ist.

Zum einfacheren Verständnis habe ich auch eine kleine Skizze gemacht:

Im Prinzip muss ich weder Arduino, noch das IF für den Schrittmotor unbedingt nutzen wenn nicht nötig. Es würde mir absolut reichen wenn ich alleine mit den Tastern was machen könnte um den Schrittmotor "hin, - und her" zu bewegen. Beispielsweise per Zeitrelais - Ich drücke einen Taster, das Zeitrelais bekommt Impuls und schaltet ganz kurz durch - so lang wie nötig um den Schrittmotor 90° weit zu bewegen. So gesehen würde es mir dann im Prinzip nur darum gehen auf welche der 5 Anschlussleitungen am Motor ich Spannung geben muss um ihn links, oder eben rechts zu bewegen.

Eine "Sperre" um zu verhindern das ich nicht mehrfach in die gleiche Richtung drehen kann könnte ich mir selbst mit Relais zusammenbasteln, das wäre kein Problem. Also ich meine, wenn ich Taster 1 betätige, kann ich ihn nicht nochmal betätigen, sondern nur Taster 2 und eben umgekehrt.

Natürlich wäre diese Methode nur eine Möglichkeit. Mit Einsatz des Arduino Moduls und entsprechendem Code wäre das ganze sicher sehr viel schöner... Wie gesagt habe ich aber leider was das Coding angeht so gut wie absolut keine Ahnung....

Hoffe ich hab das ganze nicht zu doof formuliert und es kommt halbwegs durch was ich meine / brauche. Es würde mich sehr freuen wenn ihr mir da weiterhelfen könntet!

LG, MIke

Hallo

Nimm einfach ein Servo.

Der läßt sich wesentlich einfacher ansteuern.

1 Like


// declare variables for the motor pins
int motorPin1 = 5; // Blue / Синий   - 28BYJ48 pin 1
int motorPin2 = 4; // Pink  / Розовый  - 28BYJ48 pin 2
int motorPin3 = 3; // Yellow / Желтый - 28BYJ48 pin 3
int motorPin4 = 2; // Orange  / Оранжевый - 28BYJ48 pin 4

// установить скорость шагового двигателя.
//variable to set stepper speed.
int motorSpeed = 10;  

// Кол-во сделанных шагов.
// count of steps made.
int count = 0;          

// Необходимое количество шагов, для одного полного оборота, на (360 градусов).
// number of steps per full revolution.
int countsperrev = 512; 

int lookup[8] = {
  B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

//////////////////////////////////////////////////////////////////////////////
void setup() {
  // declare the motor pins as outputs.
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  // Serial.begin(9600);
}

void loop(){
  if(count < countsperrev )
    clockwise();
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise();
  count++;
}

//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for(int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for(int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

wenn das bei dir geht, dann können wir schauen wie man 90° anfährt.

Läßt sich der Riegel auch im eingebauten Zustand sicher bewegen? Schrittmotoren sind nicht für besondere Kraft bekannt.

Wenn Du so neu bist, dann nimm erstmal was grundlegendes und mach Dich mit ner Handvoll Funktionen vertraut.

Lerne debuggen mit dem seriellen Monitor und wie die taster angeschlossen und ausgelesen werden. Verinnerliche Dir von Anfang an, das delay() manchmal schön ist, aber Dir viele Wege verbaut.

Dafür hier mal ein Kurzsketch.
Wenn Du den verstanden hast, dann geht auch Dein Schrittmotor (wobei ich den nicht per Zeit sondern per Endschalter fahren lassen würde... Aber das ist ein anderes Thema. Der Sketch zeigt aber sehr deutlich warum.

// Forensketch Statemachine und gegenseitiges verriegeln mit Zeit
// https://forum.arduino.cc/t/verschluss-riegel-mit-schrittmotor-verstellen-offnen-schliessen/1143380/2

constexpr byte tasterAufPin {2};
constexpr byte tasterZuPin {3};
constexpr uint32_t laufZeit {10000}; // zeit in millisekunden
uint32_t startZeit;

enum {auf, zu};
byte zustand = zu;



void setup()
{
  Serial.begin(9600);
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(tasterAufPin, INPUT_PULLUP);
  pinMode(tasterZuPin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void  loop()
{
  switch (zustand)
  {
    case auf:
      if (millis() - startZeit > laufZeit)
      {
        if (digitalRead(tasterZuPin) == LOW && digitalRead(tasterAufPin == HIGH))
        {
          startZeit = millis();
          Serial.println(F("Starte zu machen"));
          zustand = zu;
        }
        digitalWrite(LED_BUILTIN, LOW);
      }
      else
      {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      break;
    case zu:
      if (millis() - startZeit > laufZeit)
      {
        if (digitalRead(tasterAufPin) == LOW && digitalRead(tasterZuPin == HIGH))
        {
          startZeit = millis();
          Serial.println(F("Starte auf machen"));
          zustand = auf;
        }
        digitalWrite(LED_BUILTIN, LOW);
      }
      else
      {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      break;
  }
}

Deine idee hat einige Probleme.

  1. Du weißt nicht wo der Schrittmotor beim Einschalten steht.
  2. Dieser Schrittmotor-Treiber braucht eine bestimmte Impulsfolge auf den Eingangspins damit sich der Motor dreht.

Du brauchst einen Home-Schalter damit du mit dem Schrittmotor auf die Startposition fahren kannst. Dann muß der Arduino bei jedem Tastendruck eine gewisse Impulsfolge generieren damit der Motor 90° um dreht.
Ohne Arduino oder anderen Controller kannst Du diese Funktion mit einem DC Motor, 2 Tastern, 2 Endschaltern, und 2 Relais.
Am einfachsten ist ein Modelbauservo und ein Arduino.

Grüße Uwe

Das geht davon aus, dass du den Schrittmotor schon hast.
Und dass du dir in den Kopf gesetzt hast damit dein Schloss zu realisieren.

Arduino Basics:
Schritt 1: Krieg raus, wie du per Arduino den Motor eine Drehung um 90 ° machen lassen kannst.
Schritt 1b: -90° zurück
Schritt 2: Tasterbestätigung erkennen ( nicht trivial )

Hardware:
Schritt 3: Da du nicht weißt, wie der Schrittmotor anfangs steht, brauchst du eine Mechanik, die dir erlaubt, den Motor am Anschlag weiter in die falsche Richtung anzusteuern ohne dass was kaputt geht und der dann bei Befehl -90° vom Anschlag aus die ganze Drehung zurück macht.
Eventuell hilft dir ein Endschalter, der hilft, dass der Arduino beim Start den Motor nur bis zum Endschalter bewegt. (Ein Schritt nach dem andern, bis der Endschalter anspricht)

Schritt 4: Realisiere dein Projekt. Das ist dann ein Klacks, oder die vorigen Schritte haben dich überzeugt, dass die Sache besser mit einem Servo zu machen ist, und/oder du mit dem Schrittmotor lieber was anderes machst.

Willst du den Schrittmotor stromlos machen, wenn die Zielstellung erreicht ist?
Bleibt der Riegel dann (fest) in der gewünschten Position?

Er möchte das aber mit dem Schrittmotor lösen. Wenn ich frage, wie ich mit meinem Fiat Auto am besten von Frankfurt nach Berlin fahre, will ich nicht wissen, das es mit dem Zug entspannter geht.
Klar geht das mit nem servo einfacher, vorausgesetzt der Servo kann 180°. Aber, wenn er den Servo nimmt, lernt er nicht, wie man nen Schrittmotor ansteuert, sondern nur, wie das mit dem Servo geht.

1 Like

Er zeigt aber daß er keinen blassen Schimmer hat, was ein Schrittmotor ist und welche Problematiken dahintersteht.

Wies geht habe ich schon geschrieben.

Grüße Uwe

Ja , das ist mir schon auch aufgefallen, nur dachte ich mir, dass das ja dann die ideale Gelegenheit ist, es zu lernen. Das ist wie mit dem Nichtscwimmer der ins Wasser fällt, genau in diesem Moment ist die Gelegenheit schwimmen zu lernen am günstigsten.

Wir haben Ihm die Lösung mit Schrittmotor und andere vieleicht einfachere Lösungen aufgezeigt.
Jetzt muß er einen Weg aussuchen.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.