Motor über Drehgeber steuern?

Hallo zusammen,

Gegebenheiten:
Ich habe einen Nema 17 Schrittmotor mit einen TB6600 Motortreiber der funktioniert und eine Rolle antreibt. Weiterhin eine Potentiometer welches wiederum mit einer anderen Rolle mechanisch verbunden ist.
Rolle 1 und Rolle 2 sind über ein durchlaufendes Etikett verbunden, so dass wenn sich der Motor dreht, automatisch die Rolle dreht an der das Potentiometer angeschlossen ist.

Idee:
Motor treibt Rolle 1 für eine bestimmt kurze Zeit an und das Potentiometer misst, wieviele Umdrehungen die Rolle 2 macht, mit der es verbunden ist.

Problemstellung:
Ich poste im Anschluss nur Ausszüge aus den Programm, nicht den kompletten Code, damit ersichtlich wird, wie es (an)gesteuert wird.

  1. Wie kann ich mit den gemessenen Poteniometerwert Einfluß auf die Laufzeit des Motors nehmen?
    Von der Theoreie speichere ich den Wert in den EEPRom, was auch funktioniert, um ihn auch noch einen Neustart des Programms verfügbar zu haben. Beim nächsten Mal soll der Motor beim Drücken eines Knopfes/ Buttons genau solange laufen, bis ich den Wert aus dem EEPROM erreicht habe.
    Sprich beim Code des Motors muss ich Einfluss auf den Punkt Index<300 haben, weil die ja die Lauflänge des Motors bestimmt oder ganz anders??
    Ich überlege mir zu eine Art Tabelle zu machen. 300 wird mit der Variable "laufdauer" eretzt. Potentimeter 1=laufdauer 50, Potentiometer 2= laufdauer 100,
    Potentiometer 3= laufdauer 150 usw., um so die Laufdauer des Motors zu bestimmen, jedoch glaube ich, dass dies auch einfacher geht.

  2. Drehgeber: egal wo ich für den Drehgeber die Variable deklariere, ob in einer Methode oder global am Anfang, merkt sich das Programm den Wert der Variable "newPos". Liegt das an der Bibliothek Encoder?

Code Drehgeber:

Encoder myEnc(2, 3); 

void setup() {
  Serial.begin(9600);
  Serial.println("Basic NoInterrupts Test:");
}

long position  = -999;

void loop() {
  long newPos = myEnc.read();
  if (newPos != position  ) { 
    position = newPos;
    Serial.println(position);
  }

Code Motor

int Index;

void setup()
{
pinMode(6, OUTPUT); //Enable
pinMode(5, OUTPUT); //Puls
pinMode(4, OUTPUT); //Direction

digitalWrite(6,LOW);
}

void loop()
{
digitalWrite(4,LOW);

for(Index = 0; Index < 300; Index++)
{
digitalWrite(5,HIGH);
delayMicroseconds(500);
digitalWrite(5,LOW);
delayMicroseconds(500);
}

Ich verstehe nicht, warum, oder wozu der Drehgeber gut sein soll.

Denn:
Die Spezialität von Schrittmotoren ist das exakte positionieren!
Dafür wurden sie erfunden.

Einfach die Schritte vorgeben, dann weiß man auch wie viele Umdrehungen er macht.

Berechtigte Frage :slight_smile:

Bild Aufbau

Die Rolle 1 vom Motor wird durch das aufgewickelte Etikett immer dicker. Somit ist die Laufdauer mit zunehmender Dauer und Dicke der Rolle anders. --> Daher ist es die Idee, über den Drehgeber der an Rolle 2 ist, die Dauer zu messen.

Link zum Video mit funktionsweise:
Video

Dei Lösung ist eine Schlupfkupplung.
Grüße Uwe

Bezüglich Schlupfkupplung habe ich nichts bei Google gefunden. Kannst du mir mal ein Link zur Erklärung/ Beispiel schicken/Posten?

Wikipedia:

Beim Tonbandgerät sorgt die Rutschkupplung des rechten Bandtellers lediglich für das leichte Aufwickeln des Bandes, während der eigentliche Bandantrieb über Tonwelle und Andruckrolle erfolgt. Dadurch bleibt die Bandgeschwindigkeit trotz des veränderlichen Wickeldurchmessers immer gleich.

Während dem "Programmieren" dreht sich Rolle 2 ja nicht wirklich und du müsstest den User anweisen, das erste Mess-Ettiket auch irgenwie anzukleben/festzuhalten - alles ein Drama.
Was sich aber immer konstant mitdreht ist die Rolle mit den blauen Bändern.
Daher würde ich den Encoder an der blauen Rolle anbringen,
Während der "Programmierung" von dort lesen und auch während dem Wickeln.

Bessere Lösungen gibts sicher, aber das ist was mir ad hoc gratis für ein kommerzielles Projekt einfällt.

Ich habe es hinbekommen das beides parallel läuft, sprich Motor und Drehgeber...


const int ButtonEin = 7;
int StatusButtonEin = 0;
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
Encoder myEnc(2, 3);
long position  = -999;
long startposition=0;
long endposition=0;
long dauer=0;
long newPos =0;
int counter=0;

void setup()
{
  Serial.begin(9600);
pinMode(6, OUTPUT); //Enable
pinMode(5, OUTPUT); //Puls
pinMode(4, OUTPUT); //Direction
digitalWrite(6,LOW);
}

void loop()
{
  StatusButtonEin = digitalRead(ButtonEin);
   if (StatusButtonEin == HIGH) {
    if(counter==1){
    startposition=position;
    }
    Serial.println(dauer);
    digitalWrite(5,HIGH);
    delayMicroseconds(500);
    digitalWrite(5,LOW);
    delayMicroseconds(500);
    counter++;
    endposition=position;
    dauer=endposition-startposition;
    Serial.println(startposition);
    Serial.println(endposition);
    Serial.println(dauer);
    Serial.println(counter);
   }
   else{
    counter=0;
   }
 
 long newPos = myEnc.read();
   if (newPos != position  ) { // if (newPos != position && newpos > position) //theoretisch nur Pluswerte 
    position = newPos;
    Serial.println(position);
  }
}


1 Like

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