-         

Ergebnis 1 bis 10 von 10

Thema: Unverständliche Konsolen-Anzeige

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235

    Unverständliche Konsolen-Anzeige

    Anzeige

    Hallo,

    bitte in die Antwort nicht viel Zeit investieren, ich such selber noch. Aber evtl. fällt euch spontan was ein.
    Der Code ist auch auf das Wesentliche gekürzt

    Code:

    float lzahn2;
    float lzahn2_alt = 98; // Ausfahrlänge von Zahnstange 2 nach Justierung
    float lzahn3;
    float lzahn3_alt = 67; // Ausfahrlänge von Zahnstange 3 nach Justierung
    float x1 = 344.67; // // Koordinaten von Punkt P1, den das Schaufelgelenk ansteuern soll
    float y1 = 184.45; //
    float W4;

    void setup() {

    Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
    while (!Serial);

    }

    void loop() {


    Serial.print ("Drehwinkel2 = ");
    Serial.println (Drehwinkel2_ber (),4); // Druckt Ergebnis des UPs mit 4 Stellen hinter dem Komma
    Serial.print ("Drehwinkel3 = ");
    Serial.println (Drehwinkel3_ber (),4); // Druckt Ergebnis von lzahn2 mit 4 Stellen hinter dem Komma
    Serial.print ("lzahn2 = ");
    Serial.println (lzahn2); // Druckt Ergebnis von lzahn2
    Serial.print ("lzahn3 = ");
    Serial.println (lzahn3); // Druckt Ergebnis von lzahn3

    delay(2000);

    }


    // **************************************Unterprogram m Drehwinkel2_ber *******************************


    int Drehwinkel2_ber ( ) {

    // hier Berechnung von delta_lzahn2

    int Drehwinkel2 = int(470.0 / 77.0 * delta_lzahn2);

    Serial.print ("Klammer = ");
    Serial.println (470.0 / 77.0 * delta_lzahn2); // Druckt Ergebnis von Klammer
    Serial.println (Drehwinkel2); // Druckt Ergebnis von Drehwinkel2

    delay(5000);
    return Drehwinkel2; // die Ausgabe erfolgt in Grad

    }


    // **************************************Unterprogram m Drehwinkel3_ber *******************************


    float Drehwinkel3_ber ( ) {


    // hier Berechnung von lzahn3 und Drehwinkel3

    int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3);

    return Drehwinkel3; // die Ausgabe erfolgt in mm

    }





    Auf der Konsole sehe ich dann sofort:

    Drehwinkel2 = Klammer = 469.53
    469 das ist nch ok

    dann nach 5 s
    13111 woher kommt die ?

    Im Code sind die Befehle, die zu diesen Ausgaben führen fett

    Gruß fredyxx

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    13111 sollte das Ergebnis der Funktion 'Drehwinkel3_ber' sein.
    int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3); Wo ist das 'delta_lzahn3' definiert?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    Sehr seltsam! Zunächst dachte ich, ich könnte den Fehler nicht wieder rekonstruieren, denn das Ergebnis entsprach genau meinen Erwartungen, nämlich:

    Drehwinkel2 = Klammer = 469.53
    469
    469
    Drehwinkel3 = 7.00
    lzahn2 = 174.92
    lzahn3 = 68.21

    Dann habe ich noch mal verglichen wie der Code oben genau aussah und festgestellt, dass ich die Angabe der Stellen hinter dem Komma/Punkt in diesen Befehlen weggelassen hatte:

    Serial.println (Drehwinkel2_ber (),4); und
    Serial.println (Drehwinkel3_ber (),4);

    Wenn ich die wieder eintrage, dann ist der Fehler wieder da; nämlich so wie oben

    Drehwinkel2 = Klammer = 469.53
    469
    13111
    Drehwinkel3 = 7.00
    lzahn2 = 174.92
    lzahn3 = 68.21

    Dabei reicht es auch, wenn ich die Stelleangabe nur bei dem Druckbefehl für "Drehwinkel2_ber ()" eintrage.

    Wenn nicht schon vorhanden, kann man bei so einem Fehler graue Haare bekommen.

    Nun fällt mir auch eine Erklärung ein:
    Ich erwarte von einer int-Zahl, dass sie Stellen hinter dem Komma hat; verleitet durch die Parallelrechnung in Excel

    Danke und Gruß
    fredyxx

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    ich hätte da vlt einen Tipp -
    aber vorher eine Frage: welchen Arduino hast du? einen Mega?
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    einen UNO für die Trockenversuche. Später einen MEGA

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    ok, für einen Uno ist meine Lösung nicht geeignet, wohl aber für einen Mega.

    Es geht um das unsägliche Serial.print mit seinen schauderhaften Formatiermöglichkeiten.

    In C nutzt man für Ausgaben den sehr mächtigen Befehl printf(), wenn man direkt ausgeben will, bzw. sprintf(), wenn man die Ausgabezeile erst einmal in einen Puffer-String kopieren will.
    Da eine direkte printf() Ausgabe bei Arduino Sketch nicht möglich ist, bleibt also nur sprintf(), und dann den Pufferstring per Serial.print (ohne weitere Formatierung).
    Beide C-Funktionen nutzen ein 100% identisches Formatiersystem.

    Aber:
    Die schlauen Arduino-Entwickler haben die Float-Ausgabe für sprintf() bei AVRs unterbunden. Will man sie nutzen, kann man aber die lib patchen.

    Das ist viel Aufwand und eine Menge Holz für einen Anfänger, und unsinnig für einen Uno, da zuwenig Speicher. Für einen Mega ist es den Aufwand aber wert.

    Statt
    Serial.print ("Drehwinkel2 = ");
    Serial.println (Drehwinkel2_ber (),4);

    hättest du dann
    char sbuf[100]; // string buffer
    sprintf(sbuf,"Drehwinkel2 = %.4f \n ", Drehwinkel2_ber () ); // sbuf zusammensetzen, evtl auch mit noch viel mehr Variablen und String-Bezeichnern
    Serial.print(sbuf);


    Das macht bei 1 string und 1 Variablen noch nicht viel aus, erleichtert aber erheblich die Formatierung bei komplexeren Aufgaben.

    Wie gesagt, sehr mächtig, ein wenig aufwändig, aber anschließend höchst effizient, und du siehst leichter, welche Variablen evtl falsch formatiert wurden (int vs. float).
    Hier ist die Beschreibung zu printf und sprintf:

    http://www.cplusplus.com/reference/cstdio/printf/
    http://www.cplusplus.com/reference/cstdio/sprintf/

    Wenn es dich interessiert, poste ich dir auch den Link zum Float-Patch für den Mega.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Ne andere Möglichkeit wäre erstmal Arduino beseite zu legen und sich einen freien Compiler und IDE zu installieren.
    Im Moment geht es ja eher darum welche Daten Du hast und wie Du sie strukturieren kannst. Außerdem welche Operationen auf diese Daten nötig sind und wie sich beides in C(++) ausdrücken läßt, so daß Du ein Berechnungsmodul hast, welches sich dann auch in der Arduino Platform benutzen läßt.
    Meiner Meinung nach ist das einfacher, denn wenn die Berechnung von Ein- und Ausgabe ordentlich getrennt ist, läßt sich das separat testen, da gibt's dann auch 'nen Debugger.

    So'n Consolenprogramm dann in Header und C(PP)-File zu zerlegen und dem Arduino Sketch bezufügen ist dann einfacher als 'ne System-Lib zu patchen.
    Im Moment geht's doch eher um's erlernen von C(++) und dann in weiteren Schritten den Spezifika der Arduino-Umgebung (ganz davon abgesehen das jeder Compiler-Upload-Lauf den µC unnötig 'verschleißt').

    Meine 50ct

    Gruß

    Chris

    P.S. Kannst Du bitte mal beide DrehwinkelBerechnungen komplett zeigen?!?
    Geändert von botty (23.05.2016 um 22:43 Uhr)

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    Danke für deine umfangreiche Info, aber z.Z. habe ich erst mal eine Menge anderer Probleme zu lösen.
    Es ist aber trotzdem gut zu wissen, dass es sowas gibt.

    Gruß
    fredyxx

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    @botty:
    das stimmt so nicht: die besagte System lib zu patchen ist überhaupt kein Problem - im Gegensatz dazu, auf die Arduino IDE mit ihren ganzen Libs zu verzichten oder gar
    ein Consolenprogramm in Header und C(PP)-File zu zerlegen und dem Arduino Sketch bezufügen, schon sehr.
    Das Patchen hingegen ist ein einfacher Kopierbefehl - aber es macht nur mit einem Mega Sinn.

    Ein Arduino Zero oder Due aber kann das alles bereits ohne jeden Patch, da klappt alles "von Haus aus".

    aber ich verstehe, wenn man als Anfänger erst mal andere Probleme hat.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    Zitat Zitat von hawe Beitrag anzeigen
    @botty:

    Aber ich verstehe, wenn man als anfänger erst mal andere probleme hat.
    danke!!!!!!

Ähnliche Themen

  1. [ERLEDIGT] MCP3551 - AD Wandler liefert unverständliche Daten
    Von Lutzacht im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 11.05.2014, 10:23
  2. LCD Anzeige
    Von elkokiller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 13.05.2008, 14:50
  3. LED-Anzeige
    Von Schnippsel im Forum Elektronik
    Antworten: 21
    Letzter Beitrag: 14.01.2008, 11:36
  4. 2D - LED-Anzeige
    Von squelver im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 23
    Letzter Beitrag: 05.03.2007, 15:29
  5. LED Anzeige
    Von Elektronikus im Forum Elektronik
    Antworten: 24
    Letzter Beitrag: 15.02.2005, 20:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •