Servo über externes Poti steuern

Nabend

Eigentlich dachte ich, dass die Aufgabe recht einfach sein wird,
jetzt stehe ich aber doch vor Problemen.

Es geht um ein Modellbauservo ohne mechanische Drehwinkelbegrenzung und modifizierten Poti.
Damit sich das Poti komplett drehen kann, habe ich auch dort die mechanische Drehwinkelbegrenzung entfernt.
Ausgelesen wird das Poti über einen analogen Eingang.
Über den halben Vollkreis habe ich eine ansteigende Spannung bzw. deren analogRead Werte bis 1018.
Die andere Hälfte ist der Wert konstant 1018 oder schwankt zwischen 3 und 7.

Jetzt würde ich gerne eine volle Runde drehen und dann stoppen.
Dazu habe ich folgenden Code geschrieben:

void loop()
{
  if (analogRead(A0) > 500 && analogRead(A0) < 501)
  {
    Serial.print(analogRead(A0)); Serial.print(" ");
    digitalWrite(servo, LOW);
    Serial.print(analogRead(A0)); Serial.print(" ");
    delay(5000);
    Serial.println(analogRead(A0));
    digitalWrite(servo, HIGH);
  }
}

Als Ausgabe habe ich so etwas erwartet:

500 501 501

Es kommt aber folgendes:

3 0 10
500 1 9
3 10 2
501 1 2
3 0 2
3 0 2
4 0 3
500 1 2
4 0 2
3 0 10
501 1 2
501 1 2
500 1 2
8 0 10
500 1 27
4 1 1
501 1 2
3 0 9
6 22 10
3 17 2
3 0 2
500 1 2

Könnt ihr mir das erklären?

Danke und Gruß Kolja

Kennst du von alten Stereoanlagen, wenn die Potis beim Verstellen kratzende Geräusche machen? Sowas in der Art passiert auch hier. Der AD-Wandler ist recht schnell und empfindlich und du siehst Rauschen und "eingefangene" Störungen. Schalte zwischen Masse und den Analogeingang einen (Folien)Kondensator, der glättet die Störungen. Mit dem Wert mußt du etwas experimentieren. Versuche es mal mit 100nF und wenn imer noch Störungen dabei sind, dann nimm versuchsweise 1µF MKT.

Nabend

Ja, die Geräusche kann ich hier herstellen.
Alter Braun Verstärker.
Den Tipp mit dem Kondensator teste ich gleich mal, aber:

Das Bild habe ich vor Ostern erstellt und es zeigt etwa zwei Umdrehungen.
Im loop() habe ich einfach nur den A0 ausgelesen.

Und da rauscht nichts...

So wie das aussieht stimmt was mit dem Poti nicht.
Haste das evtl. mechanisch beschädigt beim Modifizieren?

Mach mal ein ordentlich Bild, auf dem man was erkennen kann (und das trotzdem kleiner ist als 500 kB).

hat er! Oben steht, dass Kolja den Anschlag am Poti entfernt hat.

So geht's natürlich nicht. Ein Poti hat normalerweise 270 Grad Drehwinkel. Wenn's drüber hinausgeht, geht der Schleifer ins Leere und liefert gar nix mehr. Eine Umdrehung ist nur durch das Entfernen des Anschlags nicht machbar. Ein mechanischer Umbau ist da schon fällig. Mehrgangpoti oder Untersetzungsgetriebe zwischen Servowelle und Poti fallen mir da spontan ein.

Was soll das Ding denn können? Eine Umdrehung oder mehrere?

Ich bin davon ausgegangen, dass das nicht die einzige Änderung ist - obwohl beim nochmaligen Lesen das Ergebnis dazu passt.

Dann ist das Problem ja schon identifiziert :slight_smile:

Nabend

Also Kondensatoren verhindern das "Rauschen" nicht.

Das Poti ist nicht kaputt.
Die Grafik zeigt doch, das es genauso funktioniert, wie man es erwarten würde.

X-Achse: Anzahl der Messungen (zwischen den Messungen liegen etwa 4ms)
Y-Achse: Spannung am A0

von X(0-160) werden nicht auswertbare Minimumwerte gemessen
von X(161-425) werden linear ansteigende Werte gemessen
von X(426-475) werden nicht auswertbare Maximumwerte gemessen

Und nochmal: Das Servo und das Poti haben keine mechanische Sperre mehr.
Beide können sich endlos drehen.
Das Servo hat auch keine Elektronik mehr, der Motor wird direkt an und ausgeschaltet.

Das Servo soll zwei bis drei Runden drehen können und dabei auf ca. 5° genau positioniert werden.
In dem linearen Bereich sollte das ja auch kein Problem sein.

Für die anderen Bereiche, dachte ich an eine Steuerung über die Zeit.

Der Code sollte dann in etwa so aussehen:

Als erstes werden zwei volle Runden gedreht und die Zeit pro Runde gemessen.
Vielleicht auch die Zeit des linearen Bereiches, mit dem Wissen, wie groß der Drehwinkel dieses Bereiches ist,
kann dann ja ein Vergleich angestellt werden.
Eigentlich sollte die Winkelgeschwindigkeit aber konstant sein.

Jedem Winkel (oder Anfahrposition) ist einen Wert zugeordnet.
Im linear ansteigenden Bereich ist es der Wert den auch A0 liest,
die andere Hälfte bekommt Werte über 1023 oder unter 0 damit sie eindeutig von den ersten Werten zu unterscheiden sind.

Während die A0 Werte direkt angefahren werden können, muss bei den anderen Werten der Motor eine bestimmte Zeit laufen um die Position zu erreichen.
Wie exakt die Position dann erreicht wird, ist leider nicht vom µC zu ermitteln.

Anregungen dazu ?

Gruß Kolja

Mach mal die Hysterese größer.
Bei 1 Bit und dem Gezappel und Gekrache kann das ja eigentlich nicht funktionieren.

Weiterhin halte ich es für sehr verwegen, nur einen Teil des Wegs messen zu können und den Rest im Blindflug per Zeit einstellen zu wollen. Das wird selbst bei 5 Grad nicht hinhauen fürchte ich. Aber da bin ich immer Pessimist :smiling_imp:

Hysterese ist jetzt von 500 bis 510.
Damit bleibt der Motor bei jeder Runde an der richtigen Position stehen,
aber leider nicht nur da:

ready!
501 1 2
3 0 2
500 0 2
57 0 2
501 0 2
53 0 2
501 0 2
501 1 9
7 0 10
501 0 2
3 0 3
500 1 9
500 1 1
501 1 2

Wie genau das in dem toten Bereich wird, bleibt spannend :slight_smile: