Go Down

Topic: Servo ansteuern mit 1 oder 2 Taster mit Rückmeldung (Read 224 times) previous topic - next topic

ollie4

May 19, 2017, 09:50 pm Last Edit: May 20, 2017, 12:02 am by uwefed Reason: add CODE TAGS </>
Hallo alle miteinander,

bin neu hier und auch mit dem Arduino Uno erst am Anfang. Ich möchte einen Servo mit einem oder zwei Taster ansteuern und eine Rückmeldung bekommen in welcher Position der Servo steht. Nach einigem Suchen habe ich hier einen schönen Sketch gefunden, den ich auch schon getestet hab und gut finde nur das der Servo bei dem Sketch automatisch nach einer bestimmten Zeit wieder in die Null Stellung fährt. Ich möchte aber mit erneutem Tasten druck, oder wenn das zu komplex ist, mit einem 2. Taster, dass dieser in Stellugn Null verfährt. Hab versucht den Sketch umzuschreiben, jedoch ohne Erfolg, weil ich auch nicht ganz weiß wie.
Hier der Sketch.
Code: [Select]
#include <Servo.h>

Servo servo;

int pushButton=4;

int ledRed=3;
int ledGreen=2;

void setup()
{
 pinMode(pushButton, INPUT);
 
 pinMode(ledRed, OUTPUT);
 pinMode(ledGreen, OUTPUT);
 
 servo.attach(9);
 
 digitalWrite(pushButton, HIGH); //Pull up Widerstand aktivieren
}


void loop()
{
 int pressed=digitalRead(pushButton);
 
 digitalWrite(ledGreen, LOW);
 digitalWrite(ledRed, HIGH);
 
 if(pressed==LOW)
 {
   digitalWrite(ledGreen, HIGH);
   digitalWrite(ledRed, LOW);
   
   servo.write(35);
   delay(2000);
   servo.write(0);
 }
 
 delay(15);
}


vielen Dank im voraus für eure Hilfe.
Gruß
Ollie

HotSystems

Du brauchst nur einen zweiten Taster einbauen und abfragen und damit den Servo auf die Stellung "0" bringen.
Das vorhandene delay(2000) und die Servo-Stellung "0" musst du aus dem vorhandenen Sketch entfernen.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Franz54

Hier mal kein Code wie du ihn brauchst, aber eine Hilfe um zu sehen wo was passiert. Dann kommst du vielleicht besser damit zurecht um das Porgramm anzupassen.

Code: [Select]
#include <Servo.h>
 
Servo servo;

int pushButton=4;

int ledRed=3;
int ledGreen=2;
 
void setup()
{
  pinMode(pushButton, INPUT);
 
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
 
  servo.attach(9);
 
  digitalWrite(pushButton, HIGH); //Pull up Widerstand aktivieren
}
 
 
void loop()
{
  int pressed=digitalRead(pushButton); // Hier wird die Tasterstellung abgefragt
 
  digitalWrite(ledGreen, LOW); // Hier zeigen die LEDs dass der Servo aus ist
  digitalWrite(ledRed, HIGH);
 //-----------------------------------------------------------------------------------------------------------
  if(pressed==LOW) // Hier in dieser Abfrage wird darauf reagiert wenn der Taster gedrückt wurde
  {
    digitalWrite(ledGreen, HIGH); // Hier zeigen die LEDs an, dass der Servo ein ist
    digitalWrite(ledRed, LOW);
   
    servo.write(35); //Hier wird der Servo auf 35 gesetzt
//------------------------------------------------------------------------------------------------------------
    delay(2000);    // Hier wird 2 Sekunden gewartet
    servo.write(0);  //Hier wird der Servo wieder auf Null gesetzt
  }
 
  delay(15); // Hier wird gewartet, bis der Servo wieder auf Null ist
// Dann beginnt das Programm wieder oben bei "void loop"
}

HotSystems

Habe gerade ein wenig Zeit gehabt und deinen Sketch angepasst.

So sollte das funktionieren, konnte ich leider nicht testen.

Code: [Select]
#include <Servo.h>

Servo servo;

int pushButton1 = 4;
int pushButton2 = 5;


int ledRed = 3;
int ledGreen = 2;

void setup()
{
  pinMode(pushButton1, INPUT_PULLUP);
  pinMode(pushButton2, INPUT_PULLUP);

  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);

  servo.attach(9);

}


void loop()
{
  int ButtonValue1 = digitalRead(pushButton1);
  int ButtonValue2 = digitalRead(pushButton2);

  digitalWrite(ledGreen, LOW);
  digitalWrite(ledRed, HIGH);

  if (ButtonValue1 == LOW)
  {
    digitalWrite(ledGreen, HIGH);
    digitalWrite(ledRed, LOW);

    servo.write(35);
    delay(15);
  }

  if (ButtonValue2 == LOW)
  {
    digitalWrite(ledGreen, HIGH);
    digitalWrite(ledRed, LOW);

    servo.write(0);
    delay(15);
  }
}


I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

Modelbauservos haben keine Rückmeldung bezüglich ihrer Position. Das einzige was Du sagen kannst, ist, daß Du die Ansteuerung für eine gewisse Position ausgegeben hast, aber nicht ob der Servo diese wirklich erreicht hat. Eine Rückmeldung zu bekommen brauchst Du zB ein Potentiometer das die Servoposition mißt, einen Encoder ( ist etwas teuer) oder wenns einfach geht Endschalter oder Gabellichtschranken die gewisse Positionen erkennen lassen.

Zum Programmieren: lerne arduino zu programmieren. Andere machen das nicht für Dich.

Grüße Uwe

Franz54

Ja genau, das Poti auf die Servoachse und schon hat man eine genaue Rückmeldung über nen analogen Eingangspin  :)

ollie4

Vielen Dank für eure Hilfe.
Und ja Uwe, ich versuche mich gerade daran. Aber nicht jeder ist gleich der super Programmierer. Ich hab ja schon versucht den Sketch zu ändern, aber da hat meistens nur kurz die grüne LED dann geleuchtet, der Servo gezuckt und danach ging nichts mehr.
Aber ich finde gut das es auch Leute gibt die Helfen.
Mit freundlichen Grüßen
Ollie

ollie4

Hallo HotSystem,

habe dein Sketch getestet funktioniert super man muss aber die Zeilen

digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, HIGH);

löschen.

VG
Ollie

ollie4

Hallo zusammen,

jetzt habe ich noch eine Frage.

Kann ich den Sketch auf einen ATTINY45 programmieren. Nehme ich dann einfach anstatt Pin 2,3,4,5 und 9 PB0, PB1, PB2, PB3 und PB4?

Vielen Dank für eure Hilfe.

HotSystems

Du musst vorher prüfen, ob die Library "Servo.h" auch für den ATtiny45 geeignet ist.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

agmue

... und eine Rückmeldung bekommen in welcher Position der Servo steht. ...
Modelbauservos haben keine Rückmeldung bezüglich ihrer Position.
Hallo Ollie,
ich widerspreche Uwe nur sehr ungerne, aber gelegendlich dann doch, denn die mir bekannten Servos haben ein Poti zur Positionsbestimmung eingebaut. Die Mittelanzapfung ist bei manchen (Beispiel) herausgeführt oder man öffnet das Gehäuse und lötet ein zusätzliches Kabel an, habe ich so gemacht. Siehe RC-Servo mit Istpositionsmeldung.

Der Sketch mit Servo.h kompiliert nicht für den ATtiny45, da gibt es Probleme mit dem Timer. Eine spezielle Bibliothek für den Tiny könnte helfen, habe die alte Servo8Bit gefunden, aber keine Erfahrung damit.

Go Up