- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 30

Thema: Ich brauch professionelle Hilfe bei Programmierung meines Kranes

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Du muss den Interrupt wieder abschalten und die Led anschließend ausschalten. Wenn du nur den Interrupt abschaltest könnte es sein das die Led eingeschaltet bleibt.

    Ansonsten würde ich empfehlen nicht einfach zusammen kopieren sondern Programme versuchen zu verstehen und im eigenen Programmierstil umzusetzten.

    Ich weiß zwar nichts über arduino (bzw programmiersoftware), aber im AVR Studio kann man einstellen wieviel ein Tabulatorsprung ist und ob diese in leerzeichen umgewandelt werden sollen. Vielleicht gibt es auch bei arduino so eine Einstellung.

    MfG Hannes

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    46
    Beiträge
    1.369
    Da es sich anscheinend um eine Demofunktion handelt würde versuchen an der Seilrolle eine Odometriescheibe oder ahnliches Verfahren anzubringen und direkt an der Rolle per Interrupt messen wie viele cm Seil abgerollt/aufgerollt wurden.
    Bei ereichen eines vorher definiertem Wert hört die Seilwinde dann auf. Beachtem muss mann das man je nach Drehrichtung addiert oder subtrahiert. Aber da du ja eh Relais ansteuerts sollte es kein Problem darstellen das im programm mit zu erfassen.
    Die LED soll/braucht vermutlich nicht so ganz genau im Sekundentakt blinken, dann reicht es hier die millis-Funktion zu nutzen.

    Der nachfolgende Code ist für ein openCM9-Board welches auch mit Sketch/Arduino-IDE programmiert werden kann, und muss ggf angepasst werden:
    Code:
    millis()
     : Returns the number of milliseconds since the Arduino board began running the current program. 
     This number will overflow (go back to zero), after approximately 50 days.
     */
    
    // Variables:
    long previousMillis = 0; // will store the last time the LED was updated
    int interval = 1000;  // interval at which to blink (in milliseconds)
    
    void setup() {
      // Set up the built-in LED pin as output:
      pinMode(BOARD_LED_PIN, OUTPUT);
    }
    
    void loop() {
      // Check to see if it's time to blink the LED; that is, if the
      // difference between the current time and last time we blinked
      // the LED is bigger than the interval at which we want to blink
    
      if ((int)millis() - previousMillis > interval) {
        // Save the last time you blinked the LED
        previousMillis = millis();
    
        // If the LED is off, turn it on, and vice-versa:
        toggleLED();
      }
    }
    Es gibt auch noch andrere Lösungen die wo ein Interrupt alles 50ms ausgelöst wird und dann zwei Werte hochzählt (LED und Winde) und dann jenachdem das Programm abzweigt. Allerdings wird bei einem zeitlichen Ablauf der Seilwinde vermutlich immer wieder das Problem entsehen das die position nicht passt.

    Einfache Endanschläge ( auch optische) könnten praktisch auch funktionieren. Allerdings kommt es darauf an wie gut man die hinzugefügt bekommt. Besonders beim Haken senken könnte es problematisch werden.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Kannst du auch diesen "TimerOne.h" Datei hochladen? sonnst können wir das nicht Kompilieren.

    Oder ist das diesen Library?
    https://github.com/PaulStoffregen/TimerOne

    - - - Aktualisiert - - -

    Oder einer von diese 2:
    http://code.google.com/p/arduino-tim...downloads/list

    - - - Aktualisiert - - -

    Wo sind s1 und s2 definiert in deine Code? Mein Arduino IDE meckert darüber beim Kompilieren.

    - - - Aktualisiert - - -

    Mechanisch funktioniert er und mit meinem geschriebenen Programm läuft er mit einigen Mängeln.
    Könnte von Euch mal jemand ein Auge auf meinen Sketch werfen und mir mit Ideen zur Verbesserung weiterhelfen?
    Dann verwundere ich mich wie du diesen Mängeln behebst. Ich verstehe nicht wie du diesen Code auf dein Arduino hochgeladen hast. Ich sehe auf verschiedene stellen Code das nicht funktionieren/kompilieren kann.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2015
    Ort
    Bayern
    Beiträge
    17
    Hallo und danke erstmal für eure Zeit die ihr mir spendet
    Ich habe den ersten Timer aus der Libary (https://github.com/PaulStoffregen/TimerOne)

    s1 Ist an Pin 4 und ist das Schaltsignal von der Fernsteuerung
    s2 Ist an Pin 6 und ist ein Endschalter welcher am Zahnrad des Kran befestigt ist (zum Krandrehen), damit kann ich feststellen ob der Kran in der Drehbewegung in Grundstellung ist, Seil wird nicht abgefragt

    Das musste ich machen da der Kran sonst in jeder beliebigen Position das Programm beginnen kann. Der Steppermotor hat keine Stellungsabfrage integriert.

    Das Seilabrollen ist nicht sehr problematisch. Die Tauchtasse wird nur auf dem Deck abgestellt und an der anderen Position ins Wasser abgelassen. Da kommt es also auf ein paar millimeter nicht an. wichtig ist aber das Aufrollen, da der Haken den Arm berühren soll und diesen dann leicht mit anheben.

    Die LED soll ab Startsignal blinken und wenn der Durchlauf beendet ist auch aufhören.

    Noch zur Info ich benutze einen Arduino Uno.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.213
    Das mit dem Seil wirst du mit Zeitsteuerung _nie_ in Griff bekommen. Motoren drehen sich ohne Regelung praktisch niemals reproduzierbar. Und für ne Regelung brauchst du ein Feedback.
    Sinnvoll wäre hier sowas wie ein Mikrotaster, der dann gedrückt (oder losgelassen) wird, wenn der Haken den Kranarm bis Anschlag hochgezogen hat. Alternativ auch hier ein Schrittmotor, bei dem du die Umdrehungen mitzählen kannst-aber auch das geht daneben, wenn das Seil mal _etwas_ anders aufgewickelt wird.
    Besser ist es in jedem Fall, die Endposition des Armes auszuwerden. Statt nem Taster kannst du hier zum Beispiel auch ne Lichtschranke benutzen, die in der Endposition unterbrochen wird, je nachdem, was sich besser nachrüsten lässt.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2015
    Ort
    Bayern
    Beiträge
    17
    Danke Sly, ich hab mir das schon gedacht und mir schon einige Gedanken gemacht. es müsste mit einem Reedkontakt funktionieren, der am Kranausleger befestigt ist und vom am Haken befestigten Magneten ausgelöst wird. Ich dacht mir Haken oben( Kontakt geschlossen) Grundstellung Haken. aber bei einem Kran im Maßstab 1:45 ist das auch nicht ganz so einfach zu lösen ohne das Aussehen des Kranes zu sehr zu verändern. Eventuell geht auch ein kleiner Microschalter, muss ich mal schauen was es so gibt.
    ich bin erstmal dabei mein Programm aufzuräumen und so zu laufen zu bringen wie ich es mir vorstelle.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Ok,

    Ich habe S1 und S2 definiert wie du angegeben hat. Aber mit Großbuchstaben S, weil klein nicht erlaubt ist. (Verstehe ich auch nicht warum.) Jedenfals nicht ein einziges Kleinbuchstabe s (mit oder ohne weitere Nummer):

    Und naturlich jeder stelle von s1 und s2 in den Code geändert zu S1, S2.
    Code:
    #define S1 4
    #define S2 6
    Und dann Kompiliert den IDE den Code ziemlich ohne Problemen. Ja, den Kompiler hat es Prima gefunden. Leider nicht für den Code-Polizei.

    Weil du auf verschiedene stellen ein if-Befehl macht wie das hier:

    Code:
    if (Kranstart,HIGH)  digitalWrite (RELAISAUF, HIGH);
    Den Komma ist ein gültige Operator, aber es wird nicht ausgewertet wie du wahrscheinlich möchtest. (ausführen wenn Kranstart pin HIGH ist, oder nicht wann es LOW ist) Bei einer derartige if-Befehl wirdt den Komma-operator die erste Gesetzen vor den (letzte) Komma jedenfalls ausführen (den Variabel Kranstart macht nichts alleine). Aber nur das letzte Gesetz hinter der Komma wird für den Entscheidung sorgen. (HIGH=1, und alles was nicht gleich 0 ist wird immer als Wahr gekennzeichnet) Alles da vorne macht nichts dazu. Also was hier oben steht ist:

    Code:
    if ( 1!=0 )  digitalWrite (RELAISAUF, HIGH);  //      '1 ist nicht gleich an 0'
    Deshalb wird das digitalWrite jedenfalls ausgeführt. Nur nicht wenn den Variabele Kranstart die wert 0 bekommen hat.

    Die richtige Verwendung von ein if Befehl ist:
    Code:
    if ( digitalRead(Kranstart)==HIGH ) digitalWrite (RELAISAUF, HIGH);
    Das gleiche passiert bei den while- loop am ende. Das hat nähmlich auch ein Quasi-if-Befehl in sich.
    Code:
    while(S2,HIGH);
    Das ist ein Endloss-schleife, und dein Programm wird da niemals rauskommen. Arduino loop() wirdt nicht weiter loop-en.

    Ok, dann haben wir nun die Logik Befehlen korrigiert. Dann stimmt es doch? Nein leider noch nicht.

    Zurück zum anfang von den loop() Funktion:
    void loop()
    { //Anfang der loop-Funktion

    value = digitalRead(S2); // Endschalter wird eingelesen

    digitalWrite(Kranstart,value); // Warte mall!! Kranstart ist als int definiert, und hat den wert HIGH (1) bekommen. Das ist doch kein Pin-bezeichnung!!!
    // das ist gleich: digitalWrite(1, value); Wird kommisches verhalten geben mit den Seriele port (TX) Keine ahnung was Kranstart hier bedeuten soll.


    { // Wieso alles hiernach in ein {} scope einfassen? Sollte den { nicht gerade nach den ) kommen?

    if ( digitalRead(Kranstart)==HIGH ) digitalWrite (RELAISAUF, HIGH);

    // Hier ist das if-Befehl schon am ende, wegen der ; am ende des if-Befehls, und den fehlende { dazwischen. Alles hiernach wird jedenfalls ausgeführt.


    delay(2600);
    digitalWrite (RELAISAUF, LOW);
    delay(2000);

    myStepper1.step(-3600); //Kran ausdrehen (Winkel einstellen)
    delay(2000); //Warten
    digitalWrite (RELAISAB, HIGH);
    delay(13000); //Seil ab für 13 sec
    digitalWrite (RELAISAB, LOW);
    delay(20000);

    digitalWrite (RELAISAUF, HIGH);
    delay(13000);
    digitalWrite (RELAISAUF, LOW);
    delay(2000);


    myStepper1.step(3600); //Kran eindrehen
    delay(3000);

    digitalWrite (RELAISAB, HIGH);
    delay(2600);
    digitalWrite (RELAISAB, LOW);
    delay(5000);
    } // Ende von if-Befehl Wahr-code

    {
    while(S2,HIGH); //Aber nür eines mall! Hängt hier ab. Gleich wie bei if Korrigieren.
    }
    } //Ende von loop()
    - - - Aktualisiert - - -

    Ok,

    Ich habe S1 und S2 definiert wie du angegeben hat. Aber mit Großbuchstaben S, weil klein nicht erlaubt ist. Jedenfals nicht ein einzige Kleinbuchstabe s (mit oder ohne weiteres Nummer):

    Und naturlich jeder stelle von s1 und s2 in den Code geändert zu S1, S2.
    Code:
    #define S1 4
    #define S2 6
    Und dann Kompiliert den IDE den Code ziemlich ohne Problemen. Ja, den Kompiler hat es Prima gefunden. Leider nicht für den Code-Polizei.

    Weil du auf verschiedene stellen ein if-Befehl macht wie das hier:

    Code:
    if (Kranstart,HIGH)  digitalWrite (RELAISAUF, HIGH);
    Den Komma ist ein gültige Operator, aber es wird nicht ausgewertet wie du wahrscheinlich möchtest. (ausführen wenn Kranstart pin HIGH ist, oder nicht wann es LOW ist) Bei einer derartige if-Befehl wirdt den Komma-operator die erste Gesetzen vor den (letzte) Komma jedenfalls ausführen (den Variabel Kranstart macht nichts alleine), aber nur das letzte Gesetz hinter der Komma wird für den Entscheidung sorgen. (HIGH=1, und alles was nicht gleich 0 ist wird immer als Wahr gekennzeichnet) Alles da vorne macht nichts dazu. Also was hier oben steht ist:

    Code:
    if ( HIGH==1 )  digitalWrite (RELAISAUF, HIGH);
    Deshalb wird das digitalWrite jedenfalls ausgeführt. Eben wenn Kranstart möglicherweise LOW oder 0 ist.

    Die richtige Verwendung von ein if Befehl ist:
    Code:
    if ( digitalRead(Kranstart)==HIGH ) digitalWrite (RELAISAUF, HIGH);
    Das gleiche passiert bei den while- loop am ende. Das hat nähmlich auch ein Quasi-if-Befehl in sich.
    Code:
    while(S2,HIGH);
    Das ist ein Endloss-schleife, und dein Programm wird da niemals rauskommen. Arduino loop() wirdt nicht weiter loop-en.

    Ok, dann haben wir nun die Logik Befehlen korrigiert. Dann stimmt es doch? Nein leider noch nicht.

    Zurück zum anfang von den loop() Funktion:
    void loop()
    { //Anfang der loop-Funktion

    value = digitalRead(S2); // Endschalter wird eingelesen

    digitalWrite(Kranstart,value); // Warte mall!! Kranstart ist als int definiert, und hat den wert HIGH (1) bekommen. Das ist doch kein Pin-bezeichnung!!!
    // das ist gleich: digitalWrite(1, value); Wird kommisches verhalten geben mit den Seriele port (TX) Keine ahnung was Kranstart hier bedeuten soll.


    { // Wieso alles hiernach in ein {} scope einfassen? Sollte den { nicht gerade nach den ) kommen?

    if ( digitalRead(Kranstart)==HIGH ) digitalWrite (RELAISAUF, HIGH);

    // Hier ist das if-Befehl schon am ende, wegen der ; am ende des if-Befehls, und den fehlende { dazwischen. Alles hiernach wird jedenfalls ausgeführt.


    delay(2600);
    digitalWrite (RELAISAUF, LOW);
    delay(2000);

    myStepper1.step(-3600); //Kran ausdrehen (Winkel einstellen)
    delay(2000); //Warten
    digitalWrite (RELAISAB, HIGH);
    delay(13000); //Seil ab für 13 sec
    digitalWrite (RELAISAB, LOW);
    delay(20000);

    digitalWrite (RELAISAUF, HIGH);
    delay(13000);
    digitalWrite (RELAISAUF, LOW);
    delay(2000);


    myStepper1.step(3600); //Kran eindrehen
    delay(3000);

    digitalWrite (RELAISAB, HIGH);
    delay(2600);
    digitalWrite (RELAISAB, LOW);
    delay(5000);
    } // Ende von if-Befehl Wahr-code

    {
    while(S2,HIGH); //Aber nür eines mall! Hängt hier ab. Gleich wie bei if Korrigieren.
    }
    } //Ende von loop()
    Geändert von Valen (21.07.2015 um 20:56 Uhr)

Ähnliche Themen

  1. Hilfe beim umsetzen der Elektronik meines Robi´s
    Von Benny1989 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 15
    Letzter Beitrag: 26.05.2012, 12:45
  2. Programmierung meines Hexapods
    Von lucaosswald im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 3
    Letzter Beitrag: 11.01.2012, 16:01
  3. Brauch dringend hilfe!!!!!!!!!!!
    Von julianf123 im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 2
    Letzter Beitrag: 05.07.2009, 16:59
  4. brauch Hilfe zum ADC
    Von molleonair im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 13.03.2006, 14:17
  5. brauch hilfe für projekt
    Von chioro im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 20.02.2006, 11:17

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test