Ruderweg Messung mit Arduino

jweber

User
Hallo Steffen,

du meinst aber nicht Eckehard´s Sketch "RC_ANGLE_THROW_KeypadShield_5". Mit dem komme ich klar.
Ich habe schon den Klotz flach auf den Tisch gelegt und dann genullt.

Was ich gerade nicht hinbekomme, ich der Abgleich der ADXL345. Dazu muss ich hier:
/************************************ SENSORCALIBRATION ************************************/
#define offsetX1 0 // OFFSET values
#define offsetY1 0 // replace "0" with calculated value after sensor calibration
#define offsetZ1 0
#define offsetX2 0 // OFFSET values
#define offsetY2 0 // replace "0" with calculated value after sensor calibration
#define offsetZ2 0

#define gainX1 1 // GAIN factors
#define gainY1 1 // replace "1" with calculated value after sensor calibration
#define gainZ1 1
#define gainX2 1 // GAIN factors
#define gainY2 1 // replace "1" with calculated value after sensor calibration
#define gainZ2 1
in Eckehard´s Sketch die Offset und Gainwerte für jede Richtung einsetzten. So weit, so klar, nur bekomme ich den sketch zum Auslesen der Werte nicht drauf.

Ich befürchte, dazu muss ich alles nochmal auseinanderlöten und suche Support.

Oder welchen Sketch meintest Du?
Viele Grüße
Jörn
 

kalle123

User
Ich hatte auf #117 mal was zum Sensorabgleich geschrieben.

Stammt hier her.

https://learn.sparkfun.com/tutorials/adxl345-hookup-guide/all

Abschnitt: Calibration Example Sketch

Ich hab das so gemacht (1 Sensor, 1 Arduino, 1 Anzeige). Abgleichsketch aufgespielt und wie in #117 gemacht. Werte bestimmt und in den eigentlichen Messsketch eingetragen. Feddig!

Aber wie das bei Eckehards Version geht? Müsste mich da erst mal in seinen sketch wieder einlesen .....

cu KH
 

jweber

User
Hallo Kalle,
es hat geklappt....

1. Sensoren einzeln vermessen!
2. Die Brücke für die andere Adresse rausnehmen
3. Die lib von Eckehard möchte gerne ein "Wire.begin();" nach void setup haben, sonst fängt sie gar nicht an, auszulesen

Jetzt habe ich die Tabelle wie in Post 117 und kann anfangen zu rechnen. Die Werte für Offset und Gain müssen in Eckehards Sketch an der Stelle rein, die ich oben gezeigt habe.

Viele Grüße
Jörn
 

jweber

User
Falls noch jemand das Problem hat:
// Refer to SparkFun ADXL345 Hook Up Guide: https://learn.sparkfun.com/tutorials/adxl345-hookup-guide

#include <ADXL345.h>

/*********** COMMUNICATION SELECTION ***********/
/* Comment Out The One You Are Not Using */
//ADXL345 adxl = ADXL345(10); // Use when you want to use Hardware SPI, ADXL345(CS_PIN);
ADXL345 adxl = ADXL345(); // Use when you need I2C

/****************** VARIABLES ******************/
/* */
int AccelMinX = 0;
int AccelMaxX = 0;
int AccelMinY = 0;
int AccelMaxY = 0;
int AccelMinZ = 0;
int AccelMaxZ = 0;

int accX = 0;
int accY = 0;
int accZ = 0;

int pitch = 0;
int roll = 0;

/************** DEFINED VARIABLES **************/
/* */
#define offsetX 0 // OFFSET values
#define offsetY 0
#define offsetZ 0

#define gainX 1 // GAIN factors
#define gainY 1
#define gainZ 1

/******************** SETUP ********************/
/* Configure ADXL345 Settings */
void setup()
{
Wire.begin();
Serial.begin(9600); // Start the serial terminal
Serial.println("SparkFun ADXL345 Accelerometer Breakout Calibration");
Serial.println();

adxl.initialize(); // Power on the ADXL345

//adxl.setRangeSetting(2); // Give the range settings
// Accepted values are 2g, 4g, 8g or 16g
// Higher Values = Wider Measurement Range
// Lower Values = Greater Sensitivity

//adxl.setSpiBit(0); // Configure the device to be in 4 wire SPI mode when set to '0' or 3 wire SPI mode when set to 1
// It is set to 1 by Default.
// SPI pins on the ATMega328 as reference in SPI Library are 11, 12, and 13

}

/****************** MAIN CODE ******************/
/* Accelerometer Readings and Min/Max Values */
void loop()
{
Serial.println("Send any character to display values.");
while (!Serial.available()){} // Waiting for character to be sent to Serial
Serial.println();

// Get the Accelerometer Readings
int x,y,z; // init variables hold results
adxl.getAcceleration(&x, &y, &z); // Read the accelerometer values and store them in variables declared above x,y,z

if(x < AccelMinX) AccelMinX = x;
if(x > AccelMaxX) AccelMaxX = x;

if(y < AccelMinY) AccelMinY = y;
if(y > AccelMaxY) AccelMaxY = y;

if(z < AccelMinZ) AccelMinZ = z;
if(z > AccelMaxZ) AccelMaxZ = z;

Serial.print("Accel Minimums: "); Serial.print(AccelMinX); Serial.print(" ");Serial.print(AccelMinY); Serial.print(" "); Serial.print(AccelMinZ); Serial.println();
Serial.print("Accel Maximums: "); Serial.print(AccelMaxX); Serial.print(" ");Serial.print(AccelMaxY); Serial.print(" "); Serial.print(AccelMaxZ); Serial.println();
Serial.println();


/* Note: Must perform offset and gain calculations prior to seeing updated results
/ Refer to SparkFun ADXL345 Hook Up Guide: https://learn.sparkfun.com/tutorials/adxl345-hookup-guide
/ offsetAxis = 0.5 * (Acel+1g + Accel-1g) // (+1g = 255, -1g = -255 at 2g range setting)!
/ gainAxis = 0.5 * ((Acel+1g - Accel-1g)/1g) */

// UNCOMMENT SECTION TO VIEW NEW VALUES
//accX = (x - offsetX)/gainX; // Calculating New Values for X, Y and Z
//accY = (y - offsetY)/gainY;
//accZ = (z - offsetZ)/gainZ;

//Serial.print("New Calibrated Values: "); Serial.print(accX); Serial.print(" "); Serial.print(accY); Serial.print(" "); Serial.print(accZ);
//Serial.println();

while (Serial.available())
{
Serial.read(); // Clear buffer
}
}

Ausgabe erfolgt über den seriellen Monitor der IDE
 

jweber

User
klasse, hat geklappt :-)
jetzt habe ich nahezu identische Anzeigen rechts und links.

bei einem Sensor war der offset 46.... Die streuen auch ganz gut

Jörn
 
Hallo
Ich hab mal angefangen einen zu bauen ,kenn mich aber mit programmieren überhaupt nicht aus.Mag es mir vielleicht wer machen? Gruß Jan
 

kalle123

User
Hallo
Ich hab mal angefangen einen zu bauen ,kenn mich aber mit programmieren überhaupt nicht aus.Mag es mir vielleicht wer machen? Gruß Jan

Hallo Jan.

Wenn dich das Thema interessiert, könntest du in sowas hier

https://www.google.com/search?q=ARDUINO+STARTER+KIT+DEUTSCH&ie=utf-8&oe=utf-8

investieren. Da sind keinerlei Vorkenntnisse erforderlich.

Wenn dir das zu kostspielig ist, geht doch einfach mal in deine Stadtbücherei, da findet sich doch Einiges zum Thema Arduino.

kT67Nxel.png


Und gerade bei Arduino sind die Bücher so geschrieben, dass die bei Null anfangen.

Gruß KH
 
Fertig !

Fertig !

Hallo Kalle123,

ich habe Deine Version gebaut, mit nur einem Sensor. Dann kann man die Klappen und Ruder nacheinander einstellen.
Den Sensor habe ich mit dünnem 4er-Flachkabel verbunden und auf eine etwas größere Platine geklebt und eingeschrumpft. Was soll ich sagen - funktioniert top ! Ich musste nichts einstellen. Flach auf den Tisch gelegt gibt das Gerät gleich null/null aus :-) Das Stück Platine, auf welchem der Sensor klebt ist 43mm lang. Gebe ich 43mm Klappentiefe ein und kippe den Sensor um 45 Grad nach vorn, komme ich auf genau 10mm Ausschlag, nachgemessen. Das stimmt mit der Anzeige überein.

Frage - das Gerät geht nur bis ca. 85 Grad. Liegt das an meiner Fehlenden Kalibrierung ? Bei ca. 85 Grad werden bei einer eingestellten Klappentiefe von 43mm genau 42mm Ausschlag ausgegeben. Ich müsste ja eigentlich, wenn ich über 85 Grad komme, auf einen Ausschlag von 43mm kommen, nämlich genau die Klappentiefe.

Macht es Sinn, die ausgegebenen mm Werte auf dezimal umzustellen, für kleine Modelle ? Vielleicht auf, oder abgerundet, auf 0,5mm ?

Tolles Projekt, vielen Dank für das Veröffentlichen !

Mit freundlichen Grüßen

Todde(3000)
 

kalle123

User
Hallo Todde ;)

Schön das es funktioniert und du Spass am Nachbau hattest.

Bin momentan nicht so ganz in der Materie drin, aber versuche mal ne Antwort.

- ein Sensorabgleich kann nicht schaden.

- Nachkommastellen gibt der ADXL345 sinnvoll nicht her. Da muss schon ein MMA8451 als Sensor her. Der hat eine höhere Auflösung.
Hab mal damit (mit Hilfe von Jeroen) angefangen aber nicht weiter gemacht.

- Zu dem 85° Problem. Ich weiß jetzt nicht, welchen Sketch du genommen hast.

Im Programm ist das die Zeile, wo der Winkel aus den Messergebnissen der drei Achsen (xg, yg und zg) gerechnet wird.

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

Die Rechenvorschrift arbeite waagerecht gut. Wenn du den Sensor aber um 90° kippst, müsste da m.E. die Sensorwerte zg und xg getauscht werden. Müsstest also mit 2 Formeln arbeiten und gleitend von einer zur anderen Rechenvorschrift wechseln, wenn du um 90° kippst. Also 0° -> 45° Formel 1 und 45° -> 90° Formel 2 mit gleitendem Übergang ....

Hab schon mal in die Richtung gedacht.

NUR, hab ja mal (mit Jeroen) mit dem MMA8451 angefangen und dort nen ganz anderen Ansatz vom Rechnen eingesetzt. Zeigt eine Genauigkeit in 1/10 mm Bereich und war auch bei 90° Bewegungen genau. Aber um das fortzusetzen, braucht es Mitmacher und die sind nicht da.

Grüße KH
 
Hallo Kalle,
danke für die prompte Antwort. Die Version ist wohl die letzte, die Du hier gepostet hast, die die auch das Speichern der Rudertiefe im Eprom erlaubt.

Das Teil funktioniert für mich, so wie es ist, und ich bin froh, dass ich nicht mehr im Wohnzimmer mit dem Geodreick um den Flieger herumlaufen muss ;)

Ich gucke mir mal den MMA8451 an, mal sehen, ob ich darau etwas machen kann. Ich bin aber nur mittelmäßig firm im Ardunio-Programmieren und Geometrie-Rechnen habe ich noch nie angefasst ...:D

Danke erstmal.

Viele Grüße, Todde
 
Superb !

Superb !

Kalle, danke !

Für mich sieht das aus, als ob das einwandfrei funktioniert ...:D
Was möchtest Du da noch machen ?

Viele Grüße,
Todde
 

kalle123

User
Todde, gefiel mir auch besser als mit dem ADXL.

Hab da letztes Winter in Diskussion mit Jeroen daran rum gebastelt. Ich persönlich komm mit dem ADXL und 1 mm klar, Jeroen wollte höhere Genauigkeit. Dann haben wir ein bisschen mit dem MMA "geforscht" aber mit dem MMA wird die ganze Sache super empfindlich und Jeroen hatte Zweifel in der Reproduzierbarkeit. Dann fing die Flugsaison an und es tat sich nix mehr.

cu KH
 
Hallo Kalle,
ok, notiert. Ich gucke mir Deine MMA8451-Version mal an. Mir geht's in letzter Instanz darum, mir selbst ein gut funktionierendes Gerät zum Messen bauen zu können. Deine ADXL345 Version tut's für mich super, also vielen Dank nochmal.

Ich bin noch über eine andere MMA8451-Version bei RCGroups gestolpert. Die habe ich mir auch mal heruntergeladen. Allerdings ist mir hier nicht ganz klar, wie die Einstellungen gemacht werden. Da gibt es wohl nur ein Taster. Das werde ich dann live herausfinden müssen. Ich bestelle mir erstmal ein MMA8451.

Schönen Sonntag noch.

Viele Grüße, Todde
 

jweber

User
Hallo an alle,

passend zur aktuellen Diskussion kann ich was beitragen.
Um das System zu verstehen, habe ich ein bisschen in Eckehards Sketch rumgespielt.
Und weil ich es wissen wollte, versucht, die Genauigkeit der Anzeige auf eine Stelle hinter dem Komma anzuheben.
Das 16x2 hat dann schon seine Grenzen und die Anzeige flackert ziemlich, bei mir so um plusminus 0,3, manchmal auch mehr.
Darauf habe ich versucht eine gleitende Mittelwertbildung zu implementieren, die Anzeige aber nur alle 0,5sec zu aktualisieren. Dabei ist das herausgekommen:

Den Code hänge natürlich auch gerne an, Original von Eckehard:

Anhang anzeigen RC_ANGLE_THROW_KeypadShield_5_mit_gleitendem_Mittelwert.ino.txt

Achtung, der Code enthält meine Calibrierwerte.
Mein System ist Hardwareseitig aufgebaut wie Eckehard es vorgegeben hat also auch ADXL345, ich hoffe, dass meine Lib´s halbwegs passen, da musste ich etwas dran rummachen, dass es bei mir lief.
Die Calibrierung war eher quick und dirty, so einen schönen Klotz wie Kalle habe ich (noch) nicht, da kann man auch bestimmt noch was holen.

Viele Grüße
Jörn

PS: Schlagt mich nicht, ich kann nicht programmieren, ich bin mir bewusst, dass man das besser, Speichersparender etc umsetzen kann. Ich hätte das ganze Programm nie selbst geschrieben bekommen, aber mit dem rumspielen lernt man ja auch.
 

kalle123

User
Hallo Jörn.

Ich hätte das ganze Programm nie selbst geschrieben bekommen, aber mit dem rumspielen lernt man ja auch.

So in der Art geht das bei mir auch ;)

Eine Bemerkung. Wenn du Nachkommastellen haben willst, nimm den MMA8451.

Ich versuch mal auf die Schnelle (hab noch keinen Kaffee auf dem Tisch ...)

ADXL 345 --> 2g = 10 bit, 1g = 9 bit. Jetzt musst du noch unterscheiden, ob +/- 1g, also 8 bit

Da ist m.E. max. 0.5° drin.

Gruß KH

(Hab irgendwo nen lauffähigen sketch zum MMA8451, setze den gerne hier mal ein zum selber experimentieren ....)
 
Ansicht hell / dunkel umschalten
Oben Unten