💥 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.hverwenden 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