Suchcode

Lektion 86: Position eines Servomotors mithilfe eines Potentiometers steuern

Lektion 86: Position eines Servomotors mithilfe eines Potentiometers steuern

Stellen Sie sich vor, Sie drehen einen einfachen Knopf und beobachten, wie ein mechanischer Arm präzise jeder Ihrer Bewegungen folgt. Das ist die Magie, wenn man ein Potentiometer mit einem Servomotor kombiniert. Dieses Projekt, Teil des Arduino Step by Step Kurses von Robojax, demonstriert ein grundlegendes und unglaublich nützliches Konzept in der Elektronik: die Übersetzung eines analogen Eingangs in präzise physische Bewegung. Sie lernen, wie man eine variable Spannung von einem Potentiometer liest, diesen Wert auf einen Bereich von Winkeln abbildet und einen Servomotor anweist, sich in genau diese Position zu drehen. Dies ist Ihr Tor zum Bauen intuitiver und interaktiver Projekte, bei denen manuelle Steuerung auf Automatisierung trifft.

Die Anwendungen für diese Fähigkeit sind vielfältig und praktisch. Hier sind nur ein paar Ideen, um Sie zu inspirieren:

  • Roboterarm-Steuerung: Verwenden Sie ein Potentiometer, um jedes Gelenk eines Roboterarms manuell zu positionieren, für präzise Pick-and-Place-Operationen.
  • Kamera-Schwenk- und Neigesystem: Bauen Sie eine ferngesteuerte Kamerahalterung für Zeitraffer oder Überwachung, die mit einer Drehung am Regler sanft schwenkt und neigt.
  • Nachbildung eines analogen Messgeräts: Erstellen Sie ein physisches Armaturenbrett-Messgerät (wie einen Tachometer oder Temperaturregler), das sich basierend auf Sensordaten bewegt, wobei das Potentiometer als manuelle Übersteuerung oder Kalibrierungswerkzeug dient.
  • Interaktive Kunstinstallationen: Erstellen Sie kinetische Skulpturen, die auf Eingaben des Betrachters reagieren, bei denen das Drehen eines Reglers die Position beweglicher Teile ändert.
  • Lenkung von Modellfahrzeugen: Steuern Sie den Lenkwinkel eines Modellautos oder -boots ferngesteuert, was ein intuitiveres und analogeres Gefühl vermittelt als digitale Tasten.

Dieser Leitfaden basiert auf dem Video-Tutorial Lektion 86: Position eines Servomotors mit Potentiometer steuern von Robojax (im Video bei 00:00). Er führt Sie durch den gesamten Prozess, vom Verständnis der Verkabelung bis zur Erklärung des Codes, der alles zum Laufen bringt. Legen wir los.

Hardware und Komponenten

Um diesem Projekt zu folgen, benötigen Sie die folgenden Komponenten:

  • Ein Arduino-Board (z. B. Uno, Nano)
  • Einen Standard-Servomotor (z. B. SG90 oder MG996R)
  • Ein Potentiometer (verstellbarer Widerstand, typischerweise 10kΩ)
  • Jumper-Kabel
  • Ein Breadboard (optional, für einfachere Verbindungen)

Die Verkabelung verstehen

Die Verkabelung für dieses Projekt ist unkompliziert. Der Schlüssel liegt darin, die richtigen Strom- und Signalverbindungen sowohl für den Servo als auch für das Potentiometer bereitzustellen. Der Servo ist ein stromhungriges Gerät, daher erhält er seinen Strom direkt vom 5V-Pin des Arduinos. Das Potentiometer fungiert als Spannungsteiler, und wir lesen die Spannung an seinem Schleifer (dem mittleren Pin), um seine Position zu bestimmen. (im Video bei 01:05)

Ein cleverer Trick, den dieses Projekt verwendet, ist die Erzeugung einer zusätzlichen 5V-Quelle an einem digitalen Pin, um das Potentiometer zu speisen, da einige Arduino-Boards nur einen dedizierten 5V-Pin haben. Dies wird im Code erreicht, indem ein digitaler Pin (Pin 8) auf HIGH gesetzt wird, was 5V ausgibt. (im Video bei 00:39)

Hier ist das im Video erwähnte Schaltbild:

Arduino-Verkabelung für Servomotor mit Potentiometer
Arduino-Verkabelung für Servomotor mit Potentiometer

Lassen Sie uns die Verbindungen aufschlüsseln:

  • Servomotor:
    • Strom (rotes Kabel) → Arduino 5V-Pin
    • Masse (braunes/schwarzes Kabel) → Arduino GND-Pin
    • Signal (orangefarbenes/gelbes Kabel) → Arduino-Pin 3 (ein PWM-fähiger Pin)
  • Potentiometer:
    • Linker Pin → Arduino GND-Pin
    • Mittlerer Pin (Schleifer) → Arduino-Analogpin A0
    • Rechter Pin → Arduino-Pin 8 (im Code als VCC2 definiert)

Code-Erklärung

Der Code für dieses Projekt ist elegant einfach. Er nutzt einige wichtige Arduino-Funktionen, um das Potentiometer zu lesen und den Servo zu steuern. Konzentrieren wir uns auf die benutzerkonfigurierbaren Teile, die Sie für Ihre eigenen Projekte anpassen können. (im Video bei 03:00)

Am Anfang des Sketches definieren Sie die Pins und erstellen das Servo-Objekt. Dies sind die primären Variablen, die Sie basierend auf Ihrer Verkabelung ändern werden:

#include <Servo.h>

Servo myservo;  // Servo-Objekt zur Steuerung eines Servos erstellen

int potpin = A0;  // analoger Pin zum Anschluss des Potentiometers
int servoPin = 3; // digitalen Pin (mit PWM) für Servo definieren. Kann nur Pin 3, 5, 6, 9, 10, 11 verwenden
int VCC2 = 8;// zusätzliche VCC für Potentiometer definieren
int val;    // Variable zum Lesen des Werts vom analogen Pin

Hier ist, was jeder Teil bewirkt:

  • Servo myservo;: Diese Zeile erstellt ein Objekt namens myservo, das wir verwenden, um unseren spezifischen Servomotor zu steuern. Sie können es umbenennen, müssen aber denselben Namen später im Code verwenden.
  • int potpin = A0;: Dies definiert, an welchem analogen Pin der Schleifer des Potentiometers angeschlossen ist. Wenn Sie das Kabel an einen anderen analogen Pin bewegen, müssen Sie diese Nummer aktualisieren.
  • int servoPin = 3;: Dies setzt den digitalen Pin für das Signalkabel des Servos. Es ist entscheidend, einen PWM-fähigen Pin zu verwenden (normalerweise mit einem '~' auf dem Board markiert). Der Kommentar listet die gültigen Pins für die meisten Arduinos auf.
  • int VCC2 = 8;: Dies ist der Pin, den wir als sekundäre 5V-Quelle für das Potentiometer verwenden. Wenn Sie ein Board mit mehreren 5V-Pins haben, können Sie es direkt anschließen und diesen Teil des Codes entfernen.

In der setup()-Funktion initialisiert der Code den Servo und richtet den zusätzlichen Stromversorgungspin ein. Die Funktion myservo.attach(servoPin) ist essenziell, da sie dem Arduino mitteilt, welcher Pin mit dem Signalkabel des Servos verbunden ist.

void setup() {
  Serial.begin(9600);          //  Serielle Verbindung einrichten
  myservo.attach(servoPin);  // verbindet den Servo an Pin 3 mit dem Servo-Objekt

  pinMode(VCC2, OUTPUT);// Pin 8 als Ausgang festlegen
  digitalWrite(VCC2, HIGH);// Pin 8 auf HIGH setzen, damit er als 5V-Pin fungiert
}

Die Kernlogik befindet sich in der loop()-Funktion. Sie liest den Wert des Potentiometers, skaliert ihn auf einen Winkel und weist den Servo an, sich zu bewegen. Die beiden entscheidenden Funktionen hier sind analogRead() und map(). (im Video bei 04:27)

void loop() {
  val = analogRead(potpin);            // liest den Wert des Potentiometers (Wert zwischen 0 und 1023)
  val = map(val, 0, 1023, 0, 180);     // skaliert ihn für die Verwendung mit dem Servo (Wert zwischen 0 und 180)
  myservo.write(val);                  // setzt die Servoposition entsprechend dem skalierten Wert
  Serial.print(val);
  Serial.println();
  delay(50);                           // wartet, bis der Servo die Position erreicht hat
}

So funktioniert es:

  • analogRead(potpin): Diese Funktion liest die Spannung vom Schleifer des Potentiometers und gibt einen Wert zwischen 0 (0V) und 1023 (5V) zurück.
  • map(val, 0, 1023, 0, 180): Dies ist der Schlüssel zum gesamten Projekt. Sie nimmt den Rohwert vom Potentiometer (0 bis 1023) und wandelt ihn proportional in einen Servowinkel (0 bis 180 Grad) um. Wenn das Potentiometer beispielsweise 511 (etwa die Hälfte) anzeigt, gibt die map()-Funktion 90 zurück und bewegt den Servo in seine Mittelposition.
  • myservo.write(val): Diese Funktion nimmt den berechneten Winkel (jetzt in val gespeichert) und weist den Servo an, sich in diese Position zu drehen.
  • delay(50): Dies fügt am Ende jeder Schleife eine kleine Pause hinzu. Es steuert die Aktualisierungsrate. Eine größere Verzögerung (wie 200 ms) lässt den Servo in Schritten bewegen, während eine kleinere Verzögerung (wie 50 ms) die Bewegung sehr gleichmäßig macht. Du kannst dies anpassen, um die Reaktionsfähigkeit zu ändern. (im Video bei 07:26)

Live-Projektdemonstration

Im Video kannst du das Projekt in Aktion sehen. Wenn der Drehknopf des Potentiometers gedreht wird, folgt der Arm des Servomotors seiner Position proportional. Der serielle Monitor gibt den aktuellen Winkel aus und bestätigt, dass die Zuordnung korrekt funktioniert. Wenn sich das Potentiometer in seiner Minimalposition befindet, steht der Servo bei 0 Grad. Wenn du den Knopf bis zum Maximum drehst, dreht sich der Servo sanft auf 180 Grad. (im Video bei 06:33)

Diese Echtzeit-Rückkopplungsschleife demonstriert die nahtlose Integration eines analogen Sensors mit einem digitalen Aktuator und erzeugt ein reaktionsschnelles und intuitives Steuerungssystem.

Kapitel

  • [00:00] Einführung und Projektübersicht
  • [01:05] Schaltplan und Verdrahtungsdiagramm
  • [02:07] Physische Verdrahtungsdemonstration
  • [03:00] Code-Erklärung
  • [06:33] Live-Demonstration und Tests
  • [07:26] Anpassen der Servo-Reaktionsgeschwindigkeit

Bilder

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Sprache: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

Ressourcen & Referenzen

Dateien📁

Andere Dateien