Winkelberechnung mit Arduino UNO

Hallo,

muss jetzt nochmal nachfragen. tan liefert den tangens und atan liefert den Winkel. Nur leider liefert die Funktionen nur das Bogenmaß von dem Winkel. Deswegen musste Whandall das Ergebnis nochmal weiter behandeln. Das irretiert mich jetzt. Liefern alle Winkelfunktionen auf einem µC nur das Bogenmaß des Winkels zurück? Ich meine das steht zwar im direkten Zusammenhang, nur ist eben ein Bogenmaß nicht der Winkel. Versteht ihr meine Frage?

Ja, standardmäßig benutzen die trigonometrischen Funktionen in C(++)/Java/python/... Bogenmaß.

Komischerweise bekomme ich keine Werte <1 angezeigt

  int Schleifer = analogRead(Poti)+10;   //+10));//10);        // Für Fotomenge
  int Schleifer1 = analogRead(Poti1)+1;      // für Hebestrecke
  int Schleifer2 = analogRead(Poti2)+1;      // für objektentfernung
  Serial.print("Scannhoehe: ");            //Anzeigen der Scannhöhe
  Serial.print(Schleifer1);              //Anzeigen der Scannhöhe
  Serial.print(" "); 
  Serial.print("Entfernung: ");            //Anzeigen der Entfernung
  Serial.print(Schleifer2);              //Anzeigen der Entfernung
  Serial.print(" ");
float  Winkel=(Schleifer1/Schleifer2);
  Serial.print("Winkel: "); 
  Serial.print(Winkel); 
  Serial.println(" ");     

  

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

// Serial.println(F(" Grad"));

@ Whandall: jetzt ist alles klar, Danke
@ fridi, zeig mal den Sketch

Edit:
zeig mal bitte den lauffähigen Code der falsche Werte liefert

Edit 2:
ich ahne, du meinst deinen Winkelwert, dass liegt am fehlenden Typcast

so

float  Winkel=(1.0*Schleifer1/Schleifer2);

oder

float  Winkel= (float)(Schleifer1/Schleifer2);

Komischerweise habe ich den Fehler schon beim Teilen der Poti Einstellungen.

Hallo,

zeige mal bitte den lauffähigen Sketch der das Problem zeigt

Jetzt gehts. das mit dem 1* wars. Ich muss den Wert nur noch von 90° abziehen und der Winkel stimmt.

Danke danke für die Hilfe. Den Rest werde ich wohl auch noch schaffen. Händisch geht der Scanner ja. Nun muss ich mir überlegen, wie ich den Bogen in variablen Höhen konstruiere.

Moin moin aus HU.
Jetzt muss ich doch noch einmal Nerven.
Meine Stepper machen mit einer TR8 Gewindestange 2mm Höhe pro Umdrehung. Meine Potis ermitteln einen Wert von 0 bis 1023.

Der Potiwert soll die Höhe des zu scannenden Objekts angeben. Eine Umdrehung des Motors sind 6400 Steps. Wenn ich nun den Wert der Steps bei einer Höhe von zB. 1000 mm errechne, soll dann der Wert 1000* 6400/2 = 6400000 Steps betragen. Der Monitor zeigt mir aber einen kleineren Wert mit negativem Vorzeichen an.
Ist das nur ein Darstellungsproblem oder ein Rechenfehler.

Ohne einen aktuellen Stand Deines Sketches wird da keiner etwas sinnvolles sagen können.

Gruß Tommy

Meine Glaskugel zeigt: 16-Bit-Integer Überlauf, ist aber ziemlich verwaschen.

Ich habe long Variablen generiert, weil die Werte zu groß werden.

[
#define Poti 0                  // A0    Abort
#define Poti1 3                 // A3   CoolEn
#define Poti2 5                 // A5 separat angelötet
// --------------------PIN Benennung----------------------------------
int Kamera=10;                  // Kameraauslöser Servosteuerung alt Y Endstop
//int Servo2=11;                // frei                        alt Z endstop
int StepStpHoch=4;              // step Hoch                    alt step z
int StepStpDreh=3;              // Step Drehen  Dreehteller     alt step y 
int StepStpKipp=2;              // Step  Kippen                 alt step x  
int StepDirHoch=7;              // Die Hoch  Hoch               alt z Dir
int StepDirDreh=6;              // Drehteller                   alt y DIR
int StepDirKipp=5;              // Kippen                       alt x Dir
int StepAllEna=8;               // alle Stepper einschalten
int EndstopHoch=9;              // Endstop x Achse              alt Endstop X
int Start=15;                    // schwarz    A1              Hold
int TastePlusMinus=16;           // Gelb       A2               resum
int TasteHochtief=12;           // grün   Hoch/tief             alt enable spin
int TasteKippen=13;             // braun  Kippen                alt spin dir
//----------------------------Variablen----------------------------------
int Umdrehungssteps=6400;                 //6443 Umdrehungen Teller hier 2 x 360°  12886
int Tempo=10;                   // Umdrehungsgeschwindigkeit
int Hub=1;                      //Hubgeschwindigkeit
int Kipp=3;                     //Kippgeschwindigkeit
int Klick=0;
int Servopause=1500;            //Zeit für die Einstellung des Servos auf Klick
int Fotomenge=0;                // Fotos pro Umdrehung  
int Speicherpause=3500;         //Die Zeit. die ein Foto digital abgespeichert wird
int Bildmenge=0;                // bildmenge pro Umdrehung waehlen
int Hoehe = 0;                  // Hoehe des Modells
int Ebene = 0;                  //Fotoebenen
int Drehsegment=0;              // Menge der Schritte pro Foto
int Step =0;                    //Umdrehungszähler
float Winkel=0;
long Stepshoehe=0;              //Steps der Höhe
long Stepsentfernung = 0;       // Steps der Entfernung
long Kippwinkel = 0;            //Kamera kippen





void setup()                           

{
 Serial.begin(9600);
 pinMode(Poti,INPUT);             
 //--------------------Ausgabe/ Lesen/Schreiben--------------------------
  // Pin Funktion einstellen
  pinMode(Kamera, OUTPUT);        // rRXals digital für Kamerasteuerung
  pinMode(1, OUTPUT);             //TX als digital-   für Kamerasteuerung  
  pinMode(StepAllEna, OUTPUT);
  pinMode(StepDirHoch, OUTPUT);
  pinMode(StepStpHoch, OUTPUT); 
  pinMode(StepDirDreh, OUTPUT); 
  pinMode(StepStpDreh, OUTPUT);  
  pinMode(StepDirKipp, OUTPUT);  
  pinMode(StepStpKipp, OUTPUT); 
  pinMode(EndstopHoch,INPUT);      // Endstop für Spindel unten  alt X Endstop   
  pinMode(Start,INPUT);            // Start Knopf      alt Y Endstop
  pinMode(TastePlusMinus,INPUT);   // Plus Minus      alt Z endstop
  pinMode(TasteHochtief,INPUT);    // Hoch/tief       alt enable spin
  pinMode(TasteKippen,INPUT);      // Kippen          alt spin dir

  // Pullup Widerstände für die Tasten einschalten
  pinMode(EndstopHoch, INPUT_PULLUP);       //9 Pullup ein 
  pinMode(Start, INPUT_PULLUP);             //10 Pullup ein 
  pinMode(TastePlusMinus, INPUT_PULLUP);    //11 Pullup ein 
  pinMode(TasteHochtief,INPUT_PULLUP);      //12 Pullup ein 
  pinMode(TasteKippen, INPUT_PULLUP);       //13 Pullup ein  
  digitalWrite(StepAllEna,HIGH);            // set Ena aus 

}
//---------------------------------Programmablauf----------------------
void loop(){ 

//.................Anzeigen der Potieinstellungen..............
  int Schleifer =  analogRead(Poti)+10;     //+10));//10);        // Für Fotomenge
  int Schleifer1 = analogRead(Poti1);     // für Objekzhoehe
  int Schleifer2 = analogRead(Poti2);     // für objektentfernung
  Stepshoehe = Schleifer1 * 3200;            // 1mm Höhe je Analog Wert
  Stepsentfernung = Schleifer2 *3200;       // 1mm Entfernung je Analog Wert
  
  
  
  
  Serial.print("Hoehe: ");            //Anzeigen der Scannhöhe
  Serial.print("Steps ");            //Anzeigen der Scannhöhe
   Serial.print(Stepshoehe);              //Anzeigen der Scannhöhe
  Serial.print(" "); 
  Serial.print(Schleifer1);              //Anzeigen der Scannhöhein mm
  Serial.print("mm  ");

  Serial.print("Entfern: ");            //Anzeigen der Entfernung
  Serial.print(" Steps= ");
  Serial.print(Stepsentfernung);              //Anzeigen der Entfernung
   Serial.print(" ");
  Serial.print(Schleifer2); 
  Serial.print(" mm");



/code]
  int Schleifer1 = analogRead(Poti1);     // für Objekzhoehe
  int Schleifer2 = analogRead(Poti2);     // für objektentfernung
    Stepshoehe = Schleifer1 * 3200;            // 1mm Höhe je Analog Wert
    Stepsentfernung = Schleifer2 * 3200;       // 1mm Entfernung je Analog Wert

Wie wäre es mit

  Stepshoehe = Schleifer1 * 3200L;            // 1mm Höhe je Analog Wert
  Stepsentfernung = Schleifer2 * 3200L;       // 1mm Entfernung je Analog Wert

Hi

Warum L und nicht UL?
(werde negative Werte benötigt?)

MfG

Danke Danke. Das hat geholfen. Da wäre ich im Leben nicht drauf gekommen. Jetzt beim Nachlesen ist das klar.
Ja, es kommen auch negative Werte vor, wenn der Schlitten unter das Objekt fährt.

postmaster-ino:
Warum L und nicht UL?
(werde negative Werte benötigt?)

Keine Ahnung ob die benötigt werden, das Programm ist jedenfalls dafür ausgelegt

long Stepshoehe=0;              //Steps der Höhe
long Stepsentfernung = 0;       // Steps der Entfernung
  int Schleifer1 = analogRead(Poti1);     // für Objekzhoehe
  int Schleifer2 = analogRead(Poti2);     // für objektentfernung
  Stepshoehe = Schleifer1 * 3200;            // 1mm Höhe je Analog Wert
  Stepsentfernung = Schleifer2 *3200;       // 1mm Entfernung je Analog Wert

Da würde ein UL doch eher komisch wirken und u.U. Warnungen hervorrufen, da finde ich

 Stepshoehe = Schleifer1 * 3200L;            // 1mm Höhe je Analog Wert
  Stepsentfernung = Schleifer2 * 3200L;       // 1mm Entfernung je Analog Wert

logisch passender.

Mal zur Erklärung, was ich vor habe.
Das Objektive wird auf die Mitte des Objektes ausgerichtet, Dann fahre ich auf die halbe Höhe runter + 5cm.Dort den Winkel des Fotoapparates einstellen. Das Objekt macht eine 360° Umdrehung und dort werden dann die vordefinierten Fotomengen gemacht Danach fährt der Schlitten eine Strecke nach oben. Wie viel, weiß ich noch nicht. Dann wieder eine Fotosequenz. Das geht dann bis auf 5cm über das Objekt.
Händisch geht das ja schon alles, aber automatisch ist besser. Zudem will ich auch noch ein Display einbauen, wo ich die Höhe, Entfernung und Bildermenge ablesen kann. Mit dem Editor ist das lästig und nicht autonom.
Da werde ich Euch sicherlich noch mal nerven, wenn ich das nicht nachgelesen bekomme. Ich muss dafür wohl eine LIB einbinden wie bei meinem 3D Drucker. Schauen wir mal.

Hallo fridi,
vielleicht steht es ja schon irgendwo, aber bei soviel Formeln krieg ich eine Leseschwäche. Vermute ich richtig, dass Du Photogrammetrie vereinfachen willst ? Als glücklicher Besitzer von Agisofts PhotoScan habe ich mich bisher begnügt meine "Fotos" aus GoogleEarthPro zu beziehen, weil GE in meiner Gegend dazu geeignete Luftaufnahmen bietet.
Bis 500 Bilder habe ich schon zu einem druckbaren Objekt verarbeitet.

Bei kleinen Objekten, für die Dein Projekt für mich taugen würde, muss ich noch an der Aufnahmetechnik basteln. Da ich noch absoluter Arduino-Neuling bin hatte ich bisher an eine rein mechanische Lösung per Malteserkreuz gedacht. Da könnte es aber Probleme geben, weil sich die Bilder ja weder zu viel noch garnicht überlappen dürfen. Wer wissen will was ich meine, der findet bei Agisoft einschließlich Demo-Version alles Nötige (ausgenommen Speicherung als STL, OBJ usw. - das bleibt der Bezahlversion vorbehalten).

Auf alle Fälle bin ich auf Deine Erfolgsberichte gespannt !

p.s.: mein Drucker ist ein RF1000; da kämpfe ich gerade darum, neue Firmware aufzuspielen.

Moin Extruder. Ich bin auch hier drin. Low Budget 3D Scan | Facebook
Agisoft habe ich mir auch gekauft. Ist die beste Lösung. Alles in einem. Meine Scanns funzen händisch. Dh, ich stelle den Winkel und die Höhe händisch mit den Steppern ein und der Scann in der Ebene läuft automatisch. Ich meine, dich auch in diesem Forum schon gelesen zu haben.

Was ich jetzt festgestellt habe, ist, dass ich mit dem Uno an die PIN Grenzen komme. Ich werde jetzt auf den MEGA 2560 ausweichen Die sind Pin kompatibel.. Habe davon noch einige liegen. Das Einbinden des Displays scheint nicht so schwierig zu sein, nach dem, was ich nachgelesen habe.

fridi:
... Ich meine, dich auch in diesem Forum schon gelesen zu haben.

Ausgeschlossen - war mein erster Beitrag hier. Habe aber wohl richtig geraten.
Bin meistens hier : http://3d-drucker-community.de/ - da wird man zuverlässig über neue Beiträge informiert.
Dass hier die IP aller Welt preisgegeben wird ist ja ein Unding. Da werde ich mich in Zukunft lieber auf´s Lesen beschränken.

P_Extruder:
Dass hier die IP aller Welt preisgegeben wird ist ja ein Unding. Da werde ich mich in Zukunft lieber auf´s Lesen beschränken.

Dir ist schon aufgefallen, daß Du angemeldet nur Deine eigene IP siehst, die eh ÜBERALL mitgeloggt wird, egal wo im Netz?!

Gruß André