Go Down

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

Theseus

#15
Jun 07, 2018, 06:26 pm Last Edit: Jun 07, 2018, 06:27 pm by Theseus
Mein Windows 7 Calc hat keinen atan, dafür tanh.
Tanh ist der Tangens hyperbolicus. Das ist eine wenig benutzte Funktion. Du musst im Rechner auf <Inv> drücken. Dann berechnet er die inversen Funktionen (=Umkehrfunktionen).

Whandall

Ok, das unscheinbare Inv hatte ich bisher übersehen.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

fridi

#17
Jun 07, 2018, 08:08 pm Last Edit: Jun 07, 2018, 08:11 pm by fridi
Danke, Leute. Ihr habt mir sehr weitergeholfen. Bin natürlich bei der Variable in die INT Falle gelaufen. Welche Variable soll ich nehmen. Habe jetzt eine float Variable generiert.

Doc_Arduino

Hallo,

float ist schon richtig für Kommazahlen, alles andere sind Ganzzahldatentypen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

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?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Whandall

Ja, standardmäßig benutzen die trigonometrischen Funktionen in C(++)/Java/python/... Bogenmaß.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

fridi

#21
Jun 07, 2018, 08:52 pm Last Edit: Jun 07, 2018, 09:00 pm by fridi
Komischerweise bekomme ich keine Werte <1 angezeigt
Code: [Select]


  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"));




Doc_Arduino

#22
Jun 07, 2018, 09:01 pm Last Edit: Jun 07, 2018, 09:07 pm by Doc_Arduino
@ 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
Code: [Select]
float  Winkel=(1.0*Schleifer1/Schleifer2);

oder
Code: [Select]
float  Winkel= (float)(Schleifer1/Schleifer2);

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

fridi

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

Doc_Arduino

Hallo,

zeige mal bitte den lauffähigen Sketch der das Problem zeigt
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

fridi

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.

fridi

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.

Tommy56

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

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

Whandall

Meine Glaskugel zeigt: 16-Bit-Integer Überlauf, ist aber ziemlich verwaschen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

fridi

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


Code: [Select]
[
#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]

Go Up