Servosetup mit Schalter verändern

Hallo Arduino Community,

ich versuche mich gerade an einer ESC Ansteuerung mit dem Arduino Shield.
Das Ziel ist es zwei verschiedene Setup mit einem Schalter abrufen zu können. (ECO-Mode/ Turbo-Mode oder Vorwärts/Rückwärts)

Das Servo bewegt sich und einzeln funktionieren auch die 2 Modi, jedoch wenn ich das Programm zusammen füge, schaltet der Modus nicht zuverlässig um. Manchmal zittert das Servo und schlägt aus, als würde der Wert nicht gespeichert werden, eine Restspannung am Imput noch anliegt oder der Loop nicht funktioniert.

Ich bitte um eure Hilfe!
Vielen Dank schon einmal!

Liebe Grüße
Walter

#include <Servo.h> 

Servo myservo; // erstellt ein Servo-Objekt um einen Servomotor zu steuern
int potpin = 0; // Analog Pin, an dem das Potentiometer angeschlossen ist
int val; // Variable um den Vert des Analogen Pin zwischen zu speichern
const int buttonPin = 2;

int buttonState = 0;

void setup() {
pinMode(buttonPin, INPUT);
myservo.attach(9); // verknüpft den Servomotor an Pin 9 mit dem Servo-Objekt
}

void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und180)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
}
else {
val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 0); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und180)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
}
}

Dann setze deinen Sketch bitte in Code-Tags, damit die Formatierung erhalten bleibt und wir den Sketch auch gut lesen können.
Dies dann auch mit mobilen Geräten.

Sorry, habe ich vergessen. :confused:

#include <Servo.h> 

Servo myservo; // erstellt ein Servo-Objekt um einen Servomotor zu steuern
int potpin = 0; // Analog Pin, an dem das Potentiometer angeschlossen ist
int val; // Variable um den Vert des Analogen Pin zwischen zu speichern

const int buttonPin = 2;
int buttonState = 0;

void setup() {
pinMode(buttonPin, INPUT);
myservo.attach(9); // verknüpft den Servomotor an Pin 9 mit dem Servo-Objekt
}

void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und 180)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
}
else {
val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 0); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und 180)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
}
}

Meinst du jetzt Einstellungen während der Laufzeit für den Servo ändern ?
Oder möchtest du die Konfiguration im Setup des Sketches ändern ?

Leider ist die Lesbarkeit nicht wirklich besser geworden.

Du kannst dazu den Sketch in der IDE formatieren.
Das geht mit Strg+T, dann wird dieser formatiert und noch besser lesbar.

HotSystems:
Dann setze deinen Sketch bitte in Code-Tags, damit die Formatierung erhalten bleibt und wir den Sketch auch gut lesen können.
Dies dann auch mit mobilen Geräten.

@Waldi1
Das war für den ersten Beitrag gedacht und nicht nochmal einfügen. Du kannst Deine Beiträge auch nachträglich editieren.
Hab ich Diesmal für Dich gemacht.

Hast Du einen Pullup bzw Pulldownwiderstand am Taster?

Grüße Uwe

Vielen Dank für eure Infos. Tut mir sehr leid, ich bin ganz neu in dem Forum und kenne mich noch nicht so aus.

Der Taster wird an +5V angeschlossen und gibt bei Betätigung die 5V an PIN2 weiter. Dann soll dieser Teil das Servo steuern (das Servo geht von 90°-180°) (Vorwärts):

 val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 90 und 180)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen

Wenn der Taster deaktiviert ist, liegt 0V am PIN2. Dann soll das Servo von 90°-0° drehen (Rückwärts):

 val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
val = map(val, 0, 1023, 90, 0); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 90 und 0)
myservo.write(val); // überträgt die Zielposition an den Servomotors
delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen

Somit hätte ich gesagt, dass es ein Pullupwiderstand ist.?

Danke, Gruß Walter

Du must Dich erst mal entscheiden, ob Du den Button digital oder analog einlesen willst. Beides macht keinen Sinn.
So, wie Du Deinen Taster beschrieben hast (5V --> Taster --> Pin --> hier fehlt ein Widerstand 1K --> GND) wird es digitalRead() werden.

Wenn der eingelesene Wert = HIGH, sende "1" zum PC, ansonsten "0".

Als nächster Schritt wäre das Entprellen, dann Den alten Tasterstatus merken und nur, wenn sich was geändert hat, die Meldung zum PC schicken.

So etwa könnte man das schrittweise aufbauen.

Gruß Tommy

Funktioniert!
Was fehlte war der Widerstand auf GND! Vielen Dank!

das Potentiometer wird analog eingelesen. (das war glaube ich ein Missverständnis)

Der erste gepostete Code stimmt! Wichtig ist nur der Widerstand auf GND.

Danke!

Liebe Grüße
Walter

Das mit dem Poti war ein Lesefehler von mir, sorry. War doch schon etwas spät.
Aber schön, dass es jetzt funktioniert.

Gruß Tommy