Servo mit Tastern ansteuern

Hallo,
ich würde gerne einen Servo mit Hilfe von 4 Tastern in 4 verschiedene Positionen fahren.
Soll heißen druck auf Taste 1 = Servo auf 0 Grad, Taste 2 = Servo auf 40 Grad usw.
Die Hardware Uno, Servo usw. ist vorhanden.
Wie würde das Sketch dazu aussehen ?

Gruß Holgi

Wenn du bei google "arduino servo" eingibst, erhältst du sehr viele Beiträge.
Da suchst du dir den passenden Sketch aus und änderst den auf deine Vorstellungen.

Servo Lib, den Rest mit 4 if Abfragen.

if (digitalRead(Taster1)) servo1.write(40);
so ausm Kopf

Hallo, danke für die Tipps. Tante google hat da nicht das passende ausgespuckt. Mit den if abfragen hört sich schonmal gut an, da läßt sich mit ein wenig Hilfe sicher was machen. Hatte irgendwo ein Sketch bei dem ein Poti zum ansteuern verwendet wurde gesehen, den code könnte ich mir "klauen" und versuchen ihn umstricken.

#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
}
void loop()
{
val = analogRead(potpin);  
         
         
val = map(val, 0, 1023, 0, 179); 
         
         
myservo.write(val);    
         
delay(15);      
}

Gruß Holgi

The-Holgi:
Hallo, danke für die Tipps. Tante google hat da nicht das passende ausgespuckt. Mit den if abfragen hört sich schonmal gut an, da läßt sich mit ein wenig Hilfe sicher was machen. Hatte irgendwo ein Sketch bei dem ein Poti zum ansteuern verwendet wurde gesehen, den code könnte ich mir "klauen" und versuchen ihn umstricken.

Sorry, aber dann ist dein Google kaputt.

Ich finde hier 17.000 Einträge und der 2. ist dieser:

Und das der 4.

http://forum.arduino.cc/index.php?topic=121365.15

Hallo,
habe das so "umgebaut":

#include <Servo.h>

int taster = 7;
int taster2 = 6;
int tasterstatus, tasterstatus1;
Servo meinServo;

void setup()
{
  pinMode(taster2, INPUT);
  pinMode(taster, INPUT);
  meinServo.attach(9);
  meinServo.write(0);
}

void loop()
{
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  tasterstatus = digitalRead(taster);
  tasterstatus1 = digitalRead(taster2);

  if (tasterstatus == 0)
  {
    meinServo.write(90);
  }

  if (tasterstatus1 == 0)
  {
    meinServo.write(0);
  }
}

Soweit funktioniert es, aber der Servo fährt immer wieder in eine bestimmte Stellung zurück.
Könnte der Servo vielleicht defekt sein ?
Oder woran könnte es noch liegen ?

Gruß Holgi

The-Holgi:
Hallo,
habe das so "umgebaut":

#include <Servo.h>

int taster = 7;
int taster2 = 6;
int tasterstatus, tasterstatus1;
Servo meinServo;

void setup()
{
  pinMode(taster2, INPUT);
  pinMode(taster, INPUT);
  meinServo.attach(9);
  meinServo.write(0);
}

void loop()
{
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  tasterstatus = digitalRead(taster);
  tasterstatus1 = digitalRead(taster2);

if (tasterstatus == 0)
  {
    meinServo.write(90);
  }

if (tasterstatus1 == 0)
  {
    meinServo.write(0);
  }
}




Soweit funktioniert es, aber der Servo fährt immer wieder in eine bestimmte Stellung zurück.
Könnte der Servo vielleicht defekt sein ?
Oder woran könnte es noch liegen ?

Gruß Holgi

Habs gefunden, das Netzteil war zu schwach. Jetzt klappt es.

Jetz würde ich noch gerne einen 2. Servo einbinden, also jeweils 2 Taster für einen Servo.

Schön, daß es geht! Dennoch könntest Du dies

pinMode(taster2, INPUT_PULLUP);
pinMode(taster, INPUT_PULLUP);

verwenden und diese Zeilen löschen

digitalWrite(7, HIGH);
digitalWrite(6, HIGH);

Danke für den Tipp,
so funktioniert es auch mit 4 Tastern und 2 Servos:

#include <Servo.h>  

int taster = 5;
int taster2 = 6;
int taster3 = 7;
int taster4 = 8;
int tasterstatus, tasterstatus1, tasterstatus2, tasterstatus3;
Servo Servo1;
Servo Servo2;

void setup()
{
pinMode(taster, INPUT);
pinMode(taster2, INPUT);
pinMode(taster3, INPUT);
pinMode(taster4, INPUT);
Servo1.attach(9);
Servo2.attach(10);
}

void loop()
{
pinMode(taster, INPUT_PULLUP);
pinMode(taster2, INPUT_PULLUP);
pinMode(taster3, INPUT_PULLUP);
pinMode(taster4, INPUT_PULLUP);
tasterstatus = digitalRead(taster);
tasterstatus1 = digitalRead(taster2);
tasterstatus2 = digitalRead(taster3);
tasterstatus3 = digitalRead(taster4);

if (tasterstatus == 0)
{
  Servo1.write(2);
}

if (tasterstatus1 == 0)
{
  Servo1.write(178);
}

if (tasterstatus2 == 0)
{
  Servo2.write(2);
}
  
if (tasterstatus3 == 0)
{
  Servo2.write(178);
}
}

Vielleicht kann es ja ein Anfänger gebrauchen.

The-Holgi:
Vielleicht kann es ja ein Anfänger gebrauchen.

Dann hätte ich noch Optimierungsmöglichkeiten: Konstanten verbrauchen keinen Variablenspeicher; logische Zustände sind boolean. Taster des selben Servos sollten gegeneinender verriegelt werden.

#include <Servo.h>  

const int taster = 5;
const int taster2 = 6;
const int taster3 = 7;
const int taster4 = 8;
bool tasterstatus, tasterstatus1, tasterstatus2, tasterstatus3;
Servo Servo1;
Servo Servo2;

void setup()
{
pinMode(taster, INPUT_PULLUP);
pinMode(taster2, INPUT_PULLUP);
pinMode(taster3, INPUT_PULLUP);
pinMode(taster4, INPUT_PULLUP);
Servo1.attach(9);
Servo2.attach(10);
}

void loop()
{
tasterstatus = digitalRead(taster);
tasterstatus1 = digitalRead(taster2);
tasterstatus2 = digitalRead(taster3);
tasterstatus3 = digitalRead(taster4);

if (tasterstatus == 0)
{
  Servo1.write(2);
} else if (tasterstatus1 == 0)
{
  Servo1.write(178);
}

if (tasterstatus2 == 0)
{
  Servo2.write(2);
} else if (tasterstatus3 == 0)
{
  Servo2.write(178);
}
}

Man kann noch weiter optimieren, um auch noch Platz auf dem Monitor zu sparen :slight_smile: :slight_smile:

#include <Servo.h> 
const byte taster[] = {5,6,7,8};  // const bringt hier eigentlich nichts
bool tasterstatus[4];
Servo Servo1;
Servo Servo2;

void setup(){
for(int x; x < sizeof(taster); x++) pinMode(taster[x], INPUT_PULLUP);
Servo1.attach(9);
Servo2.attach(10);
}

void loop(){
for(int x; x < sizeof(taster); x++) tasterstatus[x] = !digitalRead(taster[x]);
if (tasterstatus[0]) Servo1.write(2); else if (tasterstatus[1]) Servo1.write(178);
if (tasterstatus[2]) Servo2.write(2); else if (tasterstatus[3]) Servo2.write(178);
}

ElEspanol:

const byte taster[] = {5,6,7,8};  // const bringt hier eigentlich nichts

Mir ist schon klar, was Du meinst: Im Gegensatz zu einfachen Konstanten kann ein Array vom Compiler nicht speicherschonend wegoptimiert werden.

Aber: Beim versehendlichen Verändern einer Konstante würde der Compiler es als Fehler merken. Außerdem, wichtig beim Lesen und Verstehen fremder oder eigener alter Programme, erleichtert es den Durchblick für den Homo Sapiens. Das gilt zumindest für den, der diese Zeilen schreibt. Auch zeigt es, wie hier mal jemand schrieb, daß der Programmierer sich Gedanken gemacht hat.

Eigentlich ist es wie bei einem Kommentar: Überflüssig, aber manchmal super hilfreich! Außer natürlich, so ein Dösel fängt an, diesen zu kritisieren :wink: