Zum Hauptinhalt springen

💥 Servos


⭐ Aufgabe: Servos verstehen & erste Bewegung​

In dieser Aufgabe lernst du, wie Servos angesteuert werden und fährst den linken Servo nacheinander auf 45° → 90° → 135°.


💎 Ziel​

  • Servo.h verwenden und einen Servo ansteuern
  • Grundpositionen anfahren und beobachten

1. Verkabelung & Konstanten​

#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9; // linker Servo (Elevon links)

2. Code​

#include <Arduino.h>
#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9; // linker Servo

Servo servoLeft;

void setup() {
servoLeft.attach(SERVO_LEFT_PIN);
}

void loop() {
servoLeft.write(45); delay(1000);
servoLeft.write(90); delay(1000);
servoLeft.write(135); delay(1000);
}

✨ Aufgabe: Gegensinnige Bewegung (Elevons)​

Jetzt steuerst du beide Servos (links & rechts). Für eine Rollbewegung gehen sie gegengleich: links hoch, rechts runter – und umgekehrt.


💎 Ziel​

  • Zwei Servos koordinieren
  • Rollbewegung simulieren (links/rechts)

1. Konstanten​

#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9; // linker Servo
const uint8_t SERVO_RIGHT_PIN = 10; // rechter Servo

2. Code​

#include <Arduino.h>
#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9;
const uint8_t SERVO_RIGHT_PIN = 10;

Servo servoLeft, servoRight;

void setup() {
servoLeft.attach(SERVO_LEFT_PIN);
servoRight.attach(SERVO_RIGHT_PIN);

// Neutralstellung
servoLeft.write(90);
servoRight.write(90);
delay(800);
}

void loop() {
// Roll nach links: links hoch (45), rechts runter (135)
servoLeft.write(45);
servoRight.write(135);
delay(1000);

// Neutral
servoLeft.write(90);
servoRight.write(90);
delay(800);

// Roll nach rechts: links runter (135), rechts hoch (45)
servoLeft.write(135);
servoRight.write(45);
delay(1000);

// Neutral
servoLeft.write(90);
servoRight.write(90);
delay(800);
}

🌟 Aufgabe: Sanfte Bewegung ohne delay()​

Jetzt bewegst du die Servos gleichmäßig und nicht-blockierend mit millis(). So kann dein Arduino später mehrere Dinge parallel erledigen.


💎 Ziel​

  • Zeitsteuerung mit millis()
  • Sanfte, kontinuierliche Bewegungen

1. Konstanten​

#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9;
const uint8_t SERVO_RIGHT_PIN = 10;

2. Code​

#include <Arduino.h>
#include <Servo.h>

const uint8_t SERVO_LEFT_PIN = 9;
const uint8_t SERVO_RIGHT_PIN = 10;

Servo servoLeft, servoRight;

int pos = 90; // Start in Neutral
int direction = 1; // +1 vorwärts, -1 zurück
unsigned long prevMs = 0;
const unsigned long STEP_MS = 20; // kleiner = schneller
const int MIN_ANGLE = 45;
const int MAX_ANGLE = 135;

void setup() {
servoLeft.attach(SERVO_LEFT_PIN);
servoRight.attach(SERVO_RIGHT_PIN);
servoLeft.write(pos);
servoRight.write(180 - pos); // gegensinnig
}

void loop() {
unsigned long now = millis();
if (now - prevMs >= STEP_MS) {
prevMs = now;

pos += direction;
if (pos <= MIN_ANGLE || pos >= MAX_ANGLE) {
direction = -direction; // Richtung umkehren
}

servoLeft.write(pos);
servoRight.write(180 - pos); // gegensinnig
}

// Platz für weitere Logik (LEDs, Sensoren, …)
}

💫 Aufgabe: Servos mit MPU6050 koppeln​

Zum Schluss reagieren die Servos auf die Neigung deines Shuttles. Du nutzt den Winkel Pitch (Y), um die Elevons gegensinnig zu bewegen.


💎 Ziel​

  • MPU6050-Winkel auslesen (getAngleY())
  • Winkel sinnvoll in Servo-Winkel (45°–135°) abbilden

1. Konstanten​

#include <Servo.h>
#include <MPU6050_tockn.h>

const uint8_t SERVO_LEFT_PIN = 9;
const uint8_t SERVO_RIGHT_PIN = 10;

2. Code​

#include <Arduino.h>
#include <Servo.h>
#include <Wire.h>
#include <MPU6050_tockn.h>

const uint8_t SERVO_LEFT_PIN = 9;
const uint8_t SERVO_RIGHT_PIN = 10;

Servo servoLeft, servoRight;
MPU6050 mpu(Wire);

int mapFloatToInt(float x, float in_min, float in_max, int out_min, int out_max) {
if (x < in_min) x = in_min;
if (x > in_max) x = in_max;
return (int)((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
}

void setup() {
Serial.begin(9600);
Wire.begin();
mpu.begin();
mpu.calcGyroOffsets(true);

servoLeft.attach(SERVO_LEFT_PIN);
servoRight.attach(SERVO_RIGHT_PIN);

servoLeft.write(90);
servoRight.write(90);
}

void loop() {
mpu.update();

float angleY = mpu.getAngleY(); // -∞ … +∞ (typisch ~ -90 … +90)
int pos = mapFloatToInt(angleY, -45, 45, 45, 135); // mappe Pitch auf 45°…135°

servoLeft.write(pos);
servoRight.write(180 - pos); // gegensinnig

Serial.print("Pitch(Y): "); Serial.print(angleY);
Serial.print(" | ServoPos: "); Serial.println(pos);

delay(20); // sanftes Update
}

☄️ Vollständiges Programm​

Als allerletzter Schritt werden nun alle Einzelteile (LEDs, Beacon-LED, Lagesensor/MPU und Servos) in einem einzigen Hauptprogramm zusammengeführt – genau wie bei der anfänglichen Test-Kalibrierung.

Für diese Zusammenführung existieren verschiedene Herangehensweisen. Am lehrreichsten ist es, hierbei unterschiedliche Varianten auszuprobieren und zu vergleichen.

Der bereitgestellte Test-Code dient dabei als hervorragende Orientierung und Unterstützung, stellt jedoch nur eine von vielen Lösungsmöglichkeiten dar.

Hier findet Ihr nochmals den Testcode