Mittelwert für Beschleunigungssensor errechnen innerhalb einer Schleife

Hallo.

Ich habe folgendes Problem; Mit zwei Servos und einem 3-Achsen-Beschleunigungssensor (BS) möchte ich einen "Balancer realisieren".

Grundsätzlich funktioniert alles, d.h.;
Kippt mein Konstrukt nach vorne, wird über beide Servos eine Gegenbewegung zum Ausbalancieren ausgelöst und umgekehrt. Dadurch das der BS aber mitunter extreme Sprünge macht und die Werte des BS direkt in die Berechnung für die Position der Servos einfließt, ist das natürlich ein ziemliches "Rumgewackel" :wink:

Nun möchte ich erreichen das von einer sinnvollen Anzahl von Positionswerten (zB. 10 Werte) ein Mittelwert gebildet wird der dann als Berechnungsgrundlage für die Positioniereung der Servos genutzt wird.

Ich hoffe das ich mich nicht so verkorkst ausgedrückt habe :stuck_out_tongue:

Hier noch mein ProgrammCode;

// Memos
// *****
// Die Differenz des Beschleunigungssensors zwischen beiden Endlagen hat den Wert 140 (70 in pos. Richtung und 70 in neg. Richtung)
// Die Nullstellung ist in etwa (für dieses Projekt) bei einem Wert von 340

// Die Servos haben einen Aktionsradius von ca. 180 Grad und werden in numerischen Werten angegeben.
// Wenn man jetzt das Verhältnis zwischen Beschleunigungssensor und Servostellung herstellt
// sollte die Servostellung ohne große Rechenoperationen zu bewerkstelligen sein.

#include <Servo.h>
Servo servo_links;
Servo servo_rechts;

int yA;    
int yMittel;           
int posL;
int posR;
int posDiff;
int sleep1 = 300;      // Verzögerung Schleifengeschwindigkeit
 
void setup()
{
Serial.begin(9600);    // wird nur zur Visualisierung der Werte benötigt
servo_links.attach(3);
servo_rechts.attach(2);
}

void loop()
{
yA = analogRead(A1);
// hier an dieser Stelle sollte der Mittelwert
// aus (zB.) 10 aufeinander folgenden Werten
// von yA gebildet werden (zB. yMittel)
posL = yA-250;
posR = 90+(90-posL);
servo_links.write(posL);
servo_rechts.write(posR);

Serial.print(yA);         // wird nur zur Visualisierung der Werte benötigt  
Serial.print(" -- ");     // wird nur zur Visualisierung der Werte benötigt
Serial.print(posL);       // wird nur zur Visualisierung der Werte benötigt
Serial.print(" - ");      // wird nur zur Visualisierung der Werte benötigt
Serial.print(posDiff);    // wird nur zur Visualisierung der Werte benötigt  
Serial.print(" - ");      // wird nur zur Visualisierung der Werte benötigt
Serial.print(posR);       // wird nur zur Visualisierung der Werte benötigt
Serial.println();         // wird nur zur Visualisierung der Werte benötigt

delay(sleep1);
}

ps; bin absoluter Anfänger auf diesem Gebiet :see_no_evil:

Danke für Eure Unterstützung1

Suche mal im Forum nach "gleitender Mittelwert".

Als ganz einfache Glättung:
yA = (3*yA + analogRead(A1)) >> 2; // /4

Hallo @DrDiettrich ,

danke zuerst einmal für Deine Antwort!
Ich habe diese Zeile in meinen Sketch eigefügt und die Werte über Serial-Monitor anzeigen lassen. So wie ich das sehe (an den Werten UND der Servostellungen), ist das keine Veränderung am Verhalten des "Balancers".

Wenn ich Deine Zeile anschaue, liest sich das für mich im forderen Teil so;
Der Wert yA = 3x ausgelesener Wert + 1x ausgelesener Wert
(was >> 2; // /4 bedeutet, weiß ich leider nicht, vielleicht kann das mal jemand einem Anfänger erklären :see_no_evil:)

Das würde doch aber im Endeffekt das Selbe bedeuten wie;
yA=4 x yA ??? (Weil ja 3xyA und einmal analogRead(A1) was ja ebenfalls yA entspricht. Ich bin verwirrt. Ich weiß nicht ob das mit dem Rest der Gleichung zusammenhängt da ich die Rechenoperationen dahinter nicht kenne, aber ich verstehe es im Moment nicht, sorry.

Vielleicht habe ich mich auch unverständlich ausgedrückt?
Bevor die Werte für die Servos geschrieben werden, soll 10x (als Beispiel) die Y-Position des BS gelesen werden und daraus der Mittelwert errechnet werden.

yA=(w0+w1+w2+w3+w4+w5+w6+w7+w8+w9)/10

Das heißt, das der Wert des BS innerhalb von einem loop-Durchlauf 10x abgefragt werden soll (vielleicht durch eine "for-to-next-Schleife") um daraus den Mittelwert zu bilden und zur Berechnung zu übergeben.

(Zum besseren Verständnis; Der BS liefert selbst im Ruhezustand unregelmäßig Spitzenwerte, die natürlich sofort an die Servos übertragen werden was ein Zappeln der Servos verursacht. Das möchte ich durch das Glätten mittels eines Mittelwertes verhindern da dann die Spitzen abgefangen werden und ein gleichmäßigerer Wert erreicht werden kann.)

Danke für Eure Unterstützung!

Das ist 3*alter Wert + 1*neuer Wert.

x>>2 gibt x um 2 Stellen nach rechts geshiftet, dasselbe wie Division durch 4, nur als Int und nicht als float wie bei einer Division.
Das // gibt einen Kommentar bis zum Zeilenende.

Das hört sich nach der Regelung eines instabilen Systems an.

Die üblichen Werkzeuge dafür sind PID-Regler und, wenn schon die Messwert-Erfassung Probleme macht, Kalman-Filter.
Auch musst du Messwert-Erfassung und Regelung gedanklich trennen und zunächst die Messwert-Erfassung sauber in den Griff kriegen. Dann klären, wie du die Stellgröße (Servo-Ansteuerung) auf dein mechanisches System rüberbringst, möglichst direkt und ohne Totzonen und -zeiten. Danach kannst du Regelungstechnik studieren, P und I Anteile ermitteln und deinem "Balancer" das Balancieren beibringen. Viel Spaß !

Hallo

schau mal hier .

da ging es zwar um einen etwas andere Aufgabenstellung aber grundsätzlich sollte das passen
Heinz