Go Down

Topic: Winkelberechnung mit Arduino UNO (Read 5961 times) previous topic - next topic

fridi

#75
Jun 30, 2018, 02:20 pm Last Edit: Jun 30, 2018, 02:33 pm by fridi
Hallo an die Mathematiker. Ich komme nun doch an meine Grenzen. Vielleicht hat ja jemand eine Idee oder einen Ansatz. Mir schwirrt der Kopf.
Problemstellung. Ich habe ein Objekt variabel, aber zum Berechnen erst einmal in 600mm Entfernung   und die Kamera in der halben Objekthöhe rechtwinklig positioniert. Nun fahre ich die Kamera um die halbe Objekthöhe + 500mm nach unten. Dabei verändert sich die Entfernung (Hypotenuse). Hier den Winkel berechnen und die Kamera einstellen. Danach fahre ich die Kamera 500mm nach oben. Die Hypotenuse muss neu berechnet werden und der Winkel auch. Nun steht die Kamera ja schon auf einem Winkel. Also muss der vorherige Winkel davon abgezogen werden. Ab der Mitte des Objektes geht der Winkel in den negativen Bereich. Die Kamera in den Startwinkel drehen und dann den neuen Winkel einstellen wäre eine Option. Das lineare rauf und runter Fahren ist auch nicht das Problem. Ich hänge hier mal meine Programmierung an. Ist nicht aufgeräumt, weil ich da ständig am Probieren bin. Hinzu muss ich sagen das die Objekthöhe variabel ist. In meinem Testfall 100mm Objekt + 50mm nach unten und 50mm nach oben. Also hier Fahrweg 200mm.
Code: [Select]

void Kontur()
{
  //..............Hoehe des Objektes berechnen................
  Serial.print(" Fahrwegunten  ");          // Zeile löschen
  Serial.println(Fahrwegunten);
  Gesamtzaehler = 0;
  WinkelCounter = 0;
  Absenken();

  digitalWrite(StepDirKipp, HIGH);      //Kippen nach oben drehen High
  while (Gesamtzaehler <= Fahrweg)
  {
    Kamerawinkel();
    //   Drehen();
    Hochfahren();
  }
}
//...............................Schlitten absenken........................
void Absenken()
{
  digitalWrite(StepDirHoch, HIGH);       //Nach unten drehen
  Serial.print(" Fahrwegunten  ");
  Serial.println(Fahrwegunten);
  Wegzaehler = 0;

  while (Wegzaehler <= Fahrwegunten)
  {
    digitalWrite(StepStpHoch, HIGH);          //Takt High
    delay(0.01);
    digitalWrite(StepStpHoch, LOW);           //Takt low
    delay(0.01);
    Wegzaehler++;
    if (digitalRead(EndstopHoch) ==  HIGH)     //Wenn Endstop ausgelöst
    {
      Ende();                                  //Dann Ende aufrufen
    }


  }
  Serial.print(" Wegzaehler  ");
  Serial.println(Wegzaehler);
}
//.............................Schlitten hoch fahren......................
void Hochfahren()
{
  digitalWrite(StepDirHoch, LOW);      //Nach oben drehen
  Gesamtzaehler = 0;

  while ( Gesamtzaehler <= Fahrweg)
  {
    Wegzaehlerrauf = 0;
    while ( Wegzaehlerrauf <= ScannAbschnitt * StepsMM)           // 50mm hochfahren
    {
      digitalWrite(StepStpHoch, HIGH);          //Takt High
      delay(0.01);
      digitalWrite(StepStpHoch, LOW);           //Takt low
      delay(0.01);
      Wegzaehlerrauf++;
      Gesamtzaehler++;
    }
    Serial.print(" Fahrweg: ");
    Serial.print(Fahrweg);
    Kamerawinkel();
    //   Drehen();
    // Serial.print("    Wegzaehler: ");
    // Serial.println(Wegzaehler);
  }
}
//..............................Winkel einstellen............................
void Kamerawinkel()
{
  if (Schleifer2 > 10)        //Wenn kleiner, dann keine Winkelanpassung, nur hoch fahren
  {
    //   Hoehe = (Schleifer1 * StepsMM);// + (100 * StepsMM);//Höhe des bjekts +Vor/NachLauf in Steps
    //   UntereHoehe = Hoehe / 2 ;              // Untere Höhe 1/2 Höhe der Höhe
    //    GefahreneStrecke = GefahreneStrecke + Wegzaehler;  //Tatsächlich gefahrene Strecke
 Position=Wegzaehler;
   
   
   
   
   
   
   
    Serial.print(" WinkelCounter: ");
    Serial.println(WinkelCounter);

   
      Serial.print(" WinkelCounter: ");
      Serial.println(WinkelCounter);

      Fahrwegunten = Fahrwegunten - (StepsMM * ScannAbschnitt);
   
    float Winkel = atan(1.*Fahrwegunten / Entfernung) * 360 / (2 * PI);
    Winkelsteps = Winkel * StepsGrad;
    if (Winkelsteps < 1)
    {
      Winkelsteps = Winkelsteps * -1;
    }
    Serial.print(" WinkelCounter: ");
    Serial.println(WinkelCounter);
    Serial.print(" Winkel: ");
    Serial.print(1.*Winkel);
    Serial.print("  Wegzaehler: ");
    Serial.print(Wegzaehler);
    Serial.print(" Winkelsteps: ");
    Serial.print(1.*Winkelsteps);
    Serial.print(" Fahrwegunten: ");
    Serial.print(Fahrwegunten);
    //    Serial.print(" Entfernung: ");
    //    Serial.print(1.*Entfernung);
    Serial.print("  Gradzaehler: ");
    Serial.println(Gradzaehler);

    //   Gradzaehler = 0;
    while (Gradzaehler <= Winkelsteps)        // Schleife zum Kippen
    {
      digitalWrite(StepStpKipp, HIGH);        //Takt High
      delay(Kipp);                            //Verzögerung
      digitalWrite(StepStpKipp, LOW);         //Takt LOW
      delay(Kipp);                            //Verzögerung
      Gradzaehler++;
    }
    //   Serial.print("  Fahrwegunten: ");
    //   Serial.print(Fahrwegunten);
    while (digitalRead(TastePlusMinus) == HIGH)  // Warten
    {
      digitalWrite(StepDirKipp, LOW);      //Kippen nach unten drehen

    }
  }

  else
  {
    //    while (digitalRead(TastePlusMinus) == HIGH)   //Warten
    //    {
    //    }
  }
  // Richtung = 1;             // Kipprichtung nach unten stellen
  Fahrwegunten = Fahrwegunten - Wegzaehler;
  WinkelAlt = Winkel;
}



//..................Endstopfunktion.................
void Ende()
{
  Endzaehler = 0;
  digitalWrite(StepDirHoch, LOW);          // nach oben drehen
  while (Endzaehler < 3 * StepsMM)
  {
    digitalWrite(StepStpHoch, HIGH);          //Takt High
    delay(1);
    digitalWrite(StepStpHoch, LOW);           //Takt low
    delay(1);
    Endzaehler++;
  }
  Endzaehler = 0;
  digitalWrite(StepDirHoch, HIGH);          //Dann wieder nach unten drehen schalten
}

//    Serial.print(F("Arkustangens von Winkel ist "));
//    Serial.print(atan(Winkel));
//    Serial.print(F(" das entspricht "));
//    Serial.print (atan(Winkel) * 360 / (2 * PI));
//    Serial.println(F(" Grad"));


//   Winkel1= (atan(Winkel) * 360UL / (2 * PI)); // Kamerawinkel
//    Serial.print("Winkel: ");
//    Serial.print(1.*Winkel1);

//   Serial.print(F("Arkustangens von Winkel "));
//   Serial.print(atan(Winkel));
//   Serial.print(" ");

//   Serial.print(F(" das entspricht "));
//    Serial.print(atan(Winkel) * 360 / (2 * PI));
//   Serial.println(F(" Grad"));

P_Extruder

#76
Jun 30, 2018, 04:14 pm Last Edit: Jun 30, 2018, 04:46 pm by P_Extruder
Genau passend zur Wunschvorstellung kann ich zwar nichts liefern, aber gemäß dem Thread bezügl. Bilder im Text versuche ich es zunächst mit einer Illustration aus der ONE-Drive-Cloud :
https://1drv.ms/u/s!AhY4t4UjuOcbgesuvkb87LrGTYAyyA
Ich bin hier vom Winkel (7.5°) ausgegangen; man kann natürlich auch von der Höhe ausgehen.
Gerade weil ich eigentlich weiß was Agisoft PhotoScan braucht bringt mich das Auf und Ab in Fridis Beschreibung etwas durcheinander.
Die entsprechende Formel war schon in einem meiner vorigen Posts enthalten - folgt aber hier nochmal: https://1drv.ms/u/s!AhY4t4UjuOcbgesvqM_U8CRdXX1OqQ

Mögen geneigte Mathematiker bestätigen oder widerlegen was ich da in SketchUp fabriziert habe.
Ebenso simpel wären dann die von Fridi gewünschten Einstellungen zu ermitteln.
Umsetzung in Arduino-Code dann bitte durch Experten.

Tommy56

Wenn Du Dich schon auf den Thread "Bilder im Text" beziehst, warum machst Du dann genau das Gegenteil?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

P_Extruder

#78
Jun 30, 2018, 04:50 pm Last Edit: Jun 30, 2018, 04:56 pm by P_Extruder
Wenn Du Dich schon auf den Thread "Bilder im Text" beziehst, warum machst Du dann genau das Gegenteil?

Gruß Tommy
Weil es wie sich grad erwiesen hat für mich leichter ist . Aufgeschoben ist aber nicht aufgehoben; mir ist schon klar dass ein sofort sichtbares Bild willkommener ist. Bei sehr großen Dateien kann OneDrive nämlch ganz schön nerven.
___________________________________________________________________________________
http://3d-drucker-community.de/forum/3d-drucken/software/32372-marlin-installationsprobleme-auf-ramps-1-4-mit-china-arduino-2560-und-12864-display

Ist ein in dieser Hinsicht vorbildliches Forum (mit anderen Schwächen). Man kann dort die Bildgröße ganz nach Bedarf ändern.

Tommy56

Um die Bildgröße zu ändern gibt es Bildbearbeitungsprogramme. Manche Bildbetrachter können es auch.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

P_Extruder

Um die Bildgröße zu ändern gibt es Bildbearbeitungsprogramme. Manche Bildbetrachter können es auch.

Gruß Tommy
Sollte allgemein bekannt sein. Probier´s halt aus was schneller geht.

Tommy56

Ganz einfach: Ich ignoriere Deine Bilder. Das geht für mich am Einfachsten.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

P_Extruder

Ganz einfach: Ich ignoriere Deine Bilder. Das geht für mich am Einfachsten.

Gruß Tommy
Die Bilder sind ja auch nur für diejenigen bestimmt, die am Thema interessiert sind.
Also passt das schon so.

postmaster-ino

Hi

Das Problem werden die Leute haben, Die erst in einigen Jahren Interesse dazu entwickeln - da ist 'also passt Das so' nicht mehr ganz so richtig.

MfG

Whandall

Die Bilder sind ja auch nur für diejenigen bestimmt, die am Thema interessiert sind.
Also passt das schon so.
Meine Hilfe ist auch nur für die bestimmt, die mir helfen, ihnen zu helfen.
Mein Nürnberger Trichter ist defekt.

Passt schon.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

fridi

Danke, grafisch habe ich das Problem auch gelöst. Mir geht es um die Umsetzung. Aber ich bleibe dran. Wie ich schon schrieb, ist scheinbar bei meiner Birne der Draht lose. Ich kann so ein paar Stunden nicht über dem Problem brüten. Aber was solls, ich werde das Problem auch lösen. Dauert dann etwas länge
r und ich muss da mit einem generellen Plan ran.

postmaster-ino

Hi

Wenn Du doch das Problem auf Papier bringen kannst - dann kannst Du auch diverse Winkel darin einzeichnen - und Die sind Alle berechenbar.
Du musst Dir nur klar sein, welche zwei Angaben Du hast, damit Du nach-und-nach die Anderen berechnen kannst.

MfG

P_Extruder

#87
Jun 30, 2018, 10:06 pm Last Edit: Jun 30, 2018, 11:16 pm by P_Extruder
...Mir geht es um die Umsetzung...
Ich nehme an, dass die Umsetzung in den Arduino-Code gemeint ist.
Denn zu berechnen gibt es eigentlich nichts. In meinem Beispiel macht SketchUp alle Berechnungen, aber jedes CAD-Programm kann das auch. Diese Werte (natürlich nicht in Metern) müssen doch nur in Schritte für den Stepper umgerechnet werden? Was an dem bei #75 angehängten Programm funktioniert den nicht wunschgemäß ?
Leider melden sich ja bisher nur Schulmeister, die schon x-Mal Gesagtes zu meiner Bilder-Schau wiederholen.

Zu dem von mir verlinkten Video gibt es ja schon den fertigen Code und der Autor kündigt auch eine Version an, die den "Lift" automatisch wieder in eine Nullposition fährt (nehme an in Höhe des Drehtellers).

Was geändert bzw. erweitert werden muss ist halt, dass bisher der Sensor nur waagrecht ausgerichtet ist. Die erforderliche Drehung wäre in meinem Beispiel immer 7,5° nur der "Lift" (in der Formel "motion" genannt) nimmt halt Stufe für Stufe so sehr zu, dass diese Methode für mich nicht in Frage kommt.

fridi

#88
Jun 30, 2018, 10:38 pm Last Edit: Jun 30, 2018, 11:44 pm by fridi
Ne, der Winkel ist immer ein anderer. Das ist nichts gleichmäßiges. Ich habe aber noch einmal überlegt. Die Hypotenusenlänge ist eigentlich egal. Es reichen die Entfernung und der Abstand vom Nullpunkt. Durch den rechten Winkel habe ich alle Daten. Danke für die Hilfeleistung. Ich werde das doch selbst versuchen. Ich will hier auch keinen Streit provozieren.

Edit:
Natürlich muss man das berechnen, da ja alle Werte wie Entfernung, Höhe des Objektes und Abtastrate variabel sind.Man kann natürlich in Sketchup ( habe ich auch gemacht ) alle Werte vorbestimmen, aber dann habe ich eine unendliche Menge an Daten. Das ist nicht praktikabel. Aber hier beim Schreiben sind mir dazu schon wieder einige Ideen gekommen. Man muss nur darüber sprechen. In meinem Stübchen sind das leider nur unreflektierte Monologe.

P_Extruder

#89
Jun 30, 2018, 11:01 pm Last Edit: Jun 30, 2018, 11:45 pm by P_Extruder
Ne, der Winkel ist immer ein anderer....
Der Neigungswinkel der Kamera in Richtung Zentrum des Objektes (in meinem Bild der Halbkreis) variiert freilich, nur vom Mittelpunkt des Objektes ist er bei mir immer gleich. Natürlich ist bei dieser Methode ein Blick direkt von oben ausgeschlossen. Schon bei 82,5° vom Objekt-Zentrum bzw. 7,5° von der Kamera zur Senkrechten aus gemessen müsste sich die Kamera bereits in über 1128 m Höhe befinden.

Alles andere ist schon in der Beschreibung von PhotoScan zu sehen.

p.s.: auch wenn´s außer mir niemanden zu interessieren scheint nochmal die Frage: was läuft denn bei dem Programm falsch oder nicht nach Wunsch?

Go Up