Go Down

Topic: [solved] Methode/Funktion - Anfängerfrage (Read 1 time) previous topic - next topic

Olvo

Jul 24, 2015, 05:49 pm Last Edit: Jul 25, 2015, 12:55 pm by Olvo
Hy liebe Arduino Gemeinde,
ich sitze gerade vor einem kleinen Problem. Habe hier ein Servo in Betrieb, welcher in der Mittelstellung (90°) abweicht. Die Abweichung ist linear und lässt sich gut rausrechnen.
Das ganze habe ich wiefolgt gemacht:
- Werte holen (vom Poti,map auf 180°)
- je, nach Winkel wird die Abweichung rausgerechnet und in neue *temp Variabe gespeichert (brauch die Originalvariable noch, für eine LCD Winkelanzeige)
- die *temp Variable wird an den Servo gesendet

Code: [Select]
yPosition=analogRead(YPot);          
yPosition=map (yPosition,0,1023,0,180);
int yPositiontemp;
yPositiontemp=yPosition;

if ((yPosition>=20 && yPosition<40) || (yPosition>=140 && yPosition<160))
   {yPositiontemp=yPosition+1;}

else if ((yPosition>=40 && yPosition<60) || (yPosition>=120 && yPosition<140))
   {yPositiontemp=yPosition+2;}

else if ((yPosition>=60 && yPosition< 80) || (yPosition>=100 && yPosition<120))
    {yPositiontemp=yPosition+3;}

else if (yPosition>=80 && yPosition< 100)
      {yPositiontemp=yPosition+4;}

ServoY.write(yPositiontemp)


 

Soweit läuft das auch ganz gut.
Nun, das Problem ist das ich je nach dem welcher Teil des Codes aktiv ist, der Sollwert nicht über den Poti kommt, sondern von einem Analogstick, per bluetooth oder vom Arduino selbst generiert wird.

Nun würde ich gerne die Abweichungskorrektur als Methode/Funktion festlegen und aus mehreren unterschiedlichen Stellen im Code aufrufen können. So das ich dieser einen Winkelwert von 0-180° übergebe und sie (die Methode/Funktion) die Abweichung rausrechnet und dann an den Servo sendet.

Bisher habe ich noch nie damit gearbeitet, und lerne mich gerade ein.
So wie ich das verstehe handelt es sich ja um eine Funktion ohne Rückgabewert.

Dann müsste die Struktur doch so aussehen:
Code: [Select]
void ServoY(int Winkel)
{
int yPositiontemp;
yPositiontemp=Winkel;

if ((Winkel>=20 && Winkel<40) || (Winkel>=140 && Winkel<160))
   {yPositiontemp=Winkel+1;}

else if ((Winkel>=40 && Winkeln<60) || (Winkel>=120 && Winkel<140))
   {yPositiontemp=Winkel+2;}

else if ((Winkel>=60 && Winkel< 80) || (Winkeln>=100 && Winkeln<120))
    {yPositiontemp=Winkel+3;}

else if (Winkel>=80 && Winkel< 100)
      {yPositiontemp=Winkel+4;}

ServoY.write(yPositiontemp)
}


und der Aufruf erfolgt mit (als Beispiel kommen die Werte diesmal wieder vom Poti):
Code: [Select]
yPosition=analogRead(YPot);          
yPosition=map (yPosition,0,1023,0,180);
ServoY(yPosition);



So meine konkreten Fragen:
1. Stimmt das soweit? Wenn Nein, was ist falsch?
2. Wo kommt die Methode hin? Am Anfang des Sketchs? in den loop? nach dem loop?


PS: Bin noch Anfänger, seit gnädig mit der Kritik :)

jurs

#1
Jul 24, 2015, 07:30 pm Last Edit: Jul 24, 2015, 07:44 pm by jurs
PS: Bin noch Anfänger, seit gnädig mit der Kritik :)
Wenn Du von der Ansteuerung her einen anderen Winkelbereich möchtest, so sieht die standardmäßige Servo-Library das bereits vor.

Anstelle einer Initialisierung des Servos mit:
Code: [Select]
servo.attach(pin)
gäbe es auch die Variante mit Vorgabe der min/max Position in "Mikrosekunden Impulslänge":
Code: [Select]
servo.attach(pin, min, max)

Also ggf. aufrufen mit angepassten Parametern, z.B.:
Code: [Select]
servo.attach(servoPin, 1000, 2000)
https://www.arduino.cc/en/Reference/ServoAttach

Ansonsten: Der Servoarm ist auf vielen Servos mit einer Sternverzahnung versehen. Um dort eine mechanische Korrektur vorzunehmen: Befestigungsschraube des Servoarms entfernen, Servoarm abziehen und leicht verdreht wieder aufstecken. Befestigungsschraube wieder eindrehen.

Übrigens sind Servopositionen handelsüblicher Servos extrem temperaturabhängig. Wenn Du einen Servo einmal im Hochsommer bei 30°C betreibst und im Winter bei 0°C, dann kann es in der Neutralstellung leicht 10 Winkelgrade Abweichung alleine durch den Temperaturunterschied geben.

Immer aufpassen, dass Du den Servo von der Steuerung her nicht auf seinen mechanischen Endanschlag fährst, wo er dann mechanisch blockiert und dabei stets maximalen Strom zieht!

Serenifly

Du hast anscheinend schon ein Objekt namens ServoY:
Code: [Select]

ServoY.write(yPositiontemp)

Da kannst du nicht noch eine Funktion gleichen Namens haben.

Noch ein Tip: Objekt-, Variablen- und Funktions-Namen fangen in C/C++ normalerweise mit Kleinbuchstaben an. Es geht zwar auch so, aber es ist etwas verwirrend. Großbuchstaben sind für Klassen-Namen

Olvo

@jurs
Diese funktion der Servo Libary nutze ich bereits. der Servo stimmt auch bei 0° und 180° nur in Richrung Mittelstellung macht sich eine Winkelabweichung bemerkbar. Ihren Höchstwert hat sie bei 90°, da weicht der Soll vom Istwert um 4° ab. Das bekomme ich mit der Libary alleine nicht abgefangen. Mechanisch ist er auch soweit schon eingestellt.

@Serenifly
Ok, da kann ich einen anderen Namen vergeben, das ist kein Problem. Mit der groß/kleinschreibung und typischer Variabelnnamensgebung, hab ich es (noch) nicht so.


Wo muss die Methode/Funktion im sketch liegen?
Im/vor derm setup? im loop?

Klaus_ww

Also ich packe Funktionen in extra Tabs. Und wenn's kleine Sketches sind an's Ende.
Wo ist glaub ich tatsächlich egal, probier halt mal. Dann merkst Du's Dir auch leichter.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Olvo

#5
Jul 25, 2015, 11:18 am Last Edit: Jul 25, 2015, 12:54 pm by Olvo
Ok, Tabs kannte ich bisher noch gar nicht, werde ich aber in Zukunft der Übersichtlichkeit wegen auf jeden fall verwenden.


Also ich habe die Methode jetzt über void setup() gesetzt, und dort funktioniert es auf jeden Fall einwandfrei.
Mein Problem wurde erfolgreich gelöst.

Danke an alle beteiligten.

michael_x

Quote
ich habe die Methode jetzt über void setup() gesetzt, und dort funktioniert es auf jeden Fall einwandfrei.
Eine der Besonderheiten der Arduino IDE ist, dass alle Funktionen gefunden werden, egal in welcher Reihenfolge sie in welchem Tab auftauchen. Tabs werden alphabetisch sortiert.

Natürlich nicht innerhalb einer anderen Funktion wie loop()

Quote
Mein Problem wurde erfolgreich gelöst.
Glückwunsch und viel Spass weiterhin!

Serenifly

Es gibt übrigens einen kleinen Unterschied zwischen Funktionen und Methoden. Methoden hat man innerhalb einer Klasse. Hier handelt es sich um Funktionen.

Go Up