hab jetzt zwei Tage gegoogelt und lande immer wieder hier, aber bisher gibt es für mich keine Lösung meines Problems. Wobei ich dazu sagen muss, dass ich Frischling bin was Programmierung angeht und somit gibt es eventuell bereits Lösungen, aber ich "erkenne" diese nicht als Solche.
Zur Problemstellung bzw. was ich vor habe.
Ein Servo soll eine Bewegung vor und zurück ausführen und je nach Schalterstellung zwei unterschiedliche Zeiten warten, bis die nächste Vor- und Zurückbewegung ausgeführt wird.
Es geht also eigentlich nur darum, wie ich unterschiedliche "Delay" Werte je nach Schalterstellung umsetzen kann UND vor allem, wo der Schalter am sinnvollsten platziert wird.
Ich möchte das Ganze mit so wenig wie möglich Bauteilen realisieren.
Eventuell kann mir jemand helfen, denn ich weis nicht mal, wie ich es schaltungstechnisch umsetzen soll, und erst recht nicht programmiertechnisch.
nordmann_79:
Eventuell kann mir jemand helfen, denn ich weis nicht mal, wie ich es schaltungstechnisch umsetzen soll, und erst recht nicht programmiertechnisch.
beginn mit den Beispielen aus der Arduino IDE und lerne wie man eine Servo anspricht:
oder auch das sweep
auch besorgst dir einen Button und eine LED und machst die ganzen "basic" und "digital" Beispiele durch die mit Schalter und LED auskommen.
Danach sollte es dir gelingen, die 10 Zeilen code so hinzuschreiben, dass du das auch selber warten kannst.
Die oben verlinkte Schaltung ist zwar nur für ganz kleine Servos geeignet, aber zum Anfangen wirds schon passen.
Wenn du was genaueres haben willst, dann brauchen wir einen anklickbaren Link auf das Datenblatt deines Servos.
also die normale Bewegung vor und zurück klappt...aber ich hab halt nur die Möglichkeit einen Delay zu setzen und nicht zwei unterschiedliche.
das Programm selbst läuft endlos durch und nur der Delay definiert, wie lang zwischen einem und dem nächsten Durchlauf gewartet werden soll.
Ich möchte das Ganze aber nun erweitern um einen Schalter, der dann dafür sorgt, dass entweder (z.b.) 60 Sekunden oder 600 Sekunden gewartet wird, bis die Bewegung (also das eigentliche Programm) erneut ausgeführt wird
Du möchtest einen Automaten bauen.
Einen endlichen Automaten, oder eine Schrittkette.
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
ProtoThreads,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
Das eigentliche Programm ist, den Schalter auszulesen.
Wie alle interaktiven Sachen optimalerweise so, dass selbst während der Wartezeit Änderungen am Schalter erkannt werden.
machst die ganzen "basic" und "digital" Beispiele durch die mit Schalter und LED auskommen
Dabei ist dir BlinkWithoutDelay untergekommen und du hast erkannt, dass es da nicht um "Blink" sondern um "WithoutDelay" geht.
wow...ich wusste mir fehlen die Grundlagen und das rächt sich jetzt...
ich hab glaub Schalter nicht korrekt definiert...es soll kein Taster sein, sondern ein Schiebe-Schalter, der dann quasi entweder/oder vorgibt.
Alternativ dachte ich, man könnte ein Sketch bauen, der beide Funktionen parallel ausführt (also ein Programm für Pin x und eins für Pin y) und mittels Schalter bestimme ich nur, welcher Pin zum Servo "durchgereicht" wird
Pin x Pin y
| |
| |
Schalter
|
|
Servo
Schalter links = Funktion die auf Pin x liegt wird ausgeführt mit dem entsprechenden Delay
Schalter rechts = Funktion die auf Pin y liegt wird ausgeführt mit dem entsprechenden Delay
Dann könnt eich mir if/else sparen
Aber der Delay führt bei mir immer dazu, dass alle Funktionen dahinter warten
Hat dein Schalter eine Mittelstellung und wenn ja - was soll in der Mittelstellung passieren?
Wenn nein, dann gibt es nur zwei Varianten, und das kannst mit einem Pin auslesen - verbunden oder nicht verbunden. Mehr gibt es da nicht.
Stelle deinen Sketch in code tags hier rein dann sehen wir mal was du bisher hast.
Was willst du denn sparen? If/else ist winzig, wenn die Bedingung im if erstmal klar ist.
Aber der Delay führt bei mir immer dazu, dass alle Funktionen dahinter warten
Das ist der Sinn eines delay.
So wie du den Schalter anschliesst, macht es nur Sinn, wenn es auch eine Mittelstellung (weder noch) gibt. Und beide Pins brauchen pullup/pulldown Widerstände.
Mittelstellung hat er nicht - Ein und Aus geschieht über einen separaten Schalter
Der Sketch ist auch nur geklaut aus Beispielen - aber er läuft zumindest - aber leider so, dass egal wo ich den Servo anschließe, immer die 600 Sekunden am Ende des Loops greifen.
Der Sketch basiert auf der Idee, dass ich das Steuerkabel vom Servo splitte, an den Schalter anschließe und eine Schalterstellung an Pin 0 und die andere an Pin 3 anschließe
der delay ganz unten regelt das mit den 60 Sekunden und wenn ich jetzt noch einen Loop baue und dort 600 Sekunden eintrage, dann bringt da ja leider gar nix, weil der erste Loop auch erst läuft, wenn der zweite durch ist und 600 Sekunden gewartet hat.
Ich sollte noch erwähnen, das ich einen Digispark mit USB habe, damit ich das Programmieren per USB machen kann - nur leider unterstützt der wohl keine servo.h (oder umgekehrt).
ich sehe da auf einmal zwei Servoobjekte. Von zwei Servos war bisher nicht die Rede!
Bevor es weitere Überraschungen gibt, stellst du bitte jetzt ein
a) einen gezeichneten Schaltplan was du jetzt wie verkabelt hast, mit Bleistift auf Papier reicht, sofern man alles sieht,
b) ein Echtbild von deinem Aufbau damit wir sehen was du da wirklich hast
wenn beides online ist, schaue ich mir das wieder an.
nordmann_79:
Es geht also eigentlich nur darum, wie ich unterschiedliche "Delay" Werte je nach Schalterstellung umsetzen kann UND vor allem, wo der Schalter am sinnvollsten platziert wird.
Dein Ansatz ist falsch. Du brauchst keine 2 Servoobjekte, und Du brauchst auch keine 2 Schaltereingänge. Da wo jetzt dein 'festes' delay ist, fragst Du den Schalter ab, und machst entsprechend das delay unterschiedlich:
if ( digitalRead(schalterPin) ) {
delay(6000);
}else{
delay(60000);
}
Das Problem, dass der Sketch während der gesamten Wartezeit blockiert, löst Du damit natürlich nicht. Dafür brauchst Du einen Ansatz nach der Methode 'BlinkWithoutDelay'.
also ich hab mich mal an der Illustration der Schaltung versucht...ich hoffe es ist zu erkennen, was wohin geht
die zwei Servo Objekte sind durch die Idee gekommen, zwei separate Loops zu schaffen die parallel laufen und je nach Schalterstellung wird der Servo dann von Pin0 oder von Pin3 gesteuert...somit ist ein wechsel im laufenden Betrieb möglich?!
Was die Abfrage des Schalters angeht - es handelt sich um so etwas hier Schalter
eine Abfrage des Schalters sollte damit nicht machbar sein
Ich habe mich an dem "blink wihtout delay" Beispiel versucht - aber da dort LED Status abgefragt wird und ich den Servo nicht abfragen kann, bin ich weiterhin ratlos, wo ich weiter ansetzen soll.
nordmann_79:
Was die Abfrage des Schalters angeht - es handelt sich um so etwas hier Schalter
eine Abfrage des Schalters sollte damit nicht machbar sein
Warum nicht? Mittlerer Pol an Gnd, einer der beiden anderen an den Eingangspin und den Pin mit
pinMode( pinNr, INPUT_PULLUP);
initiieren. Der andere Schalteranschluß bleibt einfach frei. Du brauchst eigentlich keinen Umschalter.
Das mit den 2 Servoobjekten und der Umschaltung der Servoleitung ist vollkommen unnötig. Du willst doch nur die Verzögerungszeit beeinflussen, und nichts am Servo.
ok...ich kann also einen "State" auslesen - da aber weiterhin in allen Beispielen immer nur von blink mit LED die Rede ist, fehlt mir dennoch der Ansatz oder ein Beispiel, was ich auf meine "Bedürfnisse" hin anpassen kann. Einen Sketch selbst schreiben bekomme ich nicht hin - hab bisher immer nur andere Sketche genommen und versucht, die dortigen Werte an meine Wünsche anzupassen.
ich hab jetzt dieses without delay mal angepasst und funktioniert mit simpleservo ganz gut...bzw. genauso wie vorher...damit wäre wohl der erste Schritt weg von "delay" getan.
#include <SimpleServo.h>
SimpleServo myservo;
int ledPin = 1; // the number of the LED pin
int ledState = LOW; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
long OnTime = 1000; // milliseconds of on-time
long OffTime1 = 60000; // milliseconds of off-time
long OffTime2 = 600000; // milliseconds of off-time
void setup()
{
pinMode(ledPin, OUTPUT);
myservo.attach(3);
}
void loop()
{
// check to see if it's time to change the state of the LED
unsigned long currentMillis = millis();
if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
{
ledState = LOW; // Turn it off
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
myservo.write(0);
}
else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime1))
{
ledState = HIGH; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
myservo.write(120);
}
}
vorbereitet habe ich den langen Intervall, der jetzt noch keine Wirkung hat, da ich mich Schritt für Schritt vorwärts bewegen muss, sonst komme ich nicht mit.
wie kann ich nun statt LED LOW/HIGH den Schalter mit einbinden? Und ich hab nun bereits if und if else und müsste nun noch eine weitere if/else einbauen, damit die Schalterstellung auch eine Wirkung hat?!