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.
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.
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!
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.:
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://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
Code:boolean Kranstart = false; //Kran Zustand-variabeleWieder 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: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
Code:pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, Kran in RuhepositionSerial.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: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);
Kranstart ist kein Pin-nummer! Kann deshalb nicht an digitalRead gegeben werden als Parameter. Sonnst: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));
Code:Serial.println(Kranstart);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".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
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 drehenWieder 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: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);
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((S2)==HIGH &&(S1)==LOW);{
Code:if(digitalRead(S2)==HIGH && digitalRead(S1)==LOW) {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.Code:while((S1)==HIGH); } // Warten bis zum neuen Programmstart } }
Vielen Dank an Valen, ich habe jetzt die von dir beschriebenen Codestellen verbessert und siehe da der Kran läuft. Ich Stelle den fertigen Code nochmal rein. Ich habe jetzt auch die Erläuterungen von Valen verstanden und hoffe ich kann es mir merken.
//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 = false; //Kran Zustand- Variable
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
}
pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up
pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, in Ruheposition
pinMode(RELAISAUF,OUTPUT); // Relais für Seil AUF
pinMode(RELAISAB,OUTPUT); // Relais für Seil AB
myStepper1.setSpeed(400); // Steppermotor Kran drehen
Serial.begin(9600);
}
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.print("Channell 1:");
Serial.println (digitalRead(S1));
Serial.print ("Channell 2:");
Serial.println(digitalRead(S2));
Serial.print ("Channell 3:");
Serial.println(Kranstart);
delay(500);
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 if (digitalRead(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(50); // 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(digitalRead(S2)==HIGH && digitalRead(S1)==LOW)
{
while((S1)==LOW); } // Warten bis zum neuen Programmstart
}
}
Soweit alles gut.
Wie kann ich die LED nur dann zum blinken bringen wenn der Kran sich bewegt?
Bringt es etwas die Delays mit Interrupts zu steuern? Im Moment kann ich die Zeiten sehr gut einzeln einstellen. Ich denke dem Programm ist es Wurst wo es seine Zeiten herbekommt.
Ich muss jetzt noch beobachten wie sich die Position vom Seil (Haken) verhält, nach mehreren Durchläufen. Falls sich die Position des Hakens sehr verschiebt muss ich mir da auch noch eine Abfrage der Grundstellung einfallen lassen. Vielleicht überwache ich den Haken mit einem Microschalter wenn er in oberster Position ist.
Ich habe noch die Taster von high auf low umgeschrieben und den Kran angeschlossen. Läuft!!!!!!!!!!!!!!!
Nochmals vielen Dank, besonders an Valen, für eure Hilfe.
Geändert von Schiffe Bodo (24.07.2015 um 10:27 Uhr)
Hallo Bodo!
Code, auch Teile davon, werden wesentlich leserlicher wenn Du den Code in ein Codefenster schreibst. Im Codefenster sind nämlich Einrückungen und Tabs deutlich(er) zu erkennen. Ich habe mal zur Demonstration nur Deinen Text von oben in ein Codefenster kopiert . . .... Ich Stelle den fertigen Code nochmal rein. Ich habe jetzt auch die Erläuterungen von Valen verstanden und ..
Dazu wird beim Antworten (evtl. auf [Erweitert] drücken - rechts unten der mittlere Button) auf den Hashbutton (das # rechts oben) gedrückt. Es werden zwei Tags aufgemacht [.CODE.][./CODE.] , zwischen diesen kannst Du den Code einfügen. Alternativ die Einfügung markieren (linke Maustaste und mit Cursor-drüberfahren den betreffenden Text überstreichen) und DANACH sofort auf den #-Button.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 = false; //Kran Zustand- Variable 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 } pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, in Ruheposition pinMode(RELAISAUF,OUTPUT); // Relais für Seil AUF pinMode(RELAISAB,OUTPUT); // Relais für Seil AB myStepper1.setSpeed(400); // Steppermotor Kran drehen Serial.begin(9600); } 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.print("Channell 1:"); Serial.println (digitalRead(S1)); Serial.print ("Channell 2:"); Serial.println(digitalRead(S2)); Serial.print ("Channell 3:"); Serial.println(Kranstart); delay(500); 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 if (digitalRead(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(50); // 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(digitalRead(S2)==HIGH && digitalRead(S1)==LOW) { while((S1)==LOW); } // Warten bis zum neuen Programmstart } }
Weiter viel Erfolg in Deinem Trockendock - und auf dem Wasser.
Ciao sagt der JoeamBerg
Danke für den Hinweis, ich versuch es zu beachten.
Nein. Nicht ganz. Viel besser, aber das ende stimmt noch nicht. Die Bedingung von der while-schleife macht immer noch keinen Sinn. S1 ist 4, und LOW ist den Wert 0, also wird diese Vergleichung immer falsch.
Du verbindest gleich von Anfang ab in setup() den callback Funktion an den Timer1 Interrupt. Dann blinkt sie doch auch gleich wann Arduino auf-startet? Wieso das nicht nur machen auf das moment das den Kran anfangen soll sich zu bewegen? Und es gibt auch noch ein Funktion detachInterrupt womit das blinken gestoppt werden kann wenn nötig.Wie kann ich die LED nur dann zum blinken bringen wenn der Kran sich bewegt?
https://www.arduino.cc/en/Reference/DetachInterrupt
Gerne gemacht.Nochmals vielen Dank, besonders an Valen, für eure Hilfe.![]()
Hallo Valen ich hab den LOW reingeschrieben weil ich doch interne pullup verwende. Also muss ich jetzt warten wenn ich wieder starten will bis ich LOW hab da der S 1 sonst immer HIGH hat. Ich hab es am Kran mit den Schaltern ausprobiert. Deshalb kann ich schreiben Kran funktioniert. Muss mir nur noch was überlegen wie ich den Kranhaken überwachen kann. Nach mehreren durchlaufen verschiebt sich die Position vom Haken. Der Kran ist ja nicht sehr groß deshalb muss ich erst schauen was ich am besten einbauen kann. Kran ist circa 10 cm hoch. Das mit den Interrupt hab ich mir schon öfters durchgelesen aber irgendwie verstehe ich das nicht wirklich. Könntest du mir das mal erklären? Vielleicht begreife ich das dann. Danke nochmal besonders an dich für deine Hilfe. Schönes Wochenende.
Ist doch ganz einfach:
Wenn sich der Kran bewegt, startest du das Blinken mit
attachInterrupt(blinken);
Wird der Kran gestoppt, stoppst du auch das Blinken wieder mit
detachInterrupt(blinken);
und um sicher zu gehen, dass die LED hier auch aus geht (sie könnte in dem Moment ja an sein), schaltest du sie noch zusätzlich aus:
digitalWrite(LedPin, LOW);// das schaltet die LED ab-wenn sie zufällig schon aus war, passiert hier einfach nix
und fertig.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Lesezeichen