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!
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.