- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 11 bis 20 von 30

Thema: Ich brauch professionelle Hilfe bei Programmierung meines Kranes

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Bodo hat mir in einem PB geantwortet, aber ich möchte das gerner in dieses Thema weiter Diskusieren. Zo können mehrere mitlesen, und vielleicht auch davon lernen.

    Seine letzte bearbeite code (Asteriks entfernt)

    Code:
    //Kran der Calypso ansteuern
    //1 Stepper und 1 DC Motor
    
    
    #include <Stepper.h>
    #include "TimerOne.h"
    
    #define LED 7                              //WarnLED Kran in Bewegung
    #define S1 4                               //Starttaster von RC-Fernbedienung
    #define S2 6                               //Endschalter Kran in Ruheposition
    
    int valueRC = digitalRead(S1);             //Signal von RC-Fernbedienung OK
    int KranOK = digitalRead(S2);              //Signal vom Endschalter Kran Ruhepostion OK
    int 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(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
      }
      
      pinMode(S1,INPUT_PULLUP);          // Signal Kran starten von RC-Fernbedienung
      digitalWrite(S1,HIGH);
      pinMode(S2,INPUT_PULLUP);          // Schalter Kran in Ruheposition
      digitalWrite(S2,HIGH);
      
      pinMode(RELAISAUF,OUTPUT); 
      pinMode(RELAISAB,OUTPUT); 
      
      myStepper1.setSpeed(400);
      
      valueRC = digitalRead(S1);
      KranOK  = digitalRead(S2); 
      Kranstart = digitalRead((S1,HIGH)&&(S2,HIGH))==HIGH;  //Kran fertig zum Start
      if(Kranstart==HIGH)
      digitalWrite(Kranstart,HIGH);
      else(Kranstart,LOW);
      digitalWrite(Kranstart,LOW);
      //digitalWrite(Kranstart)= (S1,HIGH)&&(S2,HIGH)==HIGH;
    }
    void callback(){
      {
      // Die LED blinkt unabhängig vom Programmcode in loop()
      digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert 
      }
    }
    
    void loop(){
      
     valueRC = digitalRead(S1);             //Signal von RC-Fernbedienung OK
     KranOK = digitalRead(S2);              //Signal vom Endschalter Kran Ruhepostion OK
     Kranstart = digitalRead(Kranstart);    //Kran fertig zum Start
     
     Serial.begin(9600);
      
      Serial.print("Channell 1:");
      Serial.println (valueRC);
      
      Serial.print ("Channell 2:");
      Serial.println(KranOK);
      
      Serial.print ("Channell 3:");
      Serial.println(Kranstart);
      
      delay(500);
      
    
    if (digitalRead(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);
      }
      
      else {
      
      digitalWrite(RELAISAUF,HIGH);
      delay(2600);
      digitalWrite(RELAISAUF,LOW);
      delay(2000);
      
      myStepper1.step(S2==HIGH);
      delay(2000);
      }
      {
      while(Kranstart==HIGH);
      }  
      
    }
    Hilfe frage:
    Ich habe aber folgendes Problem:
    Der Schalter S1 soll ein Schaltkontakt von der RC-Fernbedienung sein.
    Der Schalter S2 ist der Endlageschalter am Kran.
    Kranstart soll High sein wenn S1 und S2 High sind.
    Ich komme hier nicht weiter!!!!
    Der Kran fährt los ohne die Schalter zu beachten! Was mache ich falsch?
    Beide Schalter wechseln aber den Zustand wenn der Kran losfährt!
    S1 kommt nur kurz von der RC-Fernbedienung zu Start.
    S2 wird Low wenn der Kran sich vom Endschalter wegbewegt.
    Wie kann ich das Lösen?
    Wie kann ich die ganzen Delays vermeiden? Wie funktioniert das mit den Interrupts?

    Bodo, bitte sag mal, was meinst du mit Kranstart? Ist das ein Speicherplatz das ein Zustand andeuten soll. Oder ist das ein Nummer das ein Schalter-pin für ein bestimmter Signal andeuten soll? Weil du das auf beiden Arten verwendest:

    zbs Zeile 44 und 45:
    Code:
    if(Kranstart==HIGH) /* Kranstart als Zustand Variabele */
       digitalWrite(Kranstart,HIGH); //Kranstart als Pin-nummer ....
    Wenn Kranstart die Integer Wert 1 hat ist es gleich an HIGH, und deshalb wird digitalWrite dann die D1 Pin((Serial TX) HIGH machen. Dass wurde doch nicht deine Bedeutung sein!?!

    Etwas höher in dein Programm:
    Code:
    #define S1 4                               //Starttaster von RC-Fernbedienung
    #define S2 6                               //Endschalter Kran in Ruheposition
    
    ...
    int Kranstart = digitalRead((S1)&&(S2));   //Kran fertig zum Start
    "Kran fertig zum Start" ... Das sollte also den Anfangszustand bedeuten, oder?

    Theoretisch sollte hier nur ein Anfangswert gegeben werden als initialisierung von den Speicherplatzt. Und nicht schon ein Pin-Messung gemacht werden. Das sollte am frühsten in setup() passieren, nach das einstellen der PinModus. (Eingang/Eingang mit Pull-up/Ausgang)

    (S1 && S2) wird als (4 && 6) ausgewertet beim Kompilieren. Weil && ein Boolean/Boolesch Und-Operator ist meint dass (TRUE UND TRUE), was naturlich TRUE ist. Und das wird für digitalRead als ein Integer Wert 1 ausgewertet, und so wird wieder die Ausgangszustand von den Serial TX Pin eingelesen (Pin Nummer 1).


    In setup():
    Code:
    Kranstart = digitalRead((S1,HIGH)&&(S2,HIGH))==HIGH;  //Kran fertig zum Start
    In meine Beitrag von gestern habe ich schon erklärt (hoffe ich, jedenfalls) das (S1,HIGH)&&(S2,HIGH) nicht stimmen kann mit deine Bedeutung. (Wenn ich das richtig verstehe) Das hat das gleiche Effekt als das Code Schnipsel hier oben.
    Dann wird das: Kranstart= ( digitalRead(1)==HIGH );
    Als Logik-Formel stimmt das, Kranstart wird hier TRUE wenn digitalRead ein HIGH eingelesen hat. Aber für dein Boot Projekt ist das wieder Unsinn weil 1 das Falscher Pin Nummer ist. Genauer wurde:

    Code:
    Kranstart = (digitalRead(S1)==HIGH) && (digitalRead(S2)==HIGH);  //Kran fertig zum Start, wenn S1 HIGH ist UND S2 HIGH ist.

    Am ende von setup():
    if(Kranstart==HIGH) //Ist Kranstart ein Zustand?
    digitalWrite(Kranstart,HIGH); // , ... oder Pin-nummer?
    else (Kranstart,LOW); // else LOW; ... else 0; ... ??????

    // Außerdem, achte auf das Punkt-Komma... hier kommt den else Befehl zu ende. Was hiernach kommt gehört nicht zu dem if-then-else!
    digitalWrite(Kranstart,LOW); // Eben wenn die Zeile hier oben als "else Kranstart=LOW" gemeint ist, wieso danach noch die Pin LOW setzen?
    Am Anfang von loop():
    Code:
    KranOK = digitalRead(S2);              //Signal vom Endschalter Kran Ruhepostion OK
     Kranstart = digitalRead(Kranstart);    //Kran fertig zum Start
    Nicht fertig, ... Kranstart = Pin-zustand von Serial RX oder TX Pin (Gewählt durch S2 Pin-zustand)

    Am ende von loop():
    Code:
    {
      while(Kranstart==HIGH);
       }
    Wieder ein Endloss-schleife, wenn Kranstart gleich 1 ist, kommt das Programm niemals weiter als den Punkt-Komma. (Ausserhalb den callback function, Flickern soll der LED schon weiter machen) Wieso die While-schleife hier eigentlich? Was hat das für Effekt in deiner Meinung?

    - - - Aktualisiert - - -

    Oh ja, nicht ganz Falsch, sondern die digitalWrites sind unnötig:

    in setup()

    Code:
    pinMode(S1,INPUT_PULLUP);          // Signal Kran starten von RC-Fernbedienung
    Die richtige Kommentar wurde sein: Pin S1 als Eingang mit internen Pull-up einstellen; zu RCFernbedienung 'Kran starten'.

    Code:
    digitalWrite(S1,HIGH);
    Wieso Pin S1 als Ausgang auf HIGH setzen? Es ist gerade noch als Eingang eingestellt. Den Pull-up macht das schon HIGH.

    Code:
    pinMode(S2,INPUT_PULLUP);          // Schalter Kran in Ruheposition
    Genau so wie oben bei S1: "Den Kran" oder "Den Schalter" ist nicht in Ruhe position. Sondern: diese Pin (zu dem Ruhe Position Schalter) ist eingestellt als Eingang (mit Pull-up)

    Code:
    digitalWrite(S2,HIGH);
    Genau so wie oben bei S1.

    Darf ich annehmen du verstehst was die Funktion einer Pull-up Widerstand ist? Es macht die Pin zustand HIGH eben wenn es nicht zu einer zustand gezwungen wird durch Spannungen von angeschlossen Leitungen.
    Geändert von Valen (22.07.2015 um 21:25 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
  •  

12V Akku bauen