Steuerung mit 2 Servomotoren

Mein Versuchsaufbau besteht aus:

  • 1 x Arduino Uno-Nachbau von AZ-Delivery
  • 1 x Joystick aus Freenove Starterpaket
  • Kabel
  • 3 x LED (rot, gelb, grün)
  • 3 x 220 Ohm-Widerstände
  • 2 x Servo-Motoren SG90
  • 1 x Labornetzteil

Verwendete Software:

  • Arduino IDE 1.8.16
  • Quellcode aus dem Freenove Tutorial mit eigener Erweiterung

Anschlussplan:

Die Batterie ist nur als Platzhalter für das Labornetzteil mit einer Versorgungsspannung von 4,8 V 2,5 A eingefügt!
Der Arduino wird über den USB-Anschluss versorgt!

Anschlussplan

Folgender Quellcode wurde verwendet:

#include <Servo.h>

Servo servoX, servoY;

int angleX, angleY;
int startpos = 90;

//Joystick
int xAxisPin = 0; // define X pin of Joystick
int yAxisPin = 1; // define Y pin of Joystick
int zAxisPin = 12; // define Z pin of Joystick
float xVal, yVal, zVal; // define 3 variables to store the values of 3 direction

//Display
int xLEDPin = 3;    //PWM
int yLEDPin = 5;    //PWM
int zLEDPin = 2;
float xLEDValfloat;
int xLEDVal, yLEDVal;



void setup() 
{
  servoX.attach(9);
  angleX = startpos;
  servoX.write(angleX);

  servoY.attach(10);
  angleY = startpos;
  servoY.write(angleY);
  
  pinMode(zAxisPin, INPUT_PULLUP); // initialize the port to pull-up input
  Serial.begin(115200); // initialize the serial port with baud rate 9600
  Serial.println("UNO is ready!"); // print the string "UNO is ready!"

  
}

void loop() 
{ // read analog value in XY axis
  xVal = analogRead(xAxisPin);
  xLEDValfloat = xVal*255/1024;
  xLEDVal = (int) xLEDValfloat;
  analogWrite(xLEDPin, xLEDVal);
  Serial.println(xLEDVal);
  if(xVal < 500.00)
  {
    angleX++;
    servoX.write(angleX); 
    delay(10);
  }
  if(xVal > 600.00)
  {
    angleX--;
    servoX.write(angleX);
    delay(10);
  }
  Serial.println(xLEDVal); 
  yVal = analogRead(yAxisPin); // read digital value of switch in Z axis 
  yLEDVal = yVal*255/1024;
  analogWrite(yLEDPin, yLEDVal);
  if(yVal < 500.00)
  {
    angleY++;
    servoY.write(angleY); 
    delay(10);
  }
  if(yVal > 600.00)
  {
    angleY--;
    servoY.write(angleY);
    delay(10);
  } 
  zVal = digitalRead(zAxisPin); //print the data read above
  if(zVal == 1.00)
  {
      analogWrite(zLEDPin, 255);
  }
  else
  {
    analogWrite(zLEDPin, LOW);
    angleX = startpos;
    servoX.write(angleX);
    angleY = startpos;
    servoY.write(angleY);
  }
  Serial.print("X : "); 
  Serial.print(xVal); 
  Serial.print(" \t Y : "); 
  Serial.print(yVal); 
  Serial.print(" \t Z : "); 
  Serial.println(zVal); 
  //delay(200);
}

Fazit:

  • Das Grundkonstrukt funktioniert bei mir einwandfrei.
  • Wenn mit der in der Arduino IDE integrierten Servo-Bibliothek gearbeitet wird, können Pin 9 und 10 nicht für andere Aus- bzw. Eingaben genutzt werden!
    Meine Ausgabe-LEDs z.B. leuchteten nicht mehr.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert