Go Down

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

michael_x

Quote
before 'if'
deutet an, dass der Fehler vermutlich vor der Zeile liegt, die du "gezeigt" hast.

Immherhin, du hast die Fehlermeldung geliefert, sogar als Text.
Gibt Experten die stattdessen einen Screenshot als Bild oder gar Handy-Video oder nur "bringt eine Fehlermeldung" als Beschreibung bringen.

fridi

Habe nun doch den UNO genommen. Hatte noch einen versteckten Pin gefunden. Ich hatte da reingeschrieben (Reserviert ). Wer lesen kann ist stark im Vorteil.
Das Display geht auch schon, nur das Gelb ist etwas hell.
Hier wird mir der Fehler angezaigt:      if(digitalRead(TasteKippen)==LOW)      //Unterprogramm Kamera kippen
exit status 1
expected unqualified-id before 'if'

Code: [Select]


//#include <LiquidCrystal_I2C.h>

#include <Wire.h> //Wire.h Bibliothek einbinden
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C.h Bibliothel einbinden
LiquidCrystal_I2C lcd1(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Hier wird
                //Display 1 als lcd1 benannt, die Adresse angegeben „0x27" und die
                //Pinnbelegung durch das I²C Modul angegeben

#define Poti 0                  // A0    Abort
#define Poti1 3                 // A3   CoolEn
#define Poti2 2                 // A2 alt enable spin
// --------------------PIN Benennung----------------------------------
int Kamera=10;                  // Kameraauslöser
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=11;           // Gelb       alt Z endstop            resum
int TasteHochtief=12;           // grün   Hoch/tief             alt enable spin
int TasteKippen=13;             // braun  Kippen                alt spin dir
//  I2C Bus1 A4
//  I2C Bus2 A5
//----------------------------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()                          

{
lcd1.begin(16,2);             //Display 1 wird gestartet und die Größe des Displays
                              //wird angegeben(16 Zeichen, zwei Zeilen)
lcd1.backlight();             //Beleuchtung Display 1 einschalten  
  
 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 an

}
//---------------------------------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 * 3200L;            // 1mm Höhe je Analog Wert
  Stepsentfernung = Schleifer2 *3200L;       // 1mm Entfernung je Analog Wert
  Fotomenge=Schleifer/10;
    // LCD Ausgabe........................................................
  lcd1.setCursor(0,0); //Ab hier kann das I2C LCD Modul genau wie das einfache
                       // LCD Modul programmiert werden.
  lcd1.print("                 ");          // Zeile löschen
  lcd1.setCursor(0,0);
  lcd1.print("Hoe:");
  lcd1.print(Schleifer1);
  lcd1.setCursor(8,0);
  lcd1.print("Ti:");
  lcd1.print(Schleifer2);
  lcd1.setCursor(0,1);
  lcd1.print("                 ");           // Zeile löschen
  lcd1.setCursor(0,1);  
  lcd1.print("Bilder:");
  lcd1.print(Fotomenge);

  Serial.print("TastePlusMinus: ");
  Serial.print(digitalRead(TastePlusMinus));
  Serial.print(" ");
  Serial.print("Start: ");
  Serial.print(digitalRead(Start));
  Serial.print(" ");  
  Serial.print("TasteHochtief: ");
  Serial.print(digitalRead(TasteHochtief));
  Serial.print(" ");
  Serial.print("TasteKippen: ");
  Serial.print(digitalRead(TasteKippen));
  Serial.println(" ");
      
//  Serial.print(F("Arkustangens von Winkel "));
//  Serial.print(atan(Winkel));
//  Serial.print(" ");
//  float  Winkel=(1.*Schleifer1/Schleifer2);  
//  Serial.print(F(" das entspricht "));
//  Serial.print(atan(Winkel) * 360 / (2 * PI));
//  Serial.println(F(" Grad"))//;
 
  //.............. Einstellung für Bildmenge..................


  Drehsegment=Umdrehungssteps/Fotomenge;
//........................................................

  
  digitalWrite(StepAllEna,LOW);                // Motoren an
    if(digitalRead(Start)==LOW)            //Unterprogramm Teller drehen
    {
      if (digitalRead(Start)==LOW)               //Unterprogramm Teller drehen
      while(Start==LOW);                    //Entprellen und Doppeldruck unterdrücken
      {
      }
    }
    if(Schleifer1==0)
    {
//      Drehen();
    }
     else
    {    
//      Kontur();
    }
}  
//.............................Heben einleiten...............  
    if (digitalRead(TasteHochtief)==LOW)   //Unterprogramm Hoch/Tief fahren/
    {
//      Heben();
    }
//.............................Kippen einleiten...............  
    if(digitalRead(TasteKippen)==LOW)      //Unterprogramm Kamera kippen
    {
 //     Kippen();
    }
 
}



postmaster-ino

Hi

Drück Mal STRG+T

Dann wird Dir auffallen, daß die schließende Klammer über 'Heben einleiten' bereits ganz links steht.

Du hast Da wohl eine Klammer-Zu zu viel.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

uxomm

Die letzten Zeilen des Codes sind ausserhalb von loop.

Code: [Select]

...
 if (Schleifer1 == 0)
  {
    //      Drehen();
  }
  else
  {
    //      Kontur();
  }
}   // <-- das ist die schließende Klammer von loop

// alles was danach kommt ist ausserhalb und der Grund für die Fehlermeldung


//.............................Heben einleiten...............
if (digitalRead(TasteHochtief) == LOW) //Unterprogramm Hoch/Tief fahren/
{
  //      Heben();
}
//.............................Kippen einleiten...............
if (digitalRead(TasteKippen) == LOW)   //Unterprogramm Kamera kippen
{
  //     Kippen();
}

}

Always decouple electronic circuitry.

Doc_Arduino

Hallo,

in Zeile 160, nach Kontor() ist die Klammer zu viel
und zusätzlich das Semikolon der while Zeile 148 muss weg
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

#50
Jun 15, 2018, 08:24 pm Last Edit: Jun 15, 2018, 08:45 pm by fridi
Jungs, ihr seid ja so gut. Dankeschön. Ich hatte das komplett durchsucht, aber scheinbar immer übersehen.
Das mit den Klammern und Semikola ist aber auch gewöhnungsbedürftig. Immer die gleichen Fehler.
Habt ihr da nen Trick, um so was zu finden?Ich habe mir den Wolf gesucht zumal die Fehlermeldungen ja nicht gerade aussagefähig sind.

uxomm

Ein paar "Tricks" wurden schon erwähnt:
- ausführlichen Warnungen einschalten
- Auto-Formatierung mit STRG+T
Always decouple electronic circuitry.

Doc_Arduino

Hallo,

mach mal die falsche Klammer wieder rein und gehe mit dem Cursor danach direkt hinter die Eröffnungsklammer von loop. Dann scrollste langsam nach unten guckst welche Schließklammer dir die IDE zugehörige anzeigt. Dann machste die falsche Klammer weg und guckst nochmal.

Bei Verdacht auf Klammerfehlern gehe immer alle durch dort wo ich zuletzt Code geschrieben oder geändert habe.
Eine gute Code Formatierung ist dabei viel wert.

Das falsche while Semikolon wird nicht als Fehler erkannt. Wäre fehlerfreier Syntax, nur die Wirkung vom Code ist damit verfälscht. Wenn man das wirklich bewusst mal so schreibt, sollte man das für später kommentieren.
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

michael_x

Quote
Code: [Select]
    if(digitalRead(Start)==LOW)            //Unterprogramm Teller drehen
    {
      if (digitalRead(Start)==LOW)               //Unterprogramm Teller drehen
      while(Start==LOW);                    //Entprellen und Doppeldruck unterdrücken
      {
      }
    }

Quote
zusätzlich das Semikolon der while Zeile 148 muss weg
Das verändert gar nichts.
Ist so oder so Schrott.

fridi

Wieso ist das Schrott. Wenn ich das nicht mache, läuft der Tastendruck ins Untermenü und stopt dort den Ablauf. Es ist ja eine Start/Stop Taste. Richtiges Entprellen geht natürlich anders.

Doc_Arduino

Hallo,

du musst den Taster entprellen. Danach schaltest du mit dem "entprellten Signal" eine Statusvariable einfach nur um. Andere sagen toggeln dazu. Dann haste eine Schalterfunktion und nicht die Tasterfunktion.

@ micha:
Ja okay, dass Semikolon macht den Anweisungsblock überflüssig, weil dieser hier leer ist macht das nichts, angewöhnen sollte man sich das dennoch nicht, sonst wundert man sich nur noch was schief läuft.
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

P_Extruder

... Ist so oder so Schrott.
Ich äußere mich mal zum anderen "so" : https://youtu.be/ne7okNbXym0

Wenn man sieht wie Sanladerer da mit den Tücken der Objekt-Positionierung kämpft, dann kann man das Projekt von Fridi nur begrüßen.
Da man aber tunlichst vermeiden sollte dass sich der Abstand zum Objekt durch den vertikalen "Aufzug" mit jeder Reihe ändert, habe ich mir einen Halbkreis aus Holz gebastelt. Da bleibt der Abstand stets gleich und jede Winkelberechnung wird überflüssig.

fridi

#57
Jun 16, 2018, 09:48 pm Last Edit: Jun 16, 2018, 10:18 pm by fridi
Die Abstandsveränderung ist nicht so schlimm. Wichtig ist, dass sich die Fotoeinstellung nicht verändert. Ich mache die Fotos ja von Hand mit dem gleichen Prinzip und des geht. Das Programm Agisoft liest die Metadaten des Fotos aus und kann das dann berücksichtigen. Zudem hat man bei dem Halbkreis auch eine Veränderung zum Objekt. Bei der Figur ist der Kopf von unten gesehen erst weit weg und dann von oben dicht dran.
Bei großen Objekten oder kleinem Kreis sind die Abweichungen noch größer.
Und wenn ich den Sanladerer drucken sehe, wird mir ganz schlecht. Zudem ist die X Box Kinect völlig ungeeignet für kleine Sachen

fridi

Um noch mal auf den "Fehler" mit dem Semikolon in der While Schleife zurück zu kommen. Lasse ich das Semikolon weg, bekomme ich eine Fehlermeldung. Also ist das Setzen des Semikolons nicht falsch?

Doc_Arduino

Hallo,

schlag mal die while Funktion auf. Es gehört kein Semikolon dorthin. Da ich deine lcd lib nicht habe, lösche ich alles was lcd betrifft raus, entferne die falsche Klammer und das falsche Semikolon und es kompiliert fehlerfrei. Wennn das bei dir nicht fehlerfrei kompiliert, dann musst du demzufolge etwas anders machen.  Ich hätte es letztens nicht geschrieben wenn es nicht fehlerfrei kompiliert hätte.
Die Frage wäre welche Fehlermeldung du bekommst. Sketch samt Fehlermeldung zeigen wäre jetzt gut. Dann können wir alle erneut drüberschauen.
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

Go Up