Arduino: Steuerung für Pan/Tilt

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich hab ein seltsames Problem mit einem Sketch für'n Arduino an dem ein Pan&Tilt angeschlossen ist.

    Dazu verwende ich die in Arduino-IDE bei gefügte Servo.h

    Die Servos vom Pan/Tilt hab ich so angeschlossen das sich jeweils ein 470µF Elko zwischen Steuersignal und GND befindet.

    Da ich sowohl zur Seite/Schwenken (Pan) als auch nach Oben/Unten/Kippen (Tilt) möchte, hab ich 2x die Servo Klasse initialisiert.

    Hab jetzt ein Sketch geschrieben wo er bei Initialisierung in eine eingestellte Nullstellung fährt.
    Die Schritte für PAN-Bewegungen sind auf 10 eingestellt, für TILT auf 20.

    Dann geht er in 10er Schritten erst nach Rechts, beim erreichen eines eingestellten Maximums (damit man den Servo nicht überdreht und beschädigt, sollte nicht über 179 liegen) geht er nach Links und beim erreichen des eingestellten Minimums (sollte nicht unter 0 liegen) macht er eine sog. NewLine dh der TILT geht um 20 Schritte nach oben und dann beginnt das Spiel wieder von Vorne:
    Der PAN macht erst nach rechts bis ans Max, dann nach Links bis zum Min. Ist die Line fertig geht der TILT weiter nach oben - dafür kann man ebenfalls ein Maximum einstellten. Ist das TILT_Maximum erreicht soll er wieder um 20 runter usw, und auch für TILT gibts ein Minimum...

    Das Problem besteht jetzt allerdings darin das er beim erreichen des TILT Maximums oder Minimums die Line noch mals in der selben TILT Einstellung abfährt, aber das soll er nicht :(

    Da werkel ich jetzt schon seit gestern dran aber komm nicht auf den Fehler bzw was ich anders programmieren muss.

    :helpnew:


    Sketch:

    Spoiler anzeigen

    Serial Ausgabe:

    Spoiler anzeigen

    In der Mitte ist das Problem (2.newLine)

  • Hallo meigrafd,

    hm ... so ad hoc:

    Spoiler anzeigen


    int servo_pan(int pos) {
    static int old_pos=0;
    int difference = pos - old_pos;
    // Wenn difference 0 ist ...
    for(int i=0; i < (abs(difference) +1 ); i++) {
    // läufst Du trotzdem in diese Abfrage ... wegen dem +1
    if (difference > 0)
    pan_servo.write(old_pos++);
    else if (difference<0)
    pan_servo.write(old_pos--);
    else {
    // und dann in diesen Zweig ...
    pan_servo.write(pos);
    break;
    }
    delay(15);
    }
    old_pos=pos;
    //gibst aber den richtigen Wert ( 0 ) zurück
    return abs(difference);
    }


    cu,
    -ds-

  • :auslachen: ...ich hab den blöden Fehler gefunden... Rechnen sollte man halt schon könn :daumendreh2:

    Der Fehler lag im

    Code
    if (newLine) {

    Und zwar mach ich dort ja zB:

    Code
    if (dir_tilt == UP) {
          pos_tilt = pos_tilt - 20;
          if (pos_tilt < 130) {
            pos_tilt = pos_tilt + 20;
            dir_tilt = DOWN;
          }
        } else {

    Das Problem hier war nun das er von 130 erst 20 abzieht also pos_tilt auf 110 setzt, dann feststellt dass das weniger als 130 ist (<) und dann wieder 20 addiert also ist es wieder 130...

    Die Lösung war also recht simpel:


    Hab den Sketch aber (wie bei mir üblich) auch um weitere Variablen erweitert (ich mag hardcoded Werte nicht wirklich). Also hier der funktionierende Sketch:

    Spoiler anzeigen

    Beachten sollte man das die max und min Werte nicht mit den Steps und Startpositionen in Konflikt kommen. Ist die Startposition zB 150, der Step 20 aber Max 160 kann das nicht funktionieren..


    PS: Es ist normal dass wenn man die Serielle Verbindung neu herstellt (oder den Serial Monitor neu öffnet), das der Pan/Tilt wieder von vorne anfängt, da der Arduino dann resettet wird, es sei denn man macht > dies <

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!