- SF800 Solar Speicher Tutorial         
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
    Hallo Valen, danke für deine Erläuterungen. Ich weiß und hab es auch geschrieben gehabt das ich keine Erfahrung mit dem programmieren hab. Das kranprojekt läuft nun mal und ich bin auf Hilfe angewiesen.
    Ich werde mich nochmal ransetzen und rumprobieren. Deine Erläuterungen helfen mir auf jeden Fall sehr. Du kannst das sehr gut erklären und ich denke ich habe auch verstanden was du geschrieben hast. Sorry für die PN. Du hast recht es wollen ja alle etwas lernen oder mitdiskutieren. Ich setze den überarbeiteten Code dann wieder rein. S1 soll der schaltimpuls von der Fernsteuerung sein. Ist also nicht die gesamte Zeit an. S2 ist ein Schalter der anzeigt das der Kran in anfangsstellung steht, also bereit ist zum starten. Auch S2 geht aus wenn der Kran sich von der grundstellung wegbewegt. Kranstart soll das Signal für den Arduino sein das der Kran sein Programm abspielen soll. Ich muss also S1 und S2 Zwischenspeichern bis zum Ende des Programmes. Die while Schleife habe ich reingemacht damit der Kran das Programm nur einmal durchläuft. Der Kran soll nach Ende des Programmablaufes warten bis zum nächsten Signal zum starten. Wenn S 2 nicht high oder true ist dann soll der Kran zu dieser Position hinfahren. Nur S1 und S2 high oder true zusammen ergeben kranstart true. Die pullup Funktion an den Tastern S1 und S2 hab ich reingemacht damit ich jetzt beim probieren nicht mit widerstanden arbeiten muss.
    Danke Bodo

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2015
    Ort
    Bayern
    Beiträge
    17
    Hallo Zusammen, Hallo Valen. Ich hab mich jetzt nochmal hingesetzt und versucht deine Erklärungen zu befolgen. Hier der Code:
    Code:
    //Kran der Calypso ansteuern
    //1 Stepper und 1 DC Motor
    
    #include <Stepper.h>
    #include "TimerOne.h"
    
    #define LED 7                              //WarnLED Kran in Bewegung
    int S1 = 4;                                //Starttaster von RC-Fernbedienung
    int S2 = 6;                                //Endschalter Kran in Ruheposition
    
    boolean Kranstart = digitalRead((S1)&&(S2));   //Kran fertig zum Start
    
    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(200000);         // 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
      }
       digitalWrite(S1,HIGH);            // Taster von RC-Fernbedienung
       digitalWrite(S2,HIGH);            // Taster Kran in Ruheposition
       
       pinMode(RELAISAUF,OUTPUT);        // Relais für Seil AUF
       pinMode(RELAISAB,OUTPUT);         // Relais für Seil AB
       
       myStepper1.setSpeed(400);         // Steppermotor Kran drehen
    }
    void callback(){
      {
      // Die LED blinkt unabhängig vom Programmcode in loop()
      digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert 
      }
      
    }
    void loop() {
      
    Kranstart = (digitalRead(S1)==HIGH) && (digitalRead(S2)==HIGH);  //Kran fertig zum Start, wenn S1 HIGH ist UND S2 HIGH ist.  
    
    Serial.begin(9600);
      
      Serial.print("Channell 1:");
      Serial.println (digitalRead(S1));
      
      Serial.print ("Channell 2:");
      Serial.println(digitalRead(S2));
      
      Serial.print ("Channell 3:");
      Serial.println(digitalRead(Kranstart));
      
      delay(50); 
      
    if (Kranstart == true){
      
      digitalWrite(RELAISAUF,HIGH);               // Seil auf Start            
      delay(2600);
      digitalWrite (RELAISAUF, LOW);              // Seil auf Stop
      delay(2000);
      
      myStepper1.step(-3600);                     // Kran ausdrehen (Winkel einstellen)
      delay(2000);                               
      
      digitalWrite (RELAISAB, HIGH);              // Seil ab Start
      delay(13000);                              
      digitalWrite (RELAISAB, LOW);               // Seil ab Stop
      
      delay(20000);                               // Tauchtasse im Wasser (20sec)
      
      digitalWrite (RELAISAUF, HIGH);             // Seil auf Start             
      delay(13000);
      digitalWrite (RELAISAUF, LOW);              // Seil auf Stop
      delay(2000);
      
      
      myStepper1.step(3600);                      //Kran eindrehen
      delay(3000);
      
      digitalWrite (RELAISAB, HIGH);              // Seil ab Start
      delay(2600);
      digitalWrite (RELAISAB, LOW);               // Seil ab Stop
      delay(5000);
      }
      
      else ((S2)==LOW);{                          // Kran nicht fertig zum Start
      
      digitalWrite(RELAISAUF,HIGH);               // Seil auf Start
      delay(2600);
      digitalWrite(RELAISAUF,LOW);                // Seil auf Stop
      delay(1000);
      
      myStepper1.step(100);                       // Kran drehen bis S2 HIGH
      delay(1000);
      
      digitalWrite(RELAISAB,HIGH);               // Seil ab Start
      delay(2600);
      digitalWrite(RELAISAB,LOW);                // Seil ab Stop
      delay(1000);
      
      digitalRead(S2==HIGH);
      
      if((S2)==HIGH &&(S1)==LOW);{
     while((S1)==HIGH); }                    // Warten bis zum neuen Programmstart
     }  
    }
    Ich habe für mich serial Monitor mit reingeschrieben um zu sehen was meine Taster machen.
    Jetzt funktioniert Kranstart ( wenn S1 und S2 sind HIGH), leider funktioniert das Warten auf den nächsten Programmstart nur wenn S1 und S2 High sind.
    Es wechseln ja beide S1 und S2 in low wenn der Kran sich bewegt. S1 geht weg weil das Signal von der Ferbsteuerung nur zum Starten benötigt wird. S 2 wechselt in Low wenn der Kran sich dreht und kommt am ende des Programmes wieder wenn der Kran in Ruheposition gefahren ist.
    wenn jetzt S2 high ist und S1 low fährt der Kran immer weiter zum Taster S2. wenn dann Taster S1 high gesetzt wird läuft Programm normal weiter.
    Wo liegt der Fehler? Ich komme nicht drauf.
    Danke Bodo
    Geändert von radbruch (23.07.2015 um 20:33 Uhr) Grund: Sterne entfernt

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Sorry, aber ich seh nur Sterne!?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2015
    Ort
    Bayern
    Beiträge
    17
    Die gesehenen Sterne kommen daher da ich die Leertaste benutze.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Bitte Recherchiere wie du das mit den Leertaste und * lösen kann. Weil das nicht normal ist. Ein Leertaste soll kein * anzeigen. Und es sehr ärgerlich wird wenn wir das jedes mal umsetzen müssen.

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Das ist vielleicht eine Einstellung im Editor. Leerzeichen durch Tab ersetzen oder so was
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Erstmal etwas wichtiges was noch nicht erklärt ist:

    Welcher Zustand hat das Fernbedienung S1 signal wenn den Kran nicht ausgehen soll? Ist es im rühe(nicht starten) HIGH oder LOW? Mit Pull-ups wird das HIGH, aber was macht der Fernbedienung?

    Von S2 Schalter-signal hast du schon in das Privat Bericht angegeben das es LOW wird/ist wenn es nicht mehr gegen die Endschalter steht.

    Hier unter habe ich dein Programm aufgeteilt in Stückchen, und unterbrochen auf Stellen wo du etwas falsch macht oder wo ein Problem entsteht.:

    Code:
    //Kran der Calypso ansteuern
    //1 Stepper und 1 DC Motor
    
    #include <Stepper.h>
    #include "TimerOne.h"
    
    #define LED 7                              //WarnLED Kran in Bewegung
    int S1 = 4;                                //Starttaster von RC-Fernbedienung
    int S2 = 6;                                //Endschalter Kran in Ruheposition
    
    // boolean Kranstart = digitalRead((S1)&&(S2));   //Kran fertig zum Start
    Nein, S1 und S2 sind gerade als Pin-nummer definiert, aber die Pins sind noch nicht als Eingang eingestellt in setup(). Deshalb können wir nicht darauf verlassen das digitalRead die Schaltern richtig ausliest. Deshalb annehmen das die Kran nicht fertig ist. Es geht nur darum ein Fail-Safe anfangswert zu geben:
    Code:
    boolean Kranstart = false;   //Kran Zustand-variabele
    Code:
    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(200000);         // 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
      }
    //   digitalWrite(S1,HIGH);            // Taster von RC-Fernbedienung
    //   digitalWrite(S2,HIGH);            // Taster Kran in Ruheposition
    Wieder nein! S1 und S2 bezeichnen die Pins wo den Ruheposition-Schalter und Fernbedienung angeschlossen sind. Da kommen Signalen rein! Deshalb ist es sinnlos die als Ausgang zu benutzen. Diese 2 digitalWrite Befehlen sollen ausgetauscht werden durch pinMode Befehlen die S1 und S2 als Eingängen machen:
    Code:
       pinMode(S1,INPUT_PULLUP);           // RC-Fernbedienung Eingang mit Pull-up
       pinMode(S2,INPUT_PULLUP);            // Taster Eingang mit Pull-up, Kran in Ruheposition
    Code:
     
       pinMode(RELAISAUF,OUTPUT);        // Relais für Seil AUF
       pinMode(RELAISAB,OUTPUT);         // Relais für Seil AB
       
       myStepper1.setSpeed(400);         // Steppermotor Kran drehen
    }
    void callback(){
      {
      // Die LED blinkt unabhängig vom Programmcode in loop()
      digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert 
      }
      
    }
    void loop() {
      
    Kranstart = (digitalRead(S1)==HIGH) && (digitalRead(S2)==HIGH);  //Kran fertig zum Start, wenn S1 HIGH ist UND S2 HIGH ist.  
    
    Serial.begin(9600);
    Serial.begin gehört in den setup() Funktion. Nur wenn ein Programm die Serielle Port an/ausschalten möchtest, oder auf eine andere Baudtakt umstellen möchtest, sollte das irgendwo in ein weitere Funktion oder in den loop() Funktion vor kommen. Ein mal das Befehl ausführen soll hier reichen.

    Code:
      Serial.print("Channell 1:");
      Serial.println (digitalRead(S1));
      
      Serial.print ("Channell 2:");
      Serial.println(digitalRead(S2));
      
      Serial.print ("Channell 3:");
    //   Serial.println(digitalRead(Kranstart));
    Kranstart ist kein Pin-nummer! Kann deshalb nicht an digitalRead gegeben werden als Parameter. Sonnst:
    Code:
      Serial.println(Kranstart);
    Code:
      
      delay(50); 
      
    if (Kranstart == true){
      
      digitalWrite(RELAISAUF,HIGH);               // Seil auf Start            
      delay(2600);
      digitalWrite (RELAISAUF, LOW);              // Seil auf Stop
      delay(2000);
      
      myStepper1.step(-3600);                     // Kran ausdrehen (Winkel einstellen)
      delay(2000);                               
      
      digitalWrite (RELAISAB, HIGH);              // Seil ab Start
      delay(13000);                              
      digitalWrite (RELAISAB, LOW);               // Seil ab Stop
      
      delay(20000);                               // Tauchtasse im Wasser (20sec)
      
      digitalWrite (RELAISAUF, HIGH);             // Seil auf Start             
      delay(13000);
      digitalWrite (RELAISAUF, LOW);              // Seil auf Stop
      delay(2000);
      
      
      myStepper1.step(3600);                      //Kran eindrehen
      delay(3000);
      
      digitalWrite (RELAISAB, HIGH);              // Seil ab Start
      delay(2600);
      digitalWrite (RELAISAB, LOW);               // Seil ab Stop
      delay(5000);
      }
      
      else ((S2)==LOW);{                          // Kran nicht fertig zum Start
    Was bedeutet ((S2)==LOW)? S2 ist als Pin-nummer Bezeichnung gemeint, und ist nur das Nummer 6. Das kann theoretisch nicht mit ein LOW Eingang-zustand verglichen werden. Dafür brauchen wir digitalRead(S2). Weil S2 und LOW im Gehirn von Arduino als ein Nummer geschrieben sind kann das Trotzdem kompiliert werden. Ist aber Kwatsch: "6==0".
    Und else an-sich kann kein Bedingung haben. Für weitere Bedingungen sollte man mit ein neues if danach anfangen. ((S2)==LOW); wird nur als ein Vergleich-befehl ausgeführt, aber das Resultat wird ignoriert. Und den Punkt-Komma beendet den ese-Zweig. Das {} Code block danach steht also isoliert davon.

    Besser:
    Code:
    else if (digitalRead(S2)==LOW) {                          // Kran nicht im Ruheposition -> zurück drehen
    Code:
      
      digitalWrite(RELAISAUF,HIGH);               // Seil auf Start
      delay(2600);
      digitalWrite(RELAISAUF,LOW);                // Seil auf Stop
      delay(1000);
      
      myStepper1.step(100);                       // Kran drehen bis S2 HIGH
      delay(1000);
      
      digitalWrite(RELAISAB,HIGH);               // Seil ab Start
      delay(2600);
      digitalWrite(RELAISAB,LOW);                // Seil ab Stop
      delay(1000);
      
       digitalRead(S2==HIGH);
    Wieder Kwatsch! digitalRead braucht ein Pin Nummer als Parameter, du gibt ihn aber ein Logik-test wovon das Resultat entweder 1 oder 0 ist. Was versuchst du hier zu machen? S2 einlesen, oder HIGH machen?

    Code:
      // if((S2)==HIGH &&(S1)==LOW);{
    Ich sehe kein digitalReads. Du vergleichst (6 gleich 1) und (4 gleich 0). Kwatsch-Logik, es ist nicht von den Elektronische Umwelt abhängig! Dazu, die Punkt-Komma ohne ein Befehl da vorne sagt das nichts gemacht werden soll. Die Code zwischen den {} danach ist deshalb wieder davon unabhängig.
    Code:
         if(digitalRead(S2)==HIGH && digitalRead(S1)==LOW) {
    Code:
     while((S1)==HIGH); }                    // Warten bis zum neuen Programmstart
     }  
      }
    Gehen wir mal davon aus das du das if-Befehl als Bedingung für das eintreten von den while-loop möchtest, und den Punkt-Komma am ende von das if-Befehl dort nicht steht. Dann stimmt das hier nicht. Die bedingung zur eintreten der while-schleife ist das S1 LOW sein soll. Aber den Bedingung in den while-schleife zu bleiben ist das S1 HIGH sein soll. Ist es nicht, deshalb endet den while-schleife gleich den erste mal. Warten tut es denn nicht.

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

Labornetzteil AliExpress