Liebe Arduinos ,
da ich schon fast am Verzweifeln bin erhoffe ich mir auf diesem Weg Hilfe !
Seid geraumer Zeit versuche ich krampfhaft einen Servo mittels Taster dazu zu überreden zu tun was er soll , aber der denkt garnicht dran
Will mittels Taster einfach nur einen Punkt A anfahren und dann mit dem 2. Taster wieder zurück .
Als Sketch habe ich den hier versucht :
#include<Servo.h>
Servo myservo;
int pos = 0;
int posA = 90;
int Speed = 15;
int tastUp = 12;
int tastDown =13;
void setup()
{
myservo.attach(3);
pinMode(tastUp,INPUT);
pinMode(tastDown,INPUT);
}
void loop()
{
if (digitalRead(tastUp)==LOW)
for(int pos = posA; pos<posA; pos+=1)
{
myservo.write(pos);
delay(Speed);
}
if (digitalRead(tastDown)==LOW)
for(int pos = posA;pos > posA; pos-=1)
{
myservo.write(pos);
delay(Speed);
}
}
Angeschlossen wie folgt :
Servo + an +
Servo - an GND
Servosteuerung an 3
Taster an 12 und Steuerung
Taster 2 an 13 und Steuerung
Bitte nicht lachen ich bin blutigrt Laie und mehr der Mechaniker als der Elektroniker , brauche die Schaltung aber für die Steuerung auf der MOBA Anlage meiner Enkelchen .
Wäre für jede Hilfe Dankbar .
LG
Carsten
Bist Du sicher, dass Du Deine Taster zusammen mit externen PullDown-Widerständen beschalten möchtest?
Bei kurzen Leitungslängen würde ich es eher bevorzugen, nur die Taster zu verbauen, die Pull-Widerstände in der Schaltung wegzulassen und stattdessen die internen PullUp-Widerstände des Atmegas zu aktivieren (pinMode INPUT_PULLUP).
Dein Code korrigiert und auf Verwendung von internen PullUps umgeschrieben:
#include<Servo.h>
Servo myservo;
int pos=90;
int Speed = 50;
int tastUp = 12;
int tastDown =13;
void setup()
{
myservo.attach(3);
pinMode(tastUp,INPUT_PULLUP);
pinMode(tastDown,INPUT_PULLUP);
}
void loop()
{
if (digitalRead(tastUp)==LOW) pos++;
if (pos>180) pos=180;
if (digitalRead(tastDown)==LOW) pos--;
if (pos<0) pos=0;
myservo.write(pos);
delay(Speed);
}
Falls Du lieber externe PullDown-Widerstände verbaust, ändere den pinMode zurück auf INPUT und teste beim Abfragen auf HIGH anstelle von LOW, ob der Button gedrückt wurde.
Mal abgesehen davon, dass die Variable 2x initialisiert wird, kann das nicht funktionieren:
"Setze pos auf den Wert posA und führe aus, solange pos kleiner als posA ist".
Du initialisierst pos mit dem Wert von posA, die Bedingung, dass pos kleiner posA ist, wird niemals eintreten.
Nachtrag @Jurs: der max Wert soll 90 sein, wenn ich das richtig lese im Eingangsbeitrag, nicht 180?
Danke an Euch alle , es hat mit tatsächlich weiter geholfen ;D
An jurs , ja die ekternen wiederstände muss ich beibehalten da ich das ganze dann auf einen Attiny brennen will
10.2 Ports as General Digital I/O The ports are bi-directional I/O ports with optional internal pull-ups.
Aber wenn die Leitungen zu den Schaltern lang sind, nimmst Du wahrscheinlich sowieso besser "starke" Pull-Widerstände mit z.B. 3.9K oder 4.7K statt die "schwachen" internen PullUps (ca. 20...50K) zu verwenden, um die Störanfälligkeit der Signale gering zu halten.
Hallo nochmal , dachte schon ich habe es geschafft , klappt auf dem Arduino Uno auch wie gewollt , aber wenn ich das ganze auf den Attiny brennen will kommt immer
pleace define PAGEL... was man ja ignorieren kann ?
undYikes! Invalid device signature.Double check connections and try again, or use -F to override this check .
Da der Timer in Servo .h schwirigkeiten machen soll habe ich auch mal auf Servo8Bit.h umgeschrieben was eigendlich gehen soll . Aber macht es nicht . Verwende einen Attiny 85 mit 20 Hz.
Was mache ich falsch ?
LG
Carsten
#include <Servo8Bit.h>
Servo8Bit myServo;
int pos=0;
int Speed = 40;
int tastUp = 2;
int tastDown =3;
void loop()
{
if (digitalRead(tastUp)==LOW) pos++;
if (pos>100) pos=100;
if (digitalRead(tastDown)==LOW) pos--;
if (pos<0) pos=0;
myServo.write(pos);
delay(Speed);
}