Forum: Mikrocontroller und Digitale Elektronik Beim schreiben einer eigenen abgeleiteten Klasse der Servo Klasse verhält er sich nicht richtig


von Amateur (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe versucht einen Servomotor mittels eines Temperatursensors zu 
steuern. Ich dachte mir damit mein Code übersichtlicher wird schreibe 
ich zur Bewegung des Motors eine eigene Klasse die von der Servo Klasse 
abgeleitet wird. Allerdings macht der Servo nicht das was er soll. 
Jedoch wenn ich genau den selben Code im Hauptprogramm schreibe verhält 
er sich normal und tut was er soll. Woran könnte das liegen?

Haupt-Quelldatei:
1
#ifndef _SERVO_H_
2
#define _SERVO_H_
3
#include <Servo.h>
4
#endif
5
6
#include <Temperatur.h>
7
#include <Bewegung.h>
8
9
Bewegung servo(9);
10
Temperatur temp(0);
11
float voltage, degreesC;
12
13
void setup() {
14
  // put your setup code here, to run once:
15
  Serial.begin(9600);
16
}
17
18
void loop() {
19
  // put your main code here, to run repeatedly:
20
  
21
  voltage = temp.GetVoltage();
22
  
23
  degreesC = temp.GetDegree();
24
  
25
26
  Serial.print("Temperatur: ");
27
  Serial.println(degreesC);
28
  Serial.print("Voltage: ");
29
  Serial.println(voltage);
30
  delay(500);
31
  
32
  servo.Abfrage(degreesC);
33
34
  
35
}
36
37
/*
38
void MoveRight(){
39
    for(int i = aktuellePos; i > geschlossen; i -= 2){
40
       servo1.write(i);
41
       delay(20); 
42
    }
43
    servo1.write(offen);
44
    aktuellePos = offen;
45
}
46
47
void MoveLeft(){
48
    for(int i = 0; i < offen; i += 2){
49
       servo1.write(i);
50
       delay(20); 
51
      }
52
  servo1.write(geschlossen);
53
  aktuellePos = geschlossen;
54
}
55
56
*/
57
/*
58
float Degree(float voltage){
59
  return ((voltage - 0.5) * 100);
60
}
61
62
float getVoltage(int Pin){
63
  return (analogRead(Pin)* 0.004882814);
64
}*/



Danke schon mal im voraus

von STK500-Besitzer (Gast)


Lesenswert?

1
#ifndef _SERVO_H_
2
#define _SERVO_H_
3
#include <Servo.h>
4
#endif

steht nicht genau die Anweisung auch in der "Servo.h"?

von Peter II (Gast)


Lesenswert?

wo rufst du überhaupt Methoden von Bewegung auf?

von Amateur (Gast)


Lesenswert?

Ich rufe die Bewegung auf indem ich servo.Abfrag(degreesC);
und die Methoden auf und zu sind private und werden nur von der 
Meberfunktiion Abfrage aufgerufen

von Amateur (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> steht nicht genau die Anweisung auch in der "Servo.h"?

Von welcher Anweisung spricht du?

von STK500-Besitzer (Gast)


Lesenswert?

Amateur schrieb:
> Von welcher Anweisung spricht du?

Von der, die ich zitiert habe...
Für die Blinden:
1
#ifndef _SERVO_H_
2
#define _SERVO_H_
3
#include <Servo.h>
4
#endif

von Frank L. (frank_l)


Lesenswert?

Hallo,

Bewegung ist eine Ableitung von Servo! Warum deklarierst Du dann noch 
eine Variable Servo1 innerhalb der Klasse Bewegung?

Lese Dich mal in die Vererbung ein. Dann wirst Du wahrscheinlich sehr 
schnell das Problem an Deinem Code erkennen.

Gruß
Frank

von Amateur (Gast)


Lesenswert?

Frank L. schrieb:
> Hallo,
>
> Bewegung ist eine Ableitung von Servo! Warum deklarierst Du dann noch
> eine Variable Servo1 innerhalb der Klasse Bewegung?
>
> Lese Dich mal in die Vererbung ein. Dann wirst Du wahrscheinlich sehr
> schnell das Problem an Deinem Code erkennen.
>
> Gruß
> Frank

Danke,

Ja hast recht. Ich kann ja die Memberfunktionen von der Servoklasse 
direkt benutzen wenn ich diese vererbe. Allerdings habe ich das jetzt 
getan und nun bewegt sich gar nichts mehr ^^.
1
#include "Bewegung.h"
2
3
4
Bewegung::Bewegung(int Pin): m_geschlossen(90), m_offen(0), m_aktuellePos(0), m_niedrigstTemp(20), m_hoechstTemp(38){
5
    attach(Pin);
6
    write(m_geschlossen);
7
    delay(100);
8
}
9
10
Bewegung::~Bewegung(){}
11
12
void Bewegung::Abfrage(float degree){
13
    if((degree < m_niedrigstTemp) && (m_aktuellePos == m_offen)){
14
        Zu();
15
        delay(100);
16
    } else if((degree > m_hoechstTemp) && (m_aktuellePos == m_geschlossen)){
17
        Auf();
18
        delay(100);
19
    }
20
}
21
22
23
void Bewegung::Auf(){
24
    for(int i = m_aktuellePos; i > m_geschlossen; i -= 2){
25
        write(i);
26
        delay(20);
27
    }
28
    write(m_offen);
29
    m_aktuellePos = m_offen;
30
}
31
32
void Bewegung::Zu(){
33
    for(int i = 0; i < m_offen; i += 2){
34
        write(i);
35
        delay(20);
36
    }
37
    write(m_geschlossen);
38
    m_aktuellePos = m_geschlossen;
39
}
40
41
int Bewegung::GetAktuellePos(){
42
   return m_aktuellePos; 
43
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.