Ruderweg Messung mit Arduino

kalle123

User
Walter, das hier von Digitech

q8cawT8l.png


hat mich damals motiviert, mal selber was "auf die Beine" zu stellen.

Und wenn hier im Forum dann so ein youtube Video gelinkt wird und dazu noch "perfekt" kommt, werde ich skeptisch.

Gruß KH
 

Source

User
Ich bin fleissig am tüfteln. Ne ordentliche und praxisgerechte Glättung sollte doch möglich sein.
Bis jetzt sieht es mal so aus.
Ich bin mir sicher da geht noch was...

Filter_Lowpass_0.5hz.png

Genaueres dann wieder in meinem Blog.
Gruß Max
 

WalterH

Fördermitglied
Beschriftung

Beschriftung

Hallo Max.
Danke für Deinen Einsatz.
Kannst Du bitte noch eine Beschriftung der Achsen einfügen?
Dann kann man die Abbildung interpretieren.

Ein Tip zum Filtern und zu Deinem Blog.
Alle möglichen "Filter" die man bei google so findet auszuprobieren ist etwas mühsam.;)

Ehe man filtert muss man die Daten ansehen und analysieren.
Da bist Du auf dem richtigen Weg.
Nach dem was ich bisher von Analog Devices gesehen habe sind die gemessenen Werte einer Gauss Verteilung ähnlich.
Dann bekommt man kaum bessere Präzision als mit einem Mittelwert.
Mit 50 Mittelwerten erhalte ich eine Stabilität über mehrere Minuten von etwas besser als 0,2°.
Mehr ist vermutlich nicht zu holen.
Aber ich lasse mich überraschen.

Wenn das Glitches sind in deiner Grafik helfen weder gleitende Mittelwerte noch Mittelwerte viel. Was man tun muss ist diese herauszufiltern.
Die Erkennung sollte nicht allzu schwer sein. Z.B kann man alle Einzelwerte, die mehr als sagen wir mal 0,2 ° abweichen verwerfen.
Aus Deiner Grafik kannst du schon einen Bereich herauslesen der als Schwelle geeignet wäre.
 

kalle123

User
Max, wäre auch schön, wenn du was zum Einsatz von "Microsmooth" in Verbindung mit Signalen auf I2C (ADXL 345) dort sagen könntest.

Asheesh geht im readme ja nur auf auf die beiden Quellen ein.
Then, input your analog signal value using analogRead() or pulseIn into an int variable, referred here as channel_value.

Gruß KH
 

Source

User
Die Y-Achse sind die raw daten der x-achse des accelerometer.
Rot ungefiltert, grün gefiltert.
Das ganze seriell raus und in Processing dargestellt.

Bitte nicht hauen, aber ob "Microsmooth" die beste Wahl war, zieh ich grade in Zweifel. Ich hab die signed int vom Sensor über die map() funktion auf int umgebogen :eek: und diese dann in das ms_ema geschickt. Eklig! und funktioniert nicht 100% Bei großen Negativwerten gibts n Überlauf. Dann will die funktion noch einen Zeiger, der aber nur der Konsistenz der Library dient, aber in der ema Funktion nicht vorkommt hm..
Für eine graphische Auswertung der Filtereigenschaften reichts aber.
Und da stelle ich momentan fest, dass die "Filters" Library https://playground.arduino.cc/Code/Filters ebenso gute Ergebnisse liefert aber keine hässlichen Mappingaktionen braucht.

Ich probiere weiter und Berichte dann Detailiert

Gruß Max

P.S. Disclaimer: Ich bin weder Informatiker noch Mathematiker. Alles was ich hier schreibe ist ein Resultat aus "learning by doing" und dem zerbrechen eines nichtakademisch gebildeten Kopfes ;-) Daher erhebe ich keinen Anspruch auf Richtigkeit meiner Aussagen und bitte um Korrektur falls ich Mist schreibe ;-)
 

kalle123

User
Max, und ich hab mal gelernt, Schraubverbindungen und Zahnradgetriebe zu berechnen ...

Und so langsam beginnt die "altersbedingte" Demenz.... :D

Nur dazu.

Anderes Thema: Krieg hier gerade eine PM wegen der Button. Poste die Antwort auf die Anfrage jetzt hier.

In der letzten von mir hier geposteten Version steht oben im Kopf ...

Arduino Button D2, D3, D4 and D6, Jumper to D5
D2 - zero setting
D3, D4 - up and down depth value
D5 - throw or secant measurement
D6 - write depth to eeprom

Also nicht nur 2 Buttons ;)

D5 würde ich nicht mehr nutzen. Bleiben immer noch 4 Buttons.

Zur Verdrahtung der Buttons findet sich in der nächsten Zeile dann der Hinweis

https://www.arduino.cc/en/tutorial/button

Da findet sich auch eine Skizze, wie man das macht.

Bei weiteren Fragen bitte hier. Ja, ich bin auch kein Elektroniker. :D Siehe oben.

Gruß KH
 

kalle123

User
@Jeroen.

Hi. Du hast mich überzeugt und ich werde Messreihen fahren.

- Hab mir einen Messstand "gebastelt".

- Überlege noch, mit welchen Programmen (sketches) in welcher Sequenz ich die Messreihen fahren werde.

- Auswertung ??

Nur, das kann ich nicht so mal nebenbei, wird also dauern.

Werde berichten. Gruß KH
 

Source

User
Nachtrag:

Code:
void loop()
{
    int average = 50;
    for(int i; i < average; i++){
        sensor_A.read();
        filtered_average += sensor_A.x;
        delay(5);
    }

    filtered_average = filtered_average/average;
    
    sensor_A.read();
    raw_AX = sensor_A.x;    
    filtered_lowpass1pole = lowpassFilter_OnePole.input(sensor_A.x);
    int ms_ema = map(sensor_A.x,-4095,4095,0, 8191); 
    
    Serial.print(raw_AX);
    Serial.print(",");
    Serial.print(filtered_lowpass1pole);
    Serial.print(",");
    Serial.print(filtered_average);
    Serial.print(",");
    Serial.println(ema_filter(ms_ema, ptr));
}

der Sketch spuckt folgenden Graph aus:

Filter_Lowpass_0.5hz.png
Ich hab den Sensor dabei geschüttelt.

Rot = raw daten
Grün = Filters Library
Blau = Mittelwert aus der Schleife
Violet = Microsmooth EMA

Sehr Aufschlussreich wie ich finde.
Die Schleife bremst natürlich den ganzen Prozessor aus. Arduino schreibt nur alle 50 Schleifendurchläufe. Dadurch sind die Kurven so eckig. In diesem Fall sind raw, Mittelwert und "Filters" Lowpass annähernd gleich schlecht.
Der EMA behält durch die Rekursion die Spur. ist aber unter diesem Umständen viel zu träge.

Und Vorsicht ist bei der Mittelwertschleife auch geboten. 50 mal 16bit int in eine 16bit int führt zum Überlauf! Deswegen ist filtered_average als Long deklariert.
Code:
int16_t raw_AX; //raw data from sensor A
int16_t filtered_lowpass1pole=0;
long filtered_average = 0L;    //!!

Falls jemand selber spielen will: Ich hab folgenden Processing Code verwendet: https://ericjformanteaching.wordpre...uino-to-processing-graphing-multiple-sensors/

Gruß Max

EDIT: Also gut ich verrate es: ;-) Ich hab die ADXL345 aufgegeben und verwende MMA8451! 14 statt 10 bit! Das zehntel Grad seh ich aber immer noch nicht... mal schauen...
 

WalterH

Fördermitglied
...Und Vorsicht ist bei der Mittelwertschleife auch geboten. 50 mal 16bit int in eine 16bit int führt zum Überlauf! Deswegen ist filtered_average als Long deklariert......

Also zwei signed int16 addiert wären im ungünstigen Fall, beide positiv oder beide negativ, schon Overflow.

Aber so schlimm ist es ja nicht, wenn wir die eingelesenen Werte ansehen. Die bleiben kleiner als abs(int).

Rechnen wir: 32767 / 50 = 655. So hohe Werte lese ich nicht aus meinem Sensor.
Unter +-300.
Also bleibe ich bei 50 summierten Werten und selbst bei 100 Werten unter int.

Der Mittelwert ist dann natürlich wieder unter abs(300) ;)

Aber Vorsicht ist natürlich immer gut, also Werte ansehen.
 
Kalle schrieb : @Jeroen. Hi. Du hast mich überzeugt und ich werde Messreihen fahren.
=> super!

Kalle schrieb Überlege noch, mit welchen Programmen (sketches) in welcher Sequenz ich die Messreihen fahren werde.
=> Wenn du deine Program benutzt, konnen wir sehen ob da Unterschieden sind.

Kalle schrieb : Max, und ich hab mal gelernt, Schraubverbindungen und Zahnradgetriebe zu berechnen ...
Und so langsam beginnt die "altersbedingte" Demenz....
=> also auch Mechaniker :)

Ich hoffe das jemand die Filterung von Max in Kalles Program "einbauen" kann....
Das ist von mir etwas mehr wie copy/past:D
 

Source

User
Für den ADXL345 richtig. Beim MMA8451 sinds 14 bit.
Obwohl mir der Sensor nur hier nur 13bit signed ausgibt. Sprich -4095 bis 4095.. muss ich mir auch mal genauer anschauen :confused:
Also zwei signed int16 addiert wären im ungünstigen Fall, beide positiv oder beide negativ, schon Overflow.

Aber so schlimm ist es ja nicht, wenn wir die eingelesenen Werte ansehen. Die bleiben kleiner als abs(int).

Rechnen wir: 32767 / 50 = 655. So hohe Werte lese ich nicht aus meinem Sensor.
Unter +-300.
Also bleibe ich bei 50 summierten Werten und selbst bei 100 Werten unter int.

Der Mittelwert ist dann natürlich wieder unter abs(300) ;)

Aber Vorsicht ist natürlich immer gut, also Werte ansehen.
 

WalterH

Fördermitglied
Für den ADXL345 richtig. Beim MMA8451 sinds 14 bit.
Obwohl mir der Sensor nur hier nur 13bit signed ausgibt. Sprich -4095 bis 4095.. muss ich mir auch mal genauer anschauen :confused:

Bist Du schon beim MMA8451 ? So kommt es raus :-)
Erste Erfahrungen?
13bit sind ja OK für meine Anwendung.

Für größere Werte mal mehr als 1g versuchen. Kräftig aus dem Fenster werfen :D - aber gut auffangen :cool:
 

Source

User
Bist Du schon beim MMA8451 ? So kommt es raus :-)
Erste Erfahrungen?
13bit sind ja OK für meine Anwendung.

Für größere Werte mal mehr als 1g versuchen. Kräftig aus dem Fenster werfen :D - aber gut auffangen :cool:

Habs doch schon zugegeben das ich den ADXL verworfen hab und heimlich auf den MMA8451 gewechselt hab ;-)
Jetzt hast du mich aber erwischt... die Range sind ja 2g. Klar das da bei 1g Erdbeschleunigung nur die hälfte rauskommt *stirnklatsch*
Wird zeit für Feierabend ;-)

Ich hab die Library von Adafruit verwendet. Sieht bisher gut aus! Wenn das mit den Filtern sauber läuft, könnte aus den 10tel Grad was werden. Obwohl ich zu Temperaturdrift etc. noch nicht viel sagen kann. Absolute Winkel kommen da glaub nicht raus. Relativ könnte es klappen.

Gruß Max
 

kalle123

User
@Jeroen.

Hi, so ich hab mal angefangen.

Ein paar Gedanken zuerst:

- Ich hab diese beiden Units hier. Arduino pro mini mit LCD 1602 I2C und ADXL345

(Arduino und ADXL345 sind als 1 und 2 gekennzeichnet und gehören zusammen)

g2sl5yql.png


- Als Messstand nehme ich das hier. Tischplatte (eben) 0° und Winkel 30° und 45°
So habe ich eine einfache relativ präzise Winkelvorgabe, die schnell wieder herzustellen ist.

6AlkIlCl.png


- Software (sketch). Ich fange am Anfang an. Mit dem Programm von Stefan Pynappels.


Ich hab ja meine "Programmiererei" darauf aufgebaut.
Das Programm findet sich als Link in den Kommentaren zum Video ganz unten zum download.

An zwei Stellen hab ich das Programm für mich hier modifiziert.

#define I2C_ADDR 0x3F

und

soh = xg/zg;

Achtung! Das Programm hat KEINE Nullstellfunktion.

- Stromversorgung bei den Versuchen mit switching power supply 5V 2A.

1. Versuch (wie oben beschrieben): Auf-/Anlegen meines "Wäscheklammersensors" ;) in 0°, 30° und 45°.

Ablesung der Displayanzeige (Ja, ich weiß, dass Anlegen und Ablesen Schwachpunkte sind)

Eintrag in einer Auswertetabelle.

2X2B5q7l.png


2. Versuch. Wie Versuch 1, nur habe ich ins Programm meine Abgleichdaten (Kalibrierwerte) eingefügt.

sY6ciQGl.png


Ich versuch jetzt mal, die Tabelle zu erläutern.

Zahlenreihe von LINKS nach RECHTS:

Winkelvorgabe (0°,30°,45°), min. max. Anzeige LCD 1602 (- > down, + > up), Mittelwert Anzeige, IST (um Nullanzeige korrigierter Wer), Fehler Winkel in °, dann noch throw für 60 mm chord mit SOLL, IST und FEHLER in [mm]

So, jetzt könnte ich die Versuche 1 und 2 x-mal wiederholen, um (sicher vorhandene) Anlege- und/oder Ablesefehler versuchen, zu minimieren.

Weiterhin kann ich jetzt weitere Versuche mit dem Programmcode von mir (Nullstellung, 3-Achsen Auswertung, mit/ohne Dämpfung) fahren.

Ich sehe hier danach keine Fehler wie du im Bereich von 2mm. Fehler sind da, stammen wohl u.a. von den o.a. Schwachpunkten meines Versuchsaufbaus ...

Aber ich will hier eigentlich keine Ingenieurarbeit daraus machen.... :D

Grüße KH

Ach ja, 60° zusätzlich wären nicht schlecht, finde sicherlich noch ein Zeichendreieck. Und wenn jemand hier ankommt und ob der "perfekten" Ruderwegmessung. Einfach mal das "SUPERTEIL" an so ein Zeichendreieck Konglomerat dran halten :D
 

kalle123

User
Was mir bei meinem Versuch noch nicht so ganz gefällt, ist das Anlegen des ADXL 345 an die vorgegebenen Winkel (0°, 30°, 45° und ev. 60°).

Da könnte ich folgendes machen.

Po9PTUEl.png


Das wäre auf jeden Fall eine Verbesserung.

Und statt Versuch, min. und max. Werte vom LCD Display abzulesen, halt Ausgabe im Terminal. Dann xx Werte von da mit "copy and paste" und die Zahlen auswerten.

Gruß KH
 
Hallo Kalle,

Es sieht aus das wahrscheinlich meine ADXL nicht ganz toll sind.
Wo genau hast du deine ADXL bestellt? (Kaufe dann die Gleich).

Ich hatt gehofft dass du auch die Weg messen sollte.
Ich denke dass es einfacher war mit einem "Blockhaken" und mann kann auf mehrere Position messen.

Gruss
 

kalle123

User
Hallo Kalle,

Es sieht aus das wahrscheinlich meine ADXL nicht ganz toll sind.
Wo genau hast du deine ADXL bestellt? (Kaufe dann die Gleich).

Ich hatt gehofft dass du auch die Weg messen sollte.
Ich denke dass es einfacher war mit einem "Blockhaken" und mann kann auf mehrere Position messen.

Gruss

Was ist ein "Blockhaken" ??

Jeroen, ADXL345 und Arduino messen Winkel, nicht Weg! (Eigentlich "g", aber der Winkel leitet sich davon ab und der Weg leitet sich vom Winkel ab. Wenn ich Fehler suche, versuche ich, mir die Quelle, hier "g" anzuschauen. Das kann ich hier aber nicht. Also gehe ich an den nächsten Wert in der Kette. Und das ist der Winkel. Und ich fange sicher nicht "ganz hinten" mit dem Weg an.)

Der Weg ist "nur" eine Rechenfunktion Weg = sin(Winkel) * chord.

Also noch mal, warum soll ich den Weg messen? Da sehe ich auch zu viele Fehler beim Ablesen. Und ich kann keine 1/10 mm Weg ohne Fehler ablesen. Schon mm Werte "sauber" abzulesen, ist schwierig. Und ich will die ganzen weiteren Fehlermöglichkeiten (Servo, Gestänge, Ruderanscharnierung etc. raus haben!)

Und ich vertraue darauf, dass die trigonometrischen Funktionen "sauber" im Arduino Code implementiert sind. ;)

Ich hab höchstwahrscheinlich bei Aliexpress bestellt, aber das ist schon lange her und die alten Bestellungen lösche ich immer. Wenn dann da was per Post kommt, teste ich das Teil sofort. Wenn OK, lösche ich die Bestellung, wenn nicht OK, reklamiere ich.

Da sich hier anscheinend keiner an der Messerei beteiligen will und auch nicht mit diskutiert, werde ich noch etwas für mich selber messen.

Aber das war es denn ....

Gruß KH
 
Ansicht hell / dunkel umschalten
Oben Unten