- 3D-Druck Einstieg und Tipps         
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
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2015
    Ort
    Bayern
    Beiträge
    17

    Ich brauch professionelle Hilfe bei Programmierung meines Kranes

    Hallo liebe Gemeinde,
    Ich bin 49 Jahre alt, baue Schiffsmodelle mit möglichst viel Funktionen und hab vor ca. einem halben Jahr damit begonnen den Arduino mit in meine Schffe einzubauen.
    Jetzt baue ich gerade die Calypso und hab den Kran funktionsfähig gemacht. 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?

    Folgende Probleme hab ich bis jetzt:
    1. Blink LED blinkt auch weiter wenn Programm durchlaufen ist!
    2. Seilposition verschiebt sich leicht ( ich denke das ist ein Problem mit den Delays)!
    An der Startfreigabe arbeite ich noch( muss ich noch mit Pullup oder Pulldown Tastern verwirklichen)

    Ich habe in dem Sketch auch alle Ideen die Ich schon probiert habe dringelassen, aber auskomplimentiert!
    Hier der Sketch
    Code:
    //Kran*der*Calypso*ansteuern
    //1*Stepper*und*1*DC*Motor
    
    
    #include*<Stepper.h>
    #include*"TimerOne.h"
    #define*LED*7
    
    int s1 = 4;                          //Starttaster von RC
    int s2 = 6;                          //Endschalter Kran in Ruheposition
    int value = LOW;
    int Kranstart = HIGH;
    //const*int*ledPin*=**7;******//*the*number*of*the*LED*pin
    
    //*Variables*will*change:
    //int*ledState*=*LOW;*************//*ledState*used*to*set*the*LED
    //long*previousMillis*=*0;********//*will*store*last*time*LED*was*updated
    
    //long*interval*=*250;***********//*interval*at*which*to*blink*(milliseconds)
    
    //int*StartKran*=*HIGH;
    
    int SPMU1 = 32;
    int RELAISAUF = 2;   // Seil aufrollen
    int RELAISAB  = 3;   // Seil abrollen
    
    Stepper myStepper1(SPMU1,10,11,12,13);  //Kran drehen          
    
    void setup() {
    {
    **pinMode(LED, OUTPUT);
    **Timer1.initialize(100000);         // initialize timer1, and set a 1/2 second period
    **Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
    **Timer1.pwm(9, 512);                // setup pwm on pin 9, 50% duty cycle
    **}
    **// set the digital pin as output:
    **//pinMode(ledPin, OUTPUT);
    **
    **pinMode(s1,INPUT);      // Signal Kran starten
    **pinMode(s2,INPUT);      // Schalter Kran in Ruheposition
    **
    **pinMode(RELAISAUF,OUTPUT); 
    **pinMode(RELAISAB,OUTPUT); 
    **
    **myStepper1.setSpeed(400);  
    }
    void callback(){
    **{
    **// Die LED blinkt unabhängig vom Programmcode in loop()
    **digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert
    *
    **}
    }
    
    void loop()
    
    
    *
    **//digitalRead((s1,HIGH)&&(s2,HIGH) = digitalWrite (StartKran,HIGH));
    *// {
    *// unsigned long currentMillis = millis();
    *
    **//if(currentMillis - previousMillis > interval) {
    ****// save the last time you blinked the LED
    ***// previousMillis = currentMillis;  
    ****// if the LED is off turn it on and vice-versa:
    ****//if(ledState ==LOW);
    **//  ledState =((ledState == LOW)? HIGH : LOW);
    ****//ledState = HIGH;
    ****//else
    ****//ledState = LOW;
    ****// set the LED with the ledState of the variable:
    ***// digitalWrite(ledPin, ledState);
    *//}
    //}
    {
    **value*=*digitalRead(s2);
    **digitalWrite(Kranstart,value);{
    **if (Kranstart,HIGH)  
    **
    **digitalWrite (RELAISAUF, HIGH);             
    **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);
    **}
    **{
    *// detachInterrupt (void callback);{
    **//  {
    *// digitalWrite(LED, digitalRead(LED) ^ 0); // EXOR invertiert
    *
    **//}
    //}
    **while(s2,HIGH);
    **
    }}
    Danke schonmal für eure Bemühungen und vielleicht wird mir ja geholfen

    Gruß Bodo

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Hallo Bodo,

    ich kenne mich mit Arduino-Boards selbst jetzt nicht so gut aus, aber der Timer1 scheint zumindest bei "Timer1.pwm(9, 512);" doch schon von "Timer1.attachinterrupt(callback);" in Benutzung zu sein?! Alternative mal prüfen ob es einen anderen Timer gibt der eine der beiden Funktionen auch ausführen kann.
    Wenn man Anfänger ist wäre meine Empfehlung nicht gleich mit einem derartige Code anzufangen der möglicherweise eine Mehrfachnutzung eines Timers benutzt, die man ggf noch nicht nachvollziehen kann.

    Wenn man rumprobiert mit der gesamt Systemlaufzeit ( currentMillis ) und irgednwann alles durcheinander ist, dann kann es helfen einen kompletten loop-Block dafür anzulegen und dann durch auskommentiren ganzer loop-Blöcke (siehe unten) zu arbeiten.
    Es sieht sehr nach zusammenkopiertenm Code aus. Zumal der Programmierstil echt unterirdisch ist und man wirklich nur schwer lesen kann. Sorry.

    Was sollen diie ganzen Sternchen da? Ist dir bewußt dass des " * "-Symbol auch ein Programierelement von C ist.
    Neben der mathematishcen Bedeutung vom " * ", wird der u.a. noch bei "Zeigern" benutzt. Dazu kommt das man damit ganze Codeblöcke (unter bestimmten Bedingungen ) auskommentieren kann. Es Ist also nicht nötig jede Zeile mit " // " rauszunehmen, hier bietet sich ein " /* bzw */ " an, womit der umschliessende Code auskommentiert wird. Also so: /* Code der auskommentiert werden soll */ .
    Dazu schaut man sich am besten einen Tutoriel wie dieses Hier bei You Tube an (klick mich). Hier habe ich grade sogar noch was gelernt
    Für Codeeinrückungen bietet sich die Tab " ->| " an - kann man auch zweimal drücken um mehr einzurücken oder man stellt die Einstellungen so um das gleich mehr eingerückt wird.

    Da die LED als Hardware-Interrupt programmiert ist, blinkt sie eben auch wenn "das Programm durchlaufen" ist. Hierzu muss man sagen dass das Programm nur im Ablauf durch Deine Eingaben abgezweigt wird. Das Programm selbst läuft immer in der loop - solange ausreichend Spannung vorhanden ist.
    Um das abzustellen ist es nötig den Interrupt mit einem Ereignis innerhalb der loop zu verbinden welches die Blink-Bedingung auslöst oder anhält.

    Das Seilwindenproblem entsteht vermutlich ganz genau wie Du schon sagst wegen den ganzen Delays. Wird der Arm jetzt per RC-Fernsteuerung auch mit Knüppel gesteuert oder nur per Taster an/aus auf der Fernsteuerung?

    Viele Grüße
    Jörg

  3. #3
    Schiffe BodoUnregistriert
    Gast
    Danke erstmal für deine Antwort, das mit den vielen * kann ich mir nur damit erklären das es hier beim einfügen alle Leerzeichen in Sternchen umwandelt. Das mit der LED ist eigentlich so gewollt, sie soll neben dem Programm laufen. Nur weiß ich nicht wie ich sie bei Programmende auch abschalte. Du hast recht es ist viel zusammenkopiert. Der gesamte Kran wird nur mit einem Startsignal von der Fernsteuerung gestartet. Der Arm wird mit einem Schrittmotor gedreht und die Seilwinde mit einem Getriebemotor angetrieben. Für den Getriebemotor habe ich 2 Relais zu wechseln der Drehrichtung.
    Schönen Sonntag

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.065
    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

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    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.

  6. #6
    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.

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress