Motor überwachen

Hallo zusammen,

Ich benötige mal eure Hilfe.
Ich möchte gern ein vorhandenen motor drehen lassen bis ein gewisser winkel erreicht wurde.
Momentan läuft der Getriebemotor über eine Zeitangabe, diese ist aber wie ihr euch vorstellen könnt ziemlich ungenau.

Zum Projekt:
Jeden Tag dreht sich der Getriebemotor eine Scheibe an, gewünscht sind 2mm (dieses ist aber mal mehr und mal weniger)
dazu kommt das mittels einer Fernbedienung der Motor die Scheibe 10 mal um sich selbst drehen lassen soll, und nach 10 sekunden warten die Scheibe exakt 10 mal wieder zurück drehen soll, bis es sozusagen wieder an der exakten ursprünglichen Position steht.
Das ist mit delay unmöglich
jetzt bin ich auf die Idee gekommen das ganze mit einem encoder zu bewachen.
also den Getriebemotor so zu bearbeiten das ich an der Achse den encoder drauf mache und statt der Zeit angabe nun einzelne schritte zähle und ihn nach 1000 schritten (oder wieviel auch immer) abschalte und diese schritte wieder bis 0 runter fahre.
Momentan läuft der Motor mit Links und Rechts über eine H brücke ( BA6208 )
Kann ich diese H Brücke auch so verwenden das sie am Ende die gezählten Schritte vom Encoder auch auf den Motor wieder gibt? (ich habe da leider keine genauen informationen im Datenblatt gefunden).
Oder vllt sogar mit dem normalen Getriebemotor und dem Encoder ein Servomotor baue?.

mein bisheriger code über die Zeitangabe und co.

#include <DS3231.h>
#include <IRremote.h>

int RECV_PIN = 9;                 // Analoger Eingang IR Fernbedienung
int Links = 2;                   // Rechts
int Rechts = 3;                 // Rechts

DS3231  rtc(SDA, SCL);
Time t;

 IRrecv irrecv(RECV_PIN);
  decode_results results;
  
const int OnHour = 0;
const int OnMin = 22;
const int OnSec = 15;
const int OffHour = 0;
const int OffMin = 22;
const int OffSec = 18;

void setup() {
  Serial.begin(115200);
 pinMode(Links, OUTPUT);         // Links
  pinMode(Rechts, OUTPUT);         // Rechts
  irrecv.enableIRIn();            // Fernbedienung
  rtc.begin();

}

void loop() 
{
  t = rtc.getTime();
  
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s), ");
    Serial.print(t.sec);
  Serial.print(" sekunde(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin && t.sec == OnSec){
    digitalWrite(Links,HIGH);
    Serial.println("Links an");
          delay (800);
          digitalWrite(Links,LOW);
      Serial.println("Links aus");

    }
    
    else if(t.hour == OffHour && t.min == OffMin && t.sec == OffSec){
      digitalWrite(Rechts,LOW);
      Serial.println("rechts aus");
    }

      if (irrecv.decode(&results)) 
  {
      Serial.println(results.value, DEC);


    if (results.value == 4294967295)    //Fernbedienung
    {

      digitalWrite (Links, HIGH);    // Links An
        delay(102000); 
      digitalWrite (Links, LOW);    // Links Aus
         delay(1000); 
    digitalWrite (Rechts, HIGH);    // Rechts An
        delay(102000); 
      digitalWrite (Rechts, LOW);    // Rechts Aus
         delay(1000); 
 
    }
    irrecv.resume();
  delay(10); 
  }
}

wäre Klasse wenn jemand ähnliche erfahrungen gemacht hat und mir vllt von seiner lösung berichtet

Hallo,
ein mechanischer Encoder "verschluckt" sich gerne mal. Hast du noch Platz für ein Mehrgang-Potentiometer auf der Motorachse?
Diese Lösung hat den Vorteil das Motor weiß wo er steht, wenn die Betriebsspannung eingeschaltert wird.

Ich verstehe Dein Problem nicht. Du kannst den Encoder abfragen und feststellen, wann die gewünschte Schrittzahl erreicht ist. Je nach Getriebe sollte der Motor allerdings etwas früher gebremst bzw. abgeschaltet werden, damit er nicht über das Ziel hinausschießt.

mit der geschwindigkeit muss ich noch rumspielen, bei 3v aber dreht es sich so langsam das ich mir glaube ich dies bezüglich keine Gedanken machen muss über das abbremsen.

zu dem Mehrgang Poti: ich habe bis jetzt noch nicht von diesem Poti gehört..., aber nach ersten recherchen, glaube ich nicht das ich so etwas benötige, da es ja einen festen Widerstandswert ausgibt?.
Nach mehreren Tagen würde sich dieser Wert ja ändern und jeden Tag würde es ja wieder einen anderen Wert ausgeben.

DrDiettrich:
Ich verstehe Dein Problem nicht. Du kannst den Encoder abfragen und feststellen, wann die gewünschte Schrittzahl erreicht ist. Je nach Getriebe sollte der Motor allerdings etwas früher gebremst bzw. abgeschaltet werden, damit er nicht über das Ziel hinausschießt.

Okay, also bin ich schon auf dem richtigen weg... hast du denn für mich ein Link in dem das Encoder Abfragen und die festgelegten schritte abfahren irgentwo behandelt wird?, ich habe grade noch keine Idee und google konnte mir bislang auch nicht wirklich weiter helfen.

Das wirst Du wohl von Hand machen müssen; eine fertige Lösung habe ich noch nicht gesehen (was aber nicht heißen muss, dass es keine geben könnte).

Während der Motor in die eine Richtung läuft Schritte (Encoder) zählen. Zum Rückstellen den Motor in die andere Richtung laufen lassen und dabei wieder die Schritte zählen. Rechtzeitig anhalten lassen.

Das erfordert aber blockadearme Programmierung. Das heißt: delay() ist verboten.

Encoder-Libs gibt es viele, z.B. die von Paul Stoffregen.

durstloescher:
mit der geschwindigkeit muss ich noch rumspielen, bei 3v aber dreht es sich so langsam das ich mir glaube ich dies bezüglich keine Gedanken machen muss über das abbremsen.

zu dem Mehrgang Poti: ich habe bis jetzt noch nicht von diesem Poti gehört..., aber nach ersten recherchen, glaube ich nicht das ich so etwas benötige, da es ja einen festen Widerstandswert ausgibt?.
Nach mehreren Tagen würde sich dieser Wert ja ändern und jeden Tag würde es ja wieder einen anderen Wert ausgeben.

Mehrgang Poti

durstloescher:
zu dem Mehrgang Poti: ich habe bis jetzt noch nicht von diesem Poti gehört..., aber nach ersten recherchen, glaube ich nicht das ich so etwas benötige, da es ja einen festen Widerstandswert ausgibt?.
Nach mehreren Tagen würde sich dieser Wert ja ändern und jeden Tag würde es ja wieder einen anderen Wert ausgeben.

Naja... da ist irgendwo ein Logikfehler drin. Bitte berichtige mich:

  1. *einen Startwert
  2. *nach Zyklus einen Endwert
  3. *der Endwert wird im nächsten Zyklus der Anfangswert
    3a. *wiederhole 2 und 3 nach "Bedarf"
  4. *Am Ende willst Du zurück auf den Startwert.

Dann ist das mit dem Spindelpoti vielleicht keine schlechte Idee.
Den Startwert einmal kalibrieren und merken.
Dann geht es jeden Tag nur vorwärts.
Egal wieviel tatsächlich gefahren wird, bekommst den Punkt der Rückführung immer wieder.
Du kannst auch den Startpunkt für jeden Zyklus einzeln merken....

Beschreib doch mal, was das tatsächlich werden soll.

paulpaulson:
Mehrgang Poti

Danke! :cold_sweat:

my_xy_projekt:
Naja... da ist irgendwo ein Logikfehler drin. Bitte berichtige mich:

  1. *einen Startwert
  2. *nach Zyklus einen Endwert
  3. *der Endwert wird im nächsten Zyklus der Anfangswert
    3a. *wiederhole 2 und 3 nach "Bedarf"
  4. *Am Ende willst Du zurück auf den Startwert.

Dann ist das mit dem Spindelpoti vielleicht keine schlechte Idee.
Den Startwert einmal kalibrieren und merken.
Dann geht es jeden Tag nur vorwärts.
Egal wieviel tatsächlich gefahren wird, bekommst den Punkt der Rückführung immer wieder.
Du kannst auch den Startpunkt für jeden Zyklus einzeln merken....

Beschreib doch mal, was das tatsächlich werden soll.

Okay dann gebe ich mal etwas mehr infos...
Das ganze ist/soll ein Orrery (Sonnen System) werden welches relativ genau ist.
Der Motor dreht eine Stange auf der die Sonne sitzt, ebenfalls ist ein Zahnrad fest an dieser Stange mit der Sonne dran, von da an dreht das oberste Zahnrad alle weiteren Zahnräder an, jedes weitere Zahnrad hat einen Arm mit den jeweiligen Planeten.
Jeden Tag sollen sich die Planeten (vor allem die Erde) ein kleines stück bewegen (so das bei 365 Tagen eine umdrehung erreicht ist)
da das ganze aber sehr langweilig ist möchte ich gerne um es zu demonstrieren per fernbedienung das ganze 20 Jahre (oder wieviel auch immer) in die Zukunft drehen und nach einer kleinen Pause wieder zurück drehen lassen, so das der aktuelle Tag wieder auf position ist.

Dann ist das Spindelpoti nicht geeignet. Evtl. ein Absolutwertgeber.

Gruß Tommy

Was soll denn die gesamte Apparatur machen? Ich würde einen AS5600 einsetzen denke ich

Tommy56:
Dann ist das Spindelpoti nicht geeignet. Evtl. ein Absolutwertgeber.

Gruß Tommy

ich habe mir jetzt normale Encoder bestellt, was spricht denn dagegen?

Der weiß nach Neueinschalten nicht, wo er ist. Du musst da also eine Referenzposition anfahren.

Gruß Tommy

durstloescher:
Okay dann gebe ich mal etwas mehr infos...

Tommy56 und der Mann vom Mond haben es ja schon angesprochen...
Da ich damals den Thread verfolgt habe:

https://forum.arduino.cc/index.php?topic=691168.0

Und da beweist sich wieder, das die externen Bilder Kacke sind!

Tommy56:
Der weiß nach Neueinschalten nicht, wo er ist. Du musst da also eine Referenzposition anfahren.

Gruß Tommy

aso ok..., aber er soll ja auch nicht wissen wo er ist.
er soll nur wissen wieviele schritte er fahren soll und wieviele schritte er zurück fahren soll.
oder habe ich da einen denkfehler?

Ja, man könnte auch einen Schrittmotor nehmen. Oder einen Servo...

Am besten ist es, wenn du mal genau beschreibst was deine Apparatur machen soll.

Wer nicht will das man ihm hilft soll sich nicht wundern

Denkfehler nicht unbedingt. Wenn es nur darauf ankommt, die Planetenbahnen relativ zueinander zu zeigen, geht das so. Willst du aber immer auf die Konetsllation 1.1.2000 zurück, brauchst du einen definierten Ausgangspunkt, sprich Absolutwertgeber

themanfrommoon:
Ja, man könnte auch einen Schrittmotor nehmen. Oder einen Servo...

Am besten ist es, wenn du mal genau beschreibst was deine Apparatur machen soll.

Wer nicht will das man ihm hilft soll sich nicht wundern

Ähh, Post #9 nicht gelesen?

themanfrommoon:
Ja, man könnte auch einen Schrittmotor nehmen. Oder einen Servo...

Am besten ist es, wenn du mal genau beschreibst was deine Apparatur machen soll.

Wer nicht will das man ihm hilft soll sich nicht wundern

Also es handelt sich um ein Orrery welches die Planeten relativ genau anzeigt, angetrieben wird es über einen normalen DC Getriebemotor, wenn das mit dem Encoder nicht so genau klappt wie ich es mir vorstelle werde ich wahrscheinlich auch einen anderen Motor verwenden. hättet ihr da vllt eine empfehlung welchen servo ich auch über 360° oder wieviel auch immer drehen kann?, schrittmotor wäre auch eine überlegung.

ElEspanol:
Denkfehler nicht unbedingt. Wenn es nur darauf ankommt, die Planetenbahnen relativ zueinander zu zeigen, geht das so. Willst du aber immer auf die Konetsllation 1.1.2000 zurück, brauchst du einen definierten Ausgangspunkt, sprich Absolutwertgeber

aso verstehe..., nein ich möchte nicht zurück auf den 1.1.2000.,
es wäre schön wenn sich verschiedene konstellationen realisieren lassen würden, aber das wäre momentan nicht von nöten.
Jeden Tag dreht sich die Scheibe ein paar schritte weiter, und das ist dann immer wieder die jeweilige start position wenn ich auf die Fernbedienung drücke...
Also wenn ich auf die fernbedienung drücke sollen 1000Schritte vor gefahren werden und nach einer Pause 1000 Schritte zurück
und sonst jeden Tag nur 1 Schritt.