Ruderweg Messung mit Arduino

Eckehard

User
Falsche Lib, richtige Lib, manchmal ein Durcheinander....

Falsche Lib, richtige Lib, manchmal ein Durcheinander....

Hallo,

Zum Thema Libraries und arduino IDE hatte ich hier schon einmal etwas geschrieben:
Generell gilt:
http://www.rc-network.de/forum/show...-mit-Arduino?p=4470268&viewfull=1#post4470268

Im speziellen Fall meiner RC-Meter*. ino Sketche gilt:
Ja, meine Version 5 verwendet eine spezielle ADXL Library (aus dem I2Cdev Projekt: https://www.i2cdevlib.com/)
Oder anders gesagt:
Ich verwende nicht die Sparkfun ADXL Library!

Grund: Die Verwendung von zwei ADXL Breakoutboards mit unterschiedlichen I2C Adressen ist nur mit der im I2Cdev Projekt mitgelieferten ADXL Library einfach möglich.

Das hatte ich aber bereits damals schon hier im Thread geschrieben.....

Und..... Wenn es bei den Libraries solche Spezialitäten gibt, macht es imho immer Sinn, diese zum Sketch mitzuliefern (= Paket, was alles enthält).
Ich habe mir angewöhnt, die Libs in das Sketch Verzeichnis zu legen:
Die "speziellen" Bibliotheken werden nicht über die IDE installiert, sondern im Sketchverzeichnis, also im gleichen Ordner wie das *.ino File abgelegt (hierher kopiert).
Diese "speziellen" Bibliotheken werden dann über "spezielleBibliothek.h" im Sketch/ino File eingebunden, wichtig sind hier die " " statt dem <>!

Viel Spaß beim programieren, und schnelles Fehler finden und fixen!

Eckehard
 

kalle123

User
Das sollte nicht tanzen ....


Ist zwar ein altes Video mit einer der ersten Versionen vom Programm.

Kommt das Tanzen jetzt vom Servo oder von der Elektronik? Wenn das Servo etwas tanzt, siehst du das natürlich auch in der Anzeige. Der Sensor misst nach dem Prinzip "Beschleunigung". Nach unten halt 9.81 m/s². Wenn in der Bewegung der Klappe Stösse, Sprünge, Zittern, Vibration drin ist, siehst du das natürlich in der Anzeige.

Wenn du den Sensor in die Hand nimmst und ruhig bewegst, siehst du auch das Tanzen?

cu KH
 

kalle123

User
Hallo Jeroen.

Habe folgendes gemacht.

1. Hab mal kurz mein Programm auf Winkelanzeige 1/10° umgestellt. Ich seh da Schwankungen von 2/10°.

2. Dann habe ich das Original Programm von Stefan Pynappels auf die Hardware geladen. Dort sehe ich ebenso diese 2/10° Schwankung.

Denke, man könnte das weg filtern, nur, ich brauche das eigentlich nicht .....

Gruß KH
 
Ruderwegmessung

Ruderwegmessung

Frage , kennt jemand den Hersteller / Lieferant von diesem Gerät ?


Gruß Manfred
 

Anhänge

  • 2017-05-19 06.31.48 Kopie.jpg
    2017-05-19 06.31.48 Kopie.jpg
    56,5 KB · Aufrufe: 152
Heute mail ein richtige Version gebaut, mit die Hoffnung das es besser geht.
Die Testeinrichtung :
opst (Large).JPG

Die Ergebnisse :
IMG_0812 (Large).JPG

IMG_0813 (Large).JPG

IMG_0816 (Large).JPG

IMG_0817 (Large).JPG

IMG_0818 (Large).JPG

IMG_0819 (Large).JPG

Das Program ist nur ein klein bischen modificieert.
Nur die data die nach das LCD gehen sind angepasst.
Die gemessene Data von Offset und Gain sind im Program eingetragen.
Ich hatte noch ein Flache liegen von ein Calypo Cabro ohne Servo's. (so kein Einfluss davon)
Die Ergebnisse sind nicht ganz toll.
Kann jemand sachen ob ich etwas falsch mache?
Hat jemand mal wirklich das Unterscheid gemessen zwischen Display versus mit ein Lineal?

(entschuldige fur die Bilder)

Gruss
 

kalle123

User
Jeroen, ich hatte oben schon was geschrieben. 0.2° Unruhe bei mir hier.

Ich schau mir mal nur den Winkel an, nicht den throw.

Ich hab meine beiden ADXL345 mit nem Testprogramm laufen lasse.

Hier das Ergebnis:

Accelerometer Test

------------------------------------
Sensor: ADXL345
Driver Ver: 1
Unique ID: 12345
Max Value: -156.91 m/s^2
Min Value: 156.91 m/s^2
Resolution: 0.04 m/s^2
------------------------------------

Data Rate: 100 Hz
Range: +/- 2 g

X: -0.35 Y: 0.20 Z: 8.94 m/s^2
X: -0.35 Y: 0.24 Z: 8.87 m/s^2
X: -0.35 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.94 m/s^2
X: -0.35 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.24 Z: 8.90 m/s^2
X: -0.31 Y: 0.24 Z: 8.90 m/s^2
X: -0.35 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.24 Z: 8.87 m/s^2
X: -0.31 Y: 0.20 Z: 8.94 m/s^2
X: -0.35 Y: 0.20 Z: 8.87 m/s^2
X: -0.27 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.87 m/s^2
X: -0.31 Y: 0.20 Z: 8.83 m/s^2
X: -0.31 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.87 m/s^2
X: -0.35 Y: 0.24 Z: 8.90 m/s^2
X: -0.31 Y: 0.20 Z: 8.94 m/s^2


Accelerometer Test

------------------------------------
Sensor: ADXL345
Driver Ver: 1
Unique ID: 12345
Max Value: -156.91 m/s^2
Min Value: 156.91 m/s^2
Resolution: 0.04 m/s^2
------------------------------------

Data Rate: 100 Hz
Range: +/- 2 g

X: -0.08 Y: 0.20 Z: 8.75 m/s^2
X: -0.08 Y: 0.08 Z: 8.67 m/s^2
X: -0.08 Y: 0.16 Z: 8.71 m/s^2
X: -0.12 Y: 0.12 Z: 8.75 m/s^2
X: -0.12 Y: 0.12 Z: 8.67 m/s^2
X: -0.12 Y: 0.12 Z: 8.67 m/s^2
X: -0.12 Y: 0.12 Z: 8.67 m/s^2
X: -0.12 Y: 0.12 Z: 8.67 m/s^2
X: -0.08 Y: 0.08 Z: 8.63 m/s^2
X: -0.04 Y: 0.12 Z: 8.71 m/s^2
X: -0.12 Y: 0.12 Z: 8.67 m/s^2
X: -0.16 Y: 0.08 Z: 8.71 m/s^2
X: -0.12 Y: 0.08 Z: 8.71 m/s^2
X: -0.12 Y: 0.12 Z: 8.71 m/s^2
X: -0.12 Y: 0.16 Z: 8.75 m/s^2
X: -0.08 Y: 0.12 Z: 8.71 m/s^2
X: -0.12 Y: 0.12 Z: 8.71 m/s^2
X: -0.12 Y: 0.08 Z: 8.67 m/s^2
X: -0.08 Y: 0.12 Z: 8.67 m/s^2
X: -0.12 Y: 0.12 Z: 8.71 m/s^2
X: -0.16 Y: 0.12 Z: 8.67 m/s^2

Auflösung 0.04 m/s² ... und mit dem +/- Wert "wackeln" die Signale hier. Also erst mal OK.

Dann hab ich etwas im Internet gesucht ;)

Schau z. B. mal --->


Ich werde hier mal eine einfache Filterung ins Programm rein setzen ....

Und werfe mal einen Blick hier rein

www.analog.com/media/en/technical...notes/AN-1057.pdf

insbesondere zu "Calculated Angle Error" ;)

cu KH
 
Hallo Kalle,

Hat das Unterschied im Weg mit Filterung zu tun?
Ich bewege mit mein Hand die Klappe in ein andere Position und warte ruhig ab was passiert.
Nach 10 Seconden sollte doch die richtige werte da sein....


Deine link www.analog.com/media/en/technical...notes/AN-1057.pdf funktionieert bei mir nicht.

Ich habe noch eine andere Frage.
Kannst du bitte mal dem Weg messen bei deine Flieger (mit lineal und arduino)
Hast du dann kein ungenauigkeit?

Morgen versuche ich auch mal das testprogram.

GRuss
 

kalle123

User
Hat das Unterschied im Weg mit Filterung zu tun?

Du hast mal was von TANZEN gesagt ....

Ich bewege mit mein Hand die Klappe in ein andere Position und warte ruhig ab was passiert.
Nach 10 Seconden sollte doch die richtige werte da sein....

Ja, ich kenne DAS Problem hier nicht!!


Anhang anzeigen AN-1057.pdf

Ich habe noch eine andere Frage.
Kannst du bitte mal dem Weg messen bei deine Flieger (mit lineal und arduino)
Hast du dann kein ungenauigkeit?

Noch mal. Ich und auch Eckehard haben DAS Problem nicht! Ich werde DAS jetzt auch nicht machen.
Ich kümmere mich jetzt um das leichte Tanzen und werde etwas Filterung ins Programm packen.

Wozu soll ich den Weg messen?? Ich schau mir NUR den Winkel an. Der Weg ist nur ein vom Winkel abgeleiteter Wert. Wenn der Winkel in Ordnung ist, ist der Weg auch in Ordnung!

Mach mal den Test der ADXL345 wie ich den gepostet hab. Die Werte der X,Y und Z Achsen sind OHNE! Abgleich.

Guten Abend - KH
 
Hall Kalle,

kalle123
Hat das Unterschied im Weg mit Filterung zu tun?
Du hast mal was von TANZEN gesagt ....
Das Stimmt, ich hatte 2 Problemen.
Das Tanzen und die Ungenauigkeit.
Um das Tanzen auszuschliessen habe ich ein Flache benutzt ohne Servo's.
Das gabt mir die Bestatigung dass ich irgenwo ein ziemlich gross ungenauigkeit habe. Wo ? noch keine Ahnung.
(1 grad Abweichung is bei eine lange von 54 mm doch 0.94mm)

Kalle Ich kümmere mich jetzt um das leichte Tanzen und werde etwas Filterung ins Programm packen.
Wirklich SUPER das du das versuchst! ( dein Link sieht gut aus!)

Kalle Wozu soll ich den Weg messen?? Ich schau mir NUR den Winkel an. Der Weg ist nur ein vom Winkel abgeleiteter Wert. Wenn der Winkel in Ordnung ist, ist der Weg auch in Ordnung!
Wahrscheinlich war ich nicht deutlich.
Das Idee hinter meine Frage war ob jemand gepruft hat ob was im Display steht auch wirklich stimmt wenn du ein Linial benutzt. (Nur Bestatigung von die Genauigkeit)
Ein Winkel genau messen is schweriger dann die "Throw".

Kalle Mach mal den Test der ADXL345 wie ich den gepostet hab. Die Werte der X,Y und Z Achsen sind OHNE! Abgleich.
Das mache ich und ich habe noch ein Sensor so mal sehen was die Auskunft ist .

Gruss,


PS . wenn es gut funktionieert baue ich noch 3 Stuck
 

kalle123

User
Hi Jeroen.

Einige Bemerkungen noch:

- Gyros driften, Acc "tanzen". Und ich kümmere mich jetzt ums "Tanzen". ;)

- Schau auch mal in die Beschreibung des Sensors -> Anhang anzeigen ADXL345.pdf
Wenn der Sensor in Ordnung ist (Testprogramm!!), schau ich mir NUR DEN WINKEL AN!
Und ich sag es noch mal. Schau dir in den PDFs "Calculated Angle Error" und "Resolution" an!!

- Wenn ich mir die Videos (z.B. Aaro) im Netz anschaue. Auch da wird wahrscheinlich der ADXL 345 zum Einsatz kommen.
Und auch da gilt "Calculated Angle Error" und "Resolution" ... Aber man kann viel mit Filtering machen, wenn man das braucht.
Ich brauche hier kein Filtering, habe aber gestern viel im Internet dazu gelesen und werde mich da mal daran versuchen, weil mich das interessiert.

- Jeroen, wird haben hier fast 300 posts im thread. Und nur du hast anscheinend diese Probleme. Eckehard meldet sich schon nicht mehr auf deine posts. Du postest Bilder und ich verstehe nicht, was die sagen sollen. Welche Programme du verwendest und was für Komponenten du da benutzt, ich weiss es nicht. Und ob du noch 3 oder 300 davon bauen willst, interessiert mich nicht! :D

Du kannst auch in Englisch oder Niederländisch schreiben, wenn du Probleme mit Deutsch hast, kein Problem - Gruß KH
 

kalle123

User
So, ich hab mal eine Filterung mit rein gepackt. Springerei (Tanzen) ;) ist weg. Aber es bedingt auch eine leichte Trägheit.

Filter in Zusammenhang mit dem ADXL 345 scheint ja nicht ganz ungewöhnlich zu sein, wenn ich z.B. bei google mit den Begriffen rein schaue.

https://www.google.de/search?source=hp&ei=L82TWoScOMO2kwWKn7eICQ&q=adxl345+filtering&oq=adxl+345+filter&gs_l=psy-ab.1.1.0i19k1j0i13i30i19k1j0i8i13i30i19k1l6.1838.9659.0.13591.17.16.0.0.0.0.92.1275.15.16.0....0...1c.1.64.psy-ab..1.15.1270.0..0j0i131k1j0i10k1j0i22i10i30k1j0i13i30k1j0i8i13i30k1.66.Zy-KjLt2eQI

Hab mir Aaros Video noch mal angeschaut und so bis 2:30 sieht man auch da eine deutliche Verzögerung, nur ab da dreht die Abspielgeschwindigkeit halt auf schnell und das fällt nicht mehr auf.

Gruß KH
 

Eckehard

User
Hallo Kalle,

ahh, da probiert einmal jemand etwas Neues... Fein...

Ich würde mich freuen, wenn Du Deine neue Version (inkl. Filterung) hier veröffentlichen würdest, dann lern zumindestens ich auch etwas Neues.... zum Thema Filtering...
(Ich wünschte, ich hätte mehr Zeit....)

Danke...

Eckehard
 

Eckehard

User
Hi Jeoren,

ich denke, Du bist jetzt richtig ins Arduino Thema eingetaucht....

Ich sehe da verschiedene Boards, Aufbauten mit 20x4 und 16x2 LCD.... Abgleich Protokolle... Bilder... vielfältige Probleme....
Ich habe da im Momment keinen Überblick, welches Problem Du mit welchem Sketch hast...

Zeigen Deine Bilder Werte als Ausschläge oder Sekanten als Ergebnis an? ... Dein Referenz Messgerät zeigt ja Ergebnis als Ausschlag, oder? Misst/zeigt der Sketch vielleicht Sekante /an?

Fragen.... über Fragen... Fass mal Deinen Stand zusammen, vielleicht kann man dann gezielt zusammen ein Problem nach dem anderen lösen...
Ich habe hier ja wie bekannt ist eine KeypadShield-UNOR3-2x-ADXL345 Aufbau, die ich testweise auch mit einem fremden Sketch gegentesten könnte/würde.... (siehe mein Angebot weiter oben....)

grübelnde Grüße
Eckehard
 

kalle123

User
Hallo Eckehard.

Ich als Laie hab mir da was angetan. ;) Hab gestern den halben Tag im Netz rum gelesen und schließlich den (für mich einfach nach vollziehbaren) Ansatz gefunden.

Bildschirmfoto_2018-02-25_18-04-42.png

Den genauen Link hab ich momentan nicht, ist aber aus dem Arduino Forum.

Hab die 3 zusätzlichen Zeilen hier in meinen Code eingefügt ...

calc = xg / sqrt ((sq(yg) + sq(zg))); //sensor orientation!
tilt = atan(calc) * 57.296;

tiltfiltered = tilt * 0.5 + value01 * 0.3 + value02 * 0.2;
value02 = value01;
value01 = tiltfiltered;

angle = int(tiltfiltered) * -1; //sensor orientation!

Funktioniert und die Anzeige wird ruhig. Aber Eckehard, mir wird das Darstellungsverhalten damit einfach zu träge.

Man müsste vielleicht auf nen STM32 gehen ....

Hab ja die zwei separaten Einheiten und einen mit, eine ohne nebeneinander gefahren. Ich brauch das einfach nicht. Ich brauch auch die 1/10° bzw. mm nicht.

Was mich nur momentan etwas frustriert, sind die Probleme, die Jeroen hier versucht, darzustellen. Ich weiss nicht, wie ich da helfen kann. Ich hab aber auch nicht die Kapazität, hier einen hochpräzisen Messstand im 1/10 Bereich aufzubauen. Aber ich hab auch keine Probleme mit den Dingern hier. Vielleicht "faked chips"??

Noch was. Bei Aaros Ansatz in rcgroups im Video sieht du auch, dass er mit Filter arbeitet. Nur dann wird das Video "speed up" dargestellt, um man merkt es nicht.

Grüße KH

PS. Seh gerade, du hast Jeroen auch gerade geschrieben. Vielleicht kriegen wird das ja doch noch hin.

Aber interessant wäre, was Jeroen da jetzt alles hat. Wieviele ADXL 345, alle aus einer Quelle. Alle mit dem Verhalten. Wie sieht die Verkabelung aus. Störeinflüsse etc .....
 

WalterH

Fördermitglied
Average

Average

Ich ermittle ganz brute force einen Mittelwert über die gelesenen x,y,z Werte.
Ich werte aber nur X,Y aus.
Mit Mittelwerten von 20 bis 50 bekomme ich Abweichungen der Winkel über die Zeit von 0,1° bis 0,2°.
Ich lese die Werte mit einem delay von 20 ein. Letzteres werde ich erst mit den endgültigen Kabeln optimieren.
Das gibt für mich angenehme Updates des Displays.
Nicht zu nervös und man muss nicht lange warten.

Ist vielleicht ein Startpunkt für einige.

Ich muss mich aber noch in die DOC des Sensors einlesen.
Und kalibriert hab ich auch noch nicht. Das kommt danach.
Eh ich das nicht gemacht habe schreibe ich keine zusätzlichen Details. :)

Aber vielleicht hilft das hier schon.
 
Heuteabend wieder weiter gemacht.
Das Idee von Kalle um dass Tanzen zu vermindern habe ich eingetragen.
Ich habe auch ein andere Sensor genommen, gleiche type ADXL345 und die Ergebnisse waren etwas besser.
Die Nul Stellung ist wirklich top! Nach jedem bewegung kommt die wieder in die Nul-position im display zuruck.
(die Bewegung wird noch mit der Hand gemacht so da ist noch kein Tanzen drin, kommt noch ;-) ).

Mit ein Linial vergleiche ich die Werte mit dem Dislplay.
Durch ein bischen mit dem Gain zu spielen in X-richtung habe ich versucht es noch zu verbesseren.

Nachste schritt wird mit Sender.......

Hardware :
Atmega328 Nano V3.0 CH340G
software Arduino 1.8.5
1* Sensor ADXL345 aus China.
%v aus dem Laptop

IMG_0827.JPG


Weil ich nur in "throw" oder Weg interessiert bin, habe ich die Secant weg ge // ..
Code:
/*
  .........................................................................................
  ................... based and inspired on a video by Stefan Pynappels ...................
  ................... https://www.youtube.com/watch?v=FW8ivDylOr8 .........................
  .........................................................................................

  Measuring princible - gravity with 3 axis accelerometer ADXL345

  For further information
  
  http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf
  http://www.analog.com/media/en/technical-documentation/application-notes/AN-1057.pdf 
   
  Hardware: ADXL 345, LCD 1602 with I2C interface, ARDUINO pro mini

  Wiring: ADXL 345 and LCD 1602 with I2C -> Arduino SDA and SCL, buttons to 
  Arduino D2, D3 and D4, jumper to D5
  
  See https://www.arduino.cc/en/tutorial/button for wiring circuit
  
  Added:

  2017.05.20
  
  Sensor calibration, button decrease chord, using all 3 sensor axis, 
  throw or secant measurement (throw measurement common with model aircraft,
  secant measurement sometimes in "real" aircraft)
*/

/*******************************************************************************************/

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <ADXL345.h>

// LiquidCrystal_I2C  lcd(0x3F, 2, 1, 0, 4, 5, 6, 7); // PCF8754 - 0x27, PCF8754A - 0x3F !
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // ich habe nur ein 20*4 mit adress 0x27


ADXL345 adxl;                   // variable adxl is an instance of the ADXL345 library

const int buttonPin1 = 2;       // Zero angle and throw/secant values
int buttonState1 = 0;           // variable for reading the pushbutton status
const int buttonPin2 = 3;       // Chord depth increase [1 mm step]
int buttonState2 = 0;           // variable for reading the pushbutton status
const int buttonPin3 = 4;       // Chord depth decrease [1 mm step]
int buttonState3 = 0;           // variable for reading the pushbutton status

const int jumper = 5;           // Throw or secant measurement (Jumper OPEN -> throw)
// int jumperState = 0;            // variable for reading the jumper status (SET -> secant) will not be used

int count = 67;                  // Start chord depth [mm]

int x, y, z;	                  // raw values from sensor (-255 ... 0 ... +255)
int x1, y1, z1;
int x2, y2, z2;
int x3, y3, z3;
int angle;
int up;                         // 1 -> up, 2 -> down
int relative;                   // for zeroing
float rad;
float xg, yg, zg;               // g values
float calc;
float tilt;


/************************************ DEFINED VARIABLES ************************************/
/************************************ SENSORCALIBRATION ************************************/
//sensor 1
//#define offsetX   5       // OFFSET values
//#define offsetY   -10     // replace "0" with calculated value after sensor calibration
//#define offsetZ   25

//#define gainX     1.031   // GAIN factors
//#define gainY     1.035   // replace "1" with calculated value after sensor calibration
//#define gainZ     1.011

//sensor 2
#define offsetX   -10       // OFFSET values
#define offsetY   0     // replace "0" with calculated value after sensor calibration
#define offsetZ   -45

#define gainX     0.895   // GAIN factors
#define gainY     1.012   // replace "1" with calculated value after sensor calibration
#define gainZ     0.976

/************************************ Grapics for display **********************************/

uint8_t degree[8]  = {140, 146, 146, 140, 128, 128, 128, 128};      // °
uint8_t arrowup[8]  = {132, 142, 132, 132, 132, 128, 128, 128};     // Arrow up
uint8_t arrowdown[8]  = {128, 128, 128, 132, 132, 132, 142, 132,};  // Arrow down

/*******************************************************************************************/

void setup() {

  lcd.begin (16,2);            // for 16 x 2 LCD module
  lcd.setBacklight(HIGH);

  lcd.createChar(0, degree);
  lcd.createChar(1, arrowup);
  lcd.createChar(2, arrowdown);

  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(jumper, INPUT);

  adxl.powerOn();

/*******************************************************************************************/
// START SCREEN
/*******************************************************************************************/

  lcd.home ();
  lcd.print("RC - METER");
  lcd.setCursor(0,1);
  lcd.print("  by Kallecke");
  delay(2000);

  lcd.clear ();
  lcd.print("ZERO SET");
  lcd.setCursor (0, 1);
  lcd.write(byte(2));
  delay(1000);

  lcd.clear ();
  lcd.print("CORD depth[mm]");
  lcd.setCursor (7, 1);
  lcd.write(byte(1)); lcd.setCursor (11, 1); lcd.write(byte(2));
  delay(1000);
  lcd.clear();
}

/*******************************************************************************************/

void loop() {
  // read the state of the pushbutton/jumper value:

  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  // jumperState  = digitalRead(jumper);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:

  if (buttonState1 == HIGH) {
    relative = angle;
  }

  else if (buttonState2 == HIGH) {
    count = count + 1;
    lcd.setCursor (0, 0);           // go to start of 1st line
    //lcd.clear();
    lcd.print("CHORD DEPTH:"); lcd.print(count); lcd.print("mm");
  }

  else if ((buttonState3 == HIGH) && (count > 1)) {
    count = count - 1;
    lcd.setCursor (0, 0);           // go to start of 1st line
    //lcd.clear();
    lcd.print("CHORD DEPTH:"); lcd.print(count); lcd.print("mm");
  }


//filtering by Kalles Research
  adxl.readAccel(&x, &y, &z); // read the accelerometer values and store them in variables
  x1=x;
  y1=y;
  z1=z;
  adxl.readAccel(&x, &y, &z); // read the accelerometer values and store them in variables
  x2=x;
  y2=y;
  z2=z;
  adxl.readAccel(&x, &y, &z); // read the accelerometer values and store them in variables
  x3=x;
  y3=y;
  z3=z;
  x=(x3*0.50)+(x2*0.3)+(x1*0.2);
  y=(y3*0.50)+(y2*0.3)+(y1*0.2);
  z=(z3*0.50)+(z2*0.3)+(z1*0.2);

//calculation
  adxl.readAccel(&x, &y, &z); // read the accelerometer values and store them in variables
  xg = 0.00385 * (x - offsetX) / gainX; // 0.00385 to convert the raw data to Gs
  yg = 0.00385 * (y - offsetY) / gainY; // offset and gain for calibration
  zg = 0.00385 * (z - offsetZ) / gainZ;

  calc = xg / sqrt ((sq(yg) + sq(zg)));	//sensor orientation!
  tilt = atan(calc) * 57.296;
  angle = int(tilt) * -1;               //sensor orientation!

  lcd.clear();
  lcd.setCursor (0, 2);         // go to start of 1st line

  if ((angle - relative) > 0) {
    up = 1;                     //arrow ↑↑↑
  }
  else {
    up = 2;                     //arrow ↓↓↓
  }

/*******************************************************************************************/
  
  //if ((angle - relative) == 0) {
  //  lcd.print("ANGLE:"); lcd.print(abs(angle - relative)); lcd.write(byte(0));
  //}
  //else {
  //  lcd.print("ANGLE:"); lcd.print(abs(angle - relative)); lcd.write(byte(0)); 
  //  lcd.write(byte(up));
  //}
  lcd.setCursor (0, 0);
  rad = abs(angle - relative) * 0.017453;
  
  // read the state of the jumper value:
  // ich brauche kein secant
  // if (jumperState == HIGH) {
  //  lcd.print("SECANT:"); lcd.print(int(2 * count * sin(rad / 2))); lcd.print(" mm"); 
  //   lcd.print(" ("); lcd.print(count); lcd.print(")");
  // }
  // else {
  // on LCD
    lcd.print("Weg : "); lcd.print(int(count * sin(rad))); 
    lcd.setCursor(8,0);
    lcd.print(" mm "); 
    lcd.setCursor (12,0);
    lcd.write(byte(up));
    lcd.setCursor (0,1);
    lcd.print("Breedte : "); lcd.print(count); lcd.print(" mm");
  //}
  delay(300);

Ich hoffe dass es so etwas deutlicher ist ;-)
 

whity

User
Bei meinem RC-Meter hatte ich mit einer Spannungsversorgung über die USB-Buchse ein stärkeres "pendeln" der Werte.
Nachdem ich bei meinem Arduino Uno die Rundbuchse mit einem 3s Lipo versorge, ist die Anzeige deutlich ruhiger geworden!

Deshalb habe ich die Idee mit der Spannungsversorgung über eine USB Powerbank verworfen.
Vielleicht mal ausprobieren.....

Grüße
Dirk
 

kalle123

User
Hallo Jeroen.

Ich frage noch mal.

Wieviele ADXL 345, alle aus einer Quelle. Alle mit dem Verhalten. Wie sieht die Verkabelung aus. Störeinflüsse etc .....

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

So sehen die beiden Elektroniken bei mir aus.

Ist halt gebastelt ;)

o3fl3Xzl.png


Unten sind die 3 Taster für Null, + und - und an der linken Seite , um den "chord" Wert ins eeprom zu schreiben. Daher auch die Pfeile beim Startbildschirm, damit ich weiss, wo ich drücken muss :D

Klar, Jeroen, lass die Sache mit sekant raus. DAS war eine ganz andere Geschichte .... Aber ich hab den Jumper halt mit drauf.

Ich setzte jetzt mal meine letzte Version hier rein. Da ist also der Filter und eeprom mit drin.

Jeroen, wenn du 1/10 sehen willst, einfach die entsprechenden Werte von int -> float ändern und formatiert (eine Nachkommastelle) ausgeben.

/*
.........................................................................................
................... based and inspired on a video by Stefan Pynappels ...................
................... https://www.youtube.com/watch?v=FW8ivDylOr8 .........................
.........................................................................................

Measuring principle - gravity with 3 axis accelerometer ADXL345

For further information

http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf
http://www.analog.com/media/en/technical-documentation/application-notes/AN-1057.pdf

Hardware: ADXL 345, LCD 1602 with I2C interface, ARDUINO pro mini

Wiring: ADXL 345 and LCD 1602 with I2C -> Arduino SDA and SCL, buttons to
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


See https://www.arduino.cc/en/tutorial/button for wiring circuit

Added chord depth save to eeprom! LED on 13 BLINK 500ms

*/

/*******************************************************************************************/

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <ADXL345.h>

#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7); // PCF8754 - 0x27, PCF8754A - 0x3F !

ADXL345 adxl; // variable adxl is an instance of the ADXL345 library

/************************************ DEFINED VARIABLES ************************************/

int count; // chord depth [mm]
int countnew;

int x, y, z; // raw values from sensor (-255 ... 0 ... +255)
int angle;
int arrow; // 1 -> up, 2 -> down
int relative; // for zeroing
float rad;
float xg, yg, zg; // g values
float calc;
float tilt;
float tiltfiltered;

float value01 = 0.0;
float value02 = 0.0;

int led = 13; // signal eeprom write

/************************************ SENSOR CALIBRATION ***********************************/
/*
#define offsetX -7.0 // OFFSET values SENSOR #1 CALIBRATION
#define offsetY 4.0 // replace "0" with calculated value after sensor calibration
#define offsetZ -20.0

#define gainX 1.051 // GAIN factors
#define gainY 1.074 // replace "1" with calculated value after sensor calibration
#define gainZ 0.976
*/

#define offsetX -4.5 // OFFSET values SENSOR #2 CALIBRATION
#define offsetY 0.5 // replace "0" with calculated value after sensor calibration
#define offsetZ -27.5

#define gainX 1.049 // GAIN factors
#define gainY 1.065 // replace "1" with calculated value after sensor calibration
#define gainZ 0.990

/************************************ Graphics for display **********************************/

uint8_t degree[8] = {140, 146, 146, 140, 128, 128, 128, 128}; // °
uint8_t arrowup[8] = {132, 142, 132, 132, 132, 128, 128, 128}; // Arrow up
uint8_t arrowdown[8] = {128, 128, 128, 132, 132, 132, 142, 132,}; // Arrow down
uint8_t arrowleft[8] = {128, 128, 136, 159, 136, 128, 128, 128,}; // Arrow left

// 128 is empty line, then add 16,8,4,2,1 to fill pixel. example 00x00 > 132, 0x0x0 > 138

/*******************************************************************************************/

void setup() {

lcd.begin (16, 2); // for 16 x 2 LCD module
lcd.setBacklightPin(3, POSITIVE);
lcd.setBacklight(HIGH);

lcd.createChar(0, degree);
lcd.createChar(1, arrowup);
lcd.createChar(2, arrowdown);
lcd.createChar(3, arrowleft);

adxl.powerOn();

/*******************************************************************************************/
// START SCREEN
/*******************************************************************************************/

lcd.home ();
lcd.print("RC - METER");
lcd.setCursor (0, 1);
lcd.print("ANGLE AND THROW");
delay(3000);

lcd.clear ();
lcd.print("RC - METER");
lcd.setCursor (0, 1);
lcd.print(" >> OR <<");
delay(3000);

lcd.clear ();
lcd.print("RC - METER");
lcd.setCursor (0, 1);
lcd.print("ANGLE AND SECANT");
delay(3000);

lcd.clear ();
lcd.print("ZERO SET");
lcd.setCursor (0, 1);
lcd.write(byte(2));
delay(2000);

lcd.clear ();
lcd.print("CORD depth[mm]");
lcd.setCursor (5, 1);
lcd.write(byte(1)); lcd.setCursor (7, 1); lcd.write(byte(2));
delay(2000);

lcd.clear ();
lcd.print("CORD to eeprom");
lcd.setCursor (0, 1);
lcd.write(byte(3)); lcd.write(byte(3)); lcd.print(" ....to save!");
delay(2000);

/*******************************************************************************************/

count = EEPROM.read(0); // read previous cord depth from eeprom
countnew = count;

}

/*******************************************************************************************/

void loop() {

if (digitalRead(2) == HIGH) { // zero setting
relative = angle;
}

if (digitalRead(6) == HIGH) { // chord depth -> eeprom
eepromsave ();
}

while (digitalRead(3) == HIGH) { // increase chord depth
increase ();
}

while (digitalRead(4) == HIGH && countnew > 1) { // decrease chord depth
decrease ();
}

adxl.readAccel(&x, &y, &z); // read the accelerometer values and store them in variables
xg = 0.00385 * (x - offsetX) / gainX; // 0.00385 to convert the raw data to Gs
yg = 0.00385 * (y - offsetY) / gainY; // offset and gain for calibration
zg = 0.00385 * (z - offsetZ) / gainZ;

calc = xg / sqrt ((sq(yg) + sq(zg))); //sensor orientation!
tilt = atan(calc) * 57.296;

tiltfiltered = tilt * 0.5 + value01 * 0.3 + value02 * 0.2; // see http://forum.arduino.cc/index.php?topic=184067.0
value02 = value01;
value01 = tiltfiltered;

angle = int(tiltfiltered) * -1; //sensor orientation!

lcd.setCursor (0, 0); // go to start of 1st line
lcd.clear();
if ((angle - relative) > 0) {
arrow = 1; //arrow ↑↑↑
}
else {
arrow = 2; //arrow ↓↓↓
}

/*******************************************************************************************/

if ((angle - relative) == 0) {
lcd.print("ANGLE:"); lcd.print(abs(angle - relative)); lcd.write(byte(0));
}
else {
lcd.print("ANGLE:"); lcd.print(abs(angle - relative)); lcd.write(byte(0));
lcd.write(byte(arrow));
}
lcd.setCursor (0, 1);
rad = abs(angle - relative) * 0.017453;

// read the state of the jumper value:

if (digitalRead(5) == HIGH) {
lcd.print("SECANT:"); lcd.print(int(2 * countnew * sin(rad / 2))); lcd.print("mm");
lcd.print(" ("); lcd.print(countnew); lcd.print(")");
}
else {
lcd.print("THROW:"); lcd.print(int(countnew * sin(rad))); lcd.print("mm"); lcd.print(" (");
lcd.print(countnew); lcd.print(")");
}
delay(300);
}

/*******************************************************************************************/

void increase () {
countnew = countnew + 1;
lcd.setCursor (0, 1);
lcd.print("CORD depth:"); lcd.print(countnew); lcd.print("mm");
delay(250);
}

void decrease () {
countnew = countnew - 1;
lcd.setCursor (0, 1);
lcd.print("CORD depth:"); lcd.print(countnew); lcd.print("mm");
delay(250);
}

void eepromsave () {
if (count != countnew) {
count = countnew; // reset value chord depth
EEPROM.write(0, count);
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500);
digitalWrite(led, LOW); // turn the LED on (HIGH is the voltage level)
}
}

ACHTUNG! DA SIND MEINE ABGLEICHWERTE DRIN!!


KH

PS. Zur Stromversorgung. Hab gerade mal hier gemessen. Ich nehm die 4 x Eneloops Packs.

Unbelasteter Pack 5.06V. 2 Arduino pro minis, 2 ADXL und 2 LCD1602 mit I2C angeschlossen direkt an Vcc (nicht RAW) 4.96V gemessen. Das Ganze zieht 100 mA. Ja Eckehard, ich weiss, wir haben da eine unterschiedliche Meinung zu ... ;)
 
Ansicht hell / dunkel umschalten
Oben Unten