Steuerung eines Servos der egtl keiner ist

Hallöchen hoffentlich habt ihr gut gegessen und schön entspannt in den letzten Tagen.

Ich stehe aktuell vor dem Problem das ich mit einem Arduino Mega und dem Motor shiele SHD Mopo einen Motor mittels Drehgeber regeln möchte.

Bei dem Motor handelt es sich um einen 12v DC motor der max 220mA zieht. Hier mal ein Bild.

Dieser hat nur einen bestimmten stellbereich was auch so bleiben soll. Ich möchte den Motor nur in seinem Bereich in 0,5% schritten verfahren.

Mein Problem liegt darin das ich nicht weiß wie ich ihn behandeln soll. Wie einen Servo oder einen Normalen Motor.

Bild?

Datasheet?

Hmm das Bild wird irgendwie nicht recht angezeigt. Hier mal der Link :https://pl.vc/1hu3j

Vermutlich handelt es sich um einen Stellmotor aus dem KFZ Bereich. Wird oft zur Positionierung von Stellklappen der Klimaanlage verbaut.

Dort ist ein Poti drin, also ein analoger Wert zum Erfassen der Position. Und ein normaler DC Motor. Zum Drehen des Motors in beide Richtungen des Motors braucht es eine H-Brücke. Die Lageregelung erfolgt über den Spannungswert des Poti.

Dann sind wir bei einem PID Regelkreis, die Software dazu ist nicht ganz so einfach. Gibt aber Lib's dazu....

Korrekt @rudirabbit, sind aus einem Klimagerät.

Das Foto:
Motor.png
SHD MOPO = VELLEMAN VMA03

Elmuecko:
Mein Problem liegt darin das ich nicht weiß wie ich ihn behandeln soll. Wie einen Servo oder einen
Normalen Motor.

Einen DC Motor kannst Du nur als DC-Motor ansprechen, also an A oder B vom Shield, dann die richtigen Steckbrücken wählen.

Hab Vielen Dank agmue! :)

Ich hab eine Libary gefunden die grob passen könnte. Es handelt sich um einen PID Regelkreis zur Ansteuerung eines Wischermotors mittels Poti.

int ADC_SetPoint = 0;
int ADC_SetPointOld = 0;
int ADC_ServoPoti = 0;
int ADC_ServoPotiOld = 0;
int dutyCycle = 50; // 10 - 255
int ADCdiff = 0;
int timeDiff = 0;

//Change values below to adapt your motor
//Set MAX_DUTYCYCLE to 75 for the first test run!

#define P_FRACTION 0.3         //0.0 - 10.0 (0.3)
#define I_FRACTION 0.3         //0.0 - 10.0 (0.3)
#define D_FRACTION 4.0         //0.0 - 10.0 (4.0)
#define V_WINDOW 25            //10 - 1000 (25)
#define MIN_DUTYCYCLE 25       //0 - 255 (25)
#define MAX_DUTYCYCLE 200      //0 - 255 (255)
#define SOFT_START 0.3        //0.00 - 1.00 (0.30) 1.00 = OFF
#define D_FRACTION_DEMO 0      //1 - consider only D_FRACTION for servo movement (0 - OFF)
#define EMERGENCY_SHUTDOWN 4   //0 - 100 (4), 0 - OFF, Stops motor if blocked
#define SHOOT_THROUGH_PAUSE 10 //Prevent H bridge from shoot through whenever the direction pin is changed

#define SERVO_DIRECTION_PIN 2 //Direction pin servo motor
#define SERVO_PWM_PIN 3       //PWM pin servo motor
#define SERVO_SENSOR A0       //Analog input servo sensor
#define POTI A1               //Analog input potentiometer
#define LED_01 4
#define LED_02 5
#define LED_03 6
#define LED_04 7
#define LED_05 8
#define LED_06 9
#define LED_07 10
#define LED_08 11
#define LED_09 12
#define LED_10 13


void setup(){
 pinMode(SERVO_DIRECTION_PIN, OUTPUT);     
 pinMode(SERVO_PWM_PIN, OUTPUT);     

 pinMode(SERVO_SENSOR, INPUT);     
 pinMode(POTI, INPUT);     


} 


void loop(){ 
 ADC_ServoPoti = analogRead(0);     // reads the servo sensor (between 0 and 1023) 
 ADC_SetPoint = analogRead(1);             
   
 ADCdiff = ADC_SetPoint - ADC_ServoPoti;
 
 dutyCycle = abs(ADCdiff) * P_FRACTION;
 dutyCycle += timeDiff * I_FRACTION;
 dutyCycle += abs(ADC_SetPointOld - ADC_SetPoint) * D_FRACTION;
 
 if(D_FRACTION_DEMO == 1){
   dutyCycle = abs(ADC_SetPointOld - ADC_SetPoint) * D_FRACTION;
 }
 
 if(SOFT_START * timeDiff < 1){
   dutyCycle = dutyCycle * (SOFT_START * timeDiff);
 }
 
 timeDiff++;
 
 if(dutyCycle < MIN_DUTYCYCLE && dutyCycle > 0){
   dutyCycle = MIN_DUTYCYCLE;
 }
 
 if(dutyCycle > MAX_DUTYCYCLE){
   dutyCycle = MAX_DUTYCYCLE;
 }
 
 if(dutyCycle < 0){
   dutyCycle = 0;
 }
 
 
 
 if(D_FRACTION_DEMO == 1){
   if(abs(ADC_SetPointOld - ADC_SetPoint) < 2){
     analogWrite(SERVO_PWM_PIN, 0);
     delayMicroseconds(SHOOT_THROUGH_PAUSE);
     digitalWrite(SERVO_DIRECTION_PIN, 0);
     delayMicroseconds(SHOOT_THROUGH_PAUSE);
   }
   else{
     if(ADC_SetPointOld - ADC_SetPoint < 0){
       analogWrite(SERVO_PWM_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       digitalWrite(SERVO_DIRECTION_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       analogWrite(SERVO_PWM_PIN, dutyCycle);
     }
     if(ADC_SetPointOld - ADC_SetPoint > 0){
       analogWrite(SERVO_PWM_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       digitalWrite(SERVO_DIRECTION_PIN, 1);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       analogWrite(SERVO_PWM_PIN, dutyCycle);
     }
   }
 }
 else{
   if(abs(ADCdiff) < V_WINDOW){
     dutyCycle = 0;
     timeDiff = 0;
   }

   if(abs(ADC_ServoPotiOld - ADC_ServoPoti) < EMERGENCY_SHUTDOWN && dutyCycle == MAX_DUTYCYCLE && timeDiff > 50){
     analogWrite(SERVO_PWM_PIN, 0);
     delayMicroseconds(SHOOT_THROUGH_PAUSE);
     digitalWrite(SERVO_DIRECTION_PIN, 0);
     delay(1000);
     timeDiff = 0;
   }
   else{  
     if(ADCdiff > 0){
       analogWrite(SERVO_PWM_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       digitalWrite(SERVO_DIRECTION_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       analogWrite(SERVO_PWM_PIN, dutyCycle);
     }
     if(ADCdiff < 0){
       analogWrite(SERVO_PWM_PIN, 0);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       digitalWrite(SERVO_DIRECTION_PIN, 1);
       delayMicroseconds(SHOOT_THROUGH_PAUSE);
       analogWrite(SERVO_PWM_PIN, dutyCycle);
     }
   }
 }
 

 ADC_SetPointOld = ADC_SetPoint;
 ADC_ServoPotiOld = ADC_ServoPoti;





 delay(15);                             // waits for the servo to get there 

}

Das Script habe ich auf dieser seite gefunden. www.homofaciens.de
Das ganze funktioniert über eine H-Brücke. Ich vermute mal das man mein Motorshield damit schlecht verwenden kann? Dort ist zwar eine enthalten aber im Verbund mit mehr Technik.

#define SERVO_DIRECTION_PIN 2 //Direction pin servo motor
#define SERVO_PWM_PIN 3       //PWM pin servo motor
#define SERVO_SENSOR A0       //Analog input servo sensor

Wenn Du die Steckbrücken entsprechend setzt, paßt das prima für A.

Nimm eine Elektronik aus einem alten, starken Servo. Das errinert mich an die ersten Proportional Servos von vor über 40 Jahren, da wurde die Mechanik und die Elektronik (Servobaustein vom Graupner) getrennt verkauft.

Ich MUSS mich an diese Motoren halten. Da ich damit später die Stellmotoren in verbauten Klimageräten ansteuern möchte.

ElEspanol: Nimm eine Elektronik aus einem alten, starken Servo.

Elmuecko: Ich MUSS mich an diese Motoren halten.

Die Idee ist, fertige Servo-Elektronik an Deinen Motor anzubauen. Das erspart Arduino und Shield.

Ist aber nicht meine Idee!

Ahhh achso, ansich echt ein Schöner Tipp! Gesamt betrachtet möchte/muss ich ein Modul bauen, andem der KFZ Stecker vom Klimagerät angeschlossen wird. Anhand eines TFT Display's wird dann über ein Steuerkreuz einer der erkannten Motoren ansgewählt und über den Drehgeber verstellt.

Das ganze ist eine Vorgeschriebene Aufgabenstellung einer Projektarbeit.

TFT Bildschirm wird dieser hier: EA eDIP240B-7LW von Electronic Assembly

Elmuecko: Ahhh achso, ansich echt ein Schöner Tipp! Gesamt betrachtet möchte/muss ich ein Modul bauen, andem der KFZ Stecker vom Klimagerät angeschlossen wird.

Eben. Wenn du eine fertige Servoelektronik nimmst, kannst du die recht einfach vom Arduino aus mit der Servo Lib ansteuern.

Andererseits, wenn die Motoren nur über ein Steuerkreuz verstellt werden sollen, kannst du das wirklich mit einer H-Brücke machen, und den Potiwert anfahren. Evtl. kleine Hysterese rein, damit der Motor nicht um den Zielpunkt schwingt. Bei dem Schneckengetriebe glaube ich nicht, dass er arg weit übers Ziel hinausschiesst. Und wenn du nahe beim Ziel bist, kannst du ja Geschwindigkeit rausnehmen. Auf eine PID Steuereung kannst du da mEn verzichten. Die Haltekraft ist ja durch das Getriebe.

agmue: Ist aber nicht meine Idee!

Danke, aber für die freundliche Unterstützung bei den Erläuterungen darf dein Name ruhig auch mit drauf bei der Veröffentlichung als "Idea of the year" im Arduino World Magazine ;D ;D ;D

Elmuecko:
Das ganze ist eine Vorgeschriebene Aufgabenstellung einer Projektarbeit.

Der Hinweis ist wichtig, weil Du dann keinen fertigen Sketch von mir bekommst, um die Selbständigkeit Deiner Arbeit nicht zu gefährden. Ich habe sowas ohne PID mal probiert, um die Tauglichkeit von ULN2003 für die Ansteuerung eines DC-Motors zu testen. Bei mir hat der Regelkreis ohne Hysterese schön geschwungen. Bei Dir könnte das Spiel des Getriebes, so vorhanden, als Totzeit einfließen.

ElEspanol:
… PID Steuereung …

Damit die Projektarbeit nicht falsch wird: PID Regelung.

Sehr großzügig, ich freue mich auf die Veröffentlichung ;D ;D ;D

Agmue, genau so sehe ich es auch. Ein fertiger Sketch würde ja den Sinn der Sache verfehlen. Sobalt ich vorzeigbare Ergebnisse habe werde ich diese hier präsentieren.

... und bei Fragen natürlich fragen :)

Gutes Gelingen!

Eine Frage stellt sich mir sofort. Ich habe das Datenbatt vom VMA03, aber wann ich welche Steckbrücke wähle kann ich nicht ersehen. Ich würde gerne genau wissen unter welcher Prämisse die jewahlige Konfiguration gewählt wird.

Bisher weiß ich, das ich sofern die Motoren extern mit Spannung versorgt werden, eine Steckbrücke dafür umstecken muss.

agmue: ```

define SERVO_DIRECTION_PIN 2 //Direction pin servo motor

define SERVO_PWM_PIN 3      //PWM pin servo motor

define SERVO_SENSOR A0      //Analog input servo sensor


Wenn Du die Steckbrücken entsprechend setzt, paßt das prima für A.

Hast Du das usermanual_vma03.pdf? Schau mal auf Seite 3, der Schaltplan, SK8 und SK10. Irgendeine Idee?

Ich könnte mir vorstellen das ich mit SK8 den Treiber auf den einen Motor einstelle. Mit SK10 das er durch PWM gesteurtt wird? Ich kann mir aber vorstellen das dieser Ansatz falsch ist.

SK8,SK10 Steht ja für Motor A nehme ich an. Daher müssten SK9 und SK11 allein für Motor B stehen.

Was ich allerdings nicht verstehe. Zb. bei SK8 hat man die möglichkeiten die Steckbrücke in 3 Kombinationen zu setzen. In 3,5 und 6. Auf dem Schaltplan auf Seite 3 sieht man allerdings das diese Kombinationen in der Mitte zusammenlaufen und somit ENABLE A ergeben… Was nützen mir dann die Anderen Konfigurationsmöglichkeiten? Ich weiß natürlich das es nicht so ist allerdings kann ich es nicht nachvollziehen.