Servo MG 996R über Joystick steuern

Im heutigen Blog Beitrag steuern wir einen AZ-Delivery Servo MG996R über eine Joystick Modul.

 

Dazu benötigen wir:

1x AZ-Delivery Servo MG996R

1x Joystick Modul

1x AZ-Delivery Mikrokontroller, kompatibel mit Arduino UNO R3

1x 3er Set 40 Stk. Jumper Wire m2m/f2m/f2f

Der Servo zieht im Betrieb bis zu 2,5A - viel zu viel für unseren Mikrokontroller, kompatibel mit Arduino Uno R3. Daher müssen wir Ihn über ein externes Netzteil versorgen.

 

Wir bauen unten stehende Schaltung auf. Dabei ist zu beachten dass wir GND vom Arduino mit dem GND des externen Netzteils verbinden.

Am Servo befinden sich 3 Leitungen. Die dunkelste (in unserem Fall Braun) ist GND. Rot ist wie fast immer VCC (4,8 - 7,2 V Stromaufnahme: bis 2,5A), und Orange wird vom Mikrokontroller, kompatibel mit Arduino Uno R3 gesteuert und mit Pin 9 verbunden.

Der Joystick hat 5 Anschlusspins welche wie folgt mit dem Mikrokontroller, kompatibel mit Arduino Uno R3 verbunden werden:

 

Joystick

Mikrokontroller, kompatibel mit Arduino Uno R3

GND

GND

+5V

5V

VRx

A0

Vry

A1

SW

7

 

 

 

Schaltung

 

Für die Programmierung nehmen wir die Bibliothek mit dem einfachen Namen "Servo".

Wir nutzen außerdem nur die X-Achse um den Servo in die gewünschte Richtung zu drehen.

 

#include <Servo.h>;

Servo servo1; // Dem Servo eine Bezeichnung geben
#define joyX A0 // Pin A0 - Joystick X
#define joyY A1 // Pin A1 - Joystick Y
#define joyBTN D7  // Pin D7 - Joystick Button

int pos = 0, dir = 0, xValue, yValue; // Variablen für Position (pos), Richtung (dir), sowie den X und Y Wert des Joysticks 

void setup() {
  Serial.begin(9600);
  servo1.attach (9); // Steuerungsleitung vom Servo wird mit Pin 9 verbunden
}

void loop() {
  xValue = analogRead(joyX); // X-Position des Joysticks abfragen
  yValue = analogRead(joyY); // Y-Position des Joysticks abfragen
  //Auf Seriellem Monitor ausgeben - nur zur Fehlersuche
  Serial.print(pos); 
  Serial.print("\t\n");
  Serial.print(xValue);
  Serial.print("\t\n");

  if (xValue < 490){ // Wenn Joy nach Links <- 
    pos = --pos; // pos wird veringert
  } 
  
  if (xValue > 500){ // Wenn Joy nach Rechts
    pos = ++pos;  // pos wir erhöht
  }

  if (pos < 0){ // Damit pos nicht negativ wird
    pos = 0;
  }
  if (pos > 180){ // Damit pos nicht über 180 geht
    pos = 180;
  }

  delay(20);
  servo1.write(pos); // Servo auf Position "pos" bewegen
}
  


Nach dem Hochladen des Codes können wir nun den Servo mittels dem Joystick in die gewünschte Richtung drehen.

 

 

Wir hoffen, dass Sie unser heutiger Blogbeitrag Sie inspiriert hat, und wir freuen uns auf Ihre Kommentare. Bis zum nächsten Beitrag von AZ-Delivery, Ihrem Experten für Mikroelektronik!

Für arduinoProjekte für anfänger

4 comments

Andreas Wolter

Andreas Wolter

@marc: bitte mal versuchen, statt des Kopieren-Buttons den Quellcode mit der Mouse zu markieren und zu kopieren. Wir hatten das Problem kürzlich schon einmal und ich war der Meinung, dass es gelöst wurde.

Beim Kopieren werden aus der HTML-Seite unsichtbare Steuerzeichen mitkopiert. Das sollte eigentlich nicht passieren.

Wenn man den Code in die Arduino IDE einfügt, sieht man z.B. an dem Aufruf delay(), ob etwas nicht stimmt. Wenn “delay” nicht orange eingefärbt ist, dann hat es nicht funktioniert.

Ich gebe das noch einmal weiter.
Danke für den Hinweis.

Grüße,
Andreas Wolter
AZ-Delivery Blog

marc

marc

hallo,komisch copy/past des sketch bekomme ich von Arduino IDE folgende Meldung:

#include ; ^

sketch_aug15b:11:2: error: stray ‘\302’ in program
 Serial.begin(9600);
^
sketch_aug15b:11:3: error: stray ‘\240’ in program
 Serial.begin(9600);
^
sketch_aug15b:12:2: error: stray ‘\302’ in program
 servo1.attach (9); // Steuerungsleitung vom Servo wird mit Pin 9 verbunden
^
sketch_aug15b:12:3: error: stray ‘\240’ in program
 servo1.attach (9); // Steuerungsleitung vom Servo wird mit Pin 9 verbunden
^
sketch_aug15b:16:2: error: stray ‘\302’ in program
 xValue = analogRead(joyX); // X-Position des Joysticks abfragen
^
sketch_aug15b:16:3: error: stray ‘\240’ in program
 xValue = analogRead(joyX); // X-Position des Joysticks abfragen
^
sketch_aug15b:17:2: error: stray ‘\302’ in program
 yValue = analogRead(joyY); // Y-Position des Joysticks abfragen
^
sketch_aug15b:17:3: error: stray ‘\240’ in program
 yValue = analogRead(joyY); // Y-Position des Joysticks abfragen
^
sketch_aug15b:18:2: error: stray ‘\302’ in program
 //Auf Seriellem Monitor ausgeben – nur zur Fehlersuche
^
sketch_aug15b:18:3: error: stray ‘\240’ in program
 //Auf Seriellem Monitor ausgeben – nur zur Fehlersuche
^
sketch_aug15b:19:2: error: stray ‘\302’ in program
 Serial.print(pos);
^
sketch_aug15b:19:3: error: stray ‘\240’ in program
 Serial.print(pos);
^
sketch_aug15b:20:2: error: stray ‘\302’ in program
 Serial.print(“\t\n”);
^
sketch_aug15b:20:3: error: stray ‘\240’ in program
 Serial.print(“\t\n”);
^
sketch_aug15b:21:2: error: stray ‘\302’ in program
 Serial.print(xValue);
^
sketch_aug15b:21:3: error: stray ‘\240’ in program
 Serial.print(xValue);
^
sketch_aug15b:22:2: error: stray ‘\302’ in program
 Serial.print(“\t\n”);
^
sketch_aug15b:22:3: error: stray ‘\240’ in program
 Serial.print(“\t\n”);
^
sketch_aug15b:24:2: error: stray ‘\302’ in program
 if (xValue < 490){ // Wenn Joy nach Links <-
^
sketch_aug15b:24:3: error: stray ‘\240’ in program
 if (xValue < 490){ // Wenn Joy nach Links <-
^
sketch_aug15b:25:2: error: stray ‘\302’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:25:3: error: stray ‘\240’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:25:4: error: stray ‘\302’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:25:5: error: stray ‘\240’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:25:6: error: stray ‘\302’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:25:7: error: stray ‘\240’ in program
   pos = —pos; // pos wird veringert
^
sketch_aug15b:26:2: error: stray ‘\302’ in program
 }
^
sketch_aug15b:26:3: error: stray ‘\240’ in program
 }
^
sketch_aug15b:27:2: error: stray ‘\302’ in program
 
^
sketch_aug15b:27:3: error: stray ‘\240’ in program
 
^
sketch_aug15b:28:2: error: stray ‘\302’ in program
 if (xValue > 500){ // Wenn Joy nach Rechts
^
sketch_aug15b:28:3: error: stray ‘\240’ in program
 if (xValue > 500){ // Wenn Joy nach Rechts
^
sketch_aug15b:29:2: error: stray ‘\302’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:3: error: stray ‘\240’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:4: error: stray ‘\302’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:5: error: stray ‘\240’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:6: error: stray ‘\302’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:7: error: stray ‘\240’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:21: error: stray ‘\302’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:29:22: error: stray ‘\240’ in program
   pos = +pos;  // pos wir erhöht
^
sketch_aug15b:30:2: error: stray ‘\302’ in program
 }
^
sketch_aug15b:30:3: error: stray ‘\240’ in program
 }
^
sketch_aug15b:32:2: error: stray ‘\302’ in program
 if (pos < 0){ // Damit pos nicht negativ wird
^
sketch_aug15b:32:3: error: stray ‘\240’ in program
 if (pos < 0){ // Damit pos nicht negativ wird
^
sketch_aug15b:33:2: error: stray ‘\302’ in program
   pos = 0;
^
sketch_aug15b:33:3: error: stray ‘\240’ in program
   pos = 0;
^
sketch_aug15b:33:4: error: stray ‘\302’ in program
   pos = 0;
^
sketch_aug15b:33:5: error: stray ‘\240’ in program
   pos = 0;
^
sketch_aug15b:33:6: error: stray ‘\302’ in program
   pos = 0;
^
sketch_aug15b:33:7: error: stray ‘\240’ in program
   pos = 0;
^
sketch_aug15b:34:2: error: stray ‘\302’ in program
 }
^
sketch_aug15b:34:3: error: stray ‘\240’ in program
 }
^
sketch_aug15b:35:2: error: stray ‘\302’ in program
 if (pos > 180){ // Damit pos nicht über 180 geht
^
sketch_aug15b:35:3: error: stray ‘\240’ in program
 if (pos > 180){ // Damit pos nicht über 180 geht
^
sketch_aug15b:36:2: error: stray ‘\302’ in program
   pos = 180;
^
sketch_aug15b:36:3: error: stray ‘\240’ in program
   pos = 180;
^
sketch_aug15b:36:4: error: stray ‘\302’ in program
   pos = 180;
^
sketch_aug15b:36:5: error: stray ‘\240’ in program
   pos = 180;
^
sketch_aug15b:36:6: error: stray ‘\302’ in program
   pos = 180;
^
sketch_aug15b:36:7: error: stray ‘\240’ in program
   pos = 180;
^
sketch_aug15b:37:2: error: stray ‘\302’ in program
 }
^
sketch_aug15b:37:3: error: stray ‘\240’ in program
 }
^
sketch_aug15b:39:2: error: stray ‘\302’ in program
 delay(20);
^
sketch_aug15b:39:3: error: stray ‘\240’ in program
 delay(20);
^
sketch_aug15b:40:2: error: stray ‘\302’ in program
 servo1.write(pos); // Servo auf Position “pos” bewegen
^
sketch_aug15b:40:3: error: stray ‘\240’ in program
 servo1.write(pos); // Servo auf Position “pos” bewegen
^
sketch_aug15b:42:2: error: stray ‘\302’ in program
 
^
sketch_aug15b:42:3: error: stray ‘\240’ in program
 
^
exit status 1
stray ‘\302’ in program

Andreas Wolter

Andreas Wolter

@Robert Miosga:

damit das Servo stehen bleibt, würde ich ein Maximum einbauen. eine Variable, die immer dann überspeichert wird, wenn der neue Wert größer ist, als der alte. Diesen Wert dann auf das Servo geben, falls er sich geändert hat.

Die Geschwindigkeit, mit der sich die Servoachse dreht, wird in diesem Fall wahrscheinlich mit der Zeile delay(20) festgelegt.
Was Sie brauchen ist die Beschleunigung. Je größer die Beschleunigung, desto kleiner der Wert in der delay() Funktion. Die Beschleunigung ist die erste Ableitung der Geschwindigkeit. Die Geschwindigkeit zu messen, geht über die Zeit. Das ist der mathematische Ansatz dahinter. Dafür gibt es viele Beispiele im Netz. Sie müssen es dann “nur” noch in Code umsetzen.
Ohne Mathe würde ich immer den gleichen Zeitraum messen und dann gucken, um wieviel sich der Wert erhöht hat. Den Abstand der beiden Werte innerhalb der Zeitmessung könnte man dann ins Verhältnis zum Wert in der delay() Funktion setzen. Also bräuchte man dafür eine minimale und maximale Drehgeschwindigkeit der Servoachse.

Ich hoffe, ich konnte ein wenig weiterhelfen.

Andreas Wolter

Robert Miosga

Robert Miosga

Hallo, ich habe eine Frage, ich versuche schon seit Langen Servos mit einem Joystick zu steuern, aber mein Ziel ist es das der Servo sich in die jeweilige Richtung bewegt und dann auch dort stehen bleibt .. und sich nicht wieder zurückbewegt nachdem der Joystick sich zentriert .. zusätzlich soll der Servo sich proportional schneller bewegen je nach dem wie sehr man den Joystick in die jeweilige Richtung drückt .. können Sie mir eventuell weiterhelfen oder mir Ansätze geben wie man das angeht ?

Leave a comment

All comments are moderated before being published