Mit Servo 3 Positionen mit 3 Taster anfahren

Hallo zusammen

Ich probiere gerade mit meine Arduino Mega 2560 und Grove-Mega Shield Erweiterung ein Programm zum laufen zu bringen.
Dabei muss mein Servo-Motor drei unterschiedliche Positionen einnehmen.
Zu Beginn soll er Position 1 mit 0° einnehmen.

Wird Taster 2 gedrückt soll der Servo in die Position 45° fahren.
Wird Taster 3 gedrückt soll der Servo in die Position 90° fahren.
Wird Taster 1 gedrückt soll der Servo in die Position 0° fahren.

Beim Servo handelt es sich um ein Reely-Servo (Art. Nummer: RE-2141322)

Sobald der Servo am Arduino angeschlossen ist, kommt in regelmässigem Abstand vom PC ein Ton, wie wenn ein USB-Stick die Verbindung mit dem PC nicht schafft. Woran liegt das?

Zum Code:

int tasterPin1 = 2; //Taster1 an Pin 2 angeschlossen
int tasterPin2 = 4; //Taster2 an Pin 4 angeschlossen
int tasterPin3 = 6; //Taster2 an Pin 6 angeschlossen
int Servo_Pin = 12; //Servo an Pin 12

int Stellung1 = 0; //ServoStellung 1
int Stellung2 = 45; //ServoStellung 2
int Stellung3 = 90; //ServoStellung 3
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt
void Servo_move(int servo,int Stellung_Neu);
//-------------------------------------------------------------
void setup()
{
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin 2) wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 4) wird als INPUT definiert
pinMode(tasterPin3, INPUT); //tasterPin2 (Pin 6) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin3,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=Stellung1; // Ruhestellung
}
//-------------------------------------------------------------
void loop()
{
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
if (digitalRead(tasterPin3) == LOW)
Servo_move(Servo_Pin, Stellung3);
delay(20);
}
//-------------------------------------------------------------
/*** Ab hier nichts ändern, bestimmt das Timingverhalten!!! ***/
void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
}

Bild von meinem Anschluss

Wenn ich nun den Code auf das Arduino Uploade, dann passiert gar nichts und ich stehe auf dem Schlauch wo der Fehler liegt.

Nein,
das wird nichts.
Das Bild bitte in Deinem Erstpost mit dem hochladen-Button einfügen.
Externe Links kann ich sowieso nicht und die verschwinden da irgendwann und kein Mensch kann später nachvollziehen, was Deine Ausgangslage war.

Mein Ansatz: Du ziehst mehr an Leistung aus dem USB-Port, als dieser zur Verfügung stellt, was der Port dann mit einem Disconnect quittiert.


So habe das Bild hier auch noch direkt integriert.

Gut Möglich, dass ich so zu viel Leistung ziehe. Input wäre 7 bis 12 Volt möglich, wie komme ich dort besser an das Limit? Mit den klassischen Laptop-Kabel hat man ja 19.5 Volt...

Irgend nen 9-12V Netzteil. Kein Ladegerät.
Und dann gehe mal in Dein Ausgangspost. Da ist unten ein Bleistift.
Der Code ist unvollständig.
Ersetze den mal mit dem was Du hast.

Mit dem Netzteil bewegt immerhin der Servo. Zwar noch nicht so, wie er sollte aber immerhin...

Tja und wenn der vollständige Code nicht bekannt ist, wirst Du selber suchen müssen.

Mein kompletter Code habe ich eingefügt... Weiss ehrlich gesagt worauf du hinaus willst :sweat_smile:
Fehlt was?

Ach schau. Du hast #1 nacheditiert... Es wäre schön, sowas ggfls auch mitzuteilen.
Das delay(20) macht was?
Und was machst Du in Servo_move? Da gibt es nach jedem Grad eine Pause von 19ms? Warum schickst Du den Servo nicht einfach an seine Position.
Dafür gibt es eine Library, die Dir alles abnimmt. Nimm diese.
Mein Code kompiliert - ob er das macht, was Du willst, musst Du rausfinden.

#include "Servo.h"

Servo myServo;
const byte Servo_Pin = 12; //Servo an Pin 12
const byte tasterPin[] = {2, 4, 6};
const byte pos[] = {0, 45, 90};
byte  soll = 0;
//-------------------------------------------------------------
void setup()
{
  for (byte b = 0; b < 3; b++)
    pinMode(tasterPin[b], INPUT_PULLUP);
  pinMode(Servo_Pin, OUTPUT);
  myServo.write(pos[0]);
}
//-------------------------------------------------------------
void loop()
{
  for (byte b = 0; b < 3; b++)
  {
    if (digitalRead(tasterPin[b]) == LOW)
    {
      soll = b;
      continue;
    }
  }
  if (soll > sizeof(pos) / sizeof(pos[0]))
    soll = 0; // sicherheitsabfrage
  myServo.write(pos[soll]);
}

Tut er ... wenn Du noch im setup()

pinMode(Servo_Pin, OUTPUT);

durch

myServo.attach(Servo_Pin);

ersetzt :wink:

Siehe hier:

#include "Servo.h"

Servo myServo;
const byte Servo_Pin = 12; //Servo an Pin 12
const byte tasterPin[] = {2, 4, 6};
const byte pos[] = {0, 45, 90};
byte  soll = 0;
//-------------------------------------------------------------
void setup()
{
  for (byte b = 0; b < 3; b++)
    pinMode(tasterPin[b], INPUT_PULLUP);
  myServo.attach(Servo_Pin);
  myServo.write(pos[0]);
}
//-------------------------------------------------------------
void loop()
{
  for (byte b = 0; b < 3; b++)
  {
    if (digitalRead(tasterPin[b]) == LOW)
    {
      soll = b;
      continue;
    }
  }
  if (soll > sizeof(pos) / sizeof(pos[0]))
    soll = 0; // sicherheitsabfrage
  myServo.write(pos[soll]);
}

Na danke.
Idee gehabt, Logik stimmt. Aufgabe erfüllt.
Beste Grüße

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.