Servo mit Taster ansteuern

Hallo,

ich habe vor einen Servo per Taster anzusteuern.

Er soll einen bestimmen weg dabei gehen sobald der Taster gedrückt wird - vielleicht 15ms Delay nach drücken.

Als beispiel nenne ich mal "50°"

Danach, sobald er bei 50° war soll er wieder auf 0° bzw. nullpunkt, ebenfalls mit 15 ms Delay.

Bin in sachen Arduino recht neu, also habt geduld mit mir :slight_smile:

Als board habe ich einen Nano gekauft. Da es die platzverhältnisse nicht anders hergeben.

viele grüße

Florian

Bartho:
Als board habe ich einen Nano gekauft. Da es die platzverhältnisse nicht anders hergeben.

viele grüße

Sehr schön...Grüße zurück.

Und Geduld haben wir. :wink:

Hallo,
was HotSystems Dir schonend beizubringen versucht ist-

Stelle bitte Deinen Sketch hier ins Forum. Dazu benutzt Du die CodeTag´s (Editor </>).
Hier gibt es auch Beiträge über Glaskugeln, einen Link kann ich Dir per PM gerne senden.
Nicht böse sein, aber ohne ausführliche Informationen wird das nichts.
Gruß und Spaß
Andreas

SkobyMobil:
Stelle bitte Deinen Sketch hier ins Forum. Dazu benutzt Du die CodeTag´s (Editor </>).

Aber ich habe noch gar nicht angefangen das ist mein “problem” wenn man das so nennen mag.

Da ich momentan bei punkt null anfange, erstes Arduino projekt eh und je.

Es kann somit kein Sketch geben, also noch nicht.

Habe gehofft etwas starthilfe zu bekommen wie man das anstellen könnte, ob man das überhaupt anstellen kann.

Kein Problem!
Installiere die IDE,
dann arbeite die Beispiele durch.

Viel Glück!

Stefan

Bartho:
Da ich momentan bei punkt null anfange, erstes Arduino projekt eh und je.

Das ist seltsam, denn vom Oktober 2016 gibt es einen Thread von Dir, da wolltest Du einen Arduino an den OBD2 Stecker Deines BMWs anklemmen. Nachdem eine Menge guter Hinweise kamen, wie Du das anstellen kannst, kam leider keine Reaktion mehr.

Die Frage ist, was genau erhoffst Du Dir hier an konkreter Hilfe? Das jemand Dir das Programm schreibt und aufmalt, wie die Schaltung aussehen soll? Das wird vermutlich nicht passieren.

Hilfe ist dann am effizientesten, wenn Sie der Lösung eines konkreten Problems dient.

In Deinem Fall würde ich mit einfachen Schritten anfangen.

  1. IDE installieren und z.B. erstmal die Beispielprogramme aus der IDE ausprobieren, damit Du ein Gefühl dafür bekommst wie die Programme aufgebaut sind.
  2. Einen Taster an den Arduino anschließen und ein Programm schreiben, welches den Taster abfragt und den Zustand z.B. über den Serial Monitor ausgibt.
  3. Einen Servo an den Arduino anschließen und erstmal ganz einfach ansteuern. Bau Dir einen Funktion, welche das Programm, das der Servo abfahren soll ausführt.
  4. Nimm die Funktion aus Schritt 3 und baue sie in das Programm aus Schritt 2, so dass der Taster die Funktion für den servo startet. Dann hast Du schon was Du bauen willst.

Immer wenn es bei einem der Schritte konkrete Fragen oder Punkte an denen Du nicht weiter kommst gibt, dann findest Du hier jede Menge kompetente Leute die Dir gern weiter helfen.

Bei den Beschreibungen der Probleme bitte immer daran denken, wir können nicht sehen was Du da gebaut oder programmiert hast. Daher immer eine möglichst genaue Fehlerbeschreibung geben, die ein außenstehender verstehen kann. Deinen vollständigen Sketch in Code-Tags mit angeben und ggf. die Schaltung beschreiben oder aufmalen, die zeigt wie Du was angeschlossen hast.

Das erleichtert es allen hier Dir zu helfen und verhindert Frust auf allen Seiten.

Mario.

mkl0815:
Das ist seltsam, denn vom Oktober 2016 gibt es einen Thread von Dir, da wolltest Du einen Arduino an den OBD2 Stecker Deines BMWs anklemmen. Nachdem eine Menge guter Hinweise kamen, wie Du das anstellen kannst, kam leider keine Reaktion mehr.

Dies habe ich tatsächlich lösen können, jedoch ohne Arduino. Da ich diese funktion die ich wollte per Laptop auslesen kann habe ich mir das codiert. Klingt einfacher als es war.

mkl0815:

  1. IDE installieren und z.B. erstmal die Beispielprogramme aus der IDE ausprobieren, damit Du ein Gefühl dafür bekommst wie die Programme aufgebaut sind.

Dies hab ich getan und eine Bibliothek gefunden mit Sketchen. Habe ein Sketch gefunden der wohl auf das was ich vorhabe ziemlich passt.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 

int pos = 0;    // variable to store the servo position 
int button = 2;  // The button will be on Pin 2 


void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
pinMode(pos, OUTPUT);
pinMode(button, INPUT); 
digitalWrite (button, LOW);
} 

void loop() 
{ 
  
    if (digitalRead(button) == LOW)

  for(pos = 0; pos < 90; pos += 90)  // goes from 0 degrees to 90 degrees 
  {                                  // in steps of  degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                          // waits 1s for the servo to reach the position 
  } 
  if (digitalRead(button) == HIGH) 
  
  for(pos = 90; pos>=90; pos-=90)     // goes from 90 degrees to 0 degrees 
  {                                
     myservo.write(pos);              // tell servo to go to position in variable 'pos' 
  delay(50);                             // waits 50ms for the servo to reach the position 
  }
  
}

Da werde ich mal ansetzen und das ganze austesten. Habe mich gestern noch belesen wie man wo was anschließt. Bin guter dinge

Bartho:
Da werde ich mal ansetzen und das ganze austesten. Habe mich gestern noch belesen wie man wo was anschließt. Bin guter dinge

das ist doch ein guter Ansatz.
Und wenn du wieder Fragen hast, kannst du dich gern wieder melden.

Bitte die Frage genau stellen und deine Sketch-Versuche posten.

Viel Erfolg

Müsste nach dem

  if (digitalRead(button) == LOW)

nicht schon ne geschweifte Klammer hin?

Stefan

Nö, da ist ja nur 1 Befehl/Aufruf (for) dahinter. Den zu klammern würde nichts schaden, besonders wenn man mal schnell was einfügen will (z.B. serielle Ausgabe) aber es ist nicht notwendig.

Gruß Tommy

Habe nun meinen Nano bekommen.

Der sketch geht soweit, fast.

Nutze einen 2 Poligen taster, gehe vom Pin 4 zum Taster und vom Taster zu GND.

Der Servo hängt am selben GND wie der Taster, + bekommt er von 5V und PWM von Pin 5.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 

int pos = 10;    // variable to store the servo position 
int button = 4;  // The button will be on Pin 2 


void setup() 
{ 
  myservo.attach(5);  // attaches the servo on pin 9 to the servo object
pinMode(pos, OUTPUT);
pinMode(button, INPUT); 
digitalWrite (button, LOW);
} 

void loop() 
{   
    if (digitalRead(button) == LOW)

  for(pos = 10; pos < 70; pos += 70)  // goes from 0 degrees to 90 degrees 
  {                                  // in steps of  degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                     // waits 1s for the servo to reach the position 
  } 
  if (digitalRead(button) == HIGH) 
  
  for(pos = 70; pos>=70; pos-=70)     // goes from 90 degrees to 0 degrees 
  {                                
     myservo.write(pos);              // tell servo to go to position in variable 'pos' 
     // waits 50ms for the servo to reach the position 
  }
}

So schaut nun der Sketch aus.

pos=0 ← will gar nicht gehen, minimum sind 10.

mein hauptproblem was ich habe; der Servo zuckt manchmal in neutralstellung - dann hilft auch kein drücken auf dem Taster.

Vom Taster zu GND habe ich einen 100k Ohm widerstand zwischen gesteckt, jedoch macht es keinen unterschieb ob mit oder ohne.

Wenn Dein Taster gegen GND schaltet braucht der Eingang einen Pullup. Kannst den internen nehmen.
Und wenn Dein Taster gegen +5 V schaltet dann brauchste nen externen Pulldown.

Merke: offene Eingänge = schlecht

Klaus_ww:
Wenn Dein Taster gegen GND schaltet braucht der Eingang einen Pullup. Kannst den internen nehmen.
Und wenn Dein Taster gegen +5 V schaltet dann brauchste nen externen Pulldown.

Merke: offene Eingänge = schlecht

Bin noch recht neu in der thematik, Pulldown habe ich verinnertlicht und verstehe halbwegs den sinn.

Aber wie verwende ich einen internen "Pullup"?

Edit : habe es hinbekommen.

habe den " digitalWrite (button, LOW);" auf HIGH gesetzt. Seitdem zuckt er nicht mehr.

Ist dies eine saubere lösung oder eher quick`n dirty?

interner Pullup
Ist wie Pulldown, nur halt andersrum. Damit wird der Eingang ohne gedrückten Taster auf definiertem Level gehalten. Ob der High oder Low ist ist wurscht. Die Logik dreht sich halt um.

Und häng Deinen Code bitte in Code-Tags (oben links < / >)

Hab den fehler ja nun beheben können :slight_smile: ein glück.

Ein weiterer taucht aber auf, kann ich den Servo auch andersrum drehen lassen?

Oder komm ich um einen Servoumbau nicht herum?

kann ich den Servo auch andersrum drehen lassen?

...

  for(pos = 70; pos>=70; pos-=70)     // goes from 90 degrees to 0 degrees

{                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    // waits 50ms for the servo to reach the position
  }

Wenn dein Kommentar zu deinem Code passen würde, wüsste man, worüber man meckern soll. :wink:
Was verstehst du unter "andersrum" bei einem Servo ?

Wenn der Servo auf 90° steht und du sagstmyservo.write(60);dreht er in die eine Richtung, mit myservo.write(120);in die andere. Oder?

Schonmal die Beispiele der Servo Library ausprobiert?

Man kann sich auch ansehen, was die servo Library macht und myservo.writeMicroseconds() ausprobieren.
Oder gar die PPM-Modulation direkt im eigenen Sketch machen.

Man kann auch (manche) Servos so umbauen, dass sie permanent, beliebig viele Umdrehungen in die eine oder andere Richtung drehen. Wie ein normaler Motor. ( Hab ich mal gelesen ) Aber das meinst du wohl nicht ?

michael_x:
Wenn dein Kommentar zu deinem Code passen würde, wüsste man, worüber man meckern soll. :wink:
Was verstehst du unter "andersrum" bei einem Servo ?

Momentan geht er bei einen Tastendruck immer nach links - ich brauche jedoch einen rechts auschlag

Servo drehen und somit anders einbauen geht nicht.

michael_x:
Wenn der Servo auf 90° steht und du sagstmyservo.write(60);dreht er in die eine Richtung, mit myservo.write(120);in die andere. Oder?

mein ansatz sah vor einfach ein - davor zu setzen, also minus 60 grad. Ich denke das war zu einfach gedacht.

michael_x:
Schonmal die Beispiele der Servo Library ausprobiert?

Man kann sich auch ansehen, was die servo Library macht und myservo.writeMicroseconds() ausprobieren.
Oder gar die PPM-Modulation direkt im eigenen Sketch machen.

Nein habe ich nicht getestet zu meiner schande, bin vollends überstürzt rein ins kalte wasser.

michael_x:
Man kann auch (manche) Servos so umbauen, dass sie permanent, beliebig viele Umdrehungen in die eine oder andere Richtung drehen. Wie ein normaler Motor. ( Hab ich mal gelesen ) Aber das meinst du wohl nicht ?

Also eine art winde draus bauen? nein das sehe ich nicht vor.

mein ansatz sah vor einfach ein - davor zu setzen, also minus 60 grad. Ich denke das war zu einfach gedacht.

Ein großer Vorteil ist, dass Servos in der Regel alle gleich angesteuert werden:
Mit Pulsen von 1500 µs Dauer für die Mittelstellung bzw. 1000 ... 2000 µs für den Bereich von Anschlag zu Anschlag. Modellbauservo Ansteuerung – Mikrocontroller.net
Klar gibt es da Toleranzen und kleine Unterschiede. Aber darauf basiert die bei Arduino vorhandene Servo Library, die bei 90° die Mittelstellung annimmt.

Aber du hast Recht: Wenn man sich das selbst ausdenkt, ist -90 .. + 90 auch eine sinnvolle Vorgabe.
Oder -100 ... +100 ( % ).
Oder -128 ... +127 (oder 0 .. 255 für Links .. Rechts, da würde ein Byte voll ausgenutzt)
Oder 1000 ... 2000 ( hardwarenah:servo.writeMicroseconds)

Kannst ja leicht deine eigene Library schreiben.


Kommentare im Code sollten erläutern, bei Änderungen also lieber gelöscht werden als einfach stehen bleiben :wink:

was ich nun doch nicht sooo ganz begreife ist folgendes, habe darüber auch nichts gefunden.

was besagen die 3 zahlen genau aus?

  for(pos = 90; pos>=90; pos-=90)

Das erste ist das er dahin fahren soll?

nur der rest erschließt sich mir nicht.

guckst du C++ oder C für Dummies oder irgendwas deiner Wahl.
for
oder https://www.arduino.cc/en/Reference/For

[Nachtrag:]
Trickreicher ist pos-=90 Das ist das gleiche wiepos = pos-90 und vermindert pos bei jedem Schleifendurchlauf um 90. Das willst du eher nicht, denke ich …