Ruderweg Messung mit Arduino

kalle123

User
Hab hier mal einen ADXL 345 an einen Uno angeschlossen und das Scanner sketch gestartet.

So etwas solltest du auch sehen.

jxFEOldl.png


Gruß KH

@ Thomas L ... :D
 

I3uLL3t

User
Hi zusammen,
ich habe mich jetzt auch mal ran gesetzt und habe aus dem Material was ich noch hatte eine Version nach gebaut.
Zur Verfügung stand mir der ADXL und ein Oled mit 128x64.
Desswegen habe ich mir die Version aus dem RC Groups Forum mal angeschaut und nachgebaut.

Durch die Mittelwertbildung von ziemlich vielen Werten (1500), wird das Programm zwar recht langsam aber aber funktioniert deswegen mit dem ADXL ziemlich gut.
Die Wiederholgenauigkeit ist für mich komplett ausreichend. Der Wert aktualisiert sich in meiner Version jetzt ca jede Sekunde. Reicht mir.
Was mich aber gestört hat war die U8g2lib, die extrem viel Speicher benötigt der in dem fall nicht nötig ist. Deswegen habe ich alles auf die "alte"u8glib die ist vollkommen ausreichend und ich habe mehr als die hälfte Speicher des Arduino frei.
Was ich noch geändert habe ist die anzeige der Auslenkung. Der Sketch basiert auf Berechnung des Sekanten, was für mich eigentlich auch ok ist aber der Vollständigkeit halber habe ich es angepasst und lasse mir beide Möglichkeiten berechnen. jeweils auf eine stelle hinter dem Komma.

Kurz ein Gehäuse mit Klemme für den ADXL gedruckt und die Elektronik eingeschweißt. Die ersten Tests verliefen schon recht gut und sind für mich mehr als ausreichend.
Was ich aktuell noch dazu baue ist das Speichern der Ruder länge in den EEprom damit der Wert beim nächsten starten behalten wird.


Das ganze sieht dann so aus.
Die angezeigten Werte erstmal vergessen, der Sensor lag komplett verdreht, dass führte zu fehlerhaften Berechnungen.
Das Gehäuse wurde auch nur auf die schnelle gezeichnet und gedruckt, deswegen ist die Qualität nicht so top

IMG_20190222_212130.jpg

IMG_20190222_211819.jpg
 

stefan1

User
Hallo Marcel,
möchtest du das Programm hier nicht auch mal einstellen? ich will das immer nochmal bauen, aber mir ist das Ganze mittlerweile zu unübersichtlich geworden

Gruß Stefan
 

I3uLL3t

User
Danke Kalle, ich habe mir das angeschaut, verstehe glaube ich auch grob was mir das Dokument sagen will. Wenn ich aber die Gleichung sehe habe ich nur ??????? im Kopf.
Das ist mir tatsächlich zu hoch, da habe ich wohl in der Schule nicht gut genug Aufgepasst. Was Bedeutet das "A" Das Theta wird wohl den gemessenen Winkel darstellen.
Aber da hört es bei mir auch schon auf. :(

Ich könnte auf den anderen gehen aber den hatte ich nicht zuhause. Ist aber schon in Bestellung.


Den Code werde ich hier noch rein stellen aber wie gesagt der Größte teil ist aus dem RCGroups Forum und nicht von mir.
Ich habe lediglich auf anderes OLED umgebaut und umgestrickt auf die für mich "bessere" Libary.
Denke zum Wochenende bin ich soweit.


Gruß Marcel
 

kalle123

User
Hab mal schnell einen Versuch mit der aktuellen Version von f5mmx gemacht.

Wenn ich mir das hier anschaue, wie exakt der Sensor (MMA 8451) wieder auf 0.0° zurück geht und wie einfach die Bedienung mit einer Taste ist, brauch ich auf dem Gebiet nix mehr zu machen :D


Ich hab jetzt hier kein V-Leitwerk zur Hand. Aber f5mmx hat da nen sehr komplexen Rechenalgorithmus, könnte mir vorstellen, dass der sketch damit auch zurecht kommt.

Vielleicht kann ja jemand hier das mal testen ... ;)

Gruß KH

PS. Code findet sich auf https://github.com/f5mmx/aeromodeling-throw-meter/tree/master
 

I3uLL3t

User
Das ist ja quasi das was ich nachgebaut habe nur halt in der ADXL version. Die schaft V und Seitenleitwerk leider nicht. Sobald ich das MMA habe werde ich die version testen und mal schauen. Vielleicht hat er da ja tatsächlich noch einiges verbessert.

Ich meine mich erinnert zu haben irgendwer schrieb mal von OLED´s bekommt er Augenkrebs :-P :D

Gruß Marcel
 

I3uLL3t

User
Ich habe es mir eben nochmal angeschaut.
Die Berechnungen de Winkels sind bei ADXL und MMA Versionen von Ihm identisch.
Die ADXL Version kann auf jedenfalls kein Seitenruder oder V Leitwerk. Ich gehe mal davon aus das es bei der MMA Version dann auch so ist.
Was natürlich genial ist die Genauigkeit des MMA da hast du recht Kalle.
Ich sollte heute oder Morgen meine MMA8452 bekommen und dann werde ich mal testen. Die MMA8451 konnte ich in DE irgendwie nicht mehr auftreiben.

Gruß Marcel
 

kalle123

User
Die ADXL Version kann auf jedenfalls kein Seitenruder oder V Leitwerk. Ich gehe mal davon aus das es bei der MMA Version dann auch so ist.

Hallo Marcel.

Ich hab mir irgendwann mal so was hier gebastelt.

KflT4wCl.png


Stellt die 3 Messachsen (x, y und z Achse) eines solchen Sensors dar. Egal, ob ADXL, MMA oder MPU.

Wie bitte, willst du mit einem solchen Sensor ein Seitenruder messen?

(Eine Achse konstant 9.81m/s², zwei Achsen konstant 0.0 m/s² bei Ruderauslenkung)

Bei nem V-Leitwerk sieht das aber anders aus.

Eine Achse konstant < 9.81m/s², zwei Achsen liefern Werte zwischen 0.0 m/s² und < 9.81m/s² bei Auslenkung.

Ich hab mir den Code von f5mmx nicht in Detail angeschaut, aber mit "Triple-Axis Tilt Calculation" sollte eine Messung möglich sein.

PS. So ein kleines Ding wie oben im Bild hilft, das Messprinzip besser zu verstehen. :D

Gruß KH

Was natürlich genial ist die Genauigkeit des MMA da hast du recht Kalle.

MMA 8451! Aus China hast du die in 3 Wochen hier. Chinese new year ist vorbei, die versenden wieder ....

Nebenbei https://www.ebay.de/itm/Adafruit-Triple-Axis-Accelerometer-u00b12-4-8g-14-bit-MMA8451/282172866480?hash=item41b2d03fb0:g:PjoAAOSwFlNcW-cu:rk:1:pf:0

PSS. Hab mir den Code von f5mmx mal angeschaut.
Code:
double read_angle() {                             // Function returning the current rotation value along X axis - in degrees
  //----------------------------------------------------------------------------------------------------------------------------------
  double l_angle = 0;
  double ll_angle = 0;
  int mm = 100;
  for (int nn = 1;  nn <= mm; nn++) {               // Average value computed over roughly 100ms
    mma.read();                                     // Read the accelerometer values and store them in variables declared above x,y,z
    l_angle = atan2(mma.y, mma.z) * 180/pi;         // Compute rotation angle along X axis of accelerometer
    ll_angle = ll_angle + (l_angle);
  }
  l_angle = round(ll_angle / mm * 10);
  ll_angle = l_angle / 10;
  return -ll_angle;
}

Er arbeitet mit allen 3 Achsen. Messachse 'X' und hier kompensiert er mit den 'Y' und 'Z' Achsen -- l_angle = atan2(mma.y, mma.z) * 180/pi;

Und das

Durch die Mittelwertbildung von ziemlich vielen Werten (1500), wird das Programm zwar recht langsam aber aber funktioniert deswegen mit dem ADXL ziemlich gut.


gilt da auch nicht, schnell (wie im Video zu sehen) und exakt.
 

I3uLL3t

User
Oh Eckstein wurde mir gar nicht angezeigt :(
Auch nochmal einen geordert. Danke dafür

Und ich habe es grade nochmal getestet es funktioniert tatsächlich bei einem V Leitwerk. Verstehe nicht was ich beim ersten mal falsch gemacht habe. :confused:
naja nichts desto trotz dein kleiner Helfer hilft tatsächlich echt gut beim verstehen.
Was würde denn jetzt Theoretisch passieren, wenn ich den Sensor im 45 grad Winkel hinten am Seitenruder anbringe?! Theoretisch müsste das ja durch die Kompensation auch funktionieren.

Und das

gilt da auch nicht, schnell (wie im Video zu sehen) und exakt.

Ja das hatte ich gesehen sieht super schnell und präzise aus. Denke aber nicht das das mit dem MMA8452 großartig anders aus sieht aber man wird sehen :)

Gruß Marcel
 

kalle123

User
Was würde denn jetzt Theoretisch passieren, wenn ich den Sensor im 45 grad Winkel hinten am Seitenruder anbringe?! Theoretisch müsste das ja durch die Kompensation auch funktionieren.

Hi Marcel.

NEIN! Mach dir mal so ein 'Helferlein' und schau selber. ;)

Beim Seiterruder findet eine Bewegung um eine SENKRECHT stehende Achse statt. D.h. die von den drei Sensoren gemessene Erdanziehung (Bruchteil von 9.81 m/s²) je Sensorachse ändert sich nicht. Die Sensoren rotieren ganz einfach auf einer horizontalen Ebene. Keine Messung.

Hab hier mal ein Bild zur Wirkungsweise "geklaut".

https://www.rotoview.com/accelerometer.htm

Unbenannt.jpg

Links wird 0 m/s² gemessen und Rechts halt 9.81 m/s² (oder 1 g). Das ist das Messprinzip! (von einer Achse)

Um DAS (Ruder) zu messen, müsstest du z.B. mit einem Magnetometer arbeiten, nur bezweifle ich, dass da eine Genauigkeit wie bei ADXL, MMA usw. zu erzielen ist.

Zum Code von f5mmx:

Durch 'fremden' Code durch zu steigen, ist meist schwer für Dritte.

Und f5mmx hat da einen m.E. sehr effektiven Code geschrieben.

Ich werde mir jetzt noch mal 2 OLEDs in Fernost bestellen (Rest hab ich hier) und mir zwei Messgeräte basteln. 'Augenkrebs' hin oder her ..... :D

PS. Bestellung ist raus. 2 Stück für 3.22€. Dauert jetzt 3 - 4 Wochen, aber ich hab Zeit :D

Grüße KH
 

pantau

User
MMA8451

MMA8451

Hallo,
ich melde mich auch mal wieder.
Zu den MMA Sensoren aus China habe ich folgendes zu sagen. Ich habe einen vermeintlichen 8451 bestellt, aber 8452 erhalten (in der Überschrift stand 8451, in der Artikelbeschreibung 8452). Bei einer weiteren Bestellung bei einem anderen Verkäufer habe ich dann tatsächlich einen 8451 für 1,82€ erhalten.
Ich hatte aber zwischenzeitlich mit dem 8452 gebaut und den Sketch aus rc groups verwendet. Als der 8451 kam, wollte ich einfach den Sensor tauschen..... Aber Achtung, die Verdrahtung ist nicht identisch! Habe ich aber erst festgestellt als ich getauscht hatte und loslegen wollte. Umverdrahtet und schon gings.

So nun zur Genauigkeit. Das Rückstellen auf Null ist in der Tat sehr gut. Die Messgenauigkeit bei 90° passt bei mir aber nicht so gut. Da habe ich dann ca 0,5° Differenz. Der Sensor misst in die eine Richtung -90,5° in die andere Richtung nur 89,5°. Bekommt also die 180° hin, aber die mitte ist nicht bei 0.
Gruß
Detlef
 

kalle123

User
Hallo Detlef.

Ich nehme an, wir reden über den sketch von f5mmx!?

Blick da zwar noch nicht ganz durch, aber ich sehe hier die Winkelberechnung:
Code:
for (int nn = 1;  nn <= mm; nn++) {               // Average value computed over roughly 100ms
    mma.read();                                     // Read the accelerometer values and store them in variables declared above x,y,z
    l_angle = atan2(mma.y, mma.z) * 180/pi;         // Compute rotation angle along X axis of accelerometer
    ll_angle = ll_angle + (l_angle);

Messachse ist x und er kompensiert mit der y und z Achse.

Wenn du dir nun die Messwertausgabe einer Achse mal anschaust, sieht das so aus.

(Bild aus dem oben von mir angegebenen PDF manual)


Bildschirmfoto_2019-03-02_08-52-06.png

Du machst ne 10° Bewegung um die Null Lage und kriegst eine Messwertänderung von ~0.2g (rote Werte)

Mach das nun um die senkrechte Lage und die Messwertänderung ist irgendwo bei 0.0xg (grüne Werte).

Die von dir angegebenen Abweichungen führe ich darauf zurück.

Man müsste wohl bei Bewegungen > oder < 45° das hier im sketch entsprechend wechseln

von

Messachse ist x und er kompensiert mit der y und z Achse.

nach

Messachse ist z und er kompensiert mit der x und y Achse.

Oder anders ausgedrückt. Die Messung ist genau im Bereich ~ -45° ... 0° ... 45°, aber wenn du -90° ... 90° genau haben willst, musst du zwei Achsen im Rechenschritt wechseln.

Kannst ja mal den sketch entsprechend 'umbauen', um das zu testen ;) Dann solltest du die Genauigkeit bei +/- 90° sehen und Abweichungen um die Null Lage .......

Gruß KH
 

kalle123

User
Hallo Detlef.

Muss mich korrigieren :rolleyes:

f5mmx nimmt in seiner o.a. Rechenformel die x-Achse als feste Drehachse und rechnet den Winkel mit den beiden anderen Achsen.
Code:
l_angle = atan2(mma.y, mma.z)

Das ist so korrekt und nicht Ursache für die Abweichung, die du da siehst.

Ich sehe wohl keinen Sensorabgleich in seinem sketch. Also eine 'Kalibrierung' des MMAs in allen drei Achsen mit jeweils 'offset' und 'gain'.

Vielleicht liegt es daran ....

Gruß KH
 

I3uLL3t

User
Danke Kalle jetzt habe ich meinen Denkfehler komplett verstanden.
Im Grunde hat mir der Begriff "Erdanziehung" gefehlt.
Das heißt ein sinnvolles Messen des Seitenruders, geht nur A) Rumpf verdrehen oder B) Ein Magnetometer benutzen.
Also vergesse ich das ganze und Drehe dann halt im Zweifel meinen Rumpf. :)

Meine MMAxx42 sind dann auch gekommen heute wird mal gelötet und dann wieder der Code umgebaut, damit ich mehr sehe auf dem Bildschirm und die Werte im EEPROM habe.
Wenn ich damit fertig bin stelle ich die geänderte Version auch hier ein.

Gruß Marcel
 

I3uLL3t

User
So, ich habe jetzt auf den MMA8452 umgebaut und dieser ist sehr ähnlich dem MMA8451 den Kalle im Video gezeigt hat.
Schnelle Reaktion, trotz Mittelwertbildung und er geht direkt und sauber auf 0.
Ich habe den Sketch jetzt auch wieder angepasst.
Meine geänderte Version:
-OLED 128x64 SPI (I2C ist auch möglich)
-U8glib (die alte, die verbaucht weniger Speicher).
-Anzeigen Sekant und das andere Messverfahren (für das ich keinen Namen kenne. Ich habe es einfach Throw genannt wie bei der LCD variante)
-Speichern der Ruder länge im EEPROM und aufrufen beim einschalten.
-F Makros benutzt um Speicher zu sparen.

Anzeige sieht dann so aus.
IMG_20190222_212130.jpg


Sketch:
Code:
/*
  
   Copyright J'm f5mmx, France, 2018 (jmb91650@gmail.com)
   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   This is a beerware; if you like it and if we meet some day, you can pay me a beer in return!
   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  
   --------------------------------------------------
   Uses nearly the same schematic designed around the
   ADXL345. On AXL345 CS input is tight to +3V on
   the MMA8452 SA0 is connected to GND.
   On this version the push button is monitored using
   an interrupt
   Have fun!
   --------------------------------------------------

  Changelog from I3uLL3t (m@peschi.info) V1.1
  -changed the OLED Libary to U8glib becouse to lower RAM usage.
  -added some F Macro´s
  -changed to 128x64 SPI Oled to get more Informations on screen.
  -added additional throw calculation. 
  -Store the Chrod to EEPROM


*/
#include <EEPROM.h>
#include <Wire.h>
#include <MMA8452.h>                  // MMA8452 library            from https://github.com/akupila/Arduino-MMA8452
#include <U8glib.h>                  // Oled u8g library          from https://github.com/olikraus/u8glib

int action = 0;
double corde,  ref_angle;
const float pi = M_PI;
const int buttonPin = 2;
volatile int bp_pushed = 0;
volatile  unsigned long bp_down = 0 ;
volatile  unsigned long bp_up = 0;
volatile  unsigned long bp_ = 0;

U8GLIB_SSD1306_128X64 u8g(10,8,9);


//----------------------------------------------------------------------------------------------------------------------------------
MMA8452 mma;
//----------------------------------------------------------------------------------------------------------------------------------
double read_angle() {                             // Function returning the current rotation value along X axis - in degrees
  //----------------------------------------------------------------------------------------------------------------------------------
  float x, y, z;
  double l_angle = 0, ll_angle = 0;
  int mm = 150;
  for (int nn = 1;  nn <= mm; nn++) {
    mma.getAcceleration(&x, &y, &z);
    l_angle = atan2(y, z) / pi * 180 * 10;
    ll_angle = ll_angle + l_angle;
  }
  l_angle = round(ll_angle / mm);
  ll_angle = l_angle / 10;
  //Serial.println(String(l_angle, 5) + "   -   " + String( ll_angle, 5));
  return ll_angle;
}
//----------------------------------------------------------------------------------------------------------------------------------
void init_angle() {
  //----------------------------------------------------------------------------------------------------------------------------------
  double ra = 0;
  delay(200);
  ra = read_angle();                              // Initialize the actual angle as the reference angle
  ref_angle = ra;
}

void EEPROMwrite(){
  EEPROM.put(0,corde);
  delay(300);
  Serial.println(F("EEPROM UPDATED"));
  EEPROMread();
}
void EEPROMread(){
   EEPROM.get(0,corde);
}

//----------------------------------------------------------------------------------------------------------------------------------
void setup() {
  //----------------------------------------------------------------------------------------------------------------------------------
  delay(1000);                                    // Need some time to boot up I2C components
  Wire.begin();
  Serial.begin(9600);
  double temp;
  EEPROM.get(0,temp);
  if(isnan(temp)){
    EEPROMwrite();
    Serial.println(F("write"));
  }else{
    EEPROMread();
    Serial.println(F("read"));
  }
  Serial.println(F("Init done"));
  u8g.begin();                                    // Start Oled
  affiche_init();
  delay(500);
  if (! mma.init()) {                            // Try to start MMA, if fails then display error message
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_profont12);
      u8g.setPrintPos(18, 15);
      u8g.print(F("ERROR MMA8452"));
      Serial.println(F("ERROR MMA"));
    } while ( u8g.nextPage() );
    while (1);
  }

  mma.setDataRate(MMA_400hz);
  mma.setRange(MMA_RANGE_2G);
  pinMode(buttonPin, INPUT);                      // define the Push Button input
  attachInterrupt(digitalPinToInterrupt(buttonPin), ISRbutton, CHANGE); // Interrupt on CHANGE button 2
  init_angle();
}
//----------------------------------------------------------------------------------------------------------------------------------
void ISRbutton()  {
  //----------------------------------------------------------------------------------------------------------------------------------
  bp_ = millis();
  if (bp_ - bp_up > 200) {
    if (digitalRead(buttonPin) == LOW) {
      bp_down = millis();
    }
    if (digitalRead(buttonPin) == HIGH) {
      bp_up = millis();
      if (bp_up - bp_down > 1000) {
        bp_pushed = 1;
      } else  bp_pushed = 2;
    }
  }
}
//----------------------------------------------------------------------------------------------------------------------------------
String cnv_flt2str(float num, int car, int digit) { // Convert a float variable into a string with a specific number of digits
  //----------------------------------------------------------------------------------------------------------------------------------
  float tmp_num, expo;
  String str = "";
  switch (digit) {
    case 0: expo = 1; break;
    case 1: expo = 10; break;
    case 2: expo = 100; break;
    case 3: expo = 1000; break;
    case 4: expo = 10000; break;
    default: expo = 0; break;
  }
  if (expo != 0) {
    str = String(int(num));
    if (expo > 1)  {
      tmp_num = abs(num) - int(abs(num));
      str = str + "." + String(int(tmp_num * expo));
    }
  }
  while (str.length() < car) {
    str = " " + str;
  }
  return str;
}
//----------------------------------------------------------------------------------------------------------------------------------
void aff_menu() {
  //----------------------------------------------------------------------------------------------------------------------------------
  int action = 0,  l_pas = 1;
  double l_ang = 0, l_act = 0, l_posi = 0, l_ref = 0;
  u8g.firstPage();                                                 // Display values
  do {
    u8g.setFont(u8g_font_profont12);
    u8g.setPrintPos(5, 15);
    u8g.print(F("Rud. Length :"));u8g.print(cnv_flt2str(corde, 4, 1));u8g.print(F("mm"));
    u8g.drawBox(64 - 7, 22, 14, 10);
    u8g.drawFrame(64 - 20, 22, 40, 10);
    u8g.drawFrame(64 - 45, 22, 90, 10);
    u8g.drawFrame(0, 22, 128, 10);
    u8g.setFont(u8g_font_4x6);
    u8g.setPrintPos(64 - 1, 30);
    u8g.print(F("0"));
    u8g.setPrintPos(64 - 19, 30);
    u8g.print(F("-.1"));
    u8g.setPrintPos(64 - 45 + 12, 30);
    u8g.print(F("-1"));
    u8g.setPrintPos(64 - 63 + 5, 30);
    u8g.print(F("-10"));
    u8g.setPrintPos(64 + 19 - 9, 30);
    u8g.print(F(".1"));
    u8g.setPrintPos(64 + 45 - 14, 30);
    u8g.print(F("1"));
    u8g.setPrintPos(64 + 63 - 14, 30);
    u8g.print(F("10"));
  } while ( u8g.nextPage() );
  delay(1500);
  l_ref = read_angle();
  do {
    l_ang = read_angle() - l_ref;                                       // read current angle
    if (abs(l_ang) >= 7) {                                              // If angle over 7 degrees
      if (abs(l_ang) < 20) {
        l_act = 0.1;
      }
      else {
        if (abs(l_ang) < 45) l_act = 1;
        else {
          l_act = 10;
        }
      }
      if (l_ang > 0) l_pas = 1; else l_pas = -1;
    }
    else l_act = 0;
    //  Serial.println("angle :" + String(abs(ang)) + " act " + String(act));
    if (l_act != 0) {
      corde = corde + (l_act * l_pas);
    }

    l_posi = l_ang;

    if (l_posi >= 64) {
      l_posi = 64;
    }
    else {
      if (l_posi < -64) {
        l_posi = -64;
      }
    }
    l_pas = 64 + l_posi;
    u8g.firstPage();                                                 // Display values
    do {
      u8g.setFont(u8g_font_profont12);
      u8g.setPrintPos(5, 15);
      u8g.print(F("Rud. Length :"));u8g.print(cnv_flt2str(corde, 4, 1));u8g.print(F("mm"));
      u8g.drawBox(64 - 7, 22, 14, 10);
      u8g.drawFrame(64 - 20, 22, 40, 10);
      u8g.drawFrame(64 - 45, 22, 90, 10);
      u8g.drawFrame(0, 22, 128, 10);
      u8g.setFont(u8g_font_4x6);
      u8g.setPrintPos(64 - 1, 30);
      u8g.print(F("0"));
      u8g.setPrintPos(64 - 19, 30);
      u8g.print(F("-.1"));
      u8g.setPrintPos(64 - 45 + 12, 30);
      u8g.print(F("-1"));
      u8g.setPrintPos(64 - 63 + 5, 30);
      u8g.print(F("-10"));
      u8g.setPrintPos(64 + 19 - 9, 30);
      u8g.print(F(".1"));
      u8g.setPrintPos(64 + 45 - 14, 30);
      u8g.print(F("1"));
      u8g.setPrintPos(64 + 63 - 14, 30);
      u8g.print(F("10"));
      u8g.drawLine(l_pas, 18, l_pas, 34);
      u8g.drawLine(l_pas - 1, 18, l_pas - 1, 20);
      u8g.drawLine(l_pas + 1, 18, l_pas + 1, 20);
    } while ( u8g.nextPage() );
    delay(100);
  } while (bp_pushed == 0);
  bp_pushed = 0;
}
//----------------------------------------------------------------------------------------------------------------------------------
void affiche_init() {
  //----------------------------------------------------------------------------------------------------------------------------------
  u8g.firstPage();                                                 // Display values
  do {
    u8g.setFont(u8g_font_7x14);
    u8g.setPrintPos(5, 24);
    u8g.print(F("Init in progress"));
  } while ( u8g.nextPage() );
}
//----------------------------------------------------------------------------------------------------------------------------------
void affiche(String l_angle, String l_corde, String l_debat, float r_angle,String l_throw) {
  //----------------------------------------------------------------------------------------------------------------------------------
  u8g.firstPage();                                                 // Display values
  do {
   u8g.setFont(u8g_font_profont12);
    u8g.setPrintPos(1, 14);
    u8g.print(F("Angle deg. -->"));
    u8g.setFont(u8g_font_7x14B);
    u8g.setPrintPos(80, 15);
    u8g.print(l_angle);
    u8g.setFont(u8g_font_profont12);
    u8g.setPrintPos(1, 26);
    u8g.print(F("R Length "));u8g.print(l_corde);u8g.print(F("mm"));
   // u8g.print("Corde " + l_corde + "mm");
    u8g.setPrintPos(1, 38);
    u8g.print(F("Secant mm--->"));
    u8g.setFont(u8g_font_7x14B);
    u8g.setPrintPos(80, 39);
    u8g.print(l_debat);
    u8g.setFont(u8g_font_profont12);
     u8g.setPrintPos(1, 50);
    u8g.print(F("Throw mm--->"));
    u8g.setFont(u8g_font_7x14B);
    u8g.setPrintPos(80, 51);
    u8g.print(l_throw);
//    u8g.drawLine(5, 52, 50, 52);
//    u8g.drawLine(5, 52, angle_x, angle_y);
  } while ( u8g.nextPage() );
}
//----------------------------------------------------------------------------------------------------------------------------------
void loop() {                                     // Main loop
  //----------------------------------------------------------------------------------------------------------------------------------
  float x_rot = 0, aff_angle = 0, angle = 0, debat = 0;
  float throww = 0;
  int act = 0;

  if (bp_pushed != 0) {
    do {
      delay(10);
    } while (digitalRead(buttonPin) == LOW);
    action = bp_pushed;
    bp_pushed = 0;
  }

  switch (action) {
    case (1):
      aff_menu();
      action = 2;
      break;
    case (2):
      affiche_init();
      init_angle();
      EEPROMwrite();
      action = 0;
      break;
    default:
      break;
  }
  x_rot = read_angle();                                               // read current angle
  x_rot = ref_angle - x_rot;                                          // compute angle variation vs. reference angle
  angle = x_rot/180*pi;                                         // angle value converted from radian
  //Serial.println("angle :" + String(angle, 1));
  throww = sin(abs(angle));
  throww = throww * corde;
  throww = abs(throww);
  debat = sqrt(2 * sq(corde) - (2 * sq(corde) * cos(angle)));         // throw computation in same units as chord
  //affiche(cnv_flt2str(x_rot, 6, 1), cnv_flt2str(corde, 4, 1), cnv_flt2str(debat, 6, 1));
  affiche(cnv_flt2str(x_rot, 6, 1), cnv_flt2str(corde, 4, 1), cnv_flt2str(debat, 6, 1),x_rot,cnv_flt2str(throww, 6, 1));
}

Die STL Für meinen RuderKlipp kann ich auch noch reinstellen wenn sie jemand haben möchte.
Bei Interesse stelle ich auch noch die ADXL345 Version ein.
 

kalle123

User
Hallo Marcel.

Kompilieren geht schon mal. Bisschen suchen wg. der alten 'U8glib'

Nur, ich hab keine MMA8452 und auch kein OLED mit SPI :(

Gruß KH
 
Ansicht hell / dunkel umschalten
Oben Unten